2026-07-29-outbound-release-tabs-ready-void-design.md 7.6 KB

出库放行审核 · 待审核/已审核 Tab + 就绪过滤 + 作废隐藏

日期:2026-07-29
状态:已实现
模块:中试服务 / 基础实验(及共用同页的临床应用入口)→ 出库放行审核
关联(对齐入库):

  • docs/superpowers/specs/2026-07-16-storage-release-review-tabs-design.md
  • docs/superpowers/specs/2026-07-29-storage-release-pending-ready-filter-design.md
  • docs/superpowers/specs/2026-07-29-storage-release-hide-voided-related-design.md
    界面模式:P22(审核列表)+ panel-pill-tabs
    参考页:web-admin/src/views/quality-inspection/storage-release-review/index.vue
    实现页:web-admin/src/views/pilot-service/outbound-release-review/index.vue
    后端:backend/app/crud/outbound_release_review.py

1. 背景与目标

现状

「出库放行审核」以输注计划为主表,列表无 Tab;筛选区「审核结论」含无效空值「待审核」。未按质检/生产完成度默认收敛,关联出库工单全部作废后行仍可能出现。

中试服务、基础实验(及临床应用)菜单下的出库放行审核共用同一 Vue 页(bizType 区分),需一并调整。

目标

  1. 双 Tab:待审核 / 已审核(交互与入库一致)。
  2. 就绪过滤:待审核默认仅展示出库质检侧与出库生产侧均「已完成」的记录;复选框「展示全部待审核」勾选后展示全部待审。
  3. 作废隐藏:出库质检或出库生产「有工单且全部 yzf」时,两 Tab 均不展示该行。
  4. 分页与 total 与过滤一致。

范围外

  • 不改详情、单条/批量审核、出库物料准备接口(直链仍可打开与操作)
  • 不软删输注计划或审核行;不改表结构
  • 不做协议(采集/捐赠)无效态过滤(出库场景无此关联)
  • 入库/临时工单不参与本规则
  • 不强制「未完成禁止审核」(仅列表默认隐藏;勾选后仍可审)

2. 需求确认记录

维度 决定
菜单范围 中试 + 基础实验(同页组件一并覆盖临床入口)
Tab 待审核 / 已审核;默认待审核
就绪 UI 「展示全部待审核」复选框;仅待审核可见;默认不勾选
就绪语义 对齐入库:无未完成状态码 ⇒ 该侧完成(含零工单);yzf 不算未完成
作废隐藏 该侧有出库工单且全部 yzf 才因该侧隐藏
工单范围 质检:qc_biz_type=outbound + trigger_source=schedule;生产:work_order_type=outbound;键:infusion_schedule_id
作废作用 Tab 两 Tab 常驻
详情/审核 仅列表隐藏,API 不拦
实现路径 后端列表参数 + SQL;前端 Tab + 复选框

3. Tab 与筛选

3.1 Tabs

key 文案 默认
pending 待审核 ✓
reviewed 已审核

布局:panel-top → panel-pill-tabs → 筛选 → 工具栏 → 卡片列表 + 分页。

切换 Tab:页码回 1、清空勾选、保留其它筛选;从已审核切回待审核时复选框恢复不勾选。

3.2 审核结论筛选

  • 去掉空值「待审核」选项(由 Tab 承担)。
  • 保留清空 = 当前 Tab 内全部;选项:通过 tg / 不通过 btg。
  • 待审核 Tab 下若再选通过/不通过 → 与阶段叠加,结果为空属预期。

3.3 阶段过滤(后端)

以输注计划为主表;审核结论来自关联 biz_outbound_release_review(del_flag=0)。

reviewPhase 语义
pending 不存在「有非空 review_conclusion」的审核记录(与现有 review_conclusion=pending 一致)
reviewed 存在审核记录且 review_conclusion 非空
缺省/非法 不按阶段过滤(兼容)

