2026-10-13-sample-storage-cert-insurance.sql 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. -- 样本级储存证 / 保险 + 协议级数据迁移(2026-10-13)
  2. -- 对齐 docs/superpowers/specs/2026-10-13-customer-service-management-design.md
  3. CREATE TABLE IF NOT EXISTS biz_sample_storage_cert (
  4. id VARCHAR(64) NOT NULL COMMENT '主键ID',
  5. sample_code VARCHAR(32) NOT NULL COMMENT '样本编码',
  6. collection_protocol_id VARCHAR(64) DEFAULT NULL COMMENT '采集协议单ID冗余',
  7. make_status CHAR(1) DEFAULT '0' COMMENT '制作状态 0-未制作 1-已制作',
  8. cert_image_urls VARCHAR(4000) DEFAULT NULL COMMENT '证书图片URLs',
  9. make_date CHAR(8) DEFAULT NULL COMMENT '制作日期YYYYMMDD',
  10. handle_time DATETIME DEFAULT NULL COMMENT '办理时间',
  11. handler_user_id VARCHAR(64) DEFAULT NULL COMMENT '办理人用户ID',
  12. mail_cert_time DATETIME DEFAULT NULL COMMENT '邮寄储存证时间',
  13. tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  14. order_num INT DEFAULT NULL COMMENT '排序号',
  15. remark VARCHAR(512) DEFAULT NULL COMMENT '备注',
  16. create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人id',
  17. create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  18. create_time DATETIME NOT NULL COMMENT '创建时间',
  19. update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人id',
  20. update_time DATETIME NOT NULL COMMENT '更新时间',
  21. del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
  22. PRIMARY KEY (id),
  23. UNIQUE KEY uk_bssc_tenant_sample (tenant_no, sample_code),
  24. KEY idx_bssc_protocol (tenant_no, collection_protocol_id, del_flag)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='样本储存证办理';
  26. -- 注:uk_bssc_tenant_sample 不含 del_flag;del_flag=0 行唯一性由应用层保证(与 biz_sample_storage_cert_qc 一致)。
  27. CREATE TABLE IF NOT EXISTS biz_sample_insurance (
  28. id VARCHAR(64) NOT NULL COMMENT '主键ID',
  29. sample_code VARCHAR(32) NOT NULL COMMENT '样本编码',
  30. collection_protocol_id VARCHAR(64) DEFAULT NULL COMMENT '采集协议单ID冗余',
  31. todo_status CHAR(1) NOT NULL DEFAULT '0' COMMENT '1已办保险 0未办保险',
  32. handle_date CHAR(8) DEFAULT NULL COMMENT '办理日期',
  33. handle_time DATETIME DEFAULT NULL COMMENT '办理时间',
  34. handler_user_id VARCHAR(64) DEFAULT NULL COMMENT '办理人用户ID',
  35. handle_remark VARCHAR(512) DEFAULT NULL COMMENT '办理备注',
  36. insurance_attachments VARCHAR(4000) DEFAULT NULL COMMENT '保险附件逗号分隔',
  37. insurance_company_id VARCHAR(64) DEFAULT NULL COMMENT '保险公司ID',
  38. insurance_company_name VARCHAR(200) DEFAULT NULL COMMENT '保险公司名称(冗余快照)',
  39. insurance_type VARCHAR(200) DEFAULT NULL COMMENT '保险险种',
  40. insurance_policy_no VARCHAR(100) DEFAULT NULL COMMENT '保险单号',
  41. insurance_effective_date CHAR(8) DEFAULT NULL COMMENT '保险单生效时间YYYYMMDD',
  42. insurance_expiry_date CHAR(8) DEFAULT NULL COMMENT '保险单失效时间YYYYMMDD',
  43. insurance_subscribed CHAR(1) DEFAULT '0' COMMENT '是否已订购保险',
  44. insurance_fee DECIMAL(18, 2) DEFAULT NULL COMMENT '保单费用(元)',
  45. policy_send_time DATETIME DEFAULT NULL COMMENT '保单发送时间',
  46. tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
  47. order_num INT DEFAULT NULL COMMENT '排序号',
  48. remark VARCHAR(512) DEFAULT NULL COMMENT '备注',
  49. create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人id',
  50. create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
  51. create_time DATETIME NOT NULL COMMENT '创建时间',
  52. update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人id',
  53. update_time DATETIME NOT NULL COMMENT '更新时间',
  54. del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
  55. PRIMARY KEY (id),
  56. UNIQUE KEY uk_bsi_tenant_sample (tenant_no, sample_code),
  57. KEY idx_bsi_protocol (tenant_no, collection_protocol_id, del_flag)
  58. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='样本保险办理';
  59. -- 注:uk_bsi_tenant_sample 不含 del_flag;del_flag=0 行唯一性由应用层保证(与 biz_sample_storage_cert_qc 一致)。
  60. -- 迁移:协议级储存证 → 协议下每个未删样本一行(幂等 NOT EXISTS)
  61. INSERT INTO biz_sample_storage_cert (
  62. id, sample_code, collection_protocol_id, make_status, cert_image_urls,
  63. make_date, handle_time, handler_user_id, mail_cert_time,
  64. tenant_no, order_num, remark, create_by, create_dept_id, create_time,
  65. update_by, update_time, del_flag
  66. )
  67. SELECT
  68. -- MySQL 5.7 同语句批量 UUID() 可能撞主键,用业务键派生稳定唯一 id
  69. MD5(CONCAT('bssc#', c.tenant_no, '#', ps.sample_code, '#', c.id, '#', ps.id)),
  70. ps.sample_code,
  71. c.collection_protocol_id,
  72. c.make_status,
  73. c.cert_image_urls,
  74. c.make_date,
  75. c.handle_time,
  76. c.handler_user_id,
  77. NULL,
  78. c.tenant_no,
  79. c.order_num,
  80. c.remark,
  81. c.create_by,
  82. c.create_dept_id,
  83. NOW(),
  84. c.update_by,
  85. NOW(),
  86. 0
  87. FROM biz_protocol_storage_cert c
  88. INNER JOIN biz_protocol_sample ps
  89. ON (ps.collection_protocol_id COLLATE utf8mb4_unicode_ci) = (c.collection_protocol_id COLLATE utf8mb4_unicode_ci)
  90. AND (ps.tenant_no COLLATE utf8mb4_unicode_ci) = (c.tenant_no COLLATE utf8mb4_unicode_ci)
  91. AND ps.del_flag = 0
  92. WHERE c.del_flag = 0
  93. AND ps.sample_code IS NOT NULL
  94. AND ps.sample_code <> ''
  95. AND NOT EXISTS (
  96. SELECT 1 FROM biz_sample_storage_cert t
  97. WHERE (t.tenant_no COLLATE utf8mb4_unicode_ci) = (c.tenant_no COLLATE utf8mb4_unicode_ci)
  98. AND (t.sample_code COLLATE utf8mb4_unicode_ci) = (ps.sample_code COLLATE utf8mb4_unicode_ci)
  99. AND t.del_flag = 0
  100. );
  101. -- 迁移:协议级满月保险 → 协议下每个未删样本一行(幂等 NOT EXISTS)
  102. INSERT INTO biz_sample_insurance (
  103. id, sample_code, collection_protocol_id, todo_status, handle_date, handle_time,
  104. handler_user_id, handle_remark, insurance_attachments,
  105. insurance_company_id, insurance_company_name, insurance_type, insurance_policy_no,
  106. insurance_effective_date, insurance_expiry_date, insurance_subscribed, insurance_fee,
  107. policy_send_time,
  108. tenant_no, order_num, remark, create_by, create_dept_id, create_time,
  109. update_by, update_time, del_flag
  110. )
  111. SELECT
  112. MD5(CONCAT('bsi#', t.tenant_no, '#', ps.sample_code, '#', t.id, '#', ps.id)),
  113. ps.sample_code,
  114. t.collection_protocol_id,
  115. t.todo_status,
  116. t.handle_date,
  117. t.handle_time,
  118. t.handler_user_id,
  119. t.handle_remark,
  120. t.insurance_attachments,
  121. t.insurance_company_id,
  122. t.insurance_company_name,
  123. t.insurance_type,
  124. t.insurance_policy_no,
  125. t.insurance_effective_date,
  126. t.insurance_expiry_date,
  127. t.insurance_subscribed,
  128. t.insurance_fee,
  129. NULL,
  130. t.tenant_no,
  131. t.order_num,
  132. t.remark,
  133. t.create_by,
  134. t.create_dept_id,
  135. NOW(),
  136. t.update_by,
  137. NOW(),
  138. 0
  139. FROM biz_protocol_fullmoon_todo t
  140. INNER JOIN biz_protocol_sample ps
  141. ON (ps.collection_protocol_id COLLATE utf8mb4_unicode_ci) = (t.collection_protocol_id COLLATE utf8mb4_unicode_ci)
  142. AND (ps.tenant_no COLLATE utf8mb4_unicode_ci) = (t.tenant_no COLLATE utf8mb4_unicode_ci)
  143. AND ps.del_flag = 0
  144. WHERE t.del_flag = 0
  145. AND ps.sample_code IS NOT NULL
  146. AND ps.sample_code <> ''
  147. AND NOT EXISTS (
  148. SELECT 1 FROM biz_sample_insurance s
  149. WHERE (s.tenant_no COLLATE utf8mb4_unicode_ci) = (t.tenant_no COLLATE utf8mb4_unicode_ci)
  150. AND (s.sample_code COLLATE utf8mb4_unicode_ci) = (ps.sample_code COLLATE utf8mb4_unicode_ci)
  151. AND s.del_flag = 0
  152. );