feat(lab-sample): 实验室样本处理三表台账与部门字段 ACL

按造血/单个核/间充质聚合展示,部门员工只改本部门、主管可改全部,并支持筛选与 Excel 导出;同步纠正采集接受人串权与严格菜单守卫。
This commit is contained in:
zlwu committed 2026-11-12 12:48:05 +08:00
1 parent 58b252ce6b
commit 5fe1193a2c
22 files changed
+2136 -5

No files matched your search

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-11-12
@@ -0,0 +1,23 @@
## Context
附件三张表字段覆盖市场采集信息、实验室接收/处理与质检结果。系统内对应源主要为:
- 市场:`biz_protocol_party_customer`、`biz_protocol_collection_info`、`biz_collection_hospital`、`biz_protocol_sample`
- 生产/接收:`biz_sample_reception`、`biz_sample_production_reception`
- 质检:生产接收传染四项、储存证质检 payload、检查项结果;缺口进补充表
## Decisions
1. **数据集**:`hsc`(造血)、`ubmc`(单个核)、`msc`(脐带间充质),以样本类型名 / 编码前缀识别。
2. **权限码**:
- 列表:`lab:sample-processing:list`(三子页共用读)
- 部门编辑:`lab:sample-processing:market:edit` / `production:edit` / `qc:edit`
- 主管:`lab:sample-processing:manager`(可编辑全部部门字段)
3. **读写**:列表聚合只读源表 + 补充 JSON;更新时按字段 `source` 回写源表或补充表,服务端强制部门 ACL。
4. **UI**:P01 列表 + 筛选 + 导出;行内编辑弹窗按部门分区,无权字段只读。
5. **Figma**:MCP 授权不可用,按现有 Fresh Mint 列表页实现;合入后用户做视觉验收。
## Risks
- 历史 Excel 手工列与系统字段不完全一一对应,未映射列落补充表,避免阻断上线。
- 菜单种子不自动授权角色,需管理员分配。
@@ -0,0 +1,27 @@
## Why
2026-11-04 需求会议要求按线上三张实验室样本处理表(造血干细胞 / 单个核 / 脐带间充质)在系统中单独建模块,按市场、生产、质检拆分可编辑字段,支持筛选与导出。现有业务数据分散在协议、样本接收、生产接收与质检等表,缺少统一台账视图。
## What Changes
- 新增 Web 一级模块「实验室样本处理数据」,下挂三个子模块对应三张表。
- 按样本编码从现有业务表聚合展示全字段;部门员工可读全部、只写本部门字段;主管可写全部部门字段。
- 支持关键词/时间筛选与 Excel 导出。
- 无法直接回写源表的字段写入补充表 `biz_lab_sample_processing_extra`。
## Capabilities
### New Capabilities
- `lab-sample-processing-data`: 实验室样本处理数据聚合台账、部门字段 ACL、筛选导出
### Modified Capabilities
- (无)
## Impact
- **backend**:聚合服务、API、补充表、菜单权限
- **web-admin**:三子模块列表页、编辑弹窗、导出
- **docs/sql**:结构 + 菜单种子
- **不改** mobile-h5 / mobile-oa-h5
@@ -0,0 +1,33 @@
## ADDED Requirements
### Requirement: 三子模块台账
系统 SHALL 提供「实验室样本处理数据」模块,包含造血干细胞、单个核、脐带间充质三个子模块;每个子模块按样本展示该表全部约定字段。
#### Scenario: 按数据集查询
- **WHEN** 用户打开造血干细胞子模块并具备列表权限
- **THEN** 系统仅返回造血干细胞数据集样本行,并包含市场/生产/质检字段聚合结果
### Requirement: 部门字段编辑权限
系统 SHALL 允许具备列表权限的用户查看全部字段;普通员工仅可编辑本部门字段;具备主管权限的用户可编辑全部部门字段。服务端 MUST 拒绝无权字段写入。
#### Scenario: 生产员工改市场字段被拒
- **WHEN** 仅有生产编辑权限的用户提交市场部门字段变更
- **THEN** 系统拒绝该请求且不持久化无权字段
#### Scenario: 主管可改全部
- **WHEN** 具备主管权限的用户提交跨部门字段变更
- **THEN** 系统接受并回写对应数据源或补充表
### Requirement: 筛选与导出
系统 SHALL 支持按样本编码、姓名关键词及接收/采集时间范围筛选,并导出当前筛选结果为 Excel。
#### Scenario: 导出当前筛选
- **WHEN** 用户在筛选条件下点击导出
- **THEN** 下载的表格列与当前子模块字段目录一致,行集与列表筛选一致
@@ -0,0 +1,21 @@
## 1. 规格与数据
- [x] 1.1 建立 OpenSpec 变更与字段/权限设计
- [x] 1.2 定义三数据集字段目录与部门归属、回写源
## 2. 后端
- [x] 2.1 补充表模型与迁移 SQL、菜单种子
- [x] 2.2 聚合列表 / 详情 / 更新 / 导出 API 与部门 ACL
- [x] 2.3 单元测试:数据集识别、字段 ACL、无权拒绝
## 3. 前端
- [x] 3.1 共享列表页组件(筛选、编辑、导出)
- [x] 3.2 三子模块路由与菜单码
- [x] 3.3 API 客户端
## 4. 验证
- [x] 4.1 受影响单元测试
- [ ] 4.2 字段一致性/菜单说明回写工单(凭据就绪后)