Files
shanxia2.0/docs/superpowers/specs/2026-08-16-contract-settlement-method-options-design.md
T
2026-08-16 14:58:19 +08:00

98 lines
5.1 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.
# 合同结算方式:新增选项与第五条条款规则
## 目标
合同管理「结算方式」下拉增加 **按量结算 / 月结 / 季结 / 其他** 四个选项,供业务录入与列表/详情展示。
- **货到付款 / 款到发货**:继续按现状驱动合同打印富文本「第五条、结算方式及期限」及 PDF 同源内容。
- **新四项**:不走货到/款到那套自动条款;首次需填第五条时使用带当前选项 label 的约定句式;用户改过并保存后按结算方式分 key 保留草稿,不再被自动覆盖。
采用方案:**按结算方式分默认文案 + 现有占位符/草稿机制**(不拆第二字段、不真留空占位符)。
## 字典
字典类型:`crm_settlement_method`(已有)。
| dict_label | dict_value | order_num | 说明 |
|------------|------------|-----------|------|
| 货到付款 | `arrive_payment` | 0 | 已有;条款驱动 |
| 款到发货 | `advance_payment` | 1 | 已有;条款驱动 |
| 按量结算 | `volume_settlement` | 2 | 新增 |
| 月结 | `monthly_settlement` | 3 | 新增 |
| 季结 | `quarterly_settlement` | 4 | 新增 |
| 其他 | `other_settlement` | 5 | 新增 |
- 表单、列表 `DictTag`、详情展示继续读字典,**无需改下拉组件结构**。
- 需提供可重复执行的 SQL 迁移(`backend/scripts/`),并同步基线快照约定(`docs/sql/` 如有惯例则跟)。
## 第五条内容解析规则
仍使用:
- 模板正文第五条位置:`{{SETTLEMENT_METHOD_CONTENT}}`
- 分方式草稿字段:`settlement_clause_drafts`(JSON:`{ [settlementMethod]: string }`)
解析:
```text
content = drafts[settlementMethod]
|| defaultClause(settlementMethod)
```
### defaultClause
| settlementMethod | 默认正文 |
|------------------|----------|
| `advance_payment` | `款到发货。需方付款后安排发货,需方收到货物后,供方开具13%增值税专用发票。` |
| `arrive_payment` | `货到付款,需方收到供方货物后,供方开具13%增值税专用发票,无异议后,以现汇方式月结。` |
| `volume_settlement` / `monthly_settlement` / `quarterly_settlement` / `other_settlement` | `请根据双方约定填写结算方式:{label}。供方开具13%增值税专用发票,无异议后,以现汇方式月结。` |
| 其它未知值 | 回退 `arrive_payment` 默认文案(兼容脏数据) |
其中 `{label}` 为字典 label(按量结算 / 月结 / 季结 / 其他)。示例:
- 月结 → `请根据双方约定填写结算方式:月结。供方开具13%增值税专用发票,无异议后,以现汇方式月结。`
- 按量结算 → `请根据双方约定填写结算方式:按量结算。供方开具13%增值税专用发票,无异议后,以现汇方式月结。`
### 「占位不变」在本方案中的含义
1. 存库模板第五条仍保存为占位符(与现网一致),打开打印/生成 PDF 时再解析。
2. 新四项**不得**误用货到付款/款到发货整段默认句(这是相对现状的关键修复点)。
3. 用户在打印弹窗编辑第五条并保存后,写入 `settlement_clause_drafts[当前 settlementMethod]`;再次打开同方式优先用草稿,**不自动覆盖**。
4. 在货到/款到与新四项之间切换时,各用各的草稿或默认,互不踩踏。
## 前后端一致性
前端(打印弹窗打开、`replacePlaceholders`、PDF 再替换)与后端 `save_template` 在空草稿兜底时,**必须使用同一套 defaultClause 规则**。
建议:
- 前端抽出共享函数(如 `settlementClause.ts`),`ContractDetailDialog.vue` 与仍在用的 `detail.vue` 共用。
- 后端抽出纯函数(如 CRUD 旁或 `services` 小模块),`save_template` 调用;并补单测覆盖六种方式 + 未知值。
前端取 label:字典 `crm_settlement_method`;后端兜底可用固定 value→label 映射(与上表一致),避免依赖运行时字典表。
## 不变范围
- 不改合同其它条款(如第三条送货方式)的生成逻辑。
- 不新增独立「条款结算方式」字段。
- 不改变审批/执行等状态机。
- 不要求历史合同批量回填 `settlement_clause_drafts`(打开时按新规则即时解析即可)。
## 改动落点(实现时)
| 区域 | 内容 |
|------|------|
| SQL | 向 `sys_dict_data` 插入四条(幂等) |
| 前端 | 第五条 default / 解析逻辑;打印与 PDF 路径 |
| 后端 | `save_template` 空草稿默认文案与前端对齐 |
| 测试 | 后端 defaultClause / save 兜底单测 |
## 验收要点
1. 新增/编辑结算方式下拉可见 6 项;新四项可保存,列表/详情 Tag 显示正确。
2. 选「款到发货 / 货到付款」→ 第五条仍为原默认(或各自已有草稿)。
3. 选「月结」且无草稿、首次打开打印 → 第五条为带「月结」的约定句;手改保存后再打开仍为改后内容。
4. 「按量结算 / 季结 / 其他」同理,label 随选项变化。
5. PDF 与打印弹窗第五条一致。
6. 从「货到付款」改为「月结」再打开打印 → 显示月结约定句(或月结草稿),不再误显示货到付款默认句(除非用户曾把相同文案存进月结草稿)。