# 合同结算方式:新增选项与第五条条款规则 ## 目标 合同管理「结算方式」下拉增加 **按量结算 / 月结 / 季结 / 其他** 四个选项,供业务录入与列表/详情展示。 - **货到付款 / 款到发货**:继续按现状驱动合同打印富文本「第五条、结算方式及期限」及 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. 从「货到付款」改为「月结」再打开打印 → 显示月结约定句(或月结草稿),不再误显示货到付款默认句(除非用户曾把相同文案存进月结草稿)。