2026-06-25-qc-work-order-all-tab-design.md 11 KB

质检工单「所有」Tab — 设计文档

日期:2026-06-25
状态:已确认
范围:web-admin 【质检工单】【我的质检任务】;后端列表 API 跨类型关键词增强
关联:2026-06-16-qc-work-order-tab-split-design.md、2026-06-12-qc-task-assignee-my-tasks-design.md


1. 背景与目标

1.1 需求

客户在现有 5 个分类 Tab(细胞存储 / 科研捐赠 / 中试服务 / 基础实验 / 临时)之前新增 「所有」 Tab,用于跨类型总览质检工单。

1.2 目标

  • 【质检工单】【我的质检任务】均增加「所有」Tab,置于 Tab 栏首位。
  • 「所有」Tab 展示 5 类可见工单(不含 hidden 的临床应用)。
  • 卡片标题行增加质检类型 Tag(细胞存储 / 科研捐赠 / 中试服务 / 基础实验 / 临时)。
  • 筛选区采用精简共用字段;mine 页在共用基础上增加任务相关筛选。

1.3 非目标

  • 不在「所有」Tab 提供「新增临时工单」工具栏(仍仅在「临时质检」Tab)。
  • 不在「所有」Tab 复用样本分组 / 输注计划分组布局(混排时分组规则冲突)。
  • 不在本期实现出库工单的输注/交付时间筛选(保留在各分类 Tab);「所有」Tab 统一使用创建时间。
  • 不展示 hidden 的「临床应用」类型(与现有 5 Tab 策略一致)。

2. Tab 配置变更

2.1 新增 Tab Key

Tab Key 展示标签 位置 列表布局
all 所有 首位(默认 Tab) standalone(平铺,不分组)

2.2 Tab 栏顺序(两页一致)

所有 | 细胞存储质检 | 科研捐赠质检 | 中试服务质检 | 基础实验质检 | 临时质检

2.3 默认 Tab

  • 新默认: all(替换原 inbound_cell_storage)。
  • 路由:?tab=all;旧链接 ?tab=inbound 等兼容映射保持不变。

2.3 类型 Tag 映射(卡片展示)

复用 resolveTabKeyFromWorkOrder(row),映射为短标签:

resolveTabKeyFromWorkOrder 结果 Tag 文案 Tag 语义色
inbound_cell_storage 细胞存储 primary
inbound_research_donation 科研捐赠 primary
outbound_pilot_service 中试服务 info
outbound_basic_experiment 基础实验 info
temporary 临时 warning

outbound_clinical_application 不在「所有」Tab 展示(hidden Tab 策略延续)。


3. 筛选区设计

3.1 【质检工单】manage 模式 — 主区域

字段 控件 说明
质检类型 el-select 全部 / 细胞存储 / 科研捐赠 / 中试服务 / 基础实验 / 临时;映射为 workOrderType + receptionSource / bizType 组合传给 API
关键词 el-input placeholder:工单号 / 样本编码 / 申请单号 / 产品名称等
工单状态 el-select 待配置 / 已配置 / 已完成 / 已作废
创建时间 el-date-picker daterange 统一按 createTimeStart / createTimeEnd

hint 文案: 出库工单按输注/交付时间筛选请进入对应分类 Tab。

3.2 【质检工单】manage 模式 — 展开更多

字段 控件 选项
工单来源 el-select 样本接收 / 计划质检 / 生产过程 / 生产派发 / 手动创建

工单来源筛选逻辑:

  • 样本接收 → triggerSource=reception
  • 计划质检 → triggerSource=schedule
  • 生产过程 → triggerSource=production(非临时)
  • 生产派发 → 临时工单且 triggerSource=production
  • 手动创建 → 临时工单且 triggerSource≠production

3.3 【我的质检任务】mine 模式 — 主区域

与 manage 一致,额外增加:

字段 控件 说明
任务状态 el-select 待执行 / 进行中 / 已完成
任务类型 el-select 实验室自检 / 第三方检测

主区域栅格:关键词、工单状态、任务状态、创建时间(第一行);任务类型可放展开区或与工单状态同行(实现时按 4 列栅格自适应,窄屏折行)。

hint 文案: 仅展示指派给当前登录人的质检任务。出库工单按输注/交付时间筛选请进入对应分类 Tab。

3.4 【我的质检任务】mine 模式 — 展开更多

与 manage 一致:工单来源。

3.5 质检类型 → API 参数映射

选项 API 参数
全部 不传 workOrderType / receptionSource / bizType
细胞存储 workOrderType=inbound + receptionSource=cell_storage
科研捐赠 workOrderType=inbound + receptionSource=research_donation
中试服务 workOrderType=outbound + bizType=pilot_service
基础实验 workOrderType=outbound + bizType=basic_experiment
临时 workOrderType=temporary

当用户在「所有」Tab 内选了具体质检类型,行为等价于在该子类型下筛选,但列表仍为平铺 + 类型 Tag 布局。


4. 列表与卡片

4.1 列表布局

  • all Tab:listLayout = standalone,不使用 groupInboundQcWorkOrders / groupOutboundQcWorkOrders。
  • 分页仍按工单条数(与临时 Tab 一致)。

4.2 卡片标题行

在现有「工单状态 Tag」「触发来源 Tag」之前或之后,增加质检类型 Tag(见 §2.3)。

  • 卡片主标题:统一使用 工单号 workOrderNo(不再按入库/出库规则切换为入库编码或产品编码)。
  • showTriggerTag:保持 true(与分类 Tab 一致,展示样本接收/计划质检/生产过程等)。

