Просмотр исходного кода

docs: add outbound release tabs/ready/void design

Align outbound release review with inbound tabs, ready-for-review checkbox, and voided WO list hide.

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 3 месяцев назад
Родитель
Сommit
5c7372ee06

+ 175 - 0
docs/superpowers/specs/2026-07-29-outbound-release-tabs-ready-void-design.md

@@ -0,0 +1,175 @@
+# 出库放行审核 · 待审核/已审核 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` 非作废)。
+
+```text
+列表可见 ⇔ 非(质检全作废 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. 作废钩子软删 | 拒绝 |