2026-09-01-process-route-builtin-templates.sql 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. -- 工艺路线:复制 4 条内置模版(深拷贝步骤及子表)
  2. -- 前置:已执行 2026-09-01-process-route-add-is-builtin.sql
  3. -- 幂等:同租户下目标 route_code 已存在且未删除则跳过
  4. -- MySQL 5.7+
  5. --
  6. -- 映射:
  7. -- 造血干样本处理 / CC样本处理 → 造血干样本处理(内置模版) / CC样本处理-BUILTIN
  8. -- 干细胞培养 / MSC培养 → 干细胞培养(内置模版) / MSC培养-BUILTIN
  9. -- UBMC冻存 / UBMC冻存 → UBMC冻存(内置模版) / UBMC冻存-BUILTIN
  10. -- PBMC冻存 / PBMC冻存 → PBMC冻存(内置模版) / PBMC冻存-BUILTIN
  11. --
  12. -- ID 生成说明:
  13. -- MySQL UUID() 在同一微秒批量 INSERT…SELECT 时可能撞主键。
  14. -- 新 id = UPPER(MD5(CONCAT(UUID(), 源行主键, RAND(), CONNECTION_ID()))),保证逐行唯一。
  15. --
  16. -- ---------------------------------------------------------------------------
  17. -- 若上次执行报 Duplicate entry … PRIMARY,先做半截数据清理再重跑本脚本:
  18. --
  19. -- -- 1) 查看已写入的 BUILTIN
  20. -- SELECT id, route_code, route_name, is_builtin, tenant_no, create_time
  21. -- FROM biz_process_route
  22. -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;
  23. --
  24. -- -- 2) 软删半截内置路线及其步骤/子表(仅清理本次模版种子,不动源路线)
  25. -- UPDATE biz_process_route_step_data_collection d
  26. -- INNER JOIN biz_process_route_step s ON s.id = d.step_id
  27. -- INNER JOIN biz_process_route r ON r.id = s.route_id
  28. -- SET d.del_flag = 1, d.update_time = NOW()
  29. -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND d.del_flag = 0;
  30. --
  31. -- UPDATE biz_process_route_step_output o
  32. -- INNER JOIN biz_process_route_step s ON s.id = o.step_id
  33. -- INNER JOIN biz_process_route r ON r.id = s.route_id
  34. -- SET o.del_flag = 1, o.update_time = NOW()
  35. -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND o.del_flag = 0;
  36. --
  37. -- UPDATE biz_process_route_step_consumable c
  38. -- INNER JOIN biz_process_route_step s ON s.id = c.step_id
  39. -- INNER JOIN biz_process_route r ON r.id = s.route_id
  40. -- SET c.del_flag = 1, c.update_time = NOW()
  41. -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND c.del_flag = 0;
  42. --
  43. -- UPDATE biz_process_route_step_reagent g
  44. -- INNER JOIN biz_process_route_step s ON s.id = g.step_id
  45. -- INNER JOIN biz_process_route r ON r.id = s.route_id
  46. -- SET g.del_flag = 1, g.update_time = NOW()
  47. -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND g.del_flag = 0;
  48. --
  49. -- UPDATE biz_process_route_step s
  50. -- INNER JOIN biz_process_route r ON r.id = s.route_id
  51. -- SET s.del_flag = 1, s.update_time = NOW()
  52. -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND s.del_flag = 0;
  53. --
  54. -- UPDATE biz_process_route
  55. -- SET del_flag = 1, update_time = NOW()
  56. -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;
  57. -- ---------------------------------------------------------------------------
  58. DELIMITER $$
  59. DROP PROCEDURE IF EXISTS sp_copy_process_route_builtin$$
  60. CREATE PROCEDURE sp_copy_process_route_builtin(
  61. IN p_src_code VARCHAR(64),
  62. IN p_dst_code VARCHAR(64),
  63. IN p_dst_name VARCHAR(100)
  64. )
  65. BEGIN
  66. DECLARE v_done INT DEFAULT 0;
  67. DECLARE v_src_id VARCHAR(64);
  68. DECLARE v_tenant VARCHAR(64);
  69. DECLARE v_is_current CHAR(1);
  70. DECLARE v_new_route_id VARCHAR(64);
  71. DECLARE cur CURSOR FOR
  72. SELECT x.id, x.tenant_no, IFNULL(x.is_current, '0')
  73. FROM biz_process_route x
  74. INNER JOIN (
  75. SELECT
  76. tenant_no,
  77. SUBSTRING_INDEX(
  78. GROUP_CONCAT(id ORDER BY (IFNULL(is_current, '0') = '1') DESC, update_time DESC SEPARATOR ','),
  79. ',',
  80. 1
  81. ) AS pick_id
  82. FROM biz_process_route
  83. WHERE route_code = p_src_code
  84. AND del_flag = 0
  85. GROUP BY tenant_no
  86. ) p ON p.pick_id = x.id
  87. WHERE NOT EXISTS (
  88. SELECT 1
  89. FROM biz_process_route t
  90. WHERE t.tenant_no = x.tenant_no
  91. AND t.route_code = p_dst_code
  92. AND t.del_flag = 0
  93. );
  94. DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
  95. DECLARE EXIT HANDLER FOR SQLEXCEPTION
  96. BEGIN
  97. ROLLBACK;
  98. RESIGNAL;
  99. END;
  100. OPEN cur;
  101. read_loop: LOOP
  102. FETCH cur INTO v_src_id, v_tenant, v_is_current;
  103. IF v_done = 1 THEN
  104. LEAVE read_loop;
  105. END IF;
  106. START TRANSACTION;
  107. SET v_new_route_id = UPPER(MD5(CONCAT(UUID(), v_src_id, RAND(), CONNECTION_ID())));
  108. INSERT INTO biz_process_route (
  109. id, route_code, route_name, product_type_id, version, is_current,
  110. equipment_ids, equipment_name, tenant_no, order_num, remark, is_builtin,
  111. create_by, create_dept_id, create_time, update_by, update_time, del_flag
  112. )
  113. SELECT
  114. v_new_route_id,
  115. p_dst_code,
  116. p_dst_name,
  117. product_type_id,
  118. version,
  119. v_is_current,
  120. equipment_ids,
  121. equipment_name,
  122. tenant_no,
  123. order_num,
  124. '内置模版',
  125. '1',
  126. create_by,
  127. IFNULL(create_dept_id, ''),
  128. NOW(),
  129. update_by,
  130. NOW(),
  131. 0
  132. FROM biz_process_route
  133. WHERE id = v_src_id;
  134. DROP TEMPORARY TABLE IF EXISTS tmp_step_id_map;
  135. CREATE TEMPORARY TABLE tmp_step_id_map (
  136. old_id VARCHAR(64) NOT NULL PRIMARY KEY,
  137. new_id VARCHAR(64) NOT NULL
  138. );
  139. INSERT INTO tmp_step_id_map (old_id, new_id)
  140. SELECT
  141. id,
  142. UPPER(MD5(CONCAT(UUID(), id, RAND(), CONNECTION_ID())))
  143. FROM biz_process_route_step
  144. WHERE route_id = v_src_id
  145. AND del_flag = 0;
  146. INSERT INTO biz_process_route_step (
  147. id, route_id, process_id, step_order, process_code, category_id, process_name,
  148. description, equipment_ids, equipment_name, estimated_duration, sop_ids, sop_content,
  149. tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
  150. )
  151. SELECT
  152. m.new_id,
  153. v_new_route_id,
  154. s.process_id,
  155. s.step_order,
  156. s.process_code,
  157. s.category_id,
  158. s.process_name,
  159. s.description,
  160. s.equipment_ids,
  161. s.equipment_name,
  162. s.estimated_duration,
  163. s.sop_ids,
  164. s.sop_content,
  165. s.tenant_no,
  166. s.order_num,
  167. s.remark,
  168. s.create_by,
  169. IFNULL(s.create_dept_id, ''),
  170. NOW(),
  171. s.update_by,
  172. NOW(),
  173. 0
  174. FROM biz_process_route_step s
  175. INNER JOIN tmp_step_id_map m ON m.old_id = s.id;
  176. INSERT INTO biz_process_route_step_reagent (
  177. id, step_id, reagent_code, reagent_name, spec, standard_usage, unit, is_key_material,
  178. tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
  179. )
  180. SELECT
  181. UPPER(MD5(CONCAT(UUID(), r.id, RAND(), CONNECTION_ID()))),
  182. m.new_id,
  183. r.reagent_code,
  184. r.reagent_name,
  185. r.spec,
  186. r.standard_usage,
  187. r.unit,
  188. r.is_key_material,
  189. r.tenant_no,
  190. r.order_num,
  191. r.remark,
  192. r.create_by,
  193. IFNULL(r.create_dept_id, ''),
  194. NOW(),
  195. r.update_by,
  196. NOW(),
  197. 0
  198. FROM biz_process_route_step_reagent r
  199. INNER JOIN tmp_step_id_map m ON m.old_id = r.step_id
  200. WHERE r.del_flag = 0;
  201. INSERT INTO biz_process_route_step_consumable (
  202. id, step_id, consumable_code, consumable_name, spec_model, standard_usage, unit, is_required,
  203. remark, tenant_no, order_num, create_by, create_dept_id, create_time, update_by, update_time, del_flag
  204. )
  205. SELECT
  206. UPPER(MD5(CONCAT(UUID(), c.id, RAND(), CONNECTION_ID()))),
  207. m.new_id,
  208. c.consumable_code,
  209. c.consumable_name,
  210. c.spec_model,
  211. c.standard_usage,
  212. c.unit,
  213. c.is_required,
  214. c.remark,
  215. c.tenant_no,
  216. c.order_num,
  217. c.create_by,
  218. IFNULL(c.create_dept_id, ''),
  219. NOW(),
  220. c.update_by,
  221. NOW(),
  222. 0
  223. FROM biz_process_route_step_consumable c
  224. INNER JOIN tmp_step_id_map m ON m.old_id = c.step_id
  225. WHERE c.del_flag = 0;
  226. INSERT INTO biz_process_route_step_output (
  227. id, step_id, output_type_id, output_name, output_barcode,
  228. tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
  229. )
  230. SELECT
  231. UPPER(MD5(CONCAT(UUID(), o.id, RAND(), CONNECTION_ID()))),
  232. m.new_id,
  233. o.output_type_id,
  234. o.output_name,
  235. o.output_barcode,
  236. o.tenant_no,
  237. o.order_num,
  238. o.remark,
  239. o.create_by,
  240. IFNULL(o.create_dept_id, ''),
  241. NOW(),
  242. o.update_by,
  243. NOW(),
  244. 0
  245. FROM biz_process_route_step_output o
  246. INNER JOIN tmp_step_id_map m ON m.old_id = o.step_id
  247. WHERE o.del_flag = 0;
  248. INSERT INTO biz_process_route_step_data_collection (
  249. id, step_id, collection_name, unit,
  250. tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
  251. )
  252. SELECT
  253. UPPER(MD5(CONCAT(UUID(), d.id, RAND(), CONNECTION_ID()))),
  254. m.new_id,
  255. d.collection_name,
  256. d.unit,
  257. d.tenant_no,
  258. d.order_num,
  259. d.remark,
  260. d.create_by,
  261. IFNULL(d.create_dept_id, ''),
  262. NOW(),
  263. d.update_by,
  264. NOW(),
  265. 0
  266. FROM biz_process_route_step_data_collection d
  267. INNER JOIN tmp_step_id_map m ON m.old_id = d.step_id
  268. WHERE d.del_flag = 0;
  269. DROP TEMPORARY TABLE IF EXISTS tmp_step_id_map;
  270. COMMIT;
  271. END LOOP;
  272. CLOSE cur;
  273. END$$
  274. DELIMITER ;
  275. CALL sp_copy_process_route_builtin('CC样本处理', 'CC样本处理-BUILTIN', '造血干样本处理(内置模版)');
  276. CALL sp_copy_process_route_builtin('MSC培养', 'MSC培养-BUILTIN', '干细胞培养(内置模版)');
  277. CALL sp_copy_process_route_builtin('UBMC冻存', 'UBMC冻存-BUILTIN', 'UBMC冻存(内置模版)');
  278. CALL sp_copy_process_route_builtin('PBMC冻存', 'PBMC冻存-BUILTIN', 'PBMC冻存(内置模版)');
  279. DROP PROCEDURE IF EXISTS sp_copy_process_route_builtin;
  280. -- 校验(可选):
  281. -- SELECT route_code, route_name, is_builtin, remark, is_current, tenant_no
  282. -- FROM biz_process_route
  283. -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;