4.3 卡片 meta 字段(按行动态)

根据 resolveTabKeyFromWorkOrder(row) 选取对应分类 Tab 的 metaFields 子集,不整表复用(避免出库 Tab 专有费用条等在「所有」Tab 误显)。

类型 meta 字段(按顺序)
细胞存储 / 科研捐赠 质检对象、实验室入库编码、检测方式、创建时间
中试服务 申请单号、申请单名称、患者姓名、输注时间、检测方式
基础实验 申请单号、课题名称、客户名称、交付时间、检测方式
临时 产品名称、产品编码、检测方式、创建时间

备注:有值时展示(沿用 visible 规则);协议费用条、出库费用条在「所有」Tab 不展示(showProtocolFeeSummary=false,showOutboundFeeSummary=false)。

4.4 细胞产品区块

  • 中试服务 / 基础实验行:若 triggerSource=schedule 或 production,按原 Tab 规则展示 showCellProducts 区块。
  • 其它类型:不展示细胞产品区块。

4.5 操作与查看弹窗

  • manage:操作按钮规则按行实际类型的 cardMetaConfig(allowEditTemporary、allowDelete 等)动态判断。
  • mine:仅查看工单 + 任务操作(与现有一致)。
  • 查看弹窗:QC_WORK_ORDER_VIEW_DIALOG_COMPONENTS[resolveTabKeyFromWorkOrder(row)]。

5. 后端变更

5.1 跨类型关键词(必须)

list_work_orders 当 work_order_type 为空(「所有」+ 质检类型=全部)时,关键词应覆盖:

范围 匹配字段
通用 work_order_no、sample_code
入库 lab_storage_code(经 reception 关联,现有逻辑)
出库 申请单号、申请单名称、患者、课题、客户(现有 _outbound_qc_work_order_ids_by_keyword)
临时 work_order_no、关联生产工单号、细胞产品名称/编码(若已 enrich)

实现:当 wt 为空时,关键词 OR 条件合并入库 + 出库 + 临时字段(与分别传 outbound 时行为一致)。

5.2 质检类型子筛选

无需新 API 字段;前端将 §3.5 映射为现有 workOrderType / receptionSource / bizType 查询参数。

5.3 时间筛选

「所有」Tab 仅传 createTimeStart / createTimeEnd;不传 infusionTimeStart / infusionTimeEnd。

5.4 我的任务 — mine 数据流

tabKey=all 时:

  1. fetchAllMineTasks 不按 workOrderType 限制(或传全类型 union)。
  2. filterMineEntriesByWorkOrderSearch:tabKey=all 时跳过 resolveTabKeyFromWorkOrder(row) !== tabKey 校验;关键词/时间/工单状态/工单来源按行类型分别匹配(复用 keywordMatchesWorkOrder 时传入 resolveTabKeyFromWorkOrder(row))。
  3. 质检类型子筛选:前端 filter resolveTabKeyFromWorkOrder(row) 与所选子类型一致。

6. 前端实现要点

6.1 工具与类型

  • QcWorkOrderTabKey 增加 'all'。
  • QC_WORK_ORDER_TABS 首部插入 all 配置;QC_WORK_ORDER_VISIBLE_TABS 自动包含。
  • DEFAULT_QC_WORK_ORDER_TAB → 'all'。
  • 新增 qcWorkOrderCategoryLabel(row) / qcWorkOrderCategoryTagType(row) 工具函数。
  • 新增 getAllTabCardMetaForRow(row) 或 CARD_META_BY_TAB.all + 行级 meta 解析。

6.2 组件

  • 新增 AllTab.vue(或复用 QcWorkOrderTabPanel + tabKey=all)。
  • QcWorkOrderSingleCard:支持 cardMetaConfig.tabKey === 'all' 时按行解析 meta;标题行渲染类型 Tag。
  • QcWorkOrderCardList:all 时 useGroupedList=false;可选传入 resolveCardMetaPerRow。
  • index.vue(两页):Tab 列表改用含 all 的 visible tabs;默认 tab 解析更新。

6.3 注册表

  • tab-registry.ts、view-dialog-registry.ts:all Tab 无独立 view dialog 组件;查看时按行 resolveTabKeyFromWorkOrder 动态选择(QcWorkOrderTabPanel 已有模式可扩展)。

7. 验收标准

  1. 两页 Tab 栏首位为「所有」,默认进入「所有」Tab。
  2. 「所有」Tab 列表含 5 类工单,每条卡片有正确类型 Tag。
  3. 质检类型=全部时,关键词可搜到入库样本编码、出库申请单号、临时工单号。
  4. 质检类型子筛选后,列表仅含所选类型。
  5. 创建时间筛选在「所有」Tab 对所有类型按 create_time 生效。
  6. mine 页任务状态/任务类型筛选与现有一致,且与「所有」Tab 共用结构。
  7. 查看弹窗按工单实际类型打开正确 dialog。
  8. 分类 Tab 行为与改动前一致(回归)。

8. 已确认决策

问题 决策
两页是否都加「所有」? 是 — 筛选结构一致;mine 页多任务状态/任务类型
列表是否分组? 否 — 平铺 standalone
「所有」Tab 时间字段? 创建时间;出库输注/交付时间留在分类 Tab
类型 Tag 文案? 细胞存储 / 科研捐赠 / 中试服务 / 基础实验 / 临时
默认 Tab? 所有