锁定缴费校验失败时整单回滚,避免样本半成功落库;前端禁止删除锁定缴费样本,改码走更正编码。同步落地样本更正、采集微信通知、OA提及未读、细胞产品套餐与相关迁移文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
4.5 KiB
4.5 KiB
样本编码全链路纠错 — 设计
日期:2026-10-22
状态:已确认(实现默认)
关联:采集协议单 / 科研捐赠;质检接收与工单;生产工单;储存证 / 保险 / 客服
1. 范围决策
| 项 | 决定 |
|---|---|
| 交付形态 | 产品化能力:预览 + 事务级联更正 + 审计日志(非一次性手工 SQL) |
| 细胞产品码 | 不自动修改 biz_cell_product.product_code / 出库快照;预览可提示「同名产品码条数」供人工评估 |
| 实验室入库码 | 不修改 lab_storage_code |
| 来源 | 支持 cell_storage 与 research_donation |
2. 目标与非目标
2.1 目标
- 将错误样本编码
oldCode更正为newCode,在同一租户、同一来源下级联更新所有以sample_code为匹配键或快照的业务表。 - 更正前可预览各表影响行数与阻断原因。
- 写入审计日志(操作人、时间、旧→新、影响明细、原因)。
- 入口挂在「样本信息管理 / 客户服务」列表操作列。
2.2 非目标
- 不批量改多条样本编码。
- 不改短信历史正文、附件内容。
- 不自动改细胞产品码、出库产品快照。
- 不通过「编辑协议单换码再保存」实现纠错(该路径不回写下游快照)。
3. 关联键与校验
- 权威键:
tenant_no+sample_code(OpenSpec api-conventions)。 - 来源:
reception_source∈ {cell_storage,research_donation};无来源列的表仅在对应来源下更新。 - 旧码必须存在于对应 SoT 样本表(
biz_protocol_sample或biz_research_donation_sample,del_flag=0)。 - 新码不得已被其它活跃样本占用(协议 + 捐赠共用命名空间);允许等于旧码时直接拒绝。
- UNIQUE 表(储存证 / 保险 / 客服 / 储存证 QC)若已存在
newCode行且不是本样本迁移目标,则阻断。
编码池(细胞存储)
- 若
newCode已在biz_sample_code:将样本的sample_code_id指向该池行,并标记issued=1;若旧池行不再被其它活跃样本引用,可释放issued=0。 - 否则若样本当前绑定池行:将该池行的
sample_code字符串就地改为newCode。 - 否则仅更新样本行文本码(捐赠场景常见)。
4. 级联表清单
4.1 SoT
biz_protocol_sample(cell_storage)biz_research_donation_sample(research_donation)biz_sample_code(按上节策略)
4.2 市场附属(主要为 cell_storage)
biz_protocol_sample_paymentbiz_protocol_payment_schedulebiz_protocol_payment_transferbiz_protocol_sample_transportbiz_research_donation_sample_transport(research_donation)biz_sample_freight_item
4.3 质检 / 生产(按 reception_source 过滤,无该列则仅按租户+码)
biz_sample_receptionbiz_qc_work_orderbiz_qc_taskbiz_storage_release_reviewbiz_sample_storage_cert_qc(UNIQUE;细胞存储)biz_sample_production_receptionbiz_production_work_orderbiz_production_task_input(input_type=sample且input_code=oldCode)
4.4 扩展 UNIQUE(细胞存储)
biz_sample_storage_certbiz_sample_insurancebiz_sample_customer_service
4.5 明确不改
lab_storage_code、biz_cell_product.product_code、biz_outbound_release_cell、附件与短信正文。
5. API
前缀:/web/admin/sample-code-corrections
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /preview |
校验 + 返回各表影响行数、阻断原因、可选同名产品码提示 |
| POST | /apply |
事务内级联更新 + 写审计日志 |
请求体:
{
"receptionSource": "cell_storage",
"oldSampleCode": "OLD",
"newSampleCode": "NEW",
"newSampleCodeId": null,
"reason": "客户填错编码"
}
权限:运营端登录 + 严格菜单码(细胞存储或科研捐赠样本信息 list 任一即可预览/执行;前端按钮随当前 Tab 展示)。
6. 审计
表 biz_sample_code_correction_log:记录租户、来源、旧码、新码、影响 JSON、原因、操作人、公共字段。
7. UI
样本信息页操作列增加「更正编码」→ 弹窗录入新码与原因 → 先预览 → 确认后 apply → 刷新列表。
8. 事务顺序
- 锁/读取 SoT 旧码行,校验新码空闲与 UNIQUE 冲突
- 更新编码池策略
- 更新 UNIQUE 扩展表
- 更新 SoT 与全部快照表
- 写审计日志并 commit