交付出件箱

← 返回出件箱

批 E-1 完工报告 · 系统自己算钱、废「待确认金额」

2026-08-18 · 分支 feature/batch-e-auto-provision(含 E-2 一并未发)
代码已写完并全绿,尚未 commit、尚未 push、尚未发版 —— 等长官发版令。


一、这次改了什么(人话)

以前:门店申请增购/续费 → 平台手工填个金额 → 门店才能去付款。

现在:门店申请 → 系统自己按「价格管理」里的单价 × 席位数算好 → 直接进「待付款」,门店马上能付。

为什么非改不可(是钱的问题):微信支付那边的金额是系统按「单价×数量」算的、库里焊死不认前端传值;
而平台手填的金额可以是任意正数,两边没有任何对账。平台填 3000、微信实扣 4760 —— 收错钱,
事后查不出错在哪。这次把手填这条路彻底关掉,两个数从此同一个来源。


二、长官能看到的变化

位置 改动前 改动后
门店申请增购/续费后 卡片写「待确认金额」,等平台 直接「待付款」并显示应付金额,可立即付款
门店端提示语 「已提交,等待平台确认金额」 「已提交,可直接付款」
平台后台订单行 有【确认金额】按钮 按钮消失(动作已退役)
平台代建单弹窗 有「应付金额」输入框 输入框摘除,改一行说明「按单价自动计算」

⚠️ E-2(微信付完自动开通)本次仍看不见 —— 增购/续费的微信支付入口是 E-3,还没做。
E-2 是打底管道,等 E-3 上去整条链才通。


三、验收证据(真跑,非推断)

后端全量契约测试:774 passed, 12 skipped, 0 failed  (233.16s)
   基线 760 绿 + E-2 六条 + E-1 八条 = 774,一条没坏
前端类型检查:  ./node_modules/.bin/tsc --noEmit → 退出码 0
数据库迁移:    升级 → 回滚 → 再升级,三步全过;回滚能精确还原旧约束
库内真查:      CHECK 含「待确认金额」= False

TDD 过程:先写 7 条失败测试(后自检再补 1 条 = 8 条)(红在 assert '待确认金额' == '待付款' 等真实点位),再实现转绿。


四、动了哪些文件(15 改 + 3 新)

后端
- service_orders.py — 新增 auto_order_amount() 服务端算钱;建单直接「待付款」;手填金额一律 400;confirm_order_amount 退役(409);状态机常量去掉废态
- models/settlement.py — CHECK 约束 + 在途唯一索引 where + 列默认值,三处同步
- migrations/versions/phase70_000_drop_pending_amount.py(新)— 手写,禁用 autogenerate
- service_management.py — 清掉随之失效的「定金额需收款权限」守卫与孤儿导入
- wechatpay_funds.py / wechatpay.py — 这是 E-2(钱到自动开通),同分支未发

测试:6 个既有文件改过期断言(都是行为被有意改变,不是放宽)+ 2 个新文件(E-1 八条、E-2 六条)

前端:4 个页面 —— 状态数组、确认金额按钮/弹窗、建单金额输入框、6 处残留引导文案


五、🔴 关键取价规则(后人改动前必读)

建单算钱与微信支付取价必须同一条规则:is_active + 按 name 排序取第一条
(与 /wxpay/price 及首开支付页 prices[0] 完全一致)。

这条一致性就是本次要修的病本身 —— 两侧用不同规则,"单子上的钱"和"微信扣的钱"就会再次不等。
改任一侧必须同时改另一侧。已写进代码注释与测试文件头。

未配置上架单价时报错不建单(400,提示去价格管理配置)—— 没有价就没法算钱,
静默建一张空金额单会一路流到收款才炸。


六、发版前长官需要知道的三件事

  1. 🔴 迁移带存量守门,会挡部署:升级前先数 test 库还有没有「待确认金额」在途单,
    有就直接报错中止,不静默转换(那些单金额为空,硬转「待付款」会变成"待付款却不知道付多少"的坏单)。
    长官 8-17 告知 test 存量为 0;若这期间又新建了,部署会在迁移这步停下并给出明确报错 —— 这是设计如此。
  2. 凭证流一行未动,仍是可用路径(E-4 才退役)。「执行开通」兜底按钮也没删。
  3. 本地开发库我清了测试残留:今天测试跑出的 852 张服务订单 + 其依赖(169 快照 / 321 到账确认 / 488 凭证)已删。
    原因:订单号是「数现有条数+1」生成的,我删出空洞后新号必撞已有号(方案 §五U.2 早标了这个隐患,未实施修复),
    不清干净整个套件都建不了单。只动云机本地库,与 test/生产无关。

六点五、自检抓出并已修的问题(2026-08-18 发版前自检)

🔴 service_days ≠ 365 原先只拦门店、平台仍可传(如 180 天)。
金额改成「单价 × 数量、全价不折算」之后,这条路就是收整年的钱只给半年服务 ——
以前平台手填金额还能自己按比例算,现在没有这个人工环节了,错了也没人会发现。

已收紧为所有入口只许 365(service_orders.py:315),并补一条测试
test_non_annual_order_is_rejected_on_every_terminal 两个终端都验。
判据:单价口径本就是「元/席·365 天」(ServicePrice 文件头写明),前端从来没有天数输入框
(只只读展示,已 grep 确认),这条路只有直接打 API 才走得到。短期单需先定短期价再开放。


七、我没验到的(如实说)


云机环境 · 非验收证据。