material_manage_system/docs/superpowers/specs/2026-09-22-bom-management-design.md

538 lines
27 KiB
Markdown
Raw 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.

# BOM 管理第一版设计与初始规划
**日期:** 2026-09-22
**状态:** 初稿,待评审
**适用范围:** warehouse-mms 第一版 BOM 管理
## 1. 目标
为成品和半成品提供可追溯的多层 BOM 手工维护能力。第一版重点完成 BOM 的创建、草稿编辑、版本保留、生效与停用、结构合法性校验,以及按父项数量 `1` 查看单个 BOM 版本的完整层级。
第一版不延伸到制造执行和库存业务,BOM 操作不会生成领料申请、扣减库存或创建出入库单据。
## 2. 第一版范围
### 2.1 包含
- 通过树形界面手工维护 BOM。
- 为成品或半成品建立多个 BOM 版本。
- 创建首个 BOM 草稿。
- 从物料列表进入指定物料的 BOM 页面,查看结构和历史版本。
- 新建后续版本时,可基于指定历史版本完整复制明细,或创建空白草稿。
- 编辑、保存和删除草稿。
- 生效草稿或停用指定的生效版本。
- 自动校验重复子项、自引用、循环引用、无效数量和最大层级。
- 按父项数量 `1` 查看单个 BOM 版本的完整层级和各层用量。
- 记录生效和停用等关键状态变化的审计信息。
- 第一版页面和接口仅允许超级管理员访问。
### 2.2 不包含
- CSV 或 Excel 批量导入。
- BOM 审批、驳回和申请流程。
- 替代料。
- 多 BOM 需求试算。
- 修改查看数量、按计划数量计算需求,以及汇总最底层物料需求。
- 制造订单。
- 领料、退料和完工入库。
- 库存预留、库存扣减和短缺计算。
- 面向技术人员等其他角色的细分权限。
## 3. 核心业务规则
### 3.1 版本与状态
BOM 版本仅使用以下三个状态:
| 状态 | 含义 | 允许操作 |
| ----------- | --- | ------------------------- |
| `draft` | 草稿 | 查看、编辑、保存、生效、删除 |
| `effective` | 可用 | 查看、被新 BOM 选择、停用、基于该版本新建草稿 |
| `obsolete` | 已停用 | 查看历史、基于该版本新建草稿;不能用于新 BOM |
规则如下:
1. 同一父物料的版本号必须唯一。
2. 同一父物料可以同时存在多个 `effective`(可用)版本。
3. 默认版本是尚未停用且最近一次生效的版本,按生效时间排序;同一时间时按版本 ID 确定唯一结果。停用默认版本后,剩余可用版本中最近生效的版本成为默认版本;全部停用时无默认版本。
4. 新版本生效不改变其他可用版本的状态。非默认的可用版本仍可被新建的上层 BOM 明确选择。
5. 可用版本不可直接修改。变更结构时应创建新的草稿版本,可复制指定旧版,也可从空白开始。
6. 已停用版本不能恢复为可用,但可以作为新版本的复制来源;它不能被新建的上层 BOM 选用。
7. 草稿可删除;可用和已停用版本只保留、不物理删除。
### 3.2 父子关系
- 每个 BOM 版本只保存该父物料的直接子物料。
- 一个子物料可以被多个不同父物料引用。
- 同一 BOM 版本、同一直接父节点下,相同子物料只能出现一行。
- 同一物料可出现在整棵 BOM 树的不同父节点下。
- 同一父节点下不同安装位置的相同物料合并数量,位置和用途由用户手动写入备注。第一版不自动生成备注。
- 子项使用物料的基础单位,第一版不允许在 BOM 中选择其他单位或进行单位换算。
每个 BOM 子项至少记录:
- 子物料。
- 单位用量。
- 基础单位。
- 损耗率,默认 `0%`。
- 备注。
- 锁定的下层 BOM 版本,可为空。
- 排序序号。
### 3.3 下层版本锁定
当子物料存在可用 BOM 时,编辑上层草稿可选择其任意可用版本;页面默认预选最近一次生效的版本。上层版本生效时,锁定用户确认的下层 BOM 版本。下层 BOM 以后产生新版本,不改变已经生效的上层版本。
例如:
```text
整机 A V3
├─ 外壳组件 V2
└─ 电机组件 V1
```
即使电机组件 V2 后续生效,整机 A V3 仍按电机组件 V1 展开。电机组件 V1 即使后来停用,整机 A V3 的历史结构仍可查看和展开;但新建上层版本时不能再选择已停用的电机组件 V1。整机需要采用其他下层版本时,应创建整机 A 的新草稿版本。
### 3.4 层级与循环保护
- BOM 最多支持 20 层。
- 父物料不能直接引用自身。
- 禁止任意深度的循环引用,例如 `A → B → C → A`。
- 添加子物料时,前端立即检查直接重复和自引用。
- 保存草稿时,后端检查数量、重复、自引用、循环引用和最大层级。
- 生效时,后端在同一事务中再次执行完整校验。
- 查询完整结构树时再次执行循环和最大深度保护,不能仅依赖保存时的校验。
- 检测失败时返回完整问题路径,并让前端定位对应节点。
### 3.5 数量与损耗
- 单位用量必须大于零。
- 损耗率不得小于零。
- 每层需求量按以下规则计算:
```text
子项需求量 = 上层需求量 × 单位用量 ×(1 + 损耗率)
```
- 查看结构时,父项数量固定为 `1`,按上述公式逐层显示用量,计算过程中保留足够精度。
- 第一版不输入计划数量,也不汇总不同分支中的最底层物料;相关计算留给后续“多 BOM 需求试算”。
## 4. 前端信息架构
左侧导航沿用“物料主数据”入口。BOM 维护由物料列表逐行进入,不增加独立的“BOM 管理”菜单:
```text
物料主数据
├─ 物料
└─ 基础配置
公司组织
├─ 组织管理
├─ 用户管理
└─ 角色与权限
日志记录
├─ 物料变更日志
└─ BOM 记录
```
“多 BOM 需求试算”属于后续能力,第一版不展示空菜单。
现有独立菜单“日志记录”改为左侧导航大类。现有物料日志页面归入“物料变更日志”,BOM 事件展示在新建的“BOM 记录”子页面。原有 `/logs` 地址应保持可访问,并跳转到物料变更日志页面,避免旧链接失效。
### 4.1 物料列表中的 BOM 入口
现有物料列表继续负责搜索物料、查看详情、编辑和作废。在符合 BOM 父物料条件的成品或半成品行增加明显的“BOM”按钮,放在独立的窄列中,避免挤占现有操作列。点击后进入该物料的独立 BOM 页面。现有“物料详情”弹窗保持原有用途;BOM 页面显示当前物料的编码、名称、规格、基础单位和状态,并提供“返回物料列表”。已作废物料若已有 BOM,仍可进入页面查看历史版本,但不能新建或生效版本。
```text
物料主数据 → 物料列表 → 选择整机 A 所在行的 [BOM]
↓
整机 A 的 BOM 页面
新建 BOM
→ 为当前物料创建第一个草稿版本
编辑草稿
→ 编辑明细、保存草稿、删除草稿
状态操作
→ 生效或停用
```
结构校验不作为独立按钮或菜单。系统在添加、保存和生效过程中自动校验。
树形结构维护是编辑页面的交互方式,不作为独立功能入口。
### 4.2 单个物料的 BOM 页面
页面只管理入口物料的 BOM,不再建立与物料列表重复的 BOM 总列表。顶部始终显示版本选择框:已有版本时列出该物料的全部草稿、可用和已停用版本,并在选项中标明状态和默认版本;选项按创建时间从新到旧排列。首次进入时优先选中默认可用版本,没有可用版本时选中最近创建的版本。没有任何版本时,版本框显示“无”且不可展开,旁边提供“新建 BOM”按钮:
```text
← 返回物料列表 整机 A · A-001 有效
BOM 版本:[V2 · 可用·默认 ▼] [新建版本]
当前版本状态:可用 [停用]
▼ 整机 A × 1
├─ 外壳组件 × 1
└─ 电机组件 × 2
```
选择草稿版本时,操作按钮显示在同一状态行的位置:
```text
← 返回物料列表 整机 A · A-001 有效
BOM 版本:[V3 · 草稿 ▼] [新建版本]
当前版本状态:草稿 [编辑] [生效] [删除草稿]
▼ 整机 A × 1
├─ 外壳组件 × 1
└─ 电机组件 × 2
```
无版本时沿用相同布局:
```text
← 返回物料列表 整机 A · A-001 有效
BOM 版本:[无] [新建 BOM]
暂无 BOM 结构
```
创建首个草稿后,版本选择框自动选中该草稿并显示其结构。
切换版本后,页面直接加载该版本的完整结构和节点明细,不再要求点击“查看结构”。选中草稿时,顶部状态行显示“编辑”“生效”“删除草稿”;点击“编辑”才进入草稿的树形编辑状态。选中可用版本时,该位置显示“停用”;已停用版本只读,不显示编辑、停用或生效按钮。切换前若草稿存在尚未保存的修改,应先提示保存或放弃,避免丢失内容。
物料列表及该物料 BOM 页面共同支持:
- 在现有物料列表按编码或名称查找父物料,并从该行进入 BOM 页面。
- 通过版本选择框查看当前或历史版本结构。
- 编辑已有草稿。
- 发起新版本,并选择复制旧版或空白创建。
- 执行当前状态允许的状态操作。
建议页面路由为 `/materials/:materialId/bom`。从树中的子物料进入其 BOM 时,也使用同一路由并传入该子物料 ID。物料详情弹窗无需承载多层 BOM 编辑。
版本选择框下方的结构区域固定按父物料数量 `1` 展示所选 BOM 版本的完整层级和各层用量,不提供数量输入或最底层物料汇总。
```text
整机 A × 1
├─ 外壳组件 × 1
│ └─ 螺丝 × 8
└─ 电机组件 × 2
└─ 螺丝 × 8
```
按计划数量计算、同时选择多个 BOM 并合并相同物料需求,属于后续独立页面“多 BOM 需求试算”。
### 4.3 新建 BOM
新建 BOM 只面向尚未建立 BOM 的成品或半成品。入口物料已由物料列表确定,页面包含:
- 当前父物料信息,只读展示,不再重复选择。
- 初始版本号。
- 直接子物料树或列表。
- 子项单位用量、基础单位、损耗率和备注。
- 保存草稿。
已存在 BOM 的父物料不能再次走“新建 BOM”,应从该物料的 BOM 页面点击“新建版本”,再选择复制旧版或空白创建。
### 4.4 编辑草稿
编辑页采用左侧结构树、右侧节点明细的布局。点击任意物料节点,右侧先以只读方式展示该节点的物料信息、用量、损耗率、备注和下层 BOM 版本:
```text
┌────────────────────────┬─────────────────────────────┐
│ BOM 结构树 │ 当前节点明细 │
│ ▼ 整机 A │ 电机组件 │
│ ├─ 外壳组件 × 1 │ 物料编码:DJ-001 │
│ ├─ 电机组件 × 2 ← │ 单位用量:2 套 │
│ │ └─ 螺丝 × 4 │ 损耗率:0% │
│ └─ 控制箱 × 1 │ 下层 BOM:V2 │
│ [+ 添加子物料] │ 备注:安装位置说明 │
│ │ [编辑] │
└────────────────────────┴─────────────────────────────┘
```
“添加子物料”只显示在根物料的直接子项列表末尾,用来为当前 BOM 添加第二层节点;第三层及更深层节点不显示此按钮。下层子物料应进入对应子 BOM 的草稿页面维护,再由当前 BOM 选择和锁定该子 BOM 版本。
添加子物料时只能搜索并选择当前组织中已存在的物料。如果没有找到目标物料,页面提示先到“物料主数据 → 物料”新增,新增完成后再返回 BOM 草稿继续添加;BOM 页面不自动创建物料主数据。
选中当前 BOM 的直接子项且当前版本为草稿时,右侧显示“编辑”按钮。点击后,右侧明细进入编辑模式,显示可编辑的单位用量、损耗率、备注和下层 BOM 版本,并提供“删除该子物料”“取消”“保存”操作;未点击“编辑”前不修改字段,也不显示删除入口。删除前二次确认,只删除当前草稿中选中的这一条直接子项,不删除物料主数据或子物料自身的 BOM。选中第三层及更深层节点时,右侧只读展示明细,并提供“前往该物料 BOM”入口。可用和已停用版本中的所有节点均只读。
```text
右侧明细:查看模式 [编辑]
↓
右侧明细:编辑模式 [删除该子物料] [取消] [保存]
```
编辑草稿允许:
- 添加、修改和排序直接子物料;删除直接子项必须先进入右侧明细的编辑模式。
- 修改用量、损耗率和备注。
- 保存草稿。
- 删除整个草稿。
对于树中引用的下层 BOM,直接子项进入编辑模式后提供可用版本选择器,并默认选择最近一次生效的版本。页面展示所选版本的结构,并提供跳转到该物料 BOM 的入口;不在上层 BOM 中直接修改下层 BOM。可用版本停用后,已锁定它的历史上层版本仍可查看和展开;尚未生效的上层草稿必须改选可用版本后才能生效。
### 4.5 新建版本
“新建版本”从当前物料的 BOM 页面发起,不属于编辑草稿内部操作。点击后先弹出创建方式选择窗口:
```text
┌─ 新建整机 A 的 BOM 版本 ──────────────────────────┐
│ │
│ [复制旧版] 推荐:沿用现有结构,再修改差异 │
│ 选择来源版本:[V2 · 可用 ▼] │
│ │
│ 空白创建 从零开始添加子物料 │
│ │
│ [取消] [创建草稿] │
└───────────────────────────────────────────────────┘
```
“复制旧版”作为醒目的默认选项,其“来源版本”使用弹窗内的下拉框选择,列出该父物料全部已有版本并标明状态;默认预选当前 BOM 页面正在查看的版本,也允许在下拉框中改选其他版本,不再打开第二个版本选择窗口。创建时完整复制所选版本的明细,并记录来源版本。“空白创建”使用普通样式,不复制明细,来源版本为空。两种方式都生成新的草稿版本并进入草稿编辑页;每次只创建一个版本。
### 4.6 状态操作
页面根据状态显示操作:
```text
草稿
├─ 查看
├─ 编辑草稿
├─ 生效
└─ 删除草稿
可用
├─ 查看
├─ 停用
└─ 新建版本
已停用
├─ 查看
└─ 新建版本
```
生效和停用都需要二次确认。新版本生效后成为默认版本,其他可用版本保持可用。停用默认版本时,确认提示应说明哪个剩余可用版本会成为新默认版本;没有剩余可用版本时提示该父物料将暂无默认版本。
## 5. 数据模型建议
第一版使用现有 `materials` 作为父物料和子物料主数据,新增 `bom_versions`、`bom_items` 两个 BOM 核心表,以及独立的 BOM 操作记录表。现有“物料变更日志”依赖物料 ID 和物料变更字段,不能直接承载 BOM 版本事件。
一个父物料由 `materials.id` 标识,版本表直接引用它。出现在 BOM 中的父物料和所有子物料必须先在 `materials` 表中存在;如果尚未录入,应先到物料主数据新增物料,再返回 BOM 页面选择。物料名称、编码、类别和基础单位仍由物料主数据维护,BOM 表不重复保存。
### 5.1 `bom_versions`
建议字段:
- `id`
- `organization_id`
- `parent_material_id`,引用 `materials.id`。
- `version`
- `status`
- `source_version_id`,记录复制来源,可为空。
- `effective_at`
- `obsoleted_at`
- `created_by`
- `updated_by`
- `created_at`
- `updated_at`
约束:
- 同一组织、同一 `parent_material_id` 下版本号唯一;父物料必须属于同一组织,且为允许建立 BOM 的成品或半成品。
- 为 `organization_id`、`parent_material_id`、`status` 和 `effective_at` 建立查询索引。默认版本由可用版本的生效时间和版本 ID 确定,不单独保存可变的默认标记。
### 5.2 `bom_items`
建议字段:
- `id`
- `organization_id`
- `bom_version_id`
- `child_material_id`
- `quantity`
- `unit_id`
- `loss_rate`
- `remark`
- `child_bom_version_id`,引用所选子物料本身的 BOM 版本;子物料本身无下层 BOM 时为空。
- `sort_order`
- `created_at`
- `updated_at`
约束:同一 `bom_version_id` 下 `child_material_id` 唯一。子物料引用 `materials.id`,必须与该 BOM 版本属于同一组织;`child_bom_version_id` 必须指向以该子物料为父物料的 BOM 版本。草稿可选择可用版本,草稿生效后该引用不可修改。
树形层级不直接存成固定层级字段。系统通过各父物料 BOM 版本之间的引用递归组成完整树,因此支持 10 层或 20 层时不需要改变表结构。
查询某个整机 BOM 的结构时,按以下关系逐层查找:
```text
整机 materials.id
→ 按 bom_versions.parent_material_id 查整机的版本,并选择要查看的版本
→ 用该版本的 bom_versions.id 查 bom_items.bom_version_id,取得全部直接子项
→ 用每条 bom_items.child_material_id 查 materials,取得子物料主数据
→ 用该条 bom_items.child_bom_version_id 查已选定的下层 BOM 版本
→ 用下层版本的 bom_versions.id 继续查它的 bom_items
```
`child_bom_version_id` 为空时,该子项不再往下展开;有值时按这个固定版本继续查询。新增或编辑草稿时,系统才根据 `child_material_id` 查询该子物料的可用 BOM 版本,默认预选最近生效的版本,并允许用户选择其他可用版本。保存所选版本 ID 后,查看已保存的 BOM 不再重新选择默认版本,因此下层 BOM 后续推出新版本也不会改变当前 BOM 的结构。查看历史 BOM 时仍按当时保存的版本引用展开。
### 5.3 BOM 操作记录
独立记录每次 BOM 状态变化,至少保存经营组织、父物料、BOM 版本、操作类型、操作人、操作时间和说明。生效与停用各记录一次;默认版本随这些状态变化而自动重新计算,不生成额外的停用记录。
## 6. 后端职责与接口草案
后端延续现有 Go 分层结构:
```text
model
→ 定义 BOM、版本、子项和树形结构结果
repository
→ 负责数据库查询、事务和状态更新
service
→ 负责版本规则、复制、校验、生效、停用和结构树查询
handler
→ 负责 HTTP 参数、超级管理员鉴权和统一响应
```
接口草案:
| 方法 | 路径 | 用途 |
| -------- | ---------------------------------------- | ---------------------- |
| `POST` | `/api/boms` | 为指定父物料创建首个草稿版本 |
| `GET` | `/api/boms/:materialId` | 按父物料 ID 查看 BOM 及默认版本摘要 |
| `GET` | `/api/boms/:materialId/versions` | 按父物料 ID 查看全部版本 |
| `POST` | `/api/boms/:materialId/versions` | 为已有 BOM 创建空白草稿版本 |
| `GET` | `/api/bom-versions/:versionId` | 查看指定版本和结构 |
| `PUT` | `/api/bom-versions/:versionId` | 保存草稿 |
| `DELETE` | `/api/bom-versions/:versionId` | 删除草稿 |
| `POST` | `/api/bom-versions/:versionId/copy` | 从指定版本生成新草稿 |
| `POST` | `/api/bom-versions/:versionId/effective` | 生效草稿 |
| `POST` | `/api/bom-versions/:versionId/obsolete` | 停用生效版本 |
| `GET` | `/api/bom-versions/:versionId/tree` | 按父项数量 `1` 查看完整 BOM 结构 |
接口命名在实施计划阶段可按现有路由风格进一步统一,但业务边界不应改变。
## 7. 自动校验与错误反馈
前端校验用于即时反馈,后端校验是最终可信规则。
| 时机 | 校验内容 |
| ----- | ---------------------------- |
| 选择子物料 | 当前组织物料存在、当前父节点重复、自引用、物料状态 |
| 保存草稿 | 数量、损耗率、基础单位、重复、自引用、循环、20 层限制 |
| 生效 | 完整重复执行保存校验,并验证所选下层版本仍可用 |
| 结构树查询 | 循环保护、20 层限制、版本引用完整性 |
错误信息需要包含:
- 错误类型。
- 父物料和子物料编码。
- 完整问题路径。
- 用户可执行的修改建议。
示例:
```text
无法保存:检测到循环引用。
问题路径:整机 A → 电机组件 → 控制模块 → 整机 A。
请删除导致循环的子物料关系。
```
## 8. 权限与审计
- 第一版菜单、页面和全部 BOM 接口仅超级管理员可访问。
- 不能只通过前端隐藏菜单实现权限控制,后端接口必须再次鉴权。
- 预留独立 BOM 权限边界,后续权限系统完善后再拆分查看、维护和状态操作权限。
- 创建、复制、生效、停用和删除草稿记录操作者、时间、目标版本和结果。
### 8.1 日志记录页面
左侧“日志记录”展开后显示两个子页面:
```text
日志记录
├─ 物料变更日志 → 现有物料新增、修改、删除记录
└─ BOM 记录 → BOM 创建、复制、生效、停用、删除草稿
```
“BOM 记录”页面提供父物料编码或名称、版本、操作类型和时间范围筛选。列表显示操作时间、父物料、版本、操作、操作人和说明;点击记录可查看状态变化。停用记录保留操作者及原因;若停用的是默认版本,详情展示停用后接替的默认版本或“暂无默认版本”。
建议路由为 `/logs/materials` 和 `/logs/boms`,原 `/logs` 跳转到 `/logs/materials`。两个子页面均仅超级管理员可访问。
## 9. 测试与验收重点
### 9.1 后端
- 创建首个草稿和保存明细。
- 父物料和子物料必须存在于物料主数据且属于同一组织;不存在的物料 ID 无法创建 BOM。
- 同一父物料版本号重复。
- 同一版本直接子项重复。
- 父项直接引用自身。
- 三层及更深循环引用,并返回完整路径。
- 第 20 层允许,第 21 层拒绝。
- 零数量、负数量和负损耗率拒绝。
- 生效版本禁止修改和删除。
- 多个版本可同时可用,新版本生效后成为默认版本,旧可用版本状态不变。
- 停用默认版本后,默认版本按最近生效时间回退;无可用版本时默认版本为空。
- 从指定版本完整复制为新草稿。
- 下层版本锁定后不随新版本变化。
- 单件多层结构、各层用量和损耗率计算正确,且不返回跨分支物料汇总。
- 非超级管理员访问全部 BOM 接口均被拒绝。
- 不同组织的数据不能相互读取或引用。
- BOM 状态变化与对应操作记录同时提交。
### 9.2 前端
- 物料列表仅对符合条件的父物料显示“BOM”按钮;入口和 BOM 页面仅超级管理员可访问。
- 从物料列表进入指定物料的独立 BOM 页面;版本选择框列出该物料全部版本并标明状态,切换后直接显示所选版本结构。
- 没有版本时版本框显示“无”,结构区域显示空状态;创建首个草稿后自动选中该版本。
- 版本选择框包含全部草稿、可用和已停用版本,约 50 个版本以内可滚动选择;切换后显示该版本结构与对应状态操作。
- 只有符合条件且尚无版本的成品或半成品,才能从其 BOM 页面创建首个草稿;父物料由入口固定,不再重复选择。
- 草稿可编辑,可用和已停用版本只读。
- 选中草稿时,状态行显示“编辑”“生效”“删除草稿”;点击顶部“编辑”后才进入树形编辑状态,选中可用版本时仅显示“停用”。
- 点击节点先在右侧查看明细;仅草稿的直接子项显示“编辑”按钮,点击后才进入编辑模式。
- 删除子物料入口只在右侧编辑模式出现,删除前确认,且只影响当前草稿中的该条子项。
- “添加子物料”只在根物料的第二层子项列表末尾出现;更深层节点通过对应子 BOM 维护。
- 添加子物料时只允许选择当前组织已有物料;搜索不到时提示先新增物料主数据,再返回 BOM 草稿继续添加。
- 添加重复子项和自引用时立即提示。
- 后端返回循环或深度错误时定位并标记问题节点。
- 生效、停用和删除草稿具有明确确认提示。
- 从指定历史版本创建草稿后,明细完整复制且可继续编辑。
- 点击“新建版本”先弹出方式选择窗口;“复制旧版”醒目且默认选中,来源版本通过弹窗内下拉框选择;“空白创建”可生成无明细草稿。
- “日志记录”展开后显示两个子页面;原 `/logs` 链接仍能打开物料变更日志。
- “BOM 记录”支持筛选与查看生效和停用的操作详情。
## 10. 建议实施顺序
1. 建立 BOM 数据表、模型和仓储层。
2. 实现草稿创建、查询、编辑和删除。
3. 实现复制新版本及版本列表。
4. 实现结构校验、20 层限制和完整循环路径反馈。
5. 实现多版本可用、默认版本推导、生效和停用事务。
6. 在物料列表增加 BOM 入口,实现单个物料的 BOM 页面和完整版本选择框。
7. 实现新建及草稿树形编辑页面。
8. 实现单个 BOM 版本按父项数量 `1` 的结构树查询和各层用量显示。
9. 将现有日志入口改为双子页面,接入 BOM 操作记录和筛选。
10. 补齐权限、自动化测试和真实数据副本验收。
## 11. 后续阶段
第一版稳定后再分别设计和实现:
1. 多 BOM 需求试算:在独立页面输入一个或多个 BOM 的计划数量,递归计算并汇总相同底层物料需求,再在“物料主数据”下增加菜单。
2. CSV 层级导入和错误报告。
3. 替代料管理。
4. 面向技术人员等角色的细分权限。
5. 制造订单、领料、完工和库存联动。
6. 增加结构化的“使用位置明细”:在同一 BOM 子项下分别填写安装位置、用途和用量,系统自动合计该子项的总用量,并在可展开的 BOM 树节点下展示各位置明细。可根据这些明细自动生成备注,且允许人工修改备注;同一直接父节点下仍只保留一条该物料的 BOM 子项。