Files
zkxw/openspec/changes/configured-production-reagent/design.md
T
2026-06-13 19:47:22 +08:00

111 lines
5.4 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.
## Context
生产物料库(`biz_production_material*`)已对齐质检物料库:试剂/耗材统一目录、批次、领用(`manual_out`)、工单 `step_save`(`parent_usage_id`)、盘点。用户确认 **方案 A**:配置试剂配制完成后 **先入库存**,工单使用前 **再领用**,步骤登记 **不二次扣库**。
已废弃的 `biz_consumable_pack` 仅为耗材模板,无配制实例与子物料领用追溯,不可复用。
## Goals / Non-Goals
**Goals:**
- 第三类物料 `material_type=configured_reagent`,目录 + BOM(试剂+耗材子项)
- 配制单:记录每次配制实际消耗的子物料领用行;产出配置试剂批次
- 配置试剂走完整 **批次 → 领用 → 工单 step_save** 链路
- UI 落在【生产物料库】与【生产工单】执行态,风格对齐 Fresh Mint / QC 物料库
**Non-Goals:**
- 不合并质检物料库
- 不恢复耗材包
- 工艺库/工艺路线步骤引用配置试剂 BOM(二期)
- 配制现场「直用不入库」模式(方案 B/C)
- 盘点首版对配置试剂做特殊调账逻辑(沿用现有 Part A/B,不调账)
## Decisions
### Decision 1: 扩展 material_type,不另建独立库存域
**选择**:`configured_reagent` 作为 `biz_production_material.material_type` 第三值;批次/领用/盘点 **复用** 现有表与 CRUD 模式。
**理由**:与用户已接受的试剂/耗材统一库一致;避免第二套 batch/usage API。
**替代**:独立 `biz_configured_reagent*` 表系 — 拒绝,重复建设。
### Decision 2: 配方与配制分离
| 实体 | 表 | 含义 |
|------|-----|------|
| 配方 BOM | `biz_production_material_formula` | 主数据:标准子物料与标准用量 |
| 配制单 | `biz_production_material_prep` + `_prep_line` | 业务单据:某次实际配制 |
**理由**:BOM 可版本化维护;配制单保留历史追溯(哪次用了哪些领用记录)。
配制单头关键字段:`configured_material_id`、`prep_no`、`prep_time`、`output_qty`、`output_unit`、`batch_no`、`expire_date`、`stock_in_no`(产出批次)、`status`(draft/completed/cancelled)。
配制行关键字段:`component_material_id`、`component_material_type`、`component_material_code`、`requisition_usage_id`(parent 领用记录)、`actual_qty`、`usage_unit`。
### Decision 3: 库存流水 source_type
| 环节 | change_type | source_type | 库存影响 |
|------|-------------|-------------|----------|
| 子物料配制消耗 | use | `prep_consume` | 子物料 **不扣** batch;`stock_before==stock_after`;`parent_usage_id` 指向领用记录 |
| 配置试剂配制入库 | in | `prep_in` | 配置试剂 catalog `stock_qty` ↑;新建/更新 batch `remaining_qty` |
| 配置试剂领用 | use | `manual_out` | 按 batch 扣减(与现网一致) |
| 工单步骤登记 | use | `step_save` | 不扣库存;`parent_usage_id` 指向领用记录 |
**理由**:与 `production-material-requisition` Decision 5 一致;子物料已在领用时扣过 batch。
### Decision 4: 配制完成事务边界
单次「确认配制」在一个 DB 事务内:
1. 校验每行 `requisition_usage_id` 有效、未重复、领用人为当前用户或允许范围
2. 写入 `prep` + `prep_line`
3. 对每个 prep_line 写 `prep_consume` usage
4. 创建配置试剂 `stock_batch` + `prep_in` usage
5. 更新配置试剂 `stock_qty`
失败则整体回滚。
### Decision 5: 生产工单步骤 UI
**选择**:新增 **`biz_production_task_step_configured_reagent`** 子表(或等价命名),工单执行态增加 **「配置试剂」Tab**;领用下拉 `GET /production-material-requisition-options?materialType=configured_reagent`。
**理由**:与保留「试剂」「耗材」分列一致;避免塞入 reagent Tab 造成类型混淆。
保存仍调用统一 `register_step_usage_from_requisition`;目录内配置试剂 **有实际用量时必须选领用记录**。
### Decision 6: 编码唯一性
沿用 **租户 + material_type + material_code**;允许配置试剂编码与试剂/耗材编码相同(类型不同)。
### Decision 7: 偏离 BOM
配制时允许调整 **实际用量**;子物料行 **必须** 选领用记录。标准用量自 BOM 带出,仅作参考。
## Risks / Trade-offs
| 风险 | 缓解 |
|------|------|
| 领用余量与子物料配制量不一致 | 首版仅记录 `prep_consume` 关联领用,不强制核销领用余额字段;二期可加「领用已配制量」汇总 |
| 配置试剂批次过期日规则不清 | 配制单必填 `expire_date` |
| 成本单价 | 首版 `unit_price`/`amount` 可按子物料 `prep_consume` 金额汇总写入产出 batch |
| 步骤子表增多 | 配置试剂 Tab 独立;工艺模板引用二期再做 |
| 与未完成 production-material-requisition 依赖 | tasks 注明前置:统一物料库迁移已执行 |
## Migration Plan
1. DDL:formula、prep、prep_line;字典项 `configured_reagent`;step 子表(若新建)
2. 部署后端 API + 前端
3. 无历史数据迁移(新能力);旧耗材包保持废弃
回滚:隐藏菜单与 API;新表保留不删(软兼容)。
## Open Questions
| # | 问题 | 默认 |
|---|------|------|
| Q1 | 配制单是否独立菜单 vs 物料库 Tab | **物料库第四 Tab「配制单」** |
| Q2 | prep_no 生成规则 | 租户内按日序号,如 `PZ-YYYYMMDD-NNN` |
| Q3 | 取消配制单是否回滚库存 | 首版仅 draft 可删;completed 不可撤销 |