〇、总览与差距基线
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 端写需求 |