# 项目侧字段分流总表草案 ## 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