提交
This commit is contained in:
1 parent
ad8f8d696f
commit
41aa90aa05
115 files changed
+29626
-10210
No files matched your search
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-05-26
|
||||
@@ -0,0 +1,54 @@
|
||||
## Context
|
||||
|
||||
中试服务管理已有完整的出库生产+质检闭环:中试申请单 → 输注方案 → 输注计划 → 出库生产工单/任务 → 出库质检工单/任务。已存在 `biz_outbound_release_review` 表和基础 CRUD(4个端点、149行),但功能简陋:创建时未关联生产/质检工单,无聚合查询,无前端页面。
|
||||
|
||||
入库放行审核(`storage-release-review`)已有完整实现(后端757行 CRUD + 3个 Vue 文件 + 独立 API 文件),可参照其模式设计出库放行审核。
|
||||
|
||||
后端已有可复用函数 `build_outbound_pilot_context_by_schedule(db, schedule_id, tenant_no)`,一次性查出申请单/患者/输注方案/计划/产品信息。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
- 实现完整的出库放行审核模块(后端聚合查询 + 前端列表/查看/审核界面)
|
||||
- 每条输注计划独立审核,查看其关联的生产工单/任务和质检工单/任务结果
|
||||
- 审核通过/不通过 + 备注 + 附件,仅记录结论不自动改状态
|
||||
- 参照入库放行审核模式,保持代码风格和架构一致性
|
||||
|
||||
**Non-Goals:**
|
||||
- 不实现自动联动状态更新(审核通过后不自动改输注计划状态)
|
||||
- 不实现工作流引擎(审核为单步操作,非多级审批)
|
||||
- 不修改已有入库放行审核模块
|
||||
- 不修改生产/质检工单的已有逻辑
|
||||
|
||||
## Decisions
|
||||
|
||||
### D1: 复用已有 `biz_outbound_release_review` 表 vs 新建表
|
||||
**选择**: 复用已有表,补充缺失字段。
|
||||
**理由**: 表已存在且与 `infusion_schedule_id` 关联,只需补充 `review_attachments`、`review_by_name`、`create_by_name` 等快照字段。
|
||||
**备选**: 新建表——会增加迁移成本且无额外收益。
|
||||
|
||||
### D2: 审核列表页数据来源
|
||||
**选择**: 基于 `biz_pilot_infusion_schedule` 构建,左连接 `biz_outbound_release_review` 获取审核状态。
|
||||
**理由**: 审核对象是输注计划,而非审核记录本身。输注计划创建后,只有生产和质检都完成才需要审核。列表页展示所有排程(附带审核状态),而非只展示已创建审核记录的排程。
|
||||
**备选**: 只展示已创建审核记录的排程——会导致"待审核"状态的排程无法展示。
|
||||
|
||||
### D3: 前端页面放在 pilot-service 目录 vs quality-inspection 目录
|
||||
**选择**: 放在 `pilot-service/outbound-release-review/`。
|
||||
**理由**: 用户决策放在中试服务管理菜单下,与输注计划管理同级。
|
||||
**备选**: 放在 `quality-inspection/` 下——会与入库放行审核混在一起,不符合业务分组。
|
||||
|
||||
### D4: 详情聚合查询方式
|
||||
**选择**: 后端一次性聚合查询,复用 `build_outbound_pilot_context_by_schedule()`。
|
||||
**理由**: 入库放行审核的详情也是后端聚合(6个信息域)。复用已有函数减少重复代码,且一次请求减少前端多次调用。
|
||||
**备选**: 前端多次调用已有 API 组装——增加请求次数,前端逻辑复杂。
|
||||
|
||||
### D5: API 路径前缀
|
||||
**选择**: 保持已有的 `/web/admin/pilot-release-review` 路径前缀。
|
||||
**理由**: 后端 API 已注册在此路径下,保持一致性。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- **[风险] `biz_outbound_release_review` 表字段不完整** → 补充字段即可,已有数据不受影响(新字段为 NULL 安全)
|
||||
- **[风险] 聚合查询性能** → 按 `infusion_schedule_id` 查询(有索引),且单次排程关联数据量有限,性能可控
|
||||
- **[取舍] 审核不联动状态** → 简化实现,但用户需手动操作后续步骤。如需联动可在后续版本补充
|
||||
- **[取舍] 列表基于排程而非审核记录** → 列表数据更全面但查询稍复杂(需 LEFT JOIN)
|
||||
@@ -0,0 +1,29 @@
|
||||
## Why
|
||||
|
||||
中试服务管理流程已实现申请单、体检、输注计划、出库生产工单/任务、出库质检工单/任务的完整闭环,但缺少最终的**出库放行审核**环节——即对每条输注计划关联的生产和质检结果进行审核判定后才能放行出库。目前已有的 `biz_outbound_release_review` 表和基础 CRUD 仅是骨架,未实现聚合查询和前端审核界面。
|
||||
|
||||
## What Changes
|
||||
|
||||
- **后端重构**:重构 `outbound_release_review.py` CRUD(~149行→~500行),增加按 `infusion_schedule_id` 聚合查询申请单/患者/生产工单+任务/质检工单+任务详情
|
||||
- **后端 API 扩展**:从 4 个基础 CRUD 端点扩展为完整审核 API(分页列表、聚合详情、单条审核、批量审核)
|
||||
- **前端新增页面**:在中试服务管理模块下新建出库放行审核页面(列表页 + 查看弹窗 + 审核弹窗),参照已有入库放行审核模式
|
||||
- **路由注册**:`sqxp.ts` 新增路由,菜单放在中试服务管理下与输注计划管理同级
|
||||
- **状态标签注册**:`status-tag-registry.ts` 注册出库审核结论标签
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
- `outbound-release-review-api`: 后端出库放行审核 API——聚合查询(输注计划关联的生产工单/任务/质检工单/任务/结果)、审核操作(单条/批量)、分页列表
|
||||
- `outbound-release-review-ui`: 前端出库放行审核页面——列表页(筛选+批量操作)、查看弹窗(6域聚合展示)、审核弹窗(结论+备注+附件)
|
||||
|
||||
### Modified Capabilities
|
||||
(无已有 spec 需要修改)
|
||||
|
||||
## Impact
|
||||
|
||||
- **后端文件**:`backend/app/api/outbound_release_review.py`、`backend/app/crud/outbound_release_review.py`、`backend/app/schemas/outbound_release_review.py`(可能新建)
|
||||
- **前端文件**:`web-admin/src/views/pilot-service/outbound-release-review/`(新建目录 + 3 个 Vue 文件)、`web-admin/src/api/admin.ts`(补充 API 函数)
|
||||
- **路由**:`web-admin/src/router/modules/sqxp.ts`
|
||||
- **状态标签**:`web-admin/src/utils/status-tag-registry.ts`
|
||||
- **数据库**:`biz_outbound_release_review` 表可能需要补充字段(如 `review_attachments`)
|
||||
- **无破坏性变更**:所有改动为新增功能,不影响已有模块
|
||||
@@ -0,0 +1,71 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 出库放行审核列表 API
|
||||
系统 SHALL 提供 `GET /web/admin/pilot-release-reviews` 端点,返回分页的输注计划列表(附带出库放行审核状态)。列表 SHALL 基于 `biz_pilot_infusion_schedule` 构建,LEFT JOIN `biz_outbound_release_review` 获取审核结论。每个列表项 SHALL 包含:申请单号、患者姓名、输注计划编号、细胞类型、规格、输注时间、生产工单状态、质检工单状态、审核结论、审核时间。
|
||||
|
||||
#### Scenario: 查询全部输注计划审核状态
|
||||
- **WHEN** 管理员请求 `GET /web/admin/pilot-release-reviews?page=1&page_size=20`
|
||||
- **THEN** 系统返回分页列表,包含所有未删除的输注计划及其对应的审核状态
|
||||
|
||||
#### Scenario: 按审核结论筛选
|
||||
- **WHEN** 管理员请求 `GET /web/admin/pilot-release-reviews?review_conclusion=tg`
|
||||
- **THEN** 系统只返回审核结论为"通过"的输注计划
|
||||
|
||||
#### Scenario: 按关键词搜索
|
||||
- **WHEN** 管理员请求 `GET /web/admin/pilot-release-reviews?keyword=ZSSQ202605260005`
|
||||
- **THEN** 系统返回匹配申请单号或患者姓名的输注计划
|
||||
|
||||
### Requirement: 出库放行审核详情聚合 API
|
||||
系统 SHALL 提供 `GET /web/admin/pilot-release-reviews/{schedule_id}/detail` 端点,返回指定输注计划的完整审核上下文。详情 SHALL 聚合以下 6 个信息域:
|
||||
1. **申请单信息**:申请单号、申请单名称、渠道名称、状态
|
||||
2. **患者信息**:姓名、性别、年龄、联系电话
|
||||
3. **输注计划信息**:细胞类型、规格、输注时间、地点、方式、生产状态、质检状态、输注状态
|
||||
4. **生产工单+任务信息**:工单号、状态、每个任务的投入/产出/工艺步骤及结论
|
||||
5. **质检工单+任务信息**:工单号、状态、实验室/第三方项目、每个任务的检测结果及结论
|
||||
6. **审核记录信息**:审核结论、备注、附件、审核人、审核时间
|
||||
|
||||
#### Scenario: 查看完整审核详情
|
||||
- **WHEN** 管理员请求 `GET /web/admin/pilot-release-reviews/{schedule_id}/detail`
|
||||
- **THEN** 系统返回包含上述 6 个信息域的完整聚合数据
|
||||
|
||||
#### Scenario: 输注计划无生产工单
|
||||
- **WHEN** 输注计划尚未创建出库生产工单
|
||||
- **THEN** 生产工单+任务信息域返回空数组
|
||||
|
||||
#### Scenario: 输注计划无质检工单
|
||||
- **WHEN** 输注计划尚未创建出库质检工单
|
||||
- **THEN** 质检工单+任务信息域返回空数组
|
||||
|
||||
### Requirement: 出库放行审核操作 API
|
||||
系统 SHALL 提供 `PUT /web/admin/pilot-release-reviews/{schedule_id}/review` 端点用于单条审核,以及 `PUT /web/admin/pilot-release-reviews/batch-review` 用于批量审核。审核操作 SHALL 创建或更新 `biz_outbound_release_review` 记录,设置 `review_conclusion`(tg/btg)、`review_remark`、`review_attachments`、`reviewer_user_id`、`review_time`。审核时 SHALL 自动查找并填充 `production_work_order_id` 和 `qc_work_order_id`。
|
||||
|
||||
#### Scenario: 单条审核通过
|
||||
- **WHEN** 管理员提交审核 `PUT /pilot-release-reviews/{schedule_id}/review` body=`{"review_conclusion":"tg","review_remark":"合格"}`
|
||||
- **THEN** 系统创建或更新审核记录,设置结论为"通过"、备注、审核人、审核时间
|
||||
|
||||
#### Scenario: 单条审核不通过
|
||||
- **WHEN** 管理员提交审核结论为"btg"
|
||||
- **THEN** 系统记录"不通过"结论
|
||||
|
||||
#### Scenario: 批量审核
|
||||
- **WHEN** 管理员提交 `PUT /pilot-release-reviews/batch-review` body=`{"schedule_ids":["id1","id2"],"review_conclusion":"tg","review_remark":"批量通过"}`
|
||||
- **THEN** 系统为所有指定排程创建/更新审核记录
|
||||
|
||||
#### Scenario: 重复审核覆盖
|
||||
- **WHEN** 输注计划已有审核记录,再次提交审核
|
||||
- **THEN** 系统更新已有记录(覆盖审核结论、备注、附件、审核人、时间)
|
||||
|
||||
### Requirement: 审核记录关联工单
|
||||
创建审核记录时,系统 SHALL 根据 `infusion_schedule_id` 自动查询关联的出库生产工单(`biz_production_work_order WHERE infusion_schedule_id=? AND work_order_type='outbound'`)和出库质检工单(`biz_qc_work_order WHERE infusion_schedule_id=? AND qc_biz_type='outbound'`),并将工单 ID 填充到 `production_work_order_id` 和 `qc_work_order_id` 字段。
|
||||
|
||||
#### Scenario: 自动关联生产工单
|
||||
- **WHEN** 为某输注计划创建审核记录,且该计划存在 `work_order_type='outbound'` 的生产工单
|
||||
- **THEN** 审核记录的 `production_work_order_id` 自动填充为该生产工单的 ID
|
||||
|
||||
#### Scenario: 自动关联质检工单
|
||||
- **WHEN** 为某输注计划创建审核记录,且该计划存在 `qc_biz_type='outbound'` 的质检工单
|
||||
- **THEN** 审核记录的 `qc_work_order_id` 自动填充为该质检工单的 ID
|
||||
|
||||
#### Scenario: 无关联工单
|
||||
- **WHEN** 输注计划尚无出库生产或质检工单
|
||||
- **THEN** 对应工单 ID 字段为空字符串
|
||||
@@ -0,0 +1,68 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 出库放行审核列表页
|
||||
系统 SHALL 在中试服务管理菜单下新增"出库放行审核"页面,路径为 `pilot-service/outbound-release-review`。列表页 SHALL 展示所有输注计划的审核状态,参照 `storage-release-review/index.vue` 模式。列表 SHALL 支持筛选:关键词搜索、审核结论、生产状态、质检状态。列表操作栏 SHALL 包含:查看、审核(单条)。支持批量选择和批量审核。
|
||||
|
||||
#### Scenario: 列表页加载
|
||||
- **WHEN** 用户进入出库放行审核页面
|
||||
- **THEN** 系统展示分页列表,每行展示:申请单号、患者姓名、细胞类型、规格、输注时间、生产状态(el-tag)、质检状态(el-tag)、审核结论(el-tag)、审核时间
|
||||
|
||||
#### Scenario: 筛选审核状态
|
||||
- **WHEN** 用户选择审核结论筛选为"待审核"
|
||||
- **THEN** 列表只展示未审核的输注计划
|
||||
|
||||
#### Scenario: 批量审核操作
|
||||
- **WHEN** 用户勾选多条记录后点击"批量审核"按钮
|
||||
- **THEN** 弹出批量审核对话框,提交后所有选中记录更新审核结论
|
||||
|
||||
### Requirement: 出库放行审核查看弹窗
|
||||
系统 SHALL 提供查看弹窗(`OutboundReleaseViewDialog.vue`),使用 `SystemViewDialog` 组件,展示 6 个信息域的聚合数据:
|
||||
1. 申请单基础信息(申请单号、名称、渠道、状态)
|
||||
2. 患者信息(姓名、性别、年龄、电话)
|
||||
3. 输注计划信息(细胞类型、规格、时间、地点、方式、各状态)
|
||||
4. 生产工单+任务信息(工单号、状态、任务列表含结论)
|
||||
5. 质检工单+任务信息(工单号、状态、任务列表含结论和检测结果)
|
||||
6. 审核记录信息(结论、备注、附件、审核人、时间)
|
||||
|
||||
#### Scenario: 查看完整审核详情
|
||||
- **WHEN** 用户点击某条记录的"查看"按钮
|
||||
- **THEN** 弹窗展示上述 6 个 section 的完整聚合数据
|
||||
|
||||
#### Scenario: 查看审核附件
|
||||
- **WHEN** 审核记录包含附件
|
||||
- **THEN** 附件区域展示可点击下载的附件列表
|
||||
|
||||
### Requirement: 出库放行审核操作弹窗
|
||||
系统 SHALL 提供审核弹窗(`OutboundReleaseReviewDialog.vue`),参照 `StorageReleaseReviewDialog.vue` 模式。弹窗 SHALL 包含:审核结论(单选:通过/不通过)、审核备注(textarea)、审核附件(卡片化上传,参照附件上传卡片化布局规范)。支持单条模式和批量模式。
|
||||
|
||||
#### Scenario: 单条审核
|
||||
- **WHEN** 用户点击某条记录的"审核"按钮
|
||||
- **THEN** 弹出审核弹窗,用户选择结论、填写备注、上传附件后提交
|
||||
|
||||
#### Scenario: 批量审核
|
||||
- **WHEN** 用户勾选多条记录后点击"批量审核"
|
||||
- **THEN** 弹出批量审核弹窗(不显示具体记录详情),填写统一结论/备注/附件后提交
|
||||
|
||||
#### Scenario: 审核通过提交
|
||||
- **WHEN** 用户选择"通过"并提交
|
||||
- **THEN** 系统更新审核记录,列表刷新后该记录审核结论显示为"通过"(success el-tag)
|
||||
|
||||
#### Scenario: 审核不通过提交
|
||||
- **WHEN** 用户选择"不通过"并提交
|
||||
- **THEN** 系统更新审核记录,列表刷新后该记录审核结论显示为"不通过"(danger el-tag)
|
||||
|
||||
### Requirement: 状态标签注册
|
||||
`status-tag-registry.ts` SHALL 注册出库放行审核相关的状态标签映射:
|
||||
- 审核结论:`tg`=通过(success)、`btg`=不通过(danger)、null=待审核(info)
|
||||
- 按钮 SHALL 携带 `el-icon` 图标(参照按钮须携带图标规范)
|
||||
|
||||
#### Scenario: 审核结论标签展示
|
||||
- **WHEN** 列表中某条记录审核结论为"tg"
|
||||
- **THEN** 审核结论列显示绿色 `el-tag`(type="success",text="通过")
|
||||
|
||||
### Requirement: 路由注册
|
||||
`sqxp.ts` SHALL 在中试服务管理下新增"出库放行审核"路由,路径 `outbound-release-review`,组件指向 `pilot-service/outbound-release-review/index.vue`。
|
||||
|
||||
#### Scenario: 菜单导航
|
||||
- **WHEN** 用户点击中试服务管理下的"出库放行审核"菜单
|
||||
- **THEN** 系统跳转到出库放行审核列表页
|
||||
@@ -0,0 +1,43 @@
|
||||
## 1. 数据库变更
|
||||
|
||||
- [ ] 1.1 检查并补充 `biz_outbound_release_review` 表字段(如缺少 `review_attachments`、`review_by_name`、`create_by_name` 等),生成增量 SQL 到 `docs/sql/`
|
||||
- [ ] 1.2 更新 `backend/app/models/models.py` 中 `BizOutboundReleaseReview` 模型,与表结构对齐
|
||||
|
||||
## 2. 后端 Schema 与 CRUD
|
||||
|
||||
- [ ] 2.1 新建 `backend/app/schemas/outbound_release_review.py`,定义请求/响应 Pydantic 模型(列表项、详情聚合、审核提交、批量审核),遵循项目 Schema 命名规范
|
||||
- [ ] 2.2 重构 `backend/app/crud/outbound_release_review.py`:实现分页列表查询(基于 infusion_schedule LEFT JOIN 审核记录 + 生产工单 + 质检工单状态)
|
||||
- [ ] 2.3 实现聚合详情查询 `get_review_detail(schedule_id)`:复用 `build_outbound_pilot_context_by_schedule()` + 查生产工单任务 + 查质检工单任务结果,返回 6 域聚合数据
|
||||
- [ ] 2.4 实现审核操作 `review_schedule(schedule_id, conclusion, remark, attachments, user)`:创建或更新审核记录,自动填充 production_work_order_id 和 qc_work_order_id
|
||||
- [ ] 2.5 实现批量审核 `batch_review(schedule_ids, conclusion, remark, attachments, user)`
|
||||
|
||||
## 3. 后端 API
|
||||
|
||||
- [ ] 3.1 重构 `backend/app/api/outbound_release_review.py`:新增 `GET /pilot-release-reviews` 分页列表端点
|
||||
- [ ] 3.2 新增 `GET /pilot-release-reviews/{schedule_id}/detail` 详情聚合端点
|
||||
- [ ] 3.3 新增 `PUT /pilot-release-reviews/{schedule_id}/review` 单条审核端点
|
||||
- [ ] 3.4 新增 `PUT /pilot-release-reviews/batch-review` 批量审核端点
|
||||
- [ ] 3.5 确认路由已在 `app/api/__init__.py` 和 `app/main.py` 正确注册
|
||||
|
||||
## 4. 前端 API 层
|
||||
|
||||
- [ ] 4.1 在 `web-admin/src/api/admin.ts` 中补充/重构出库放行审核相关 API 函数(列表、详情、单条审核、批量审核),定义 TypeScript 类型
|
||||
|
||||
## 5. 前端列表页
|
||||
|
||||
- [ ] 5.1 新建 `web-admin/src/views/pilot-service/outbound-release-review/index.vue` 列表页,参照 `storage-release-review/index.vue` 模式:搜索栏(关键词、审核结论、生产状态、质检状态)+ 表格(申请单号、患者、细胞类型、规格、输注时间、生产/质检/审核状态列)+ 操作栏(查看、审核)
|
||||
- [ ] 5.2 实现批量选择和批量审核按钮交互
|
||||
|
||||
## 6. 前端查看弹窗
|
||||
|
||||
- [ ] 6.1 新建 `OutboundReleaseViewDialog.vue`,使用 `SystemViewDialog` 组件,展示 6 个 section(申请单信息、患者信息、输注计划、生产工单+任务、质检工单+任务、审核记录)
|
||||
- [ ] 6.2 生产/质检信息域复用 `SampleQcInfoCards` / `SampleProductionInfoCards` 组件(如有)或参照入库放行审核的 `StorageReleaseViewDialog.vue` 模式自定义展示
|
||||
|
||||
## 7. 前端审核弹窗
|
||||
|
||||
- [ ] 7.1 新建 `OutboundReleaseReviewDialog.vue`,参照 `StorageReleaseReviewDialog.vue`:审核结论(el-radio-group)、备注(el-input textarea)、附件上传(卡片化布局),支持单条和批量模式
|
||||
|
||||
## 8. 路由与状态标签
|
||||
|
||||
- [ ] 8.1 在 `web-admin/src/router/modules/sqxp.ts` 中新增出库放行审核路由(路径 `outbound-release-review`,放在中试服务管理下)
|
||||
- [ ] 8.2 在 `web-admin/src/utils/status-tag-registry.ts` 中注册出库审核结论标签映射(tg=通过/success、btg=不通过/danger、null=待审核/info)
|
||||
Reference in new issue
Block a user