采集协议单 · 优惠价驱动缴费金额 — 设计说明
日期:2026-10-09
状态:已确认
范围:web-admin 采集协议单新增/编辑(细胞存储)、相关工具函数与保存校验;后端按样本缴费保存校验对齐
取代:2026-07-06-protocol-payment-defaults-design.md 中的「样本数 × 缴费模式」硬编码价目表默认合同金额逻辑
1. 目标
- 废除价目表:不再使用
22880 / 25880 / 37880 / 41000 / 44000 及各期写死拆分作为合同/应缴默认值。
- 优惠价为唯一金额源(新建与变更时):
- 样本合同金额 = 该样本优惠价
price
- 样本合同合计 = Σ 各有效样本合同金额
- 协议总金额默认 = 样本合同合计
- 分期不默认金额:按「期数 + 间隔 + 开始日」生成期次与应缴日;每期金额留空手填;保存时每期金额与应缴时间必填,且各期之和 = 该样本合同金额。
- 历史已核对数据不被重算:打开编辑以库内缴费为准;仅用户改优惠价时同步该样本合同。
2. 已确认产品决策
| # |
议题 |
决策 |
| D1 |
价目表 |
全部去掉(新旧一律不再走价目表代码路径) |
| D2 |
协议总金额 |
默认同步合计,可手改;与合计不一致仅提示,不阻断 |
| D3 |
分期期次生成 |
仍用期数 + 间隔 + 开始日;金额空;应缴日可预填可改 |
| D4 |
历史打开 |
以库内缴费为准;改优惠价才同步该样本合同 |
| D5 |
实现范围 |
前端去价目 + 统一按优惠价;后端保存校验对齐(方案 B);不做历史金额迁移脚本 |
3. 金额规则
3.1 样本层
| 字段 |
规则 |
原价格 originalPrice |
仍可由样本类型 storagePrice 带出;不参与合同默认 |
优惠价格 price |
用户设置;合同金额来源 |
| 样本合同金额 |
= price(新建方案时;或用户改 price 后同步) |
| 趸交应缴 |
单期 dueAmount = 合同金额 |
| 分期各期 |
金额不默认;用户填写;Σ = 合同金额;每期须有应缴时间 |
3.2 协议层
| 字段 |
规则 |
| 样本合同合计 |
Σ 各样本 contractAmount(只读展示) |
| 协议总金额 |
未手改时跟随合计;手改后可偏离,仅弱提示 |
3.3 优惠价变更
- 无已财务确认(
yjf)转账时:将该样本 contractAmount 更新为新优惠价。
- 趸交:同步唯一期
dueAmount。
- 分期:不自动改写各期金额;保存前须各期之和仍等于新合同,否则阻断并提示用户调整。
3.4 编辑打开
- 不用当前优惠价覆盖库内
contractAmount / 各期 dueAmount。
- 新建样本缴费方案时:合同 = 当时优惠价(无优惠价则合同为空,提示补价后再配缴费)。
4. 校验
4.1 前端保存(v2 按样本)
| 规则 |
强度 |
| 有效样本须有样本编码(已有按样本方案时) |
阻断 |
分期/分改趸:每期 dueAmount 有值且 > 0 |
阻断 |
分期/分改趸:每期 dueDate 非空 |
阻断 |
| 未作废期应缴合计 = 该样本合同金额 |
阻断 |
| 协议总金额 ≠ 样本合同合计 |
仅提示 |
| 样本合同与优惠价不一致(可选弱提示) |
仅提示(允许历史核对后手改合同的边界;新建以优惠价写入) |
4.2 后端
与前端阻断项对齐:sample_payment_schedule_validate(或等价)校验各期必填与合计 = 合同;不依赖价目表常量。
5. 删除 / 停用范围
| 项 |
处理 |
protocol-payment-presets.ts 中 PRESETS 及 resolvePaymentPreset |
删除价目;保留 getActiveSampleCount / availablePayModes / isInstallmentPayMode 等非金额工具(若仍被引用) |
resolvePerSamplePreset / 硬编码 22880 等 |
删除;改由优惠价解析 |
ProtocolFormDialog v1:applyPaymentPresetForMode、样本数变化套价目 |
删除套用逻辑;v1 编辑仅展示库内值,不再填默认合同 |
| 新建 |
一律 paymentModelVersion=2,不出现整单价目填充 |
不做:历史协议金额批量迁移;强制把 v1 明细拆成按样本(本期)。
6. UI 行为摘要(SamplePaymentPanel)
- 样本增减:无方案则新建趸交方案,
contractAmount = price(无 price 则 null)。
- 切换趸交:合同 = 优惠价,一期应缴 = 合同。
- 切换分期/分改趸:保留/写入期数间隔开始日;生成期次行时 dueAmount 为空;dueDate 按公式预填。
- 合同金额字段:可展示;与优惠价联动策略见 §3.3;用户仍可手改合同(保存时各期之和须等于合同)。
- 去掉「套用默认分期金额模板」的一切入口。
7. 非目标
- 意向金自动冲抵样本合同。
- 强制协议总金额 = 样本合计。
- 历史 v1 → v2 自动拆分迁移。
- 价目表配置化(本期直接删除硬编码,不换成配置表)。
8. 验收要点
- 两样本优惠价 20000 + 22000 → 样本合同分别为 20000/22000,合计与默认协议总金额均为 42000。
- 分期生成后各期金额为空;不填金额或应缴日无法保存。
- 各期填满且之和 ≠ 合同 → 无法保存。
- 打开历史单金额与打开前一致;改某一优惠价后仅该样本合同(及趸交应缴)更新。
- 代码与测试中不再出现作为默认合同的 22880/25880/37880/41000/44000 套用路径。