2026-10-09-protocol-preferential-price-payment-design.md 5.5 KB

采集协议单 · 优惠价驱动缴费金额 — 设计说明

日期:2026-10-09
状态:已确认
范围:web-admin 采集协议单新增/编辑(细胞存储)、相关工具函数与保存校验;后端按样本缴费保存校验对齐
取代:2026-07-06-protocol-payment-defaults-design.md 中的「样本数 × 缴费模式」硬编码价目表默认合同金额逻辑


1. 目标

  1. 废除价目表:不再使用 22880 / 25880 / 37880 / 41000 / 44000 及各期写死拆分作为合同/应缴默认值。
  2. 优惠价为唯一金额源(新建与变更时):
    • 样本合同金额 = 该样本优惠价 price
    • 样本合同合计 = Σ 各有效样本合同金额
    • 协议总金额默认 = 样本合同合计
  3. 分期不默认金额:按「期数 + 间隔 + 开始日」生成期次与应缴日;每期金额留空手填;保存时每期金额与应缴时间必填,且各期之和 = 该样本合同金额。
  4. 历史已核对数据不被重算:打开编辑以库内缴费为准;仅用户改优惠价时同步该样本合同。

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)

  1. 样本增减:无方案则新建趸交方案,contractAmount = price(无 price 则 null)。
  2. 切换趸交:合同 = 优惠价,一期应缴 = 合同。
  3. 切换分期/分改趸:保留/写入期数间隔开始日;生成期次行时 dueAmount 为空;dueDate 按公式预填。
  4. 合同金额字段:可展示;与优惠价联动策略见 §3.3;用户仍可手改合同(保存时各期之和须等于合同)。
  5. 去掉「套用默认分期金额模板」的一切入口。

7. 非目标

  • 意向金自动冲抵样本合同。
  • 强制协议总金额 = 样本合计。
  • 历史 v1 → v2 自动拆分迁移。
  • 价目表配置化(本期直接删除硬编码,不换成配置表)。

8. 验收要点

  1. 两样本优惠价 20000 + 22000 → 样本合同分别为 20000/22000,合计与默认协议总金额均为 42000。
  2. 分期生成后各期金额为空;不填金额或应缴日无法保存。
  3. 各期填满且之和 ≠ 合同 → 无法保存。
  4. 打开历史单金额与打开前一致;改某一优惠价后仅该样本合同(及趸交应缴)更新。
  5. 代码与测试中不再出现作为默认合同的 22880/25880/37880/41000/44000 套用路径。