This commit is contained in:
zlwu committed 2026-06-26 00:50:04 +08:00
1 parent 0b50eff3d8
commit ee364e24aa
323 files changed
+57731 -35766

No files matched your search

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-06-25
@@ -0,0 +1,36 @@
# 质检检测批次 — 技术设计
权威产品决策见 `docs/superpowers/specs/2026-06-25-qc-inspection-batch-design.md`。
## 架构
工单 → `biz_qc_work_order_inspection_batch` → lab/third 明细(`batch_id`)→ `biz_qc_task` → `biz_qc_task_assignee`(从 `biz_qc_batch_assignee` 同步)。
批次无状态字段;进度由任务聚合。
## 数据表
- `biz_qc_work_order_inspection_batch`
- `biz_qc_batch_assignee`
- `biz_qc_work_order_lab_item.batch_id`
- `biz_qc_work_order_third_item.batch_id`
- 可选 `biz_qc_task.batch_id` 冗余
## API
- `POST /qc-work-orders/{id}/configure` — body `batches[]`;扁平 `labItemIds` 兼容为单批次
- `GET /qc-work-orders/{id}/inspection-batches` — 批次 + tasks 嵌套
## 同步策略
按批次 ID 比对:增删改 lab/third 行;任务 assignee 调用 `sync_assignees_for_task` 与批次负责人一致。
## 前端
- `index.vue` 配置弹窗:批次卡片
- `QcWorkOrderBatchSubList.vue`:折叠批次 + 内嵌任务卡片
- `qc-mine-task-groups.ts`:工单下按批次分组
## 迁移
SQL 脚本为每个已配置工单创建 `B01` 默认批次并回填 `batch_id`。
@@ -0,0 +1,31 @@
## Why
质检工单配置检测时,每个检测主数据项目在同一工单内只能选一次,负责人需按项目逐一指派,列表平铺展示任务,无法满足客户「多批次、跨批重复项目、批次级负责人」的质检组织方式。
## What Changes
- 新增 **检测批次** 实体:工单下可配置多个批次,`ypz` 后可追加批次
- 批次内可选 lab + 第三方项目(批次内不重复,跨批次可重复同一主数据项目)
- **批次级多人负责人**,同步至批次内全部任务的 `biz_qc_task_assignee`
- **BREAKING**:配置检测 API 请求体改为 `batches[]`(保留扁平字段短期兼容转单批次)
- 新增 `GET /qc-work-orders/{id}/inspection-batches` 供列表展开
- 配置/调整检测弹窗改为批次卡片 UI
- 质检工单、我的质检任务:列表先展示批次,展开后展示检测项目/任务
- DDL + 历史数据迁移(默认批次 1)
## Capabilities
### New Capabilities
- `qc-inspection-batch`: 检测批次数据模型、配置/调整 API、批次列表 API、迁移与任务 assignee 同步
### Modified Capabilities
(无 `openspec/specs/` 基线;行为变更记录于本变更 spec)
## Impact
- **后端**:`models.py`、`qc_work_order.py`、`qc.py` API;新 `qc_inspection_batch.py` CRUD
- **SQL**:`docs/sql/` 新表 + alter + 迁移脚本
- **前端**:`qc-work-order/index.vue` 配置弹窗、`QcWorkOrderTaskSubList` / 新 `QcWorkOrderBatchSubList`、`qc-mine-task-groups.ts`、`qc-work-order.ts` API
- **文档**:`docs/superpowers/specs/2026-06-25-qc-inspection-batch-design.md` 为实现权威
@@ -0,0 +1,51 @@
### Requirement: 检测批次数据模型
系统 SHALL 提供 `biz_qc_work_order_inspection_batch` 与 `biz_qc_batch_assignee` 表;lab/third 明细表 SHALL 包含 `batch_id` 外键。
#### Scenario: 新建批次
- **WHEN** 用户在 `dpz` 或 `ypz` 工单上提交配置且包含新批次
- **THEN** 系统创建批次记录,`batch_no` 为 `{work_order_no}-Bnn`,`batch_name` 为 `YYYYMMDD检测`(同日多批递增 `-2` 后缀)
### Requirement: 批次内项目唯一与跨批重复
系统 SHALL 允许同一 `lab_test_item_id` / `third_party_item_id` 出现在同一工单的不同批次;同一批次内 SHALL NOT 重复同一主数据项目 ID。
#### Scenario: 批次内重复项目
- **WHEN** 提交的配置在同一批次 lab 列表含重复 ID
- **THEN** 返回 400 校验错误
### Requirement: 批次负责人
每个批次 SHALL 配置至少一名负责人(多名允许);配置保存时 SHALL 将该负责人集合同步至批次内全部未删除任务的 `biz_qc_task_assignee`。
#### Scenario: 修改批次负责人
- **WHEN** 调整检测修改某批次负责人
- **THEN** 该批次下所有任务 assignee 更新,「我的质检任务」对新负责人可见
### Requirement: 配置检测 API
`POST /web/admin/qc-work-orders/{id}/configure` SHALL 接受 `batches[]`;每批含 `assigneeUserIds`、`hasLab`、`hasThirdParty`、`labItemIds`、`thirdPartyItemIds`。`dpz` 首次配置后工单状态为 `ypz`;`ypz` 可追加批次。
### Requirement: 批次列表 API
`GET /web/admin/qc-work-orders/{id}/inspection-batches` SHALL 返回批次列表,每项含 `tasks` 嵌套(结构与任务列表项一致)及 `taskCount` / `completedTaskCount`。
### Requirement: 列表 UI 批次层级
质检工单与我的质检任务页面 SHALL 在工单展开区先展示检测批次,展开批次后展示检测项目任务卡片;任务级操作(开始、填写结果)不变。
### Requirement: 只读质检信息批次展示
协议单/捐赠单/入库放行/出库放行等查看弹窗中的质检信息、以及质检工单「查看」弹窗 SHALL 按检测批次分组展示任务;多批次时以 Tab 或分节展示批次名、批次编号、负责人与进度。
#### Scenario: 协议样本卡质检信息
- **WHEN** 用户在协议单查看弹窗打开含多批次质检工单的样本卡
- **THEN** 质检信息区按批次 Tab 展示各批任务摘要,可跳转任务详情
### Requirement: 详情内嵌 inspectionBatches
工单详情、`qcInfo`(样本关联摘要)、出库质检详情 SHALL 可选内嵌 `inspectionBatches` 字段,结构与 `GET .../inspection-batches` 一致,以减少前端重复请求。
@@ -0,0 +1,36 @@
# Tasks: qc-inspection-batch
## 1. Database & Models
- [x] 1.1 `docs/sql/qc_inspection_batch.sql` — 新表 + alter `batch_id` + 数据迁移
- [x] 1.2 `models.py` — `BizQcWorkOrderInspectionBatch`、`BizQcBatchAssignee`;明细/任务 `batch_id`
- [x] 1.3 更新 `待同步到生产的sql脚本`;`migrate_qc_inspection_batch_data.sql` 历史迁移
- [ ] 1.4 合并到 `docs/sql/zkxw.sql` 全量基线(待下次库导出)
## 2. Backend
- [x] 2.1 `crud/qc_inspection_batch.py` — 批次 CRUD、同步 lab/third、assignee、configure
- [x] 2.2 `configure_work_order` 改为批次数组;扁平 body 兼容单批
- [x] 2.3 `GET /qc-work-orders/{id}/inspection-batches`
- [x] 2.4 工单详情 / qcInfo / outbound-detail 内嵌 `inspectionBatches`
## 3. Frontend — 配置弹窗
- [x] 3.1 `qc-work-order.ts` / `qc-inspection-batch.ts` — 类型与 API
- [x] 3.2 `QcWorkOrderConfigureBatches.vue` + `index.vue` 批次卡片配置 UI
- [x] 3.3 校验:批次负责人、批次内不重复、至少一项检测
## 4. Frontend — 列表与只读展示
- [x] 4.1 `QcWorkOrderBatchSubList.vue`
- [x] 4.2 `QcWorkOrderSingleCard` 改用批次列表(SampleGroup 经 SingleCard 继承)
- [x] 4.3 我的任务:`QcWorkOrderBatchSubList` 按 `batchId` 分组 preset 任务
- [x] 4.4 `SampleQcBatchReadonly` + `SampleQcInfoCards` 批次 Tab(协议/捐赠/放行等查看弹窗)
- [x] 4.5 工单查看弹窗六 Tab:`QcWorkOrderSystemViewDialog` 按批次分节
- [x] 4.6 任务详情弹窗补充「检测批次」字段;`loadQcInspectionBatches` 优先内嵌数据
## 5. Verification
- [ ] 5.1 执行迁移 SQL(本地)
- [ ] 5.2 手工验收:双批次、跨批重复项目、追加批次、我的任务可见性
- [ ] 5.3 手工验收:协议单/放行查看弹窗质检信息按批次展示;工单查看弹窗批次分节