TECHNICAL DEVELOPMENT DESIGN · V2

VWCG-1190 补单管理

把设备离线、餐盘未绑定等遗漏消费补成可结算、可退款、可对账、可统计、可追溯的正式消费订单。

基线:origin/master @ e22cbb2ca 文档日期:2026-08-20 状态:核心实现完成,待联调 业务代码:未提交

评审导航

  1. 关键决策
  2. 需求范围
  3. 数据模型
  4. 后端架构
  5. 接口契约
  6. 权限与安全
  7. 报表与导出
  8. 一卡通边界
  9. 实施与验收
  10. 阻断项

关键决策

双记录模型补单表保存原因、操作人和试算/结算快照;ydy_meal_order 仍是退款、报表和导出的正式订单真源。
禁止使用 OrderSource=8最新 master 中 8 已经是咖啡机订单。补单复用 source=2,另用补单标识区分。
七项输入部门、档口、姓名、消费时间、消费机、订单金额、补单原因。
六项结果优惠金额、服务金额、实付金额、现金支付、补贴支付、赠送支付。
服务端权威计算试算只用于展示;提交时重新计算。策略、余额或限制变化必须要求重新确认。
退款不删除退款只改变正式订单与补单状态,并追加操作日志;不得物理删除补单。

需求范围

本需求本质是资金补偿流程,不是后台手工插入订单。

范围内不做
独立补单菜单、列表、详情、试算、提交、异步 XLSX、消费订单补单标识、退款和报表联动。消费订单页不加新增入口;前端不计算最终金额;不伪造刷卡/刷脸;一期不录菜品明细;不物理删除。

时间口径

consume_time 决定策略、餐次、补贴有效期和统计账期;create_time 记录补单提交时间。餐次由后端推导,不由前端填写。

数据模型

正式消费订单

字段用途
is_supplement0 正常订单,1 补单
supplement_id与补单主表一一关联;普通订单写 NULL,避免唯一键默认值冲突
supplement_no列表、详情和导出快速回显;普通订单写 NULL

补单主表

保存补单号、幂等键、正式订单关联、人员/部门快照、档口、设备、实际消费时间、订单金额、原因、策略快照、六项结算金额、结算单 ID、状态、错误信息、门店与标准生命周期字段。

SQL 约束正式发布版本未确认前不创建猜测版本 SQL;菜单只写 db/menu.sql;新表必须包含项目规定的 is_delete/create_by/create_time/update_time 四字段。

后端架构

从设备消费服务中抽取与设备协议无关的共享结算核心。设备链路保留 paycode、msgid、在线/离线、MQTT 和设备重试;PC 补单只调用领域服务,不伪造设备请求。

1 输入校验权限、人员、档口、设备、金额、原因
2 试算推导餐次,匹配策略与限制
3 再校验锁账户,比较 quote hash
4 结算落单本地钱包或一卡通适配器
5 回读追溯返回补单号和正式订单号

跨库或第三方调用不能被描述为一个普通数据库事务;失败必须保留状态、幂等键、远端交易号和补偿证据。

接口契约

接口职责
POST /p/supplementMealOrder/list补单列表与组合筛选
POST /p/supplementMealOrder/detail补单、消费、结算、正式订单和操作记录
POST /p/supplementMealOrder/quote七项输入换取策略、六项金额和 quote hash,不扣款
POST /p/supplementMealOrder/create重算、幂等扣款、生成正式订单
POST /p/supplementMealOrder/export创建异步 XLSX 任务
POST /p/supplementMealOrder/exportLogs导出日志

消费订单 list/detail/export 同步增加补单标识、补单编号与正确的订单生成时间。响应继续使用现有 {code,message,data} 结构。

权限、安全与审计

独立菜单权限补单查询、详情、试算、创建和导出分别受控,不能借用消费订单权限创建资金记录。
对象级数据权限人员/部门、餐厅和设备归属必须全部校验;详情、导出和退款同样校验。
不信任前端策略 ID、餐次、六项金额、人员名称和部门名称都由后端解析或重算。
审计脱敏记录对象、金额、结果和错误码,不记录完整手机号、卡号、令牌或钱包敏感快照。

报表与异步导出

该列表页关联异步导出功能,需同步确认/修改异步导出逻辑。
范围结论
消费订单 XLSX必须新增“是否补单”“补单编号”,保持流式 XLSX,不改 CSV。
人员/部门/设备正式订单同表聚合,通常无需新增字段,但必须验证实际消费时间、状态和权限。
餐厅/档口应按实际消费时间自动计入,必须做账期回归。
菜品销量/营养一期无菜品明细,不计入;需产品接受。
充值/补贴统计不改变充值和发放记录,无需同步字段。

一卡通边界

上线阻断一卡通开启且用户已映射时,必须走受支持的远端消费与本地镜像;不能静默改走本地钱包。第三方不支持补记历史消费时,一期应明确阻断这类补单。

回归需覆盖:关闭+访客、关闭+历史映射用户、开启+访客、开启+一卡通用户。远端成功本地失败必须进入现有补偿状态,不能删除记录掩盖。

实施与验收

切片人工估算(未使用 AI)
契约、SQL、枚举和模型6~8h
共享策略/结算核心与单测12~16h
接口、权限、审计和幂等10~14h
前端列表、试算、提交和详情12~16h
退款、报表和异步导出8~12h
Apifox、回归、截图和发布证据8~12h
合计56~78h,不含一卡通第三方等待

详细接口用例见 test-cases/api-contract-test-plan.md。涉及菜单、角色、路由和 UI 必须附真实页面证据;异步导出必须生成 XLSX 并通过结构校验。

上线阻断项

  1. 一卡通是否支持后台补记账、历史交易时间和对应冲正。
  2. 补单编号规则。
  3. 消费订单显示“后台补单”与补单页显示钱包构成的命名口径。
  4. 一期不录菜品明细、因此不进入菜品销量和营养统计是否接受。
  5. 是否支持部分退款。
  6. 正式发布版本号与数据库升级窗口。
本轮状态已在 codex/VWCG-1190-supplement-order-management-20260820 完成后端、前端、权限、退款和异步导出核心实现。专项测试与前端生产构建通过;代码未提交、未推送,正式版本 SQL 与真实数据库全链路仍待确认。