| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- -- 工艺路线:复制 4 条内置模版(深拷贝步骤及子表)
- -- 前置:已执行 2026-09-01-process-route-add-is-builtin.sql
- -- 幂等:同租户下目标 route_code 已存在且未删除则跳过
- -- MySQL 5.7+
- --
- -- 映射:
- -- 造血干样本处理 / CC样本处理 → 造血干样本处理(内置模版) / CC样本处理-BUILTIN
- -- 干细胞培养 / MSC培养 → 干细胞培养(内置模版) / MSC培养-BUILTIN
- -- UBMC冻存 / UBMC冻存 → UBMC冻存(内置模版) / UBMC冻存-BUILTIN
- -- PBMC冻存 / PBMC冻存 → PBMC冻存(内置模版) / PBMC冻存-BUILTIN
- --
- -- ID 生成说明:
- -- MySQL UUID() 在同一微秒批量 INSERT…SELECT 时可能撞主键。
- -- 新 id = UPPER(MD5(CONCAT(UUID(), 源行主键, RAND(), CONNECTION_ID()))),保证逐行唯一。
- --
- -- ---------------------------------------------------------------------------
- -- 若上次执行报 Duplicate entry … PRIMARY,先做半截数据清理再重跑本脚本:
- --
- -- -- 1) 查看已写入的 BUILTIN
- -- SELECT id, route_code, route_name, is_builtin, tenant_no, create_time
- -- FROM biz_process_route
- -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;
- --
- -- -- 2) 软删半截内置路线及其步骤/子表(仅清理本次模版种子,不动源路线)
- -- UPDATE biz_process_route_step_data_collection d
- -- INNER JOIN biz_process_route_step s ON s.id = d.step_id
- -- INNER JOIN biz_process_route r ON r.id = s.route_id
- -- SET d.del_flag = 1, d.update_time = NOW()
- -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND d.del_flag = 0;
- --
- -- UPDATE biz_process_route_step_output o
- -- INNER JOIN biz_process_route_step s ON s.id = o.step_id
- -- INNER JOIN biz_process_route r ON r.id = s.route_id
- -- SET o.del_flag = 1, o.update_time = NOW()
- -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND o.del_flag = 0;
- --
- -- UPDATE biz_process_route_step_consumable c
- -- INNER JOIN biz_process_route_step s ON s.id = c.step_id
- -- INNER JOIN biz_process_route r ON r.id = s.route_id
- -- SET c.del_flag = 1, c.update_time = NOW()
- -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND c.del_flag = 0;
- --
- -- UPDATE biz_process_route_step_reagent g
- -- INNER JOIN biz_process_route_step s ON s.id = g.step_id
- -- INNER JOIN biz_process_route r ON r.id = s.route_id
- -- SET g.del_flag = 1, g.update_time = NOW()
- -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND g.del_flag = 0;
- --
- -- UPDATE biz_process_route_step s
- -- INNER JOIN biz_process_route r ON r.id = s.route_id
- -- SET s.del_flag = 1, s.update_time = NOW()
- -- WHERE r.route_code LIKE '%-BUILTIN' AND r.del_flag = 0 AND s.del_flag = 0;
- --
- -- UPDATE biz_process_route
- -- SET del_flag = 1, update_time = NOW()
- -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;
- -- ---------------------------------------------------------------------------
- DELIMITER $$
- DROP PROCEDURE IF EXISTS sp_copy_process_route_builtin$$
- CREATE PROCEDURE sp_copy_process_route_builtin(
- IN p_src_code VARCHAR(64),
- IN p_dst_code VARCHAR(64),
- IN p_dst_name VARCHAR(100)
- )
- BEGIN
- DECLARE v_done INT DEFAULT 0;
- DECLARE v_src_id VARCHAR(64);
- DECLARE v_tenant VARCHAR(64);
- DECLARE v_is_current CHAR(1);
- DECLARE v_new_route_id VARCHAR(64);
- DECLARE cur CURSOR FOR
- SELECT x.id, x.tenant_no, IFNULL(x.is_current, '0')
- FROM biz_process_route x
- INNER JOIN (
- SELECT
- tenant_no,
- SUBSTRING_INDEX(
- GROUP_CONCAT(id ORDER BY (IFNULL(is_current, '0') = '1') DESC, update_time DESC SEPARATOR ','),
- ',',
- 1
- ) AS pick_id
- FROM biz_process_route
- WHERE route_code = p_src_code
- AND del_flag = 0
- GROUP BY tenant_no
- ) p ON p.pick_id = x.id
- WHERE NOT EXISTS (
- SELECT 1
- FROM biz_process_route t
- WHERE t.tenant_no = x.tenant_no
- AND t.route_code = p_dst_code
- AND t.del_flag = 0
- );
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
- OPEN cur;
- read_loop: LOOP
- FETCH cur INTO v_src_id, v_tenant, v_is_current;
- IF v_done = 1 THEN
- LEAVE read_loop;
- END IF;
- START TRANSACTION;
- SET v_new_route_id = UPPER(MD5(CONCAT(UUID(), v_src_id, RAND(), CONNECTION_ID())));
- INSERT INTO biz_process_route (
- id, route_code, route_name, product_type_id, version, is_current,
- equipment_ids, equipment_name, tenant_no, order_num, remark, is_builtin,
- create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- v_new_route_id,
- p_dst_code,
- p_dst_name,
- product_type_id,
- version,
- v_is_current,
- equipment_ids,
- equipment_name,
- tenant_no,
- order_num,
- '内置模版',
- '1',
- create_by,
- IFNULL(create_dept_id, ''),
- NOW(),
- update_by,
- NOW(),
- 0
- FROM biz_process_route
- WHERE id = v_src_id;
- DROP TEMPORARY TABLE IF EXISTS tmp_step_id_map;
- CREATE TEMPORARY TABLE tmp_step_id_map (
- old_id VARCHAR(64) NOT NULL PRIMARY KEY,
- new_id VARCHAR(64) NOT NULL
- );
- INSERT INTO tmp_step_id_map (old_id, new_id)
- SELECT
- id,
- UPPER(MD5(CONCAT(UUID(), id, RAND(), CONNECTION_ID())))
- FROM biz_process_route_step
- WHERE route_id = v_src_id
- AND del_flag = 0;
- INSERT INTO biz_process_route_step (
- id, route_id, process_id, step_order, process_code, category_id, process_name,
- description, equipment_ids, equipment_name, estimated_duration, sop_ids, sop_content,
- tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- m.new_id,
- v_new_route_id,
- s.process_id,
- s.step_order,
- s.process_code,
- s.category_id,
- s.process_name,
- s.description,
- s.equipment_ids,
- s.equipment_name,
- s.estimated_duration,
- s.sop_ids,
- s.sop_content,
- s.tenant_no,
- s.order_num,
- s.remark,
- s.create_by,
- IFNULL(s.create_dept_id, ''),
- NOW(),
- s.update_by,
- NOW(),
- 0
- FROM biz_process_route_step s
- INNER JOIN tmp_step_id_map m ON m.old_id = s.id;
- INSERT INTO biz_process_route_step_reagent (
- id, step_id, reagent_code, reagent_name, spec, standard_usage, unit, is_key_material,
- tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- UPPER(MD5(CONCAT(UUID(), r.id, RAND(), CONNECTION_ID()))),
- m.new_id,
- r.reagent_code,
- r.reagent_name,
- r.spec,
- r.standard_usage,
- r.unit,
- r.is_key_material,
- r.tenant_no,
- r.order_num,
- r.remark,
- r.create_by,
- IFNULL(r.create_dept_id, ''),
- NOW(),
- r.update_by,
- NOW(),
- 0
- FROM biz_process_route_step_reagent r
- INNER JOIN tmp_step_id_map m ON m.old_id = r.step_id
- WHERE r.del_flag = 0;
- INSERT INTO biz_process_route_step_consumable (
- id, step_id, consumable_code, consumable_name, spec_model, standard_usage, unit, is_required,
- remark, tenant_no, order_num, create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- UPPER(MD5(CONCAT(UUID(), c.id, RAND(), CONNECTION_ID()))),
- m.new_id,
- c.consumable_code,
- c.consumable_name,
- c.spec_model,
- c.standard_usage,
- c.unit,
- c.is_required,
- c.remark,
- c.tenant_no,
- c.order_num,
- c.create_by,
- IFNULL(c.create_dept_id, ''),
- NOW(),
- c.update_by,
- NOW(),
- 0
- FROM biz_process_route_step_consumable c
- INNER JOIN tmp_step_id_map m ON m.old_id = c.step_id
- WHERE c.del_flag = 0;
- INSERT INTO biz_process_route_step_output (
- id, step_id, output_type_id, output_name, output_barcode,
- tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- UPPER(MD5(CONCAT(UUID(), o.id, RAND(), CONNECTION_ID()))),
- m.new_id,
- o.output_type_id,
- o.output_name,
- o.output_barcode,
- o.tenant_no,
- o.order_num,
- o.remark,
- o.create_by,
- IFNULL(o.create_dept_id, ''),
- NOW(),
- o.update_by,
- NOW(),
- 0
- FROM biz_process_route_step_output o
- INNER JOIN tmp_step_id_map m ON m.old_id = o.step_id
- WHERE o.del_flag = 0;
- INSERT INTO biz_process_route_step_data_collection (
- id, step_id, collection_name, unit,
- tenant_no, order_num, remark, create_by, create_dept_id, create_time, update_by, update_time, del_flag
- )
- SELECT
- UPPER(MD5(CONCAT(UUID(), d.id, RAND(), CONNECTION_ID()))),
- m.new_id,
- d.collection_name,
- d.unit,
- d.tenant_no,
- d.order_num,
- d.remark,
- d.create_by,
- IFNULL(d.create_dept_id, ''),
- NOW(),
- d.update_by,
- NOW(),
- 0
- FROM biz_process_route_step_data_collection d
- INNER JOIN tmp_step_id_map m ON m.old_id = d.step_id
- WHERE d.del_flag = 0;
- DROP TEMPORARY TABLE IF EXISTS tmp_step_id_map;
- COMMIT;
- END LOOP;
- CLOSE cur;
- END$$
- DELIMITER ;
- CALL sp_copy_process_route_builtin('CC样本处理', 'CC样本处理-BUILTIN', '造血干样本处理(内置模版)');
- CALL sp_copy_process_route_builtin('MSC培养', 'MSC培养-BUILTIN', '干细胞培养(内置模版)');
- CALL sp_copy_process_route_builtin('UBMC冻存', 'UBMC冻存-BUILTIN', 'UBMC冻存(内置模版)');
- CALL sp_copy_process_route_builtin('PBMC冻存', 'PBMC冻存-BUILTIN', 'PBMC冻存(内置模版)');
- DROP PROCEDURE IF EXISTS sp_copy_process_route_builtin;
- -- 校验(可选):
- -- SELECT route_code, route_name, is_builtin, remark, is_current, tenant_no
- -- FROM biz_process_route
- -- WHERE route_code LIKE '%-BUILTIN' AND del_flag = 0;
|