feat(project): group assignment records by business type

Add four business tabs and identifying fields so users can locate orders before assigning projects. Introduce a permission-scoped detail query with child EXISTS searches and batched enrichment, preserving statistics and assignment writes.

Approved Figma v2; independent source review completed. Tests authored but not executed under the user self-test arrangement. Related to issue #13.
This commit is contained in:
zlwu committed 2026-11-04 14:14:50 +08:00
1 parent 2a7e763cdf
commit 29f9866a24
9 files changed
+611 -22

No files matched your search

@@ -1,5 +1,15 @@
# 实现设计与接口契约
## 历史归属维护 v2(2026-11-04 已确认)
用户明确采用 [Figma 原型 v2](https://www.figma.com/design/wOQLDAhr1gdlQEXnVaFO9S?node-id=13-23)。范围为 Web 历史归属维护及其后端读取接口,沿用用户先合入 V2.0 再自测的安排。复用 P02 列表和 `pilot-service/pilot-application/index.vue` 的 `panel-pill-tabs`,操作列固定右侧,搜索右对齐。
`RecordList` 仅在 assignment 模式显示四类正式业务 tab 和业务识别列。细胞存储/科研捐赠展示母亲姓名、电话、采集医院、市场专员及采集/捐赠日期;中试展示申请名称、渠道、服务订单名称、患者姓名/电话;基础实验展示课题、客户名称/联系人/电话。公共列保留序号、主单号、状态、项目组、所属项目、创建时间。多个有效子记录以稳定顺序去重连接展示,缺失值显示破折号,采集日期来自采集信息的样本采集时间。
新增 `GET /web/admin/project-management/assignments/records`,严格要求 `project:assignment:edit`,仅接受四类正式业务。原 `/records` 继续服务统计明细,不扩展联系信息;移动接口不变。专用服务复用主单租户、软删除、数据权限和归属筛选。关键词支持单号、姓名/电话、医院/专员、渠道/服务订单名称、课题/客户信息(日期使用现有创建日期条件);子表使用同租户未删除记录 EXISTS 匹配,不增加主单行数。分页后批量补充项目、医院、人员、患者和服务订单资料,避免逐行查询。
切换 tab 清空关键词、状态、项目组/项目并回第一页,保留日期和仅未归属条件;重新挂载候选选择器避免短暂显示上一个业务的选项。列表请求按序号丢弃过时响应,提供加载、空态和失败重试。归属弹窗绑定选中单据的业务类型,沿用原项目选择权限、关联单据预览、并发快照及审计。预签约不单列 tab,但关联预签约仍随正式单预览和调整。不新增批量操作、数据库字段或迁移。
## 模块边界
新增 models/project_management.py、services/project_management.py、api/project_management.py。现有四种主表(预签约、采集协议、科研捐赠、中试/基础实验申请)增加可空 project_id,不向下游样本表复制归属。不更改已有课题名称 project_title。
@@ -1,5 +1,20 @@
## ADDED Requirements
### Requirement: 按业务识别历史归属单据
历史归属维护 SHALL 按细胞存储、科研捐赠、中试服务、基础实验展示四个 tab,并提供对应业务识别字段和关键词搜索;列表保持主单分页,右侧固定归属与审计操作。
#### Scenario: 按联系人或业务信息定位
- **WHEN** 用户在某类业务输入姓名、电话、医院/专员、渠道/服务订单或课题/客户等该业务支持的关键词
- **THEN** 仅返回当前租户及数据权限内匹配的有效主单,展示对应业务信息,多条子记录不重复计数;删除和跨租户关联数据不用于匹配或展示。
#### Scenario: 切换业务及请求竞争
- **WHEN** 用户切换 tab 或旧请求在新请求后返回
- **THEN** 切换时清空关键词、状态、项目组/项目并回到第一页,保留日期与仅未归属条件;过时响应不得覆盖当前业务的列表或计数,失败可重试且不保留旧列表。
#### Scenario: 业务联系信息权限
- **WHEN** 仅有统计权限的用户读取统计钻取或尝试调用归属维护详情接口
- **THEN** 统计接口不返回新增联系信息,归属维护详情接口拒绝无 `project:assignment:edit` 权限的访问;全部项目选择权限不扩大主单数据范围。
#### Scenario: 归属调整仍按关联链执行
- **WHEN** 用户从某个业务 tab 调整归属
- **THEN** 目标候选按该单据业务类型及项目权限加载,仍先预览关联单据再确认提交;关联预签约纳入预览和审计,不新增独立预签约 tab。
### Requirement: 项目管理三级导航
Web SHALL 使用“项目 → 项目管理 → 项目组管理 / 项目管理 / 业务统计 / 历史归属维护”层级,复用现有导航组件;原页面权限、名称和功能保持。
#### Scenario: 现有角色升级
@@ -4,6 +4,15 @@
**架构:** 新管理模块统一校验与统计;现有业务显式接入;前端复用已有样式。
**技术栈:** FastAPI/SQLAlchemy/Pydantic、Vue3/Element Plus、Vue3/Vant。
## 2026-11-04 历史归属维护四业务 tab
用户已明确“采用原型 v2,继续开发”,继续按用户自测与先合入 V2.0 再测试的指令交付;本轮不运行测试、构建或浏览器业务验收,不关闭工单。
- [x] 核对四类业务真实字段、现有样式和权限,完成 Figma v2 及用户确认。
- [x] 新增归属维护专用读取接口:四类主单、业务关键词、同租户有效子表匹配和分页后批量资料读取;统计及移动契约不变。
- [x] 实现四 tab、各业务识别列、关键词首位、状态语义、固定操作、筛选重置及过时响应防护。
- [x] 编写 5 个后端回归用例供后续运行;独立源码审查未发现新增 P1/P2,Git 差异核对通过。本轮未执行测试/构建或浏览器验收。
- [ ] 提交推送、PR 合入 V2.0 并同步主目录,回写待用户测试的提交、入口和覆盖点,保留工单及任务环境。
## 2026-11-04 菜单增加项目管理分组
用户明确指定层级:项目 → 项目管理 → 项目组管理 / 项目管理 / 业务统计 / 历史归属维护。仅重组现有菜单配置,复用市场三级导航,不新增业务页面或修改页面样式。沿用用户自测及先合入 V2.0 再测试的安排,工单保持开放。