日期:2026-07-01
状态:待审核
关联:2026-05-19-protocol-donation-convert-design.md(捐赠转细胞存储样本复制)
关联模块:采集协议单、捐赠协议单、样本信息、质检、生产、入库审核
在采集协议单与捐赠协议单的样本信息中,增加「特殊样本」标记及「特殊说明」文本字段。例如样本为小三阳时:勾选特殊样本,特殊说明填写「小三阳」。
凡展示样本数据的界面,若该样本为特殊样本,须醒目展示:
isSpecial + specialRemark。biz_protocol_sample 行。| 字段 | API 名 | 类型 | 说明 |
|---|---|---|---|
| 特殊样本标记 | isSpecial |
boolean |
true 表示特殊样本 |
| 特殊说明 | specialRemark |
string |
自由文本,如「小三阳」 |
与现有 remark(普通备注)语义分离:remark 为通用备注;specialRemark 为结构化警示说明,仅在 isSpecial=true 时有效。
| 条件 | 规则 |
|---|---|
isSpecial = true |
specialRemark 必填,trim 后非空,最大 256 字符 |
isSpecial = false |
specialRemark 保存时清空为 null / 空字符串 |
| 未勾选却填写了说明 | 前端保存前清空;后端以 isSpecial 为准,忽略 specialRemark |
前后端均须校验;后端为最终门禁。
SampleTransportFormSection 子弹窗)。research_donation.py 复制 BizResearchDonationSample → BizProtocolSample 时,须同步复制:
is_special ← 源样本 is_specialspecial_remark ← 源样本 special_remark两张样本表对称增加字段(位于业务字段末尾、tenant_no 之前):
biz_protocol_sample
ALTER TABLE `biz_protocol_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
biz_research_donation_sample
ALTER TABLE `biz_research_donation_sample`
ADD COLUMN `is_special` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否特殊样本:0否 1是' AFTER `storage_expire_date`,
ADD COLUMN `special_remark` varchar(256) DEFAULT NULL COMMENT '特殊说明' AFTER `is_special`;
同步更新 docs/sql/zkxw.sql 基线。
backend/app/models/models.py → BizProtocolSamplebackend/app/models/research_donation.py → BizResearchDonationSample_sample_to_dict 统一输出:
"isSpecial": bool(s.is_special),
"specialRemark": (s.special_remark or "").strip(),
save_samples 写入时:
is_special = 1 if raw.get("isSpecial") else 0special_remark 仅在 is_special=1 时写入 trim 后文本,否则 None特殊标记仅存于 biz_protocol_sample / biz_research_donation_sample,下游模块在 list/detail API 中 JOIN 或复用已有样本查询补出 isSpecial、specialRemark。
不在 biz_sample_reception、biz_qc_work_order 等子表冗余。
凡构建样本相关 dict 的位置,按 _sample_to_dict 模式补字段。重点文件:
| 文件 | 改动 |
|---|---|
crud/collection_protocol.py |
_sample_to_dict、save_samples |
crud/research_donation.py |
_sample_to_dict、save_samples、转存储复制 |
crud/protocol_sample_collection.py |
list item 构建 |
crud/research_donation_sample_collection.py |
list item 构建 |
crud/sample_reception.py |
待接收/已接收/批量 list |
crud/qc_work_order.py |
工单 list/detail 中样本信息 |
crud/production_work_order.py |
同上 |
crud/storage_release_review.py |
入库审核 list/detail |
| 转运前样本等相关 CRUD | 协议卡片内样本 list |
Pydantic Create/Update body 中 samples 数组项增加可选字段 isSpecial、specialRemark;后端 save 时校验。
运行 python scripts/check_field_consistency.py 验证 CRUD ↔ Schema ↔ 前端字段一致。
SampleTransportFormSection位置:添加/编辑样本子弹窗,「样本状态」表单项之后。
控件:
el-checkbox — 标签「特殊样本」,绑定 sampleDraft.isSpecialel-input type="textarea" — 标签「特殊说明」,:disabled="!sampleDraft.isSpecial",maxlength=256,show-word-limit交互:
specialRemarkisSpecial=true 且 specialRemark 为空 → ElMessage.warning + 表单校验失败列表表格:新增列「特殊样本」(min-width ≥ 120):
—SpecialSampleDisplay 组件内容createEmptySample() / sampleDraft 初始化增加 isSpecial: false、specialRemark: ''。
采集协议单、捐赠协议单共用此组件,改一处覆盖两种协议。
新建 web-admin/src/components/business/special-sample-display/index.vue:
<!-- props: isSpecial, specialRemark, layout?: 'inline' | 'block' -->
<template v-if="isSpecial">
<span class="special-sample-mark">【特殊样本】</span>
<span v-if="specialRemark" class="special-sample-remark">{{ specialRemark }}</span>
</template>
样式(scoped + 可全局复用 class):
.special-sample-mark,
.special-sample-remark {
color: var(--el-color-danger);
font-weight: 700;
}
.special-sample-remark {
margin-left: 4px;
}
el-tag:此为警示文本,非状态枚举。ProtocolViewDialog / DonationViewDialog 样本卡片:
SpecialSampleDisplayisSpecial 时显示,block 布局)| 模块 | 文件 |
|---|---|
| 协议管理 | ProtocolAuditTab.vue、PreTransitProtocolCardList.vue |
| 捐赠审核 | research-donation/audit/index.vue |
| 样本采集信息 | SampleCollectionInfoTab.vue、DonationSampleCollectionInfoTab.vue |
| 样本接收 | sample-reception/index.vue、SampleReceptionCardList.vue |
| 质检工单 | QcWorkOrderProtocolGroup.vue、QcWorkOrderSampleGroup.vue、QcWorkOrderTaskSubList.vue |
| 入库审核 | storage-release-review/index.vue、StorageReleaseReviewDialog.vue、StorageReleaseViewDialog.vue |
| 生产工单 | ProductionWorkOrderCardList.vue、SampleReceptionDialog.vue、DispatchTaskDialog.vue 等 |
| 溯源 | SampleCustomerViewDialog.vue |
展示策略:
SpecialSampleDisplay,禁止各页复制样式web-admin/src/types/api.d.ts 中协议/捐赠样本相关类型补充 isSpecial?: boolean、specialRemark?: string。
| 阶段 | 范围 | 交付标准 |
|---|---|---|
| P0 | DB + Model + 两协议 CRUD + 录入组件 + 两协议查看弹窗 | 可在协议单录入/查看特殊样本 |
| P1 | 公共展示组件 + 下游全部展示点 + 转存储复制 | 质检/生产/接收等链路可见红色警示 |
| P2(可选) | 筛选、导出、小程序 | 产品另行排期 |
建议 P0、P1 同一 PR 或连续 PR 交付,避免下游看不到标记造成业务风险。
specialRemark 为空isSpecial=falseisSpecial + specialRemarkpython scripts/check_field_consistency.py 通过font-weight: 700,符合 Fresh Mint 规范中对强提醒的使用场景。| 议题 | 决策 |
|---|---|
| 勾选特殊样本时特殊说明是否必填 | A. 必填(前后端校验) |
| 数据存储位置 | 样本源表唯一数据源,下游 JOIN |
| 展示组件 | 新建 SpecialSampleDisplay,红色加粗文本,非 Tag |
| 本期范围 | web-admin 全链路展示;不含筛选/导出/小程序 |