日期:2026-06-16
状态:已确认方向(Tab 命名 + 拷贝再改策略 + 临床应用 hidden)
范围:web-admin生产工单 + 我的生产任务;后端列表 / mine API 补充分型过滤
参照:docs/superpowers/specs/2026-06-16-qc-work-order-tab-split-design.md(质检侧已落地)
【生产工单】【我的生产任务】现为 3 Tab(入库 / 出库 / 临时),同一 Tab 内混用字段模板:
拆为 6 个业务 Tab,每个 Tab 仅查、仅展示 对应子类型;列表卡片、查看弹窗与 Tab 一一对应。
| 项 | 决策 |
|---|---|
| Tab 展示名 | 细胞存储生产 / 科研捐赠生产 / 中试服务生产 / 基础实验生产 / 临床应用生产(hidden)/ 临时生产 |
| 实施策略 | 拷贝再改(从现有 3 Tab 界面剪出/拷贝为 6 份,再按子类型删减字段) |
| 临床应用 Tab | hidden: true,Tab 栏不展示;保留 key 与弹窗文件供数据解析/后续开放 |
| 默认 Tab | inbound_cell_storage |
| 路由 | ?tab=<tabKey> |
| Tab Key | 展示标签 | workOrderType |
receptionSource |
bizType |
hidden |
|---|---|---|---|---|---|
inbound_cell_storage |
细胞存储生产 | inbound |
cell_storage |
— | |
inbound_research_donation |
科研捐赠生产 | inbound |
research_donation |
— | |
outbound_pilot_service |
中试服务生产 | outbound |
— | pilot_service |
|
outbound_basic_experiment |
基础实验生产 | outbound |
— | basic_experiment |
|
outbound_clinical_application |
临床应用生产 | outbound |
— | clinical_application |
是 |
temporary |
临时生产 | temporary |
— | — |
每个 Tab 列表请求 必须 携带上表过滤参数,禁止 仅传 workOrderType 后客户端再筛:
细胞存储 → workOrderType=inbound AND receptionSource=cell_storage
科研捐赠 → workOrderType=inbound AND receptionSource=research_donation
中试服务 → workOrderType=outbound AND bizType=pilot_service
基础实验 → workOrderType=outbound AND bizType=basic_experiment
临床应用 → workOrderType=outbound AND bizType=clinical_application
临时 → workOrderType=temporary
验收: 任一可见 Tab 列表不得出现其它子类型工单;切换 Tab 分页重置为第 1 页。
用户明确要求:从已稳定运行的 3 Tab 界面拷贝,再按子类型删减,以最大幅度保留现有业务逻辑(筛选、分页、工具栏、卡片事件、查看弹窗 sections),避免在单一文件内继续堆 activeTypeTab / bizType 分支。
这与质检改造 组件边界一致;质检在 Tab 子页上最终用 QcWorkOrderTabPanel 收敛,生产侧按产品要求 保留 6 份更独立的 Tab 文件(拷贝痕迹可见、 diff 清晰)。
| 新 Tab 文件 | 拷贝自(现状) | 改造要点 |
|---|---|---|
tabs/InboundCellStorageTab.vue |
现 index.vue 在 activeTypeTab === 'inbound' 时的筛选+列表+查看逻辑 |
写死 receptionSource=cell_storage;卡片/弹窗保留协议、协议费用、样本接收 |
tabs/InboundResearchDonationTab.vue |
拷贝上一行 | 写死 research_donation;去掉协议缴费;状态文案改为捐赠 |
tabs/OutboundPilotTab.vue |
现 index.vue 在 activeTypeTab === 'outbound' 且中试字段逻辑 |
写死 bizType=pilot_service;保留患者/输注/诊断附件 |
tabs/OutboundBasicExperimentTab.vue |
拷贝 outbound Tab | 写死 basic_experiment;去掉患者/输注方案;保留课题/客户/交付 |
tabs/OutboundClinicalTab.vue |
拷贝 outbound Tab | 写死 clinical_application;hidden;保留临床+缴费 |
tabs/TemporaryTab.vue |
现 activeTypeTab === 'temporary' 区块 |
写死 temporary;仅最小字段+任务 |
查看弹窗: 各 Tab 内 独立一份 view-dialogs/*ViewDialog.vue(从现 index.vue 内联 SystemViewDialog + useProductionWorkOrderViewDialog 拷贝再改),禁止继续用 ProductionWorkOrderViewDialogHost + 大 variant 分支。
| 模块 | 理由 |
|---|---|
WorkOrderTaskSubList 及任务执行/派发/完成/转发弹窗 |
与 Tab 子类型无关,逻辑复杂,拷贝 6 份维护成本过高 |
production-work-order/index.vue 壳层管理弹窗 |
新增临时工单、派发任务、派发质检、样本接收、批量完成等 与 Tab 无关或仅特定 Tab 触发 |
ProductionWorkOrderCardList 外壳(可选) |
推荐 共用列表容器,各 Tab 传入不同 cardMetaConfig(与质检一致);若产品坚持卡片模板也拷贝,可在 Tab 文件内嵌独立 meta 区块,但默认方案为 cardMeta props |
utils/production-work-order-tabs.ts |
Tab 常量、可见 Tab 列表、toListQuery() |
原则: 拷贝 Tab 页 + 查看弹窗(展示差异大);共用 任务与生产管理动作(行为一致)。
| 模块 | 策略 |
|---|---|
WorkOrderTaskSubList + 任务相关弹窗 |
共用 |
ProductionWorkOrderCardList + 组/单卡 |
共用,props cardMetaConfig |
| 查看详情弹窗 | 6 份独立 view-dialogs/*.vue |
| Tab 子页面 | 6 份独立 tabs/*.vue(拷贝再改) |
生产工单壳 index.vue |
6 Tab 按钮 + <component :is="..." /> + 共用管理向弹窗 |
| 我的生产任务 | import 同一套 tabs/*,page-mode="mine" |
移除原出库 Tab 内「业务类型」下拉(my-production-task 现有 searchForm.bizType 一并删除)。
| Tab | 关键词 placeholder | 时间标签 | 时间字段 |
|---|---|---|---|
| 细胞存储生产 | 工单号/样本编码/入库编码 | 创建时间 | createTime |
| 科研捐赠生产 | 同上 | 创建时间 | createTime |
| 中试服务生产 | 工单号/申请单号/申请单名称/患者 | 输注时间 | infusionTime |
| 基础实验生产 | 工单号/申请单号/课题名称/客户 | 交付时间 | infusionTime |
| 临床应用生产 | 同中试 | 输注时间 | infusionTime |
| 临时生产 | 工单号 | 创建时间 | createTime |
默认近 30 天。
共用 ProductionWorkOrderCardList;各 Tab 传入 production-work-order-card-meta.ts 中对应配置。
paymentSummary 时展示协议缴费面板receptionSource、协议状态| Tab | 弹窗文件 | 要点 |
|---|---|---|
| 细胞存储 | InboundCellStorageProductionViewDialog.vue |
协议缴费 + 运输 + 样本接收 + 生产任务 |
| 科研捐赠 | InboundResearchDonationProductionViewDialog.vue |
无协议缴费;捐赠状态 |
| 中试 | OutboundPilotProductionViewDialog.vue |
中试 context + 产品 + 任务 |
| 基础实验 | OutboundBasicExperimentProductionViewDialog.vue |
课题/客户/交付 + 缴费(若有) |
| 临床应用 | OutboundClinicalProductionViewDialog.vue |
临床完整 + 缴费 |
| 临时 | TemporaryProductionViewDialog.vue |
最小信息 + 任务 |
可抽 useProductionWorkOrderTaskViewSections.ts 供 6 弹窗 import 任务/步骤区块,避免任务展示逻辑拷 6 份。
删除/替换: ProductionWorkOrderViewDialogHost.vue、useProductionWorkOrderViewDialog.ts(逻辑迁入 6 弹窗 + composable);index.vue 内联 SystemViewDialog 移除。
与生产工单 共用 6 个 Tab 子组件(tabs/*)。
差异:
pageMode='mine'WorkOrderTaskSubList:listMode=mine,operateScope=mineGET /production-tasks/mine + Tab 一致 receptionSource / bizType 过滤production-mine-task-groups.ts(对标 qc-mine-task-groups.ts)GET /production-work-orders新增 Query:receptionSource、bizType;list_production_work_orders() 增加过滤。
GET /production-tasks/mine新增 Query:receptionSource、bizType;join biz_production_work_order 过滤。
出库列表确认/补充 projectTitle、customerName(基础实验卡片);关键词支持课题/客户(对标质检)。
web-admin/src/views/production/production-work-order/
index.vue # 6 Tab 壳 + 管理向共用弹窗
tabs/
InboundCellStorageTab.vue # 从现 inbound 拷贝改
InboundResearchDonationTab.vue # 拷贝 inbound 改
OutboundPilotTab.vue # 从现 outbound 拷贝改
OutboundBasicExperimentTab.vue # 拷贝 outbound 改
OutboundClinicalTab.vue # 拷贝 outbound 改(hidden)
TemporaryTab.vue # 从现 temporary 拷贝改
view-dialogs/ # 6 独立查看弹窗
composables/ # 任务 sections、附件等可共用
web-admin/src/utils/
production-work-order-tabs.ts
production-work-order-card-meta.ts
web-admin/src/utils/
production-mine-task-groups.ts # mine 数据管道
receptionSource| 日期 | 决策 |
|---|---|
| 2026-06-16 | 6 Tab 命名确认;临床应用 hidden |
| 2026-06-16 | 拷贝再改:从现 3 Tab 剪出/拷贝为 6 Tab 页 + 6 查看弹窗;任务与管理弹窗共用 |
| 2026-06-16 | 卡片列表容器共用 + cardMetaConfig(避免 6 份卡片 markup 拷贝);若实现中发现 inbound 组头差异过大,允许 Inbound*Tab 内单独包一层组头组件 |
docs/superpowers/plans/2026-06-16-production-work-order-tab-split.md