日期:2026-07-29
状态:已实现
模块:中试服务 / 基础实验(及共用同页的临床应用入口)→ 出库放行审核
关联(对齐入库):
docs/superpowers/specs/2026-07-16-storage-release-review-tabs-design.mddocs/superpowers/specs/2026-07-29-storage-release-pending-ready-filter-design.mddocs/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
「出库放行审核」以输注计划为主表,列表无 Tab;筛选区「审核结论」含无效空值「待审核」。未按质检/生产完成度默认收敛,关联出库工单全部作废后行仍可能出现。
中试服务、基础实验(及临床应用)菜单下的出库放行审核共用同一 Vue 页(bizType 区分),需一并调整。
yzf」时,两 Tab 均不展示该行。total 与过滤一致。| 维度 | 决定 |
|---|---|
| 菜单范围 | 中试 + 基础实验(同页组件一并覆盖临床入口) |
| Tab | 待审核 / 已审核;默认待审核 |
| 就绪 UI | 「展示全部待审核」复选框;仅待审核可见;默认不勾选 |
| 就绪语义 | 对齐入库:无未完成状态码 ⇒ 该侧完成(含零工单);yzf 不算未完成 |
| 作废隐藏 | 该侧有出库工单且全部 yzf 才因该侧隐藏 |
| 工单范围 | 质检:qc_biz_type=outbound + trigger_source=schedule;生产:work_order_type=outbound;键:infusion_schedule_id |
| 作废作用 Tab | 两 Tab 常驻 |
| 详情/审核 | 仅列表隐藏,API 不拦 |
| 实现路径 | 后端列表参数 + SQL;前端 Tab + 复选框 |
| key | 文案 | 默认 |
|---|---|---|
pending |
待审核 | ✓ |
reviewed |
已审核 |
布局:panel-top → panel-pill-tabs → 筛选 → 工具栏 → 卡片列表 + 分页。
切换 Tab:页码回 1、清空勾选、保留其它筛选;从已审核切回待审核时复选框恢复不勾选。
tg / 不通过 btg。以输注计划为主表;审核结论来自关联 biz_outbound_release_review(del_flag=0)。
reviewPhase |
语义 |
|---|---|
pending |
不存在「有非空 review_conclusion」的审核记录(与现有 review_conclusion=pending 一致) |
reviewed |
存在审核记录且 review_conclusion 非空 |
| 缺省/非法 | 不按阶段过滤(兼容) |
前端:待审核始终传 reviewPhase=pending;已审核传 reviewed。具体结论筛选用现有 reviewConclusion(仅 tg/btg)。
仅待审核显示复选框,主文案:展示全部待审核;副文案对齐入库:默认不勾选仅展示质检与生产工单均为完成的记录;勾选后展示全部。
重置 → 不勾选。
关联:同租户、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、无未完成码 → 该侧已完成。零工单 → 该侧已完成。
readyForReviewOnly=true 时:质检侧已完成 AND 生产侧已完成(双 NOT EXISTS 未完成工单)。缺省/false → 不按就绪过滤。
仅前端在「待审核且未勾选展示全部」时传 true。
yzf(含 NULL 视为非作废)的工单。yzf(NULL 非作废)。列表可见 ⇔ 非(质检全作废 OR 生产全作废)
与 reviewPhase / readyForReviewOnly / 关键词等 AND 叠加。无查询参数开关。
无协议无效过滤。混有非 yzf → 不因该侧隐藏。仅入库/临时工单作废 → 不影响。
就绪过滤将单侧仅 yzf 视为「已完成」;若该侧全部为 yzf,作废隐藏优先,行不可见(含勾选「展示全部待审核」时)。
沿用 GET 出库放行审核列表,增加:
| 参数 | 说明 |
|---|---|
reviewPhase |
pending | reviewed |
readyForReviewOnly |
布尔;true 启用双工单侧完成过滤 |
作废隐藏在 CRUD list_reviews_paginated 内常驻。过滤在 COUNT/分页之前。
详情/审核/物料 API 不变。
| 文件 | 变更 |
|---|---|
web-admin/src/views/pilot-service/outbound-release-review/index.vue |
Tab、复选框、请求参数、去掉空「待审核」选项 |
web-admin/src/api/outbound-release-review.ts |
params 增加 reviewPhase、readyForReviewOnly |
卡片列表组件可不改结构。
| 文件 | 变更 |
|---|---|
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 与/或谓词单测(按实现计划) |
dpz/ypz 或出库生产 dpz/jxz → 不出现;两侧均无未完成(含双无工单)→ 可出现。yzf 或出库生产全部 yzf → 两 Tab 均不出现。ywc+yzf → 不因该侧作废隐藏。bizType)。total 与过滤一致;详情直链仍可用。| 方案 | 结论 |
|---|---|
| 1. 后端参数 + SQL + 前端 Tab/复选框 | 采用 |
| 2. 前端拉全量过滤 | 拒绝 |
| 3. 作废钩子软删 | 拒绝 |