# Contract Settlement 领域重构指南

## 1. 范围

本文档对应 backend 的 `contract_settlement` 主表。

当前优先关注：

- `contract_settlement.contract_type`
- `contract_settlement.status`
- `contract_settlement.payment_method`

## 2. 字段盘点

### 2.1 `contract_type`

当前实现：

- 模型里是 `String`
- 没有单独 enum 类型绑定到模型

项目侧取值范围：

- 当前主要跟随关联合同的 `contract_type`
- 代码现状至少包含：`product`、`service`、`project`

集团侧差异：

- 集团侧 `enum_config.ContractSettlement.contract_type` 当前只有 `product`、`service`
- 项目侧如果继续沿用 `project`，会比集团侧多一个值
- 当前仓库里没有 standalone 的同步 schema 来收紧这个字段

结论：

- 先与合同主表 `contract_type` 保持一致
- 再确认结算领域是否允许 `project`

### 2.2 `status`

当前实现：

- 模型里是 `SmallInteger`
- 默认值 `0`

项目侧取值范围：

- 当前没有独立 enum 类
- 从集团侧和现有语义看，应至少覆盖 `-1`、`0`、`1`

集团侧差异：

- 集团侧 `enum_config.ContractSettlement.status` 明确给出 `-1`、`0`、`1`
- 项目侧模型没有沉成统一常量或 enum

结论：

- 应补统一状态定义源

### 2.3 `payment_method`

当前实现：

- 本地 `PaymentMethod` enum 有两个值：`node_payment`、`progress_payment`
- 模型里仍是 `String`
- `SettlePaymentMethodsSelect` 手动校验合法值

当前使用：

- 合同结算服务会按 `payment_method` 分支校验和处理

项目侧取值范围：

- `node_payment`
- `progress_payment`

集团侧差异：

- 当前没看到集团侧 `enum_config` 为该字段给出正式候选项
- 当前仓库里也没有 standalone 的同步 schema 覆盖该字段

结论：

- 保留为本地代码 enum
- 需要把“手动 validator”提升为统一 schema / service 约束

## 3. 重点结论

- `contract_settlement` 里最稳定的枚举字段是 `payment_method`，应继续保留为代码 enum。
- `contract_type` 不能单独拍板，必须跟合同主表一起决定是否保留 `project`。
- `status` 当前只是模型整数，没有正式定义源，需要补齐。

## 4. 待修改项清单

1. 明确 `contract_settlement.contract_type` 是否允许 `project`。
2. 为 `status` 补正式常量或 enum 定义。
3. 将 `payment_method` 的合法值校验统一沉到正式 schema/enum，而不是只在个别 schema 手动校验。
4. 明确结算主表与合同主表在 `contract_type` 上是否必须同源。

## 5. 按本轮要求的改造落点

contract_settlement 领域不属于项目初始化第一批重点，但它直接涉及“写死下拉改动态”这件事。

### 5.1 初始化

本领域当前没有独立的项目初始化候选项链路。

`contract_type` 主要跟随合同主表，`payment_method` 主要出现在结算业务选择和后续分支处理中。

### 5.2 Create / 业务校验

当前 `payment_method` 的合法值主要靠：

- `PaymentMethod` enum
- `SettlePaymentMethodsSelect` schema 里的手动 validator

而 service `payment_methods_select()` 本身没有再做额外校验。

本轮目标是：

- 保留 `payment_method` 的固定语义 enum 属性
- 但在业务层入口也要能通过统一 config 工具或统一 enum 工具做显式校验
- 不把校验只留在 schema 里

### 5.3 下拉列表

当前支付方式只有选择接口，没有正式的动态下拉接口。

因此这轮要补的不是“替换已有动态接口”，而是：

- 把现有写死支付方式候选项明确收口
- 如果前端需要单独下拉接口，应改成动态返回，而不是继续依赖前端或 schema 写死

同理，`payment_type`、`advance_type` 这类当前靠本地 enum 固定的候选项，也应按同样思路处理。

### 5.4 清理项

本轮 contract_settlement 领域完成后，应避免继续保留：

- 只存在于 schema validator、但没有统一出口的支付方式候选项定义
- 前端和后端各自写死一份支付方式列表

## 6. 测试关注点

contract_settlement 领域 service 层集成测试至少覆盖：

1. `payment_method` 合法值更新成功，非法值明确报错。
2. 如果补了下拉接口，下拉返回是否与 service 校验同源。
3. `contract_type` 跟随合同主表时，不出现与合同主表不一致的脏数据。

