Files
ecm_sync_system/docs/enum_refactor/material.md
T
2026-03-18 11:34:02 +08:00

5.5 KiB
Raw Blame History

Material 领域重构指南

1. 范围

本文档只做 Material 主表梳理。

当前优先关注:

  • material.material_type
  • material.status
  • material.supply_status
  • material.approval_party

2. 字段盘点

2.1 material_type

当前实现:

  • 本地没有独立 enum 类
  • 主要来源是 contract_product_type_list
  • 模型里是 String
  • 创建 schema 里是 str
  • 同步 schema 里也是 str

当前使用:

  • 是物资主类型字段
  • schema 示例和业务逻辑都直接依赖 contract_product_type_list

项目侧取值范围:

  • 当前本地明确值:TYZJNBXBZBGSCNDLXTCBJDBSXECXTQT

集团侧差异:

  • 集团侧 enum_config.Material.material_type 是按项目类型变化的
  • 光伏下有:ZJTYNBXBZBGSCNQT
  • 陆风/海风下有:FJTTXBZBGSCNQT
  • 项目侧当前使用的本地列表明显偏光伏,且代码里还存在命名差异:例如本地用 XT / CBJDB / SX / ECXT,集团侧常见的是 35KV / CYJD / SVG / ECPG
  • 同步 schema 里 material_type 仍是 str

结论:

  • 应迁到 field_config
  • 不能继续只靠本地 contract_product_type_list

2.2 status

当前实现:

  • 模型里是 SmallInteger
  • 同步 schema 里是 Optional[int]

项目侧取值范围:

  • 当前未看到单独 enum 类
  • 现有注释和使用都表明它是数值状态字段

集团侧差异:

  • 集团侧 enum_config.Material.status 给的是 -101
  • 项目侧没有在 material 模块里沉成统一常量

结论:

  • 应统一正式状态定义源

2.3 supply_status

当前实现:

  • 模型里是 SmallInteger
  • 本地有 SupplyStatus enum-101None

项目侧取值范围:

  • -1
  • 0
  • 1
  • None

集团侧差异:

  • 集团侧 Material.status 也是按 -101 表达进度状态
  • 项目侧存在 statussupply_status 两个相近字段,语义有重叠

结论:

  • 需要明确 statussupply_status 哪个才是正式推送字段

2.4 approval_party

当前实现:

  • 模型里是 String
  • schema 里是 str
  • 当前示例值是 jiagongyigong

项目侧取值范围:

  • jiagong
  • yigong

集团侧差异:

  • 当前没看到集团侧 enum_config 对这个字段给出正式候选项
  • 同步 schema 里也没有这个字段

结论:

  • 先保留本地代码级候选项
  • 后续如需推送再决定是否外提

3. 重点结论

  • material_type 是标准的 field_config 候选字段,不能再继续绑死在本地光伏型列表上。
  • statussupply_status 当前语义重叠,必须先定正式推送字段。
  • approval_party 暂时还是本地专有字段,不需要现在就硬并到集团侧。

4. 待修改项清单

  1. material_type 正式迁到 field_config
  2. 按项目类型重建 material_type 候选项,不再只用本地光伏型列表。
  3. 统一 35KV/XTCYJD/CBJDBSVG/SXECPG/ECXT 这类命名差异。
  4. 明确 statussupply_status 的职责边界。
  5. material_type 在 schema 层增加统一校验入口。

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

material 是本轮最需要针对性改造的领域之一,因为它当前同时存在:

  • 初始化来源分叉
  • create 校验分叉
  • 下拉来源分叉

5.1 初始化

当前 material 初始化不是单源:

  • 候选项来自 contract_config 里的 product 合同
  • 单位和部分展示信息来自 material_contract_{project_type} dict

而且 unit 现在还挂在 dict remark 上。

本轮目标是:

  • 明确 material.material_type 的正式配置来源
  • labelunitparts 等附属字段纳入正式 config 结构
  • 去掉“从 dict remark 补单位”这种不适当用法

5.2 Create 校验

当前 create 路径里:

  • material_type 入参本身没有正式 config 校验
  • show_nameunitcontract_product_type_list 反查
  • 随后又会调用合同创建,由合同 service 再做一层 code 白名单校验

这说明 material create 现在不是单一入口校验。

本轮目标是:

  • MaterialService.create() 开头基于 config 校验 material_type
  • get_field_option_map() 之类的方法直接拿 labelunitparts
  • 不再依赖 contract_product_type_list 和默认兜底值

5.3 下拉列表

当前物资下拉已经部分走 config

  • /material/material-typesmaterial_types
  • /material-detail/contract-product-type/list 也读 material_types

但模块里仍保留了旧的硬编码路径:

  • get_material_info_by_code()
  • get_kit_options()
  • contract_product_type_list

本轮目标是:

  • 让物资类型和部件列表统一从新的 config 工具返回
  • 下拉、初始化、create 校验全部围绕同一套 material_type 配置

5.4 清理项

material 领域这轮改造完成后,应优先清理:

  • material_contract_* 中用 remark 承载单位的旧逻辑
  • contract_product_type_list 里只服务于 material_type 真源的旧定义
  • get_material_info_by_code() 这类旧反查入口

6. 测试关注点

material 领域 service 层集成测试至少覆盖:

  1. 初始化:项目初始化后 material 的 material_typeshow_nameunit 是否来自目标 config。
  2. 下拉:物资类型和部件列表是否来自同一 config,且与初始化同源。
  3. Create:合法 material_type 能创建,非法 material_type 明确报错,不再依赖默认兜底。