入库生产工单 + 生产任务 + 细胞产品库 设计文档
日期: 2026-05-19
状态: 已确认
关联模块: 样本接收、工艺路线管理、库位管理
1. 业务背景
当前系统中,样本接收(accept_conclusion="js")后会自动触发一个入库质检工单。现在需要在此基础上,同时触发生成一个入库生产工单。生产工单可以创建多个生产任务单,生产任务单用于记录完整的工艺过程执行数据。
业务流程
样本接收(accept_conclusion="js")
├→ 自动创建 入库质检工单 (已有)
└→ 自动创建 入库生产工单 (新增, 状态=dpz待配置)
└→ 用户在工单中手动创建 生产任务单(1:N)
├→ 选择一个工艺路线 → 克隆全部步骤(含试剂/耗材/产出/采集项)
├→ 可新增/删除工艺步骤
├→ 可录入输入(样本或细胞产品)
├→ 执行过程中填写实际用量、采集值
└→ 录入输出(细胞产品 → 存入细胞产品库 → 关联储物格)
2. 需求共识
- 触发机制: 样本接收后自动创建入库生产工单(状态为"待配置"),与质检工单在同一个事务中
- 工单→任务关系: 1对多,用户在工单中自由创建多个生产任务单
- 生产任务单三部分(全部用子表):
- 输入子表: 可选关联样本或细胞产品
- 工艺过程: 必选一个工艺路线,克隆其所有步骤(含试剂、耗材、产出物、数据采集项),可修改
- 输出子表: 记录产出的细胞产品,关联储物格位置
- 细胞产品库: 新建
biz_cell_product 表(产品编码、类型、规格、储物格、状态等)
- 菜单位置: 在【生产管理】下新增"入库生产工单"、"生产任务"、"细胞产品库"三个二级菜单
- 数据采集填写: 克隆数据采集项后,用户在生产执行过程中填写采集值
- 工艺过程可编辑: 选了工艺路线后可以新增/删除工艺步骤;执行中仍可继续增删
- 实际用量录入: 用户可录入耗材实际使用量、试剂实际使用量、数据采集值等
3. 数据库设计
3.1 新增表概览(10 张)
| # |
表名 |
说明 |
| 1 |
biz_cell_product |
细胞产品库 |
| 2 |
biz_production_work_order |
入库生产工单 |
| 3 |
biz_production_task |
生产任务 |
| 4 |
biz_production_task_input |
任务输入子表 |
| 5 |
biz_production_task_step |
任务工艺步骤(克隆自路线) |
| 6 |
biz_production_task_step_reagent |
步骤试剂 + 实际用量 |
| 7 |
biz_production_task_step_consumable |
步骤耗材 + 实际用量 |
| 8 |
biz_production_task_step_output |
步骤产出物 + 实际条码 |
| 9 |
biz_production_task_step_data_collection |
步骤数据采集项 + 填写值 |
| 10 |
biz_production_task_output |
任务输出子表(细胞产品+储物格) |
3.2 表关系图
biz_sample_reception ──→ biz_production_work_order ──→ biz_production_task
│ │
└──→ biz_qc_work_order (已有) ├── biz_production_task_input
├── biz_production_task_step (克隆自)
│ └── biz_process_route_step
│ ├── ..._reagent
│ ├── ..._consumable
│ ├── ..._output
│ └── ..._data_collection
├── biz_production_task_output
└── biz_cell_product ← 细胞产品库
└── biz_storage_facility_slot (库位)
3.3 详细字段设计
3.3.1 biz_cell_product — 细胞产品库
CREATE TABLE `biz_cell_product` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`product_code` varchar(64) NOT NULL COMMENT '产品编码',
`product_name` varchar(200) NOT NULL COMMENT '产品名称',
`product_type_id` varchar(64) DEFAULT NULL COMMENT '细胞产品类型ID',
`spec_id` varchar(64) DEFAULT NULL COMMENT '规格ID',
`batch_no` varchar(64) DEFAULT NULL COMMENT '批次号',
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
`product_status` varchar(16) NOT NULL DEFAULT 'zk' COMMENT '状态(zk在库/yc已出库/ysy已使用)',
`source_type` varchar(20) DEFAULT 'production' COMMENT '来源类型(production生产/manual手动录入)',
`production_task_id` varchar(64) DEFAULT NULL COMMENT '来源生产任务ID',
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
`expiry_date` datetime DEFAULT NULL COMMENT '有效期',
`product_images` varchar(4000) DEFAULT NULL COMMENT '产品图片URL(逗号分隔)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_cp_tenant_status` (`tenant_no`,`product_status`,`del_flag`),
KEY `idx_cp_type` (`product_type_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='细胞产品库';
3.3.2 biz_production_work_order — 入库生产工单
CREATE TABLE `biz_production_work_order` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`work_order_no` varchar(32) NOT NULL COMMENT '工单号(前缀SC)',
`reception_id` varchar(64) NOT NULL COMMENT '样本接收记录ID',
`protocol_sample_id` varchar(64) NOT NULL COMMENT '协议样本ID',
`collection_protocol_id` varchar(64) NOT NULL COMMENT '协议单ID',
`protocol_no` varchar(64) DEFAULT NULL COMMENT '协议号快照',
`sample_code` varchar(32) DEFAULT NULL COMMENT '样本编码快照',
`reception_source` varchar(20) NOT NULL DEFAULT 'cell_storage' COMMENT '来源(cell_storage/research_donation)',
`work_order_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/ywc已完成)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pwo_reception` (`reception_id`,`del_flag`),
KEY `idx_pwo_tenant_status` (`tenant_no`,`work_order_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库生产工单';
3.3.3 biz_production_task — 生产任务
CREATE TABLE `biz_production_task` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`task_no` varchar(32) NOT NULL COMMENT '任务号(前缀RW)',
`work_order_id` varchar(64) NOT NULL COMMENT '所属工单ID',
`task_name` varchar(200) DEFAULT NULL COMMENT '任务名称',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`route_id` varchar(64) DEFAULT NULL COMMENT '所选工艺路线ID(仅记录来源)',
`task_status` varchar(16) NOT NULL DEFAULT 'dpz' COMMENT '状态(dpz待配置/jxz进行中/ywc已完成)',
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`attachments` varchar(4000) DEFAULT NULL COMMENT '附件/图片URL(逗号分隔)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pt_wo` (`work_order_id`,`del_flag`),
KEY `idx_pt_tenant_status` (`tenant_no`,`task_status`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务';
3.3.4 biz_production_task_input — 任务输入子表
CREATE TABLE `biz_production_task_input` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
`input_type` varchar(20) NOT NULL COMMENT '类型(sample样本/cell_product细胞产品)',
`input_id` varchar(64) DEFAULT NULL COMMENT '关联ID(样本ID或细胞产品ID)',
`input_code` varchar(64) DEFAULT NULL COMMENT '编码快照',
`input_name` varchar(200) DEFAULT NULL COMMENT '名称快照',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pti_task` (`task_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输入';
3.3.5 biz_production_task_step — 任务工艺步骤
CREATE TABLE `biz_production_task_step` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
`step_order` int(11) DEFAULT NULL COMMENT '步骤顺序',
`process_code` varchar(64) DEFAULT NULL COMMENT '工序代码',
`category_id` varchar(64) DEFAULT NULL COMMENT '工序分类ID',
`process_name` varchar(100) DEFAULT NULL COMMENT '工序名称',
`description` varchar(500) DEFAULT NULL COMMENT '描述',
`equipment_name` varchar(200) DEFAULT NULL COMMENT '设备名称',
`estimated_duration` varchar(100) DEFAULT NULL COMMENT '预估耗时',
`actual_duration` varchar(100) DEFAULT NULL COMMENT '实际耗时',
`sop_ids` varchar(1000) DEFAULT NULL COMMENT 'SOP文档ID(逗号分隔)',
`step_status` varchar(16) NOT NULL DEFAULT 'dzx' COMMENT '状态(dzx待执行/jxz进行中/ywc已完成)',
`started_time` datetime DEFAULT NULL COMMENT '开始时间',
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pts_task` (`task_id`,`del_flag`),
KEY `idx_pts_tenant` (`tenant_no`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务工艺步骤';
3.3.6 biz_production_task_step_reagent — 步骤试剂
CREATE TABLE `biz_production_task_step_reagent` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
`reagent_code` varchar(64) DEFAULT NULL COMMENT '试剂编码',
`reagent_name` varchar(100) DEFAULT NULL COMMENT '试剂名称',
`spec` varchar(200) DEFAULT NULL COMMENT '规格',
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
`is_key_material` char(1) DEFAULT '0' COMMENT '是否关键物料(0否 1是)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_ptsr_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤试剂';
3.3.7 biz_production_task_step_consumable — 步骤耗材
CREATE TABLE `biz_production_task_step_consumable` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
`consumable_code` varchar(64) DEFAULT NULL COMMENT '耗材编码',
`consumable_name` varchar(100) DEFAULT NULL COMMENT '耗材名称',
`spec_model` varchar(200) DEFAULT NULL COMMENT '规格型号',
`standard_usage` varchar(100) DEFAULT NULL COMMENT '标准用量',
`actual_usage` varchar(100) DEFAULT NULL COMMENT '实际用量',
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
`is_required` char(1) DEFAULT '1' COMMENT '是否必需(1必须 0可选)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_ptsc_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤耗材';
3.3.8 biz_production_task_step_output — 步骤产出物
CREATE TABLE `biz_production_task_step_output` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
`output_type_id` varchar(64) DEFAULT NULL COMMENT '产出类型ID',
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
`output_barcode` varchar(200) DEFAULT NULL COMMENT '实际条码',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_ptso_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤产出物';
3.3.9 biz_production_task_step_data_collection — 步骤数据采集
CREATE TABLE `biz_production_task_step_data_collection` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`step_id` varchar(64) NOT NULL COMMENT '步骤ID',
`collection_name` varchar(100) DEFAULT NULL COMMENT '采集项名称',
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
`collection_value` varchar(500) DEFAULT NULL COMMENT '填写值',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_ptsdc_step` (`step_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务步骤数据采集';
3.3.10 biz_production_task_output — 任务输出
CREATE TABLE `biz_production_task_output` (
`id` varchar(64) NOT NULL COMMENT '主键ID',
`task_id` varchar(64) NOT NULL COMMENT '任务ID',
`cell_product_id` varchar(64) DEFAULT NULL COMMENT '关联细胞产品ID',
`storage_slot_id` varchar(64) DEFAULT NULL COMMENT '储物格ID',
`output_name` varchar(200) DEFAULT NULL COMMENT '产出物名称',
`output_barcode` varchar(200) DEFAULT NULL COMMENT '产出物条码',
`quantity` decimal(18,4) DEFAULT NULL COMMENT '数量',
`unit` varchar(64) DEFAULT NULL COMMENT '单位',
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
`attachments` varchar(4000) DEFAULT NULL COMMENT '图片URL(逗号分隔)',
`tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`),
KEY `idx_pto_task` (`task_id`,`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务输出';
4. 后端架构
4.1 触发点
文件: backend/app/crud/sample_reception.py 第 757-766 行
在现有的 if conclusion == "js" 判断中,紧跟质检工单创建之后,添加生产工单创建调用。
if conclusion == "js":
# 现有:质检工单
from app.crud import qc_work_order as qc_wo_svc
qc_wo_svc.create_work_order_from_reception(...)
# 新增:生产工单
from app.crud import production_work_order as prod_wo_svc
prod_wo_svc.create_production_work_order_from_reception(
db, reception=obj, tenant_no=tenant_no,
user_id=user_id, create_dept_id=create_dept_id or "",
)
4.2 新增文件清单
| 层 |
文件 |
说明 |
| Models |
models.py 新增 10 个 SQLAlchemy 模型 |
对应 10 张新表 |
| CRUD |
crud/production_work_order.py |
工单 CRUD + create_production_work_order_from_reception() |
| CRUD |
crud/production_task.py |
任务 CRUD + 克隆工艺路线 + 步骤增删改 |
| CRUD |
crud/cell_product.py |
细胞产品库 CRUD |
| API |
api/production.py 扩展 |
新增工单/任务/产品库路由 |
| Schemas |
schemas/production_work_order.py |
工单 Pydantic 模型 |
| Schemas |
schemas/production_task.py |
任务 Pydantic 模型 |
| Schemas |
schemas/cell_product.py |
产品 Pydantic 模型 |
4.3 核心业务逻辑
工单号生成
- 前缀 "SC" + 日期 YYYYMMDD + 4 位序号(如
SC202605190001)
- 与质检工单 ZJ 前缀对应
- 同一租户同一天内序号递增
任务号生成
- 前缀 "RW" + 日期 YYYYMMDD + 4 位序号(如
RW202605190001)
克隆工艺路线到任务步骤
- 读取
biz_process_route_step 及其 4 个子表(reagent/consumable/output/data_collection)
- 将每个步骤克隆到
biz_production_task_step(task_id 替换 route_id)
- 将步骤的试剂/耗材/产出物/数据采集项克隆到对应的 task_step 子表
- 数据采集项的
collection_value 初始为空,等待用户执行时填写
- 试剂和耗材的
actual_usage 初始为空
执行中增删工艺
- 新增步骤: 直接在
biz_production_task_step 中插入新记录,重新排序 step_order
- 删除步骤: 软删除(del_flag=1)步骤及其子表,重新排序
- 编辑步骤: 直接更新步骤及其子表(整体替换模式)
5. 前端架构
5.1 新增菜单(在【生产管理】下)
| 菜单名称 |
路由路径 |
组件 |
| 入库生产工单 |
/production/work-order |
views/production/production-work-order/index.vue |
| 生产任务 |
/production/task |
views/production/production-task/index.vue |
| 细胞产品库 |
/production/cell-product |
views/production/cell-product/index.vue |
5.2 新增前端文件
| 文件 |
说明 |
views/production/production-work-order/index.vue |
入库生产工单列表+详情 |
views/production/production-task/index.vue |
生产任务列表+执行界面 |
views/production/cell-product/index.vue |
细胞产品库管理 |
api/production-work-order.ts |
工单 API |
api/production-task.ts |
任务 API |
api/cell-product.ts |
产品 API |
5.3 界面设计要点
- 入库生产工单: 标准 list 页面,展示工单号、协议号、样本编码、状态、创建时间。支持查看详情(含关联的生产任务列表)
- 生产任务: list 页面展示任务号、所属工单、状态、工艺路线、开始/完成时间。进入详情可执行工艺步骤、录入数据
- 细胞产品库: 标准 list 页面,支持新增手动录入或从生产任务产出自动生成
6. API 路由设计
6.1 入库生产工单 API
| Method |
Path |
说明 |
| GET |
/web/admin/production-work-orders |
工单列表(分页) |
| GET |
/web/admin/production-work-orders/{id} |
工单详情 |
| PUT |
/web/admin/production-work-orders/{id}/complete |
完成工单 |
6.2 生产任务 API
| Method |
Path |
说明 |
| POST |
/web/admin/production-tasks |
创建任务(选工艺路线,克隆步骤) |
| GET |
/web/admin/production-tasks |
任务列表(分页,支持按工单ID筛选) |
| GET |
/web/admin/production-tasks/{id} |
任务详情(含步骤+子表) |
| PUT |
/web/admin/production-tasks/{id} |
更新任务基本信息 |
| PUT |
/web/admin/production-tasks/{id}/status |
更新任务状态 |
| POST |
/web/admin/production-tasks/{id}/steps |
新增步骤 |
| PUT |
/web/admin/production-tasks/{id}/steps/{step_id} |
更新步骤 |
| DELETE |
/web/admin/production-tasks/{id}/steps/{step_id} |
删除步骤 |
| PUT |
/web/admin/production-tasks/{id}/steps/{step_id}/reagents |
替换步骤试剂 |
| PUT |
/web/admin/production-tasks/{id}/steps/{step_id}/consumables |
替换步骤耗材 |
| PUT |
/web/admin/production-tasks/{id}/steps/{step_id}/data-collection |
替换步骤数据采集 |
| POST |
/web/admin/production-tasks/{id}/inputs |
设置任务输入 |
| POST |
/web/admin/production-tasks/{id}/outputs |
设置任务输出 |
6.3 细胞产品库 API
| Method |
Path |
说明 |
| GET |
/web/admin/cell-products |
产品列表(分页) |
| GET |
/web/admin/cell-products/{id} |
产品详情 |
| POST |
/web/admin/cell-products |
新增产品 |
| PUT |
/web/admin/cell-products/{id} |
更新产品 |
| DELETE |
/web/admin/cell-products/{id} |
删除产品(软删除) |
7. 状态流转
7.1 入库生产工单
dpz(待配置) ──→ ywc(已完成)
- 创建时默认 dpz
- 所有关联任务完成后,可手动标记为 ywc
7.2 生产任务
dpz(待配置) ──→ jxz(进行中) ──→ ywc(已完成)
- 创建时默认 dpz(已克隆工艺步骤)
- 用户开始执行时手动标记为 jxz
- 所有步骤完成后标记为 ywc
7.3 生产任务步骤
dzx(待执行) ──→ jxz(进行中) ──→ ywc(已完成)
- 克隆时默认 dzx
- 用户开始该步骤时标记为 jxz,记录 started_time
- 步骤完成时标记为 ywc,记录 completed_time
8. 约束与注意事项
- 租户隔离: 所有查询必须带 tenant_no 过滤
- 软删除: 所有删除操作设置 del_flag=1,不物理删除
- 工单号唯一: SC 前缀 + 日期 + 序号,同一租户同一天唯一
- 任务号唯一: RW 前缀 + 日期 + 序号,同一租户同一天唯一
- 克隆独立性: 任务步骤克隆后与原工艺路线完全独立,后续修改互不影响
- 细胞产品编码唯一: 产品编码在租户内唯一
- 储物格关联: 细胞产品的 storage_slot_id 关联 biz_storage_facility_slot
- 触发原子性: 生产工单与质检工单在同一事务中创建,确保要么同时成功要么同时失败