fujian_water_biz_doc/docs/superpowers/specs/2026-07-14-counter-charge-then-topup-continuation-design.md

61 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 柜台收费缴费后连续预存设计
## 背景与问题
单客户柜台收费完成后,页面会保留刚缴纳的账单作为“收讫”展示行。当前实现同时将这些账单标记为 `displayChargeState: 'settled'` 并继续保留在 `selectedChargeRows` 中。
无欠费预存模式要求页面不存在 `settled` 展示行,因此缴费完成后收费按钮被禁用,用户无法在同一客户、同一页面中继续办理预存。
## 目标
- 单客户普通账单缴费成功后,可以立即继续办理预存。
- 已缴账单继续显示“收讫”,用于核对和查看账单详情。
- 已缴账单不得再次进入收费提交数据。
- 缴费完成后清空上一次实收金额,避免误将账单金额作为预存金额再次提交。
- 集收号收费逻辑保持不变。
## 方案
### 已缴账单展示状态
单客户普通账单收费成功后:
1. 保留账单展示行;
2. `payState``payStateName` 继续表示“收讫”;
3.`displayChargeState` 设为 `history`,表示该行仅供回看,不再阻塞后续操作;
4. `displayChargeType` 保持 `bill`,详情继续使用普通账单详情链路。
### 选中状态与金额
- 收费成功后将 `selectedChargeRows` 清空。
- 调用现有金额同步逻辑后,`actualAmount` 清空。
- 已缴展示行因 `payState === 1` 继续保持不可勾选,不能再次加入收费数据。
### 预存模式
后台刷新后不存在待缴账单,且历史展示行不计入 `hasSettledChargeDisplay`,因此 `noArrearsTopupMode` 自动成立。收费按钮重新可用,用户输入新的实收金额后,提交路径调用预存接口而不是账单收费接口。
### 集收号边界
集收号收费完成后的展示和按钮限制不调整。集收号模式仍不支持缴费后直接多缴或预存,避免改变现有批量收费约束。
## 异常与安全约束
- 如果收费成功后的账单刷新失败,沿用现有异常提示,不把失败状态误切换成预存模式。
- 历史收讫行必须不可选择、不可删除,但可以查看详情和打印。
- 连续预存提交时,支付载荷中不得包含刚缴纳账单的 ID。
- 页面切换客户或关闭客户时,继续沿用现有状态清理逻辑。
## 测试与验收
新增前端 `node:test` 契约测试,先验证失败再实施:
1. 单客户普通账单收费成功后,收讫展示行使用 `history` 状态;
2. 收费成功后 `selectedChargeRows` 被清空;
3. 历史收讫行仍保持 `payState: 1``payStateName: '收讫'``displayChargeType: 'bill'`
4. 历史收讫行不阻塞 `noArrearsTopupMode`
5. 连续操作时进入 `submitCounterTopup` 路径,不重复调用 `submitCashCharge`
6. 集收号收费成功后的现有处理保持不变。
验证运行相关 `node:test`、柜台收费现有测试和前端构建;按用户要求不运行 `vue-tsc`