📱 C 端真实开发方案 · c-app-uniapp 全量落地

基线:c-prototype2 原型 50 页(视觉参照)→ wiki/design/c-end 43 页 spec + 6 域 PRD(权威契约)→ c-app-uniapp 已实现 7 页 + 后端 12 端点 + 桩协议充电链路已通(server-338)· 2026-09-03

〇、总览与差距基线

36+
C 端页面总目标(5 Tab)
7
uniapp 已实现页
~50
API 缺口(目标 ~60 端点)
12
后端已有 C 端端点
11
C 端新表待迁移

三层资产:原型(c-prototype2 50 vue,station 11/charging 12/order 8/member 7/account 6/service 4/login 1/ad 1)|契约(wiki/design/c-end 43 页 spec §8 接口 + 6 PRD + decisions + tables 11 新表)|已实现(uniapp 7 页 + 后端 12 端点 + 桩协议启停闭环 18/18 验收)。

开发载体决策:续建 c-app-uniapp(Vue3 uniapp,非新建工程/taro);后端随 server-cdz 单体(C 端聚合层模式沿用 CendCharging:Controller+VOs record+Service 归属校验 40403 防枚举);c-prototype2 仅作视觉/交互参照不再迭代。

一、决策点(E11-E15,带建议——批准后按建议执行)

E11 微信登录对接时机 · 建议:手机验证码先行,微信登录后置

现状 c-login 手机验证码(dev 固定 123456)链路已通;微信资质未定(OAuth appid/secret),微信授权登录单独排期,契约占位(wxCode 字段已在 CLoginReq,见 wiki/design/c-end/pages/cend-login spec)。

E12 支付通道形态 · 建议:沿用 dev mock 通道,正式支付(微信支付分/支付资质)单列

充电结算支付沿用 CDZ_REFUND_DEMO_PAY_SNAPSHOT mock;钱包充值走 payment mock 渠道(P27 冒烟已绿);真实支付渠道需商户资质,不在本方案批次内。

E13 地图供应商 · 建议:高德/腾讯 H5 地图,key 待申请(占位先列表视图)

找桩地图页依赖地图 key(manifest 配置);申请前地图页降级为附近列表视图(nearby 已有),key 就绪后启地图层。

E14 5 Tab 导航启动批次 · 建议:P0 首建

首页/订单/会员/消息/我的 5 Tab 先行(c-end-design §4.1 权威),消息 Tab 内容源=service 客服/通知(session 表雏形)。

E15 结算编排接线批次 · 建议:P1 前置(账单/发票依赖 BILLING→HAVE_FINISHED)

当前订单 stop 后卡 orderStatus=5(M2.2 缺口,WalletSettlementService 三池无编排层)——P1 订单域前先接线 5→6(dev 替身升级为正式编排),否则账单/占位费/发票页无完结订单可展示。

二、目标架构

前端(c-app-uniapp,Vue3 + pages.json)

  • 5 Tab:首页(找桩)/订单/会员/消息/我的(uni-app tabBar 5 项);36+ 业务页 + 登录 + 扫码等非 Tab 页
  • 请求层三态:utils/request.js(已建:USE_MOCK 开关 / BASE 可配 VITE_API_BASE / L1 信封解包 / 40100 清会话跳登录 / 白名单标注);mock.js 与真后端契约同构纪律(每 API 先 mock 后真接,调用方零改动)
  • 常量/枚举/色码引用统一(金额分→元/状态 7 态/订单 10 态文案,防硬编码)

