Files
zkxw/docs/superpowers/specs/2026-05-13-cell-storage-protocol-modules-design.md
T
2026-05-17 08:36:37 +08:00

160 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 细胞存储管理(2.2.6~2.2.10)— 实现设计(方案 C)
**依据**:`docs/中科兴皖需求V0.3.md` 菜单 2.2.6~2.2.10;数据模型 `docs/sql/zkxw.sql`(`biz_collection_protocol` 及其子表)。
**范围**:Web 管理端 `web-admin` + FastAPI `backend`;租户隔离与既有 `/web/admin` 响应风格保持一致。
---
## 1. 目标与非目标
### 1.1 目标
- 新增一级菜单 **细胞存储管理**,下挂 5 个页面,路由与目录命名已定稿。
- **最小闭环**:协议单列表/概要详情;审核(仅写审核表);财务收款确认与退费确认(限定状态流转);分期缴费预警(固定规则)。
- **审核(2.2.7)**:采用用户确认的 **方案 A**——审核仅写入 `biz_protocol_audit`,**不修改** `biz_collection_protocol.protocol_status`。
- **审核记录策略**:采用 **A1**——同一协议单**允许多条**审核记录,保留历史。
- **收款确认(2.2.8)**:仅处理 `pay_status = jfqrz` → `yjf`。
- **退费确认(2.2.9)**:仅处理 `pay_status = tfqrz` → `ytf`;**不包含**退费发起(不把状态推到 `tfqrz`)。
- **分期预警(2.2.10)**:预警窗口 **未来 15 天**;列表仅包含 `pay_status = dfj` 的分期明细(**不包含 `jfqrz`**);逾期定义为应缴日早于当天。
### 1.2 非目标(本阶段不做)
- 不实现科研捐赠、临床应用等非本菜单范围模块。
- 不把 2.2.6 下所有子表(采集信息、样本、运输、当事人等)一次性做全量录入与维护 UI;**第一版协议单详情以主表 + 缴费相关信息为主**,子表可后续迭代。
- 不引入工作流引擎驱动上述 5 个菜单(除非后续产品明确要求);审核与财务确认以**表字段 + 接口**为准。
- 退费发起、待缴费→提交财务确认等业务动作若未在本阶段定义接口,**不实现**。
---
## 2. 前端:菜单与路由
### 2.1 一级菜单
- **标题**:细胞存储管理
- **路径前缀**:`/cell-storage`
- **组件容器**:与现有模块一致,使用布局父级 ` /index/index`。
### 2.2 子菜单与文件路径
| 需求编号 | 菜单名称 | path | 组件路径 |
|----------|--------------------|--------------------------|----------|
| 2.2.6 | 采集协议单 | `protocol` | `views/cell-storage/protocol/index.vue` |
| 2.2.7 | 采集协议单审核 | `protocol-audit` | `views/cell-storage/protocol-audit/index.vue` |
| 2.2.8 | 收款确认(财务) | `payment-confirm` | `views/cell-storage/payment-confirm/index.vue` |
| 2.2.9 | 退费确认(财务) | `refund-confirm` | `views/cell-storage/refund-confirm/index.vue` |
| 2.2.10 | 分期缴费用户预警 | `installment-warning` | `views/cell-storage/installment-warning/index.vue` |
### 2.3 与后端菜单对齐
- 同步更新 `web-admin/src/router/modules/sqxp.ts` 与 `backend/app/api/menu.py` 中的静态菜单树,保证 **前端路由与后端菜单接口一致**(与仓库现有约定相同)。
### 2.4 UI 约定
- 列表页对齐模板:`web-admin/src/views/system/unit/index.vue`(筛选、工具栏、表格、分页)。
- 弹窗表单:`label-position="top"`,`.dialog-form-layout`,无 backdrop blur;色板遵循 `docs/web-admin-ui-spec-fresh-mint.md`。
---
## 3. 数据与后端建模范围(方案 C)
### 3.1 本阶段必须落地的表(SQLAlchemy Model + CRUD)
| 表名 | 用途 |
|------|------|
| `biz_collection_protocol` | 协议单主表:列表、概要详情 |
| `biz_protocol_audit` | 审核记录:列表、提交审核 |
| `biz_protocol_payment` | 缴费主表:展示缴费模式、合同金额、分期参数(与协议单 1:1) |
| `biz_protocol_payment_detail` | 缴费明细:财务确认列表、状态变更、分期预警 |
可选后续迭代再补:`biz_protocol_collection_info`、`biz_protocol_sample`、`biz_protocol_party_customer` 等。
### 3.2 租户与软删除
- 所有查询默认 `tenant_no = 当前用户租户`、`del_flag = 0`。
- 写入时设置 `tenant_no`、`create_by` / `update_by` 等公共字段(与现有 CRUD 一致)。
### 3.3 列表默认排序
- 无自定义排序时:`create_time DESC`(与工程规范一致);预警列表可按 `installment_due_date ASC` 等业务需求单独约定。
---
## 4. API 设计(前缀 `/api`,路由挂载与现有 `basic_info`、`admin` 一致)
以下路径均在 **`/web/admin`** 下(与现有基础信息管理相同前缀),具体以路由注册为准。
### 4.1 采集协议单(2.2.6)
- `GET .../collection-protocols`
- Query:`page`, `pageSize`, `keyword`(协议号等), `protocolStatus`(可选)
- `GET .../collection-protocols/{id}`
- 返回:协议单主表字段 + 缴费主表概要(若存在)+ 缴费明细分页或摘要(实现时可先返回主表 + payment 一行)
创建/编辑协议单若产品未在本次冻结字段,可:**第一版仅只读列表 + 详情**,或最小字段新增——以 OpenSpec tasks 为准。
### 4.2 采集协议单审核(2.2.7)
- `GET .../collection-protocol-audits`
- 列表:关联协议单展示协议号、审核状态、审核时间等;支持按 `auditStatus`、`keyword` 筛选
- `POST .../collection-protocols/{id}/audit`
- Body:`auditStatus`(`shtg` | `shth`), `auditRemark`(可选)
- 行为:插入一条 `biz_protocol_audit`(**A1:允许多条**);**不更新** `biz_collection_protocol.protocol_status`
- `auditor_user_id` / `create_by` 使用当前登录用户
### 4.3 收款确认(2.2.8)
- `GET .../protocol-payment-details/receipt-confirm`
- 仅 `pay_status = jfqrz`
- `POST .../protocol-payment-details/{detailId}/receipt-confirm`
- 校验当前行必须为 `jfqrz`
- 更新为 `yjf`,写入 `finance_confirm_attachments`(若前端上传)、备注等
- **幂等**:已为 `yjf` 则返回业务错误提示
### 4.4 退费确认(2.2.9)
- `GET .../protocol-payment-details/refund-confirm`
- 仅 `pay_status = tfqrz`
- `POST .../protocol-payment-details/{detailId}/refund-confirm`
- 校验当前行必须为 `tfqrz`
- 更新为 `ytf`
- **幂等**:已为 `ytf` 则返回业务错误提示
### 4.5 分期缴费预警(2.2.10)
- `GET .../protocol-payment-details/installment-warning`
- 条件:`installment_no IS NOT NULL`、`pay_status = dfj`
- 计算字段(可由后端计算返回):
- `warningType = warn`:`today <= due <= today+15天`
- `warningType = overdue`:`due < today`
- Query:`warningType`(`warn` | `overdue` | `all`)、`page`、`pageSize`
- 排序建议:`installment_due_date ASC`
日期计算使用服务器本地日期(YYYYMMDD 字符串与当天对比)。
---
## 5. 权限(建议)
- 五个菜单默认 **`admin` / `super_admin`** 可见(与 Demo 体系一致);若需细分「财务」角色,在 OpenSpec 任务中增加 `perms` 与角色菜单种子 SQL,不阻塞第一版。
---
## 6. 风险与后续迭代
- **协议单详情不完整**:第一版可能无法满足采集专员全量录入,需在后续变更中按子表拆分页面或 Tab。
- **退费链路不完整**:仅确认 `tfqrz→ytf`,需业务侧在其他模块或后续任务中补齐「发起退费」。
- **附件字段**:`finance_confirm_attachments` 等与 MinIO 上传组件对齐现有项目用法。
---
## 7. OpenSpec 后续步骤
1. 使用 `openspec new change` 创建变更(例如 `cell-storage-protocol-modules`)。
2. 按 `openspec-propose` 生成 `proposal.md`、`design.md`、`tasks.md` 及 capabilities 下各 `spec.md`,与本设计对齐。
3. `openspec-apply-change` 按 tasks 实现后端 Model、CRUD、路由注册、`sqxp.ts` + `menu.py`、五个 Vue 页面及 `web-admin/src/api` 封装。
---
**文档状态**:已定稿上述边界(含 A、A1、财务状态、预警 C+1、菜单与路径)。审阅通过后进入 implementation plan(writing-plans)与 OpenSpec 变更落地。