docs(sql): add sample-level storage cert and insurance with migrate-from-protocol.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-13 10:43:36 +08:00
1 parent 8618141c2f
commit da35921f58
1 file changed
+157
@@ -0,0 +1,157 @@
-- 样本级储存证 / 保险 + 协议级数据迁移(2026-10-13)
-- 对齐 docs/superpowers/specs/2026-10-13-customer-service-management-design.md
CREATE TABLE IF NOT EXISTS biz_sample_storage_cert (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
sample_code VARCHAR(32) NOT NULL COMMENT '样本编码',
collection_protocol_id VARCHAR(64) DEFAULT NULL COMMENT '采集协议单ID冗余',
make_status CHAR(1) DEFAULT '0' COMMENT '制作状态 0-未制作 1-已制作',
cert_image_urls VARCHAR(4000) DEFAULT NULL COMMENT '证书图片URLs',
make_date CHAR(8) DEFAULT NULL COMMENT '制作日期YYYYMMDD',
handle_time DATETIME DEFAULT NULL COMMENT '办理时间',
handler_user_id VARCHAR(64) DEFAULT NULL COMMENT '办理人用户ID',
mail_cert_time DATETIME DEFAULT NULL COMMENT '邮寄储存证时间',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT DEFAULT NULL COMMENT '排序号',
remark VARCHAR(512) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
UNIQUE KEY uk_bssc_tenant_sample (tenant_no, sample_code),
KEY idx_bssc_protocol (tenant_no, collection_protocol_id, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='样本储存证办理';
-- 注:uk_bssc_tenant_sample 不含 del_flag;del_flag=0 行唯一性由应用层保证(与 biz_sample_storage_cert_qc 一致)。
CREATE TABLE IF NOT EXISTS biz_sample_insurance (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
sample_code VARCHAR(32) NOT NULL COMMENT '样本编码',
collection_protocol_id VARCHAR(64) DEFAULT NULL COMMENT '采集协议单ID冗余',
todo_status CHAR(1) NOT NULL DEFAULT '0' COMMENT '1已办保险 0未办保险',
handle_date CHAR(8) DEFAULT NULL COMMENT '办理日期',
handle_time DATETIME DEFAULT NULL COMMENT '办理时间',
handler_user_id VARCHAR(64) DEFAULT NULL COMMENT '办理人用户ID',
handle_remark VARCHAR(512) DEFAULT NULL COMMENT '办理备注',
insurance_attachments VARCHAR(4000) DEFAULT NULL COMMENT '保险附件逗号分隔',
insurance_company_id VARCHAR(64) DEFAULT NULL COMMENT '保险公司ID',
insurance_company_name VARCHAR(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)',
insurance_type VARCHAR(200) DEFAULT NULL COMMENT '保险险种',
insurance_policy_no VARCHAR(100) DEFAULT NULL COMMENT '保险单号',
insurance_effective_date CHAR(8) DEFAULT NULL COMMENT '保险单生效时间YYYYMMDD',
insurance_expiry_date CHAR(8) DEFAULT NULL COMMENT '保险单失效时间YYYYMMDD',
insurance_subscribed CHAR(1) DEFAULT '0' COMMENT '是否已订购保险',
insurance_fee DECIMAL(18, 2) DEFAULT NULL COMMENT '保单费用(元)',
policy_send_time DATETIME DEFAULT NULL COMMENT '保单发送时间',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT DEFAULT NULL COMMENT '排序号',
remark VARCHAR(512) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
UNIQUE KEY uk_bsi_tenant_sample (tenant_no, sample_code),
KEY idx_bsi_protocol (tenant_no, collection_protocol_id, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='样本保险办理';
-- 注:uk_bsi_tenant_sample 不含 del_flag;del_flag=0 行唯一性由应用层保证(与 biz_sample_storage_cert_qc 一致)。
-- 迁移:协议级储存证 → 协议下每个未删样本一行(幂等 NOT EXISTS)
INSERT INTO biz_sample_storage_cert (
id, sample_code, collection_protocol_id, make_status, cert_image_urls,
make_date, handle_time, handler_user_id, mail_cert_time,
tenant_no, order_num, remark, create_by, create_dept_id, create_time,
update_by, update_time, del_flag
)
SELECT
REPLACE(UUID(), '-', ''),
ps.sample_code,
c.collection_protocol_id,
c.make_status,
c.cert_image_urls,
c.make_date,
c.handle_time,
c.handler_user_id,
NULL,
c.tenant_no,
c.order_num,
c.remark,
c.create_by,
c.create_dept_id,
NOW(),
c.update_by,
NOW(),
0
FROM biz_protocol_storage_cert c
INNER JOIN biz_protocol_sample ps
ON ps.collection_protocol_id = c.collection_protocol_id
AND ps.tenant_no = c.tenant_no
AND ps.del_flag = 0
WHERE c.del_flag = 0
AND ps.sample_code IS NOT NULL
AND ps.sample_code <> ''
AND NOT EXISTS (
SELECT 1 FROM biz_sample_storage_cert t
WHERE t.tenant_no = c.tenant_no
AND t.sample_code = ps.sample_code
AND t.del_flag = 0
);
-- 迁移:协议级满月保险 → 协议下每个未删样本一行(幂等 NOT EXISTS)
INSERT INTO biz_sample_insurance (
id, sample_code, collection_protocol_id, todo_status, handle_date, handle_time,
handler_user_id, handle_remark, insurance_attachments,
insurance_company_id, insurance_company_name, insurance_type, insurance_policy_no,
insurance_effective_date, insurance_expiry_date, insurance_subscribed, insurance_fee,
policy_send_time,
tenant_no, order_num, remark, create_by, create_dept_id, create_time,
update_by, update_time, del_flag
)
SELECT
REPLACE(UUID(), '-', ''),
ps.sample_code,
t.collection_protocol_id,
t.todo_status,
t.handle_date,
t.handle_time,
t.handler_user_id,
t.handle_remark,
t.insurance_attachments,
t.insurance_company_id,
t.insurance_company_name,
t.insurance_type,
t.insurance_policy_no,
t.insurance_effective_date,
t.insurance_expiry_date,
t.insurance_subscribed,
t.insurance_fee,
NULL,
t.tenant_no,
t.order_num,
t.remark,
t.create_by,
t.create_dept_id,
NOW(),
t.update_by,
NOW(),
0
FROM biz_protocol_fullmoon_todo t
INNER JOIN biz_protocol_sample ps
ON ps.collection_protocol_id = t.collection_protocol_id
AND ps.tenant_no = t.tenant_no
AND ps.del_flag = 0
WHERE t.del_flag = 0
AND ps.sample_code IS NOT NULL
AND ps.sample_code <> ''
AND NOT EXISTS (
SELECT 1 FROM biz_sample_insurance s
WHERE s.tenant_no = t.tenant_no
AND s.sample_code = ps.sample_code
AND s.del_flag = 0
);