后端(server-cdz,域聚合层模式)

  • 公开层(白名单):GET /api/station/nearby(已有)、GET /api/station/page(已有)、GET /api/station/c-detail/{id}(已有)、/api/ping;新增公开仅限搜索/城市等无敏感类
  • 会员层:/api/c-end/{domain}/**——CendCharging(已有 6 端点)/ CendStation / CendOrder / CendAccount / CendMember / CendService 六聚合;统一 JWT C_END_MEMBER + memberId 归属校验(越权与不存在同码 40403 防枚举)
  • 鉴权红线:AuthInterceptor PUBLIC_PATHS/PREFIXES 白名单仅放行无敏感端点;新增任何公开端点须过主控审(防枚举/越权)

数据(PostgreSQL cdz 库,迁移 V15+)

  • c-end-tables 11 新表迁移(member_wechat_bind/member_station_favorite/cend_invoice_title/member_service_faq_category/member_service_faq/member_service_session/member_service_message/cend_stat_bill_cache/member_sign_record/member_invite_record)——逐表标注双轨口径(C 端新表 vs V5 保留/派生:sign/invite 现读 V5 保留表,如建新表需一致性决策)

三、差距矩阵(六域,逐域子任务深挖填表)

station 找桩域(11 spec 页)+charging 充电域(7 spec 页)—— 子任务 A 实测

spec 页(优先级)uniapp 现状后端已实现 / 缺口
home 首页找桩(P0)index.vue ✓(nearby 简卡;搜索/城市仅占位)nearby ✓(缺 price/memberPrice/tags/parking 聚合字段)
map 地图(P0)/ search(P0)/ city(P1)三页全缺缺(city=站去重派生无独立表;地图 key 未申请,先降级列表)
station-detail 详情(P0)detail.vue ✓(站+桩+枪+电价)c-detail ✓(缺 memberPrice/评价摘要/占位费卡)
price-detail / connector 枪选择(P0)detail 内嵌(无独立页)c-detail.priceInfo 部分(缺会员价比列);connectorList ✓ 缺 insertGunStatus/分组
frequent 收藏常用地 / review 评价 / feedback 场站反馈 / guide 指引(P1)四页全缺缺(member_station_favorite 未建表;review/feedback 复用 member_experience/member_feedback 已有表无接口;guide 依赖 site_guide [待确认]列)
charging scan/start/realtime/settle(P0)4 页 ✓(桩协议链路已通 18/18)c-end/charging 6 端点 ✓(settle 为雏形 NOT_STARTED;payment 端点缺)
gun-status 枪状态(P0)/ plug-and-charge 即插即充(P1)/ schedule 预约(P1)三页缺connector/{code} 可扩展(补 insertGunStatus/reasonText);plug/预约缺——预约表 business_scheduled_reservation DDL 已有
  • API 新增草案(统一 /api/c-end/station/**):list(nearby 聚合扩展)/ map / search / city/list+reverse / favorite 组(POST/DELETE/GET list)/ review list+POST / feedback POST / reservation 组(POST+list+cancel+connectors)/ plug ability;公开=找桩读(list/map/search/city/review-list),会员=收藏/评价写/预约
  • P0 契约要点:station/list 卡=站基础+price/memberPrice+快慢超充三档空闲/总数+停车/tags/favorite/plugChargeEnabled(空闲口径=IDLE 且 insertGunStatus 未插枪,排除 BUILDING/OFFLINE,离线=last_report_time>90s);reservation=1 枪 1 活跃冲突 40901、scheduledTime>now+5min、落 business_scheduled_reservation 5 态
  • 桩协议红限:0x68 无预约/占枪下行指令、桩 03/13 不上报 RESERVED → 预约只能「定时启动非锁枪」,RESERVED 平台派生(schedule.md BR-27);WS ≤3s 实时通道未建(现 REST 3s 轮询兜底,P1 排 WS)

order 订单发票域(8 spec 页)+account 资产域(6 spec 页)—— 子任务 B 实测

spec 页(优先级)uniapp 现状后端已实现 / 缺口
order-list / order-detail(P0)全缺B 端 OrderController.page/detail/六区块读已实现 无 member 过滤(C 直调即越权)→ C 端新聚合强制 subject;detail 需补 join pay_order/pay_refund/occupancy
bill 月度账单(P0)缺零实现(双环图+节省卡依赖 cend_stat_bill_cache T+1 缓存表——未建)
invoice 开票 / invoice-title 抬头 / invoice-history(P0/P1)全缺仅 finance_invoice DDL 无代码;cend_invoice_title 未建表;ISSUED 需税控→先落「申请→PENDING 审核」
occupancy-appeal 申诉 / occupancy-list 占用订单(P1)缺business_occupancy_appeal DDL 在(双审核+赔付族)无 DO/接口;business_occupancy_fee DO+O5 补偿引擎已实现(仅终态补收)
mine 我的(P0)缺member_member/pay_wallet/points/plate 表在;mine 聚合端点缺
wallet 钱包 / recharge 充值(P0)缺pay_wallet 三池+WalletController B 端(path memberId 无归属校验);recharge=运营直充非收银台 → C 端充值建 pay_order+mock 通道+回调幂等
vehicles 车辆 / settings 设置 / profile 资料(P1)缺member_plate CRUD ✓(R-member-14 ≤5/唯一/默认复用需镜像改造);vehicles 3 增列(vehicle_use/operating_cert_status/plug_charge_enabled)与 member_member.email 需 ALTER;注销四维拦截无
  • 结算编排缺口(阻塞量化,E15 必先接线):OrderStateMachine 5→6 等 7 项待接、settlement/ 包全 UOE 骨架、stop 后卡 5 永久占枪(D4 靠 DB 替身)——真实单到不了 6/7 → 订单 Tab/详情金额/发票整链/账单/钱包流水全空态;已就绪底座:business_order 金额族列+pay_order/pay_refund DO+finance_invoice/occupancy_appeal DDL——只缺编排写路径与 C 端读端点
  • P1 契约要点:order/list(10 态 Tab)→ detail(金额拆分+时段+payment/refund/occupancy 区)→ bill/summary(stat_bill_cache);wallet(三池+四类流水)→ recharge(amountFen+channel→pay_orderNo+prepayParams mock,2h 超时关闭 Job 后置);invoice titles CRUD+apply(先 PENDING);occupancy-appeal 7 日窗双审核
  • 风险:支付 mock 演示话术标注;发票税控/数电后置(ISSUED 下载留 M2.5 税务批);车牌 OCR/改绑短信基础设施未备

member 会员营销域(7 spec 页)+service 客服域(4 spec 页)—— 子任务 C 实测

spec 页(优先级)uniapp 现状后端已实现 / 缺口
member-center 会员中心 / coupons 券(P1/P0)全缺/api/member/{id} 聚合 ✓(等级/积分/近期订单);券读侧 /api/marketing/coupon 按 memberPhone 模糊+脱敏 → 需 memberId 归属过滤改造;paid 订阅无表无接口(先不开放付费)
points 积分 / points-exchange 兑换 / activity 活动(P1)缺积分流水 ✓(memberId 筛);兑换商品/活动表无 → 全新建(商品可挂 member_coupon 模板 B14)
sign 签到(P1)缺sign-records ✓ 但读 V5 保留表(无连续/补签)→ 新表 member_sign_record+4 端点(do/retroactive/claim/日历)
invite 邀请(P1)缺invitations ✓ 但 V5 派生二态(无首单/奖励)→ 新表 member_invite_record 三态;MVP 兜底积分流水 change_type=5
service-center 客服 / unplug-guide 拔枪(P1)缺FAQ 与 B 端 faq.md 共表 member_service_faq(_category)(未建库 E5=乙)→ 消费侧纯读+resolved 计数回写
live-chat 在线客服(P1)缺member_service_session/message 未建库;坐席 agent_id 待 T11 → 先会员侧会话落库雏形(单会员单 ACTIVE)
feedback 意见反馈(P1)缺member_feedback 表已建无接口(B 端亦无)→ 提交/列表/详情 3 端点全新建
  • P2/P3 契约要点:coupons list(faceValue 单位口径待定:spec 分 vs 后端元——建议 C 端直接元)/redeem 幂等;points balance+transactions;sign 日历+连续+补签(月≤5 扣点递增)+签到券档;invite 码+三态记录;service center/faq list/hot/feedback 防刷;chat session/messages/message/close;feedback 3 端点(slaExceeded>48h 前端推导)
  • 表:member_sign_record/member_invite_record/member_service_faq×2/session/message 6 新表;member_coupon V7 已建(C 端只读);双轨口径注记(sign/invite V5 保留 vs C 端新表并存,决策记录)
  • 风险:签到奖励值两源不一(+2/次 vs 每日 5 分)以 member_points_rule 配置为准待运营定稿;券面额分/元冲突;IM 坐席 T11/T12 待定;FAQ 分类命名两源;鉴权域隔离缺失(member/marketing B 读端点无角色守卫 → C 端全部服务层强制 subject=memberId)

四、批次计划(4 批,每批后端先行→前端真接→verify 冒烟扩批→CDP 抽查)

批范围工期前置依赖产出验收
P0主链强化5 Tab 框架 + 找桩域补全(地图降级列表/搜索/城市/收藏/评价)+ 充电域预约/枪状态页1-1.5 天E14 拍板主链 H5 可演示(登录→找桩→详情→扫码→充电→结算)
P1订单资产结算编排 5→6 接线 + 订单列表/详情/账单/占位费申诉 + 发票抬头/历史 + 钱包/充值(mock)/车辆2-2.5 天E15 拍板;V15 迁移verify-cend-order/account 绿;完结订单全链可见
P2会员营销我的券/领券/积分明细/签到页/邀请页(复用 B 端读侧+归属过滤)1.5 天member 读侧改造verify-cend-member 绿
P3客服边缘服务中心/FAQ(今日 spec 已补)/在线客服 session 雏形/设置/意见反馈1-1.5 天—verify-cend-service 绿;FAQ 可用
总工期约 6-7 天(P0-P3 顺序 + 并行空间:P1 结算接线可与 P2 前端并行)。每批沿用:静态验收 → node67 编译/测试 → 提交 → CI 镜像(touch .gitlab-ci.yml 触发)→ 部署 server-<id> → 冒烟 → CDP。

五、技术方案要点

  • 鉴权:C_END_MEMBER JWT(subject=memberId);白名单严控仅 c-login/nearby/c-detail/page/ping;新增公开端点主控审
  • 归属校验:所有 /api/c-end/** 服务层 requireOwnOrder/memberId==AuthContext.userId(),越权与不存在统一 40403(防枚举,已立 CendCharging 先例)
  • 错误码:复用 40xxx(40001 参数/40100 会话/40101 凭证/40403 订单/40901 状态/40903 冲突/42201 校验)——新增域码注册进 ErrorCode.java(如 4043x 域实体)
  • 序列化:bigint→string 全局 JacksonConfig;金额 BigDecimal 元;时间 ISO-8601+08:00
  • 结算编排(P1 前置):BILLING(5)→结算金额落时段明细→HAVE_FINISHED(6) 正式接线(WalletSettlementService 三池+正向计算 R-order-09 口径);替换 D4 的 DB 替身 5→6
  • 表迁移:db/V15__c_end_domain.sql(11 表 IF NOT EXISTS 幂等,与 V1-V14 同款约定);执行:主控随部署对 cdz 库 psql(教训:先 \l 核验目标库)
  • H5 构建发布:uniapp npm run build:h5 → dist 静态挂 nginx(复用 cdz-docs 同款 ConfigMap 模式或并入 c 站 cdz.c.gridvo.com 新版本)——P0 尾交付预览 URL

六、验收标准(每批硬性)

层硬性验收
契约43 页 spec §8 接口与实现一一对应(或显式 [待后置] 标注);verify-cend-*.sh 冒烟断言 L1 信封 code=0 + 归属 40403 + 白名单穿透 + 40100
前端uniapp H5 全链 CDP:登录→找桩→扫码/输码→充电中 realtime 3s→停止→结算→订单→账单/发票 链路 PASS;mock 与真后端零差异演示
后端node67 mvn 编译 + 既有 83+ 测试无回归;新域单测(归属/守卫/状态)
数据V15 迁移 0 ERROR 且表核验;双轨口径决策记录(V5 vs 新表)

七、风险与预案

风险预案
支付资质未定(充电支付/钱包充值)dev mock 通道兜底(E12);真实渠道单列后续
微信登录资质未定手机验证码先行(E11);CLoginReq.wxCode 占位
地图 key 未申请地图页降级列表视图(E13);key 就绪启层
结算编排缺口(卡 5)阻塞账单/发票E15:P1 前置正式接线(替代 D4 DB 替身)
桩联调依赖(实时充电演示需模拟器常驻)node67 模拟器 40055825050010 常驻脚本化;100 桩压测能力已备
CI changes 判空(镜像构建不触发)touch .gitlab-ci.yml 注释触发(已验证绕行)
双轨表口径(sign/invite V5 vs 新表)spec [待确认] 决策记录;默认沿用 V5 读派生直至 C 端写需求