# 项目侧字段分流总表草案

## 1. 目的

这份总表只回答一件事：

- 哪些字段继续保留为代码 enum / 代码常量。
- 哪些字段应迁到 `field_config`。
- 哪些字段暂时不能直接收口，必须先补领域边界或映射关系。

## 2. 分流原则

优先按三类处理：

- 保留代码 enum：值域固定、语义稳定、业务分支已直接依赖。
- 迁到 `field_config`：值域跟 `project_type`、初始化模板或业务配置强相关。
- 暂缓收口：当前 backend 与 sync schema 映射不完整，或领域边界本身还没定。

## 3. 总表

| 领域 | 字段 | 当前主要来源 | 建议归类 | 备注 |
| --- | --- | --- | --- | --- |
| project | `project_type` | 代码 enum + 初始化字典 | 保留代码 enum | 核心路由字段 |
| project | `project_subtype` | 自由字符串 | 迁到 `field_config` | 建议 key：`project.project_subtype` |
| project | `syxs` | 自由字符串 | 迁到 `field_config` | 建议 key：`project.syxs` |
| project | `status` | 代码 enum + 服务推导 | 保留代码 enum | 正式集合含 `early`，并清理历史 `NULL` |
| project | `progress_type` | 代码 enum + DB enum | 保留代码 enum | 已与 sync schema 对齐 |
| project | `key_constraints` | 代码 enum 分叉 + DB enum | 保留代码 enum | 项目侧保留 `OTHER`，备注集团侧使用 `QT` |
| contract | `contract_type` | 代码 enum | 保留代码 enum | 先确认是否保留 `project` |
| contract | `code` | 初始化字典 / config / 自由字符串 | 迁到 `field_config` | 建议 key：`contract.code` |
| contract | `currency` | 自由字符串 | 暂不处理 | 当前仅见 `CNY` |
| construction_task | `section_type_code` | 硬编码 dict + config | 迁到 `field_config` | 建议 key：`construction.section_type_code` |
| construction_task | `task_type` | 类型树 + 字符串字段 | 暂缓收口 | 先拆 category 与真实任务类型 |
| construction_task | `status` | 数值字段 + dict | 保留代码常量 | 先统一常量定义源 |
| material | `material_type` | 本地列表 + 自由字符串 | 迁到 `field_config` | 建议 key：`material.material_type` |
| material | `status` | 数值字段 | 暂缓收口 | 先和 `supply_status` 划边界 |
| material | `supply_status` | 代码 enum | 保留代码常量 | 先确认是否为正式推送字段 |
| material | `approval_party` | 本地候选项 | 暂不处理 | 当前无集团侧对应 |
| contract_settlement | `contract_type` | 跟随合同主表 | 暂缓收口 | 先确认是否允许 `project` |
| contract_settlement | `status` | 数值字段 | 保留代码常量 | 需补统一定义源 |
| contract_settlement | `payment_method` | 代码 enum | 保留代码 enum | 不建议迁 `field_config` |
| personnel | `personnel_type` | 本地代码常量 | 保留代码 enum | 本地真实领域是人员资质 |
| personnel | `task_type` | 本地候选项常量 | 保留代码常量 | 先补 schema 白名单 |
| personnel | `is_duty` | 数值常量 | 保留代码常量 | 与集团侧 `status` 不是同一字段 |
| preparation | `code` | 初始化字典 + 自由字符串 | 迁到 `field_config` | 建议 key：`preparation.code` |
| preparation | `approval_status` | 通用审批体系 | 接入通用审批定义 | 不单独建 `field_config` |
| preparation | `is_exist` | 布尔字段 | 暂不处理 | 不属于候选项字段 |
| production | `code` | 初始化字典 + 自由字符串 | 迁到 `field_config` | 建议 key：`production.code` |
| production | `approval_status` | 通用审批体系 | 接入通用审批定义 | 不单独建 `field_config` |
| production | `is_exist` | 布尔字段 | 暂不处理 | 不属于候选项字段 |

## 4. 第一批建议落地项

优先进入 `field_config` 的字段：

- `project.project_subtype`
- `project.syxs`
- `contract.code`
- `construction.section_type_code`
- `material.material_type`
- `preparation.code`
- `production.code`

优先保留并收紧 schema 的代码 enum 字段：

- `project.project_type`
- `project.status`
- `project.progress_type`
- `project.key_constraints`
- `contract.contract_type`
- `contract_settlement.payment_method`

优先先做边界确认、暂不直接配置化的字段：

- `construction.task_type`
- `material.status`
- `contract_settlement.contract_type`

## 5. 使用方式

这份表可以直接作为后续代码改造顺序的输入：

1. 先处理“迁到 `field_config`”的一组字段。
2. 再处理“保留代码 enum，但 schema 还没收口”的一组字段。
3. 最后处理“暂缓收口”的结构性问题字段。

## 6. 按本轮目标拆出的第一批字段

这次不是单纯做字段分类，而是要直接服务于 3 条链路：

- 项目初始化
- create 业务校验
- 前端下拉列表

因此第一批字段不能只看“适不适合进 `field_config`”，还要看它能不能尽快把这 3 条链路收口到同一真源。

### 6.1 第一批优先收口字段

建议第一批优先处理：

- `contract.code`
- `material.material_type`
- `construction.section_type_code`
- `preparation.code`
- `production.code`
- `power.code`

原因：

- 都属于 code 类字段
- 都直接影响初始化、创建或下拉其中至少两条链路
- 当前都存在 config / dict / 代码常量混用问题，或者已具备明显收口价值

### 6.2 每个字段要同时回答的 3 个问题

对上面每个字段，后续文档和代码改造都应同时回答：

1. 初始化时从哪里拿候选项。
2. create service 开头用哪个 config key 做校验。
3. 前端下拉接口用哪个 config key 返回选项。

如果这 3 个问题的答案不是同一个 key，就说明还没有真正收口。

### 6.3 本轮不优先收口但要避免误迁的字段

下面这些字段虽然也和 enum 有关，但本轮不应抢先塞进字段级配置：

- `project.status`
- `project.progress_type`
- `project.key_constraints`
- `contract.contract_type`
- `contract_settlement.payment_method`

原因是：

- 这些字段语义更固定
- 业务分支已经直接依赖
- 本轮重点是先把“按项目类型变化的 code 类字段”收口，而不是把固定状态类枚举全部配置化

### 6.4 对物资字段的特别说明

`material.material_type` 虽然在表里只是一行，但它实际上牵扯 4 套来源：

- 初始化合同候选项：`contract_config`
- 物资初始化补充：`material_contract_*`
- 前端下拉：`material_types`
- create 内部默认展示/单位：`contract_product_type_list`

所以 `material.material_type` 不是简单迁一个 key，而是本轮最需要先统一真源的一项。

### 6.5 本轮完成后的字段判定标准

一个字段只有同时满足下面 3 条，才算本轮真正完成收口：

- 初始化使用它对应的 field config
- create 校验使用它对应的 field config
- 下拉列表返回也使用它对应的 field config
