# Production 领域重构指南

## 1. 范围

本文档对应 backend 的 `production` 投产节点表。

当前优先关注：

- `production.code`
- `production.approval_status`
- `production.is_exist`

## 2. 字段盘点

### 2.1 `code`

当前实现：

- 模型里是 `String`
- 没有本地 enum 类
- 项目初始化时，节点集合来自 `production_{project_type}` 字典数据
- 同步 schema `project_extensions/production.py` 里也是 `str`

项目侧取值范围：

- 当前无法从单一 enum 文件列出完整范围
- 已知典型值包括：`SYZDSD`、`SPBW`、`QBBW`、`KHWC240`、`YJSC`、`DBTC`、`CQZS`、`WGJS`、`JGJS`

集团侧差异：

- 集团侧 `enum_config.Production.code` 已把该字段按项目类型列成正式候选项
- 本地仍主要靠初始化字典和自由字符串

结论：

- 更适合迁到 `field_config`

### 2.2 `approval_status`

当前实现：

- backend 依赖 `ApprovalMixin`
- 本地 `ProductionApproval` schema 仍使用 int
- 同步 schema `ProductionDetail` 里是 `Optional[str]`

项目侧取值范围：

- 当前本地未在 production 模块中沉成独立 enum

集团侧差异：

- 同步 schema 有字段，但没有正式 enum

结论：

- 应统一接入通用审批状态体系

### 2.3 `is_exist`

当前实现：

- 模型里是 `Boolean`
- backend 和 sync schema 都有

项目侧取值范围：

- `true`
- `false`

集团侧差异：

- 当前没看到 enum_config 对该字段给候选项

结论：

- 保持布尔字段即可

## 3. 重点结论

- `production.code` 和 `preparation.code` 一样，属于典型的初始化节点编码字段，应迁到 `field_config`。
- `approval_status` 仍应走通用审批体系，而不是 production 自己维护一套值域。
- `is_exist` 不属于本轮需要抽成字段候选表的重点字段。

## 4. 待修改项清单

1. 将 `production.code` 正式迁到 `field_config`。
2. 将项目初始化里对 `production_{project_type}` 的依赖逐步收敛到统一字段配置入口。
3. 将 `approval_status` 接入通用审批状态定义。

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

production 和 preparation 一样，属于本轮适合优先收口的平铺型节点编码领域。

### 5.1 初始化

当前 production 初始化直接来自 `production_{project_type}` dict。

本轮目标是：

- 把 `production.code` 迁到 field config
- 初始化改成通过 config 工具读取候选项后批量创建
- 不再依赖 dict 作为初始化真源
∏
### 5.2 Create 校验

当前 production 领域也没有统一的 code 候选项校验入口。

本轮目标是：

- 在 create / update 的 service 入口开头，基于 config 校验 `production.code`
- 不再继续用本地硬编码列表承担合法值白名单职责

### 5.3 下拉列表

production 当前也没有单独的 code 候选项下拉接口，更多是返回项目实例列表 `/production/list`。

本轮要求是：

- 如果需要单独 code 候选项下拉，应直接从 `production.code` field config 返回

## 6. 测试关注点

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

1. 初始化：项目初始化时生成的投产节点是否来自目标 field config。
2. Create / Update：合法 `code` 可以写入，非法 `code` 明确报错。
3. 列表：项目实例列表顺序是否来自配置顺序，而不是硬编码 `sort_code`。

