111 lines
5.4 KiB
Markdown
111 lines
5.4 KiB
Markdown
## 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 不可撤销 |
|