日期: 2026-05-26 状态: 待实施 方案: A(在现有生产工单页面扩展 tab)
create_outbound_production_work_order() 函数,通用列表 API 已支持 workOrderType=outbound 过滤| # | 需求项 | 确认结果 |
|---|---|---|
| 1 | 出库工单生成时机 | 输注计划创建时立即自动创建 |
| 2 | 输注计划删除时出库工单行为 | 保留工单,状态变为已作废(yzf) |
| 3 | 业务类型字段 | 新增 biz_type 字段区分中试服务(pilot_service)/临床应用(clinical_application) |
| 4 | 详情弹窗 | 复用现有 SystemViewDialog,增加申请单信息和输注计划信息区块 |
| 5 | 操作按钮 | 查看详情、编辑(仅备注)、删除、编辑任务、派发任务、完成工单 |
| 6 | 列表列 | 工单号、业务类型、申请单号、细胞类型、规格、输注时间、备注、工单状态、创建时间 |
| 7 | 全部 tab 操作列 | 隐藏 |
ALTER TABLE biz_production_work_order
ADD COLUMN biz_type VARCHAR(20) NULL COMMENT '业务类型: pilot_service=中试服务, clinical_application=临床应用' AFTER infusion_schedule_id;
现有:dpz(待配置), jxz(进行中), ywc(已完成)
新增:yzf(已作废)
无需 ALTER TABLE,VARCHAR(16) 已足够容纳。仅需更新模型 comment:
ALTER TABLE biz_production_work_order
MODIFY COLUMN work_order_status VARCHAR(16) NOT NULL DEFAULT 'dpz' COMMENT '工单状态 dpz待配置 jxz进行中 ywc已完成 yzf已作废';
ALTER TABLE biz_production_work_order
MODIFY COLUMN work_order_type VARCHAR(20) NOT NULL DEFAULT 'inbound' COMMENT '工单类型: inbound=入库, temporary=临时, outbound=出库';
backend/app/models/models.pyBizProductionWorkOrder 新增:
biz_type = Column(String(20), nullable=True, comment="业务类型: pilot_service=中试服务, clinical_application=临床应用")
更新 work_order_type 和 work_order_status 字段 comment。
backend/app/crud/production_work_order.py_WORK_ORDER_STATUS_LABELS = {
"dpz": "待配置",
"jxz": "进行中",
"ywc": "已完成",
"yzf": "已作废", # 新增
}
_wo_to_dict() 增加字段返回值新增:
"bizType": getattr(wo, "biz_type", None) or None,
"bizTypeLabel": {"pilot_service": "中试服务", "clinical_application": "临床应用"}.get(getattr(wo, "biz_type", None), ""),
create_outbound_production_work_order() 增加 biz_type 参数函数签名新增 biz_type: str = "pilot_service" 参数,创建时写入 biz_type 字段。
在 _enrich_wo_items() 或列表返回后,对 workOrderType == "outbound" 的记录:
infusion_schedule_id 关联 BizPilotInfusionScheduleinfusion_plan_id 关联 BizPilotInfusionPlanpilot_application_id 关联 BizPilotApplicationapplicationNo, applicationName, cellType, specText, infusionTime, infusionLocation在 _wo_to_response_dict() 中对 outbound 类型,增加返回:
"pilotApplication": {
"applicationNo": "...",
"applicationName": "...",
"applicationStatus": "...",
},
"infusionSchedule": {
"cellType": "...",
"specText": "...",
"infusionTime": "...",
"infusionLocation": "...",
"infusionMethod": "...",
"scheduleStatus": "...",
}
backend/app/crud/pilot_application.py在 create_schedule() 函数末尾(db.commit() 之前),增加:
# 自动创建出库生产工单
from app.crud import production_work_order as pwo_svc
pwo_svc.create_outbound_production_work_order(
db,
schedule_id=schedule_id,
tenant_no=tenant_no,
user_id=user_id,
create_dept_id=dept_id,
biz_type="pilot_service",
)
注意:create_outbound_production_work_order 内部已有幂等检查(通过 infusion_schedule_id 查重),重复调用不会产生重复工单。
backend/app/crud/pilot_application.py在 soft_delete_schedule() 函数中,row.del_flag = 1 之前,增加:
# 关联的出库生产工单标记为已作废
outbound_wo = (
db.query(BizProductionWorkOrder)
.filter(
BizProductionWorkOrder.infusion_schedule_id == schedule_id,
BizProductionWorkOrder.tenant_no == tenant_no,
BizProductionWorkOrder.del_flag == 0,
BizProductionWorkOrder.work_order_type == "outbound",
)
.first()
)
if outbound_wo:
outbound_wo.work_order_status = "yzf"
outbound_wo.update_time = datetime.now()
需在文件头部导入 BizProductionWorkOrder。
backend/app/schemas/production_work_order.pyProductionWorkOrderListQuery 如需支持按 biz_type 筛选,新增可选字段。当前需求未要求筛选,暂不增加。
web-admin/src/views/production/production-work-order/index.vuetype WorkOrderTypeTab = 'inbound' | 'temporary' | 'outbound' | 'all'
<el-tabs v-model="activeTypeTab" class="work-order-type-tabs" @tab-change="handleTypeTabChange">
<el-tab-pane label="入库生产工单" name="inbound" />
<el-tab-pane label="临时生产工单" name="temporary" />
<el-tab-pane label="出库生产工单" name="outbound" />
<el-tab-pane label="全部生产工单" name="all" />
</el-tabs>
v-if="activeTypeTab !== 'all' && activeTypeTab !== 'outbound'"const searchPlaceholder = computed(() => {
if (activeTypeTab.value === 'temporary') return '工单号'
if (activeTypeTab.value === 'outbound') return '工单号/申请单号'
return '工单号/协议号/样本编码'
})
新增出库工单专属列(仅在 outbound tab 显示):
v-if="activeTypeTab === 'outbound'"v-if="activeTypeTab === 'outbound'"v-if="activeTypeTab === 'outbound'"v-if="activeTypeTab === 'outbound'"v-if="activeTypeTab === 'outbound'"更新 tag 映射:
// 工单类型 tag(全部 tab 显示)
const woTypeTag = (type: string) => {
const map: Record<string, { label: string; type: string }> = {
inbound: { label: '入库', type: 'success' },
temporary: { label: '临时', type: 'warning' },
outbound: { label: '出库', type: 'primary' },
}
return map[type] || { label: type, type: 'info' }
}
操作列 <el-table-column> 添加条件:
<el-table-column
v-if="activeTypeTab !== 'all'"
label="操作"
...
>
const woStatusTag = (status: string) => {
const map: Record<string, { label: string; type: string }> = {
dpz: { label: '待配置', type: 'info' },
jxz: { label: '进行中', type: 'warning' },
ywc: { label: '已完成', type: 'success' },
yzf: { label: '已作废', type: 'danger' }, // 新增
}
return map[status] || { label: status, type: 'info' }
}
增加已作废选项:
<el-option label="已作废" value="yzf" />
对 outbound 类型(isOutbound = d.workOrderType === 'outbound'):
基本信息 section:
中试申请信息 section(新增,仅 outbound):
{
title: '中试申请信息',
fields: [
{ label: '申请单号', value: d.pilotApplication?.applicationNo || '—' },
{ label: '申请名称', value: d.pilotApplication?.applicationName || '—' },
{ label: '申请状态', value: applicationStatusLabel(d.pilotApplication?.applicationStatus), tagType: ... },
]
}
输注计划信息 section(新增,仅 outbound):
{
title: '输注计划信息',
fields: [
{ label: '细胞类型', value: d.infusionSchedule?.cellType || '—' },
{ label: '规格', value: d.infusionSchedule?.specText || '—' },
{ label: '输注时间', value: d.infusionSchedule?.infusionTime || '—' },
{ label: '输注地点', value: d.infusionSchedule?.infusionLocation || '—' },
{ label: '输注方式', value: d.infusionSchedule?.infusionMethod || '—' },
]
}
不显示:运输信息 section、样本接收 section(这些是入库工单特有的)
outbound tab 的操作按钮与 inbound/temporary 基本一致:
const showReceptionCols = computed(() => activeTypeTab.value !== 'temporary' && activeTypeTab.value !== 'outbound')
| 文件 | 改动类型 | 说明 |
|---|---|---|
docs/sql/2026-05-26-outbound-work-order.sql |
新增 | ALTER TABLE SQL 脚本 |
backend/app/models/models.py |
修改 | BizProductionWorkOrder 新增 biz_type 字段,更新 comment |
backend/app/crud/production_work_order.py |
修改 | 状态映射、biz_type 字段、出库工单创建参数、列表增强、详情增强 |
backend/app/crud/pilot_application.py |
修改 | create_schedule 自动创建钩子、soft_delete_schedule 作废钩子 |
web-admin/src/views/production/production-work-order/index.vue |
修改 | 新增 tab、列配置、操作按钮逻辑、详情弹窗、状态映射 |