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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 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 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. REPLACE(UUID(), '-', ''),
  69. ps.sample_code,
  70. c.collection_protocol_id,
  71. c.make_status,
  72. c.cert_image_urls,
  73. c.make_date,
  74. c.handle_time,
  75. c.handler_user_id,
  76. NULL,
  77. c.tenant_no,
  78. c.order_num,
  79. c.remark,
  80. c.create_by,
  81. c.create_dept_id,
  82. NOW(),
  83. c.update_by,
  84. NOW(),
  85. 0
  86. FROM biz_protocol_storage_cert c
  87. INNER JOIN biz_protocol_sample ps
  88. ON ps.collection_protocol_id = c.collection_protocol_id
  89. AND ps.tenant_no = c.tenant_no
  90. AND ps.del_flag = 0
  91. WHERE c.del_flag = 0
  92. AND ps.sample_code IS NOT NULL
  93. AND ps.sample_code <> ''
  94. AND NOT EXISTS (
  95. SELECT 1 FROM biz_sample_storage_cert t
  96. WHERE t.tenant_no = c.tenant_no
  97. AND t.sample_code = ps.sample_code
  98. AND t.del_flag = 0
  99. );
  100. -- 迁移:协议级满月保险 → 协议下每个未删样本一行(幂等 NOT EXISTS)
  101. INSERT INTO biz_sample_insurance (
  102. id, sample_code, collection_protocol_id, todo_status, handle_date, handle_time,
  103. handler_user_id, handle_remark, insurance_attachments,
  104. insurance_company_id, insurance_company_name, insurance_type, insurance_policy_no,
  105. insurance_effective_date, insurance_expiry_date, insurance_subscribed, insurance_fee,
  106. policy_send_time,
  107. tenant_no, order_num, remark, create_by, create_dept_id, create_time,
  108. update_by, update_time, del_flag
  109. )
  110. SELECT
  111. REPLACE(UUID(), '-', ''),
  112. ps.sample_code,
  113. t.collection_protocol_id,
  114. t.todo_status,
  115. t.handle_date,
  116. t.handle_time,
  117. t.handler_user_id,
  118. t.handle_remark,
  119. t.insurance_attachments,
  120. t.insurance_company_id,
  121. t.insurance_company_name,
  122. t.insurance_type,
  123. t.insurance_policy_no,
  124. t.insurance_effective_date,
  125. t.insurance_expiry_date,
  126. t.insurance_subscribed,
  127. t.insurance_fee,
  128. NULL,
  129. t.tenant_no,
  130. t.order_num,
  131. t.remark,
  132. t.create_by,
  133. t.create_dept_id,
  134. NOW(),
  135. t.update_by,
  136. NOW(),
  137. 0
  138. FROM biz_protocol_fullmoon_todo t
  139. INNER JOIN biz_protocol_sample ps
  140. ON ps.collection_protocol_id = t.collection_protocol_id
  141. AND ps.tenant_no = t.tenant_no
  142. AND ps.del_flag = 0
  143. WHERE t.del_flag = 0
  144. AND ps.sample_code IS NOT NULL
  145. AND ps.sample_code <> ''
  146. AND NOT EXISTS (
  147. SELECT 1 FROM biz_sample_insurance s
  148. WHERE s.tenant_no = t.tenant_no
  149. AND s.sample_code = ps.sample_code
  150. AND s.del_flag = 0
  151. );