fujian_water_biz_doc/docs/evidence/rev003-charging/2026-07-15-p0-verification.md

5.3 KiB
Raw Blame History

REV-003 营业收费 P0 验证证据

1. 验证结论

2026-07-15 完成营业收费 P0 代码整改和定向验收。后端营业模块 106 项测试、银行冲正 1 项测试、29 个 Maven reactor 模块编译、前端 38 项 Node 契约测试及 Vite 全量构建均通过。

验证期间未运行 vue-tsc

2. 实施提交

后端 fix/rev003-charging-p0

提交 内容
098749d58 增加柜台支付幂等和金额拆分字段
04a5247a2 统一本金与违约金口径
d72a360f2 账户加锁并去重柜台预存充值
276d90df7 新增原子多账单柜台收费命令
25c385c27 封堵通用财务状态和余额修改旁路
f0b906048 按显式支付记录执行柜员结账
6c2e4850c 修复已结/未结预存红冲状态路径
a4d3cc0cc 防止银行假冲正和预存回调重放

前端 fix/rev003-charging-p0

提交 内容
fe21be95 柜台收费切换为单次原子批量提交
06a5d70a 柜台结账只提交显式勾选的支付记录

3. 后端验证

营业模块定向测试

mvn -pl sw-business/sw-business-server \
  -Dtest=CounterChargeAmountCalculatorTest,CounterChargeApplicationServiceImplTest,PaymentRecordServiceImplTest,ChargeServiceCounterPaymentTest,AccountServiceImplConcurrencyTest,CounterSettleApplicationServiceImplTest,PaymentQueryServiceTest,PrestorageBpmCallbackServiceTest \
  -Dsurefire.failIfNoSpecifiedTests=false test

结果:退出码 0Tests run: 106, Failures: 0, Errors: 0, Skipped: 0BUILD SUCCESS

银行冲正测试

mvn -pl sw-business-bank/sw-business-bank-server \
  -Dtest=PayInvalidServiceImplTest \
  -Dsurefire.failIfNoSpecifiedTests=false test

结果:退出码 0Tests run: 1, Failures: 0, Errors: 0, Skipped: 0BUILD SUCCESS。测试日志中的异常栈为用例主动模拟业务红冲失败,用于验证银行原交易不会被错误标记为已冲正。

后端编译

mvn -pl sw-business/sw-business-server,sw-business-bank/sw-business-bank-server \
  -am -DskipTests compile

结果:退出码 029 个 reactor 模块全部 SUCCESS,最终 BUILD SUCCESS

4. 前端验证

P0 契约测试

node --test \
  tests/operatingCharges/counterChargingP0Flow.test.mjs \
  tests/operatingCharges/counterCheckoutExplicitSelection.test.mjs \
  src/views/operatingCharges/counterCharging/counterTopup.contract.test.mjs \
  src/views/operatingCharges/counterCheckout/redFlushReason.contract.test.mjs \
  tests/operatingCharges/counterChargingZeroAmount.contract.test.mjs \
  tests/revenue-bugs/counterChargeAndCheckoutDisplay.contract.test.mjs \
  tests/rev006/counterCheckoutOldPageInventory.test.mjs

结果:退出码 0tests 38pass 38fail 0

覆盖点包括:

  • 本金与违约金按分计算,拒绝非法和负数金额。
  • 同一批次只调用一次原子收费接口,重试期间复用请求号。
  • 无欠费预存可连续操作,零金额账单不会误进入预存模式。
  • 当前仅现金渠道可直接提交,配置异常时仍回退现金安全项。
  • 结账只提交明确勾选且去重后的支付记录 ID切换支付方式或刷新数据时清除选择。
  • 结账金额和展示优先使用渠道实收,预存抵扣独立表达。
  • 已结、未结红冲原因均为必填。

Vite 全量构建

build:dev 脚本已确认仅执行 vite build --mode dev,不包含 vue-tsc

第一次按 Node 默认堆上限执行时,在 Rollup 大体量打包阶段触发约 4GB 堆上限,报 JavaScript heap out of memory。随后不修改源码和构建配置,仅提高本次 Node 堆上限复验:

NODE_OPTIONS=--max-old-space-size=8192 \
  node ./node_modules/vite/bin/vite.js build --mode dev

结果:退出码 0输出 Build successful. Please see dist directory

构建仍会输出项目既有的中文 SVG symbolId 命名警告和 Rollup PURE 注释警告,本轮未新增相关资源,也不影响构建成功。

5. 数据库集成门禁

当前环境未设置 REV004_IT_DB_URL,因此未执行依赖真实数据库的可选集成测试。上线前仍需在目标 PostgreSQL 环境验证:

  1. 新增列、条件唯一索引和历史空值兼容 DDL 已完整部署。
  2. 同一 requestId 重试不重复收费或充值。
  3. 同一账单并发收费只有一个请求成功,失败批次不留下部分支付或余额变化。
  4. 柜员结账金额等于所选记录的渠道实收之和。
  5. 已结/未结预存红冲正确扣减余额并生成唯一反向流水。

6. 已知非本轮问题

实施期间单独运行完整 ChargeServiceAccountingAdjustTest 时,既有用例 testAdjustAccounting_usageGarbageFeeUsesCustomerBasicNumberOnly 出现期望 12.34、实际 1221.66 的失败。该用例属于用量垃圾费账务调整,不在 REV-003 P0 范围;本轮涉及的通用财务旁路定向方法测试和上述 106 项收费测试均已通过。该问题应作为 REV-004 独立缺陷继续处理。

7. 发布约束

  1. 先部署数据库 DDL再部署后端最后部署前端。
  2. 不回退通用营业账/账户更新的财务旁路封堵。
  3. 首批只开放现金柜台收费;非现金渠道接入真实确认前保持禁用。
  4. 上线后按 payment_batch_norequest_id、账户流水和结账差异持续观察。