前端:待审核始终传 reviewPhase=pending;已审核传 reviewed。具体结论筛选用现有 reviewConclusion(仅 tg/btg)。

4. 就绪过滤(待审核默认)

4.1 UI

仅待审核显示复选框,主文案:展示全部待审核;副文案对齐入库:默认不勾选仅展示质检与生产工单均为完成的记录;勾选后展示全部。

重置 → 不勾选。

4.2 「侧完成」语义

关联:同租户、del_flag=0、infusion_schedule_id = 当前计划 id。

侧 工单范围 已完成 未完成
质检 qc_biz_type=outbound 且 trigger_source=schedule 无工单;或不存在 work_order_status IN ('dpz','ypz') 存在至少一条 dpz/ypz
生产 work_order_type=outbound 无工单;或不存在 work_order_status IN ('dpz','jxz') 存在至少一条 dpz/jxz

说明:仅 ywc/yzf、无未完成码 → 该侧已完成。零工单 → 该侧已完成。

4.3 API

readyForReviewOnly=true 时:质检侧已完成 AND 生产侧已完成(双 NOT EXISTS 未完成工单)。缺省/false → 不按就绪过滤。

仅前端在「待审核且未勾选展示全部」时传 true。

5. 作废隐藏(两 Tab 常驻)

5.1 条件(满足任一则隐藏)

  1. 出库质检全作废:存在 ≥1 张上述范围质检工单,且不存在状态非 yzf(含 NULL 视为非作废)的工单。
  2. 出库生产全作废:存在 ≥1 张上述范围生产工单,且全部为 yzf(NULL 非作废)。
列表可见 ⇔ 非(质检全作废 OR 生产全作废)

与 reviewPhase / readyForReviewOnly / 关键词等 AND 叠加。无查询参数开关。

无协议无效过滤。混有非 yzf → 不因该侧隐藏。仅入库/临时工单作废 → 不影响。

5.2 与就绪过滤的关系

就绪过滤将单侧仅 yzf 视为「已完成」;若该侧全部为 yzf,作废隐藏优先,行不可见(含勾选「展示全部待审核」时)。

6. API 与改动面

6.1 列表接口

沿用 GET 出库放行审核列表,增加:

参数 说明
reviewPhase pending | reviewed
readyForReviewOnly 布尔;true 启用双工单侧完成过滤

作废隐藏在 CRUD list_reviews_paginated 内常驻。过滤在 COUNT/分页之前。

详情/审核/物料 API 不变。

6.2 前端

文件 变更
web-admin/src/views/pilot-service/outbound-release-review/index.vue Tab、复选框、请求参数、去掉空「待审核」选项
web-admin/src/api/outbound-release-review.ts params 增加 reviewPhase、readyForReviewOnly

卡片列表组件可不改结构。

6.3 后端

文件 变更
backend/app/api/outbound_release_review.py Query 透传新参数
backend/app/crud/outbound_release_review.py phase / ready / void EXISTS 过滤
backend/tests/test_outbound_release_review_*.py normalize 与/或谓词单测(按实现计划)

7. 测试要点

  1. 待审核默认:存在出库质检 dpz/ypz 或出库生产 dpz/jxz → 不出现;两侧均无未完成(含双无工单)→ 可出现。
  2. 勾选「展示全部待审核」→ 待审核全集(仍排除全作废)。
  3. 出库质检全部 yzf 或出库生产全部 yzf → 两 Tab 均不出现。
  4. 混有 ywc+yzf → 不因该侧作废隐藏。
  5. 已审核无复选框;作废隐藏仍生效。
  6. 中试 / 基础实验入口行为一致(同页不同 bizType)。
  7. total 与过滤一致;详情直链仍可用。

8. 方案取舍

方案 结论
1. 后端参数 + SQL + 前端 Tab/复选框 采用
2. 前端拉全量过滤 拒绝
3. 作废钩子软删 拒绝