Files
2026-03-18 11:34:02 +08:00

202 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`
项目侧取值范围:
- 当前本地明确值:`TY``ZJ``NB``XB``ZB``GS``CN``DL``XT``CBJDB``SX``ECXT``QT`
集团侧差异:
- 集团侧 `enum_config.Material.material_type` 是按项目类型变化的
- 光伏下有:`ZJ``TY``NB``XB``ZB``GS``CN``QT`
- 陆风/海风下有:`FJ``TT``XB``ZB``GS``CN``QT`
- 项目侧当前使用的本地列表明显偏光伏,且代码里还存在命名差异:例如本地用 `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` 给的是 `-1``0``1`
- 项目侧没有在 material 模块里沉成统一常量
结论:
- 应统一正式状态定义源
### 2.3 `supply_status`
当前实现:
- 模型里是 `SmallInteger`
- 本地有 `SupplyStatus` enum`-1``0``1``None`
项目侧取值范围:
- `-1`
- `0`
- `1`
- `None`
集团侧差异:
- 集团侧 Material.status 也是按 `-1``0``1` 表达进度状态
- 项目侧存在 `status``supply_status` 两个相近字段,语义有重叠
结论:
- 需要明确 `status``supply_status` 哪个才是正式推送字段
### 2.4 `approval_party`
当前实现:
- 模型里是 `String`
- schema 里是 `str`
- 当前示例值是 `jiagong``yigong`
项目侧取值范围:
- `jiagong`
- `yigong`
集团侧差异:
- 当前没看到集团侧 `enum_config` 对这个字段给出正式候选项
- 同步 schema 里也没有这个字段
结论:
- 先保留本地代码级候选项
- 后续如需推送再决定是否外提
## 3. 重点结论
- `material_type` 是标准的 `field_config` 候选字段,不能再继续绑死在本地光伏型列表上。
- `status``supply_status` 当前语义重叠,必须先定正式推送字段。
- `approval_party` 暂时还是本地专有字段,不需要现在就硬并到集团侧。
## 4. 待修改项清单
1.`material_type` 正式迁到 `field_config`
2. 按项目类型重建 `material_type` 候选项,不再只用本地光伏型列表。
3. 统一 `35KV/XT``CYJD/CBJDB``SVG/SX``ECPG/ECXT` 这类命名差异。
4. 明确 `status``supply_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` 的正式配置来源
-`label``unit``parts` 等附属字段纳入正式 config 结构
- 去掉“从 dict remark 补单位”这种不适当用法
### 5.2 Create 校验
当前 create 路径里:
- `material_type` 入参本身没有正式 config 校验
- `show_name``unit``contract_product_type_list` 反查
- 随后又会调用合同创建,由合同 service 再做一层 code 白名单校验
这说明 material create 现在不是单一入口校验。
本轮目标是:
-`MaterialService.create()` 开头基于 config 校验 `material_type`
-`get_field_option_map()` 之类的方法直接拿 `label``unit``parts`
- 不再依赖 `contract_product_type_list` 和默认兜底值
### 5.3 下拉列表
当前物资下拉已经部分走 config:
- `/material/material-types``material_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_type``show_name``unit` 是否来自目标 config。
2. 下拉:物资类型和部件列表是否来自同一 config,且与初始化同源。
3. Create:合法 `material_type` 能创建,非法 `material_type` 明确报错,不再依赖默认兜底。