| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- -- =============================================================================
- -- 打开全部 OA 审批应用的「审批人去重」,并强制重新发布(2026-10-16)
- -- MySQL 5.7
- --
- -- 行为:
- -- 1. 每个已有「最新已发布」版本的应用:无论 approverDedup 当前是否已为 true,
- -- 一律复制为新的 published 行(表单、流程不变,开关强制 true),
- -- 旧的 is_latest_published 改为 0。
- -- 已在途实例仍指向旧 version id;新发起走新版本。
- -- 2. 全部未删除草稿:就地把 approverDedup 设为 true(不把草稿未完成改动一并发布)。
- -- 3. 从未发布过的应用:把版本号最大的那条草稿标为已发布,并打开开关。
- --
- -- 注意:本脚本会为每个已发布应用再升一版;短时间内重复执行会连续升版。
- -- =============================================================================
- DROP PROCEDURE IF EXISTS sp_oa_enable_approver_dedup;
- DELIMITER $$
- CREATE PROCEDURE sp_oa_enable_approver_dedup()
- BEGIN
- DECLARE v_done INT DEFAULT 0;
- DECLARE v_src_id VARCHAR(64);
- DECLARE v_app_id VARCHAR(64);
- DECLARE v_tenant VARCHAR(64);
- DECLARE v_next_no INT;
- DECLARE v_new_id VARCHAR(64);
- DECLARE v_advanced TEXT;
- -- 强制:所有当前最新已发布版本都重新发布一版
- DECLARE cur CURSOR FOR
- SELECT id, app_id, tenant_no
- FROM oa_app_version
- WHERE del_flag = 0
- AND is_latest_published = '1';
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
- OPEN cur;
- read_loop: LOOP
- FETCH cur INTO v_src_id, v_app_id, v_tenant;
- IF v_done = 1 THEN
- LEAVE read_loop;
- END IF;
- SELECT IFNULL(MAX(version_no), 0) + 1
- INTO v_next_no
- FROM oa_app_version
- WHERE app_id = v_app_id
- AND tenant_no = v_tenant;
- SET v_new_id = UPPER(REPLACE(UUID(), '-', ''));
- SELECT CAST(
- JSON_SET(
- CASE
- WHEN advanced_settings_json IS NULL
- OR advanced_settings_json = ''
- OR JSON_VALID(advanced_settings_json) = 0
- THEN CAST('{}' AS JSON)
- ELSE CAST(advanced_settings_json AS JSON)
- END,
- '$.approverDedup',
- CAST('true' AS JSON)
- ) AS CHAR
- )
- INTO v_advanced
- FROM oa_app_version
- WHERE id = v_src_id;
- INSERT INTO oa_app_version (
- id, app_id, version_no, status, is_latest_published,
- form_schema_json, flow_tree_json, advanced_settings_json,
- tenant_no, order_num, remark,
- create_by, create_dept_id, create_time,
- update_by, update_time, del_flag
- )
- SELECT
- v_new_id, app_id, v_next_no, 'published', '1',
- form_schema_json, flow_tree_json, v_advanced,
- tenant_no, order_num, remark,
- create_by, create_dept_id, NOW(),
- 'sql-approver-dedup', NOW(), 0
- FROM oa_app_version
- WHERE id = v_src_id;
- UPDATE oa_app_version
- SET is_latest_published = '0',
- update_by = 'sql-approver-dedup',
- update_time = NOW()
- WHERE id = v_src_id;
- END LOOP;
- CLOSE cur;
- -- 草稿只改开关,避免把未完成的表单/流程改动一起发布
- UPDATE oa_app_version
- SET advanced_settings_json = CAST(
- JSON_SET(
- CASE
- WHEN advanced_settings_json IS NULL
- OR advanced_settings_json = ''
- OR JSON_VALID(advanced_settings_json) = 0
- THEN CAST('{}' AS JSON)
- ELSE CAST(advanced_settings_json AS JSON)
- END,
- '$.approverDedup',
- CAST('true' AS JSON)
- ) AS CHAR
- ),
- update_by = 'sql-approver-dedup',
- update_time = NOW()
- WHERE del_flag = 0
- AND status = 'draft';
- -- 从未发布:提升当前最大版本号草稿
- UPDATE oa_app_version d
- INNER JOIN (
- SELECT app_id, tenant_no, MAX(version_no) AS version_no
- FROM oa_app_version
- WHERE del_flag = 0
- AND status = 'draft'
- GROUP BY app_id, tenant_no
- ) latest_draft
- ON latest_draft.app_id = d.app_id
- AND latest_draft.tenant_no = d.tenant_no
- AND latest_draft.version_no = d.version_no
- LEFT JOIN (
- SELECT app_id, tenant_no
- FROM oa_app_version
- WHERE del_flag = 0
- AND is_latest_published = '1'
- GROUP BY app_id, tenant_no
- ) published
- ON published.app_id = d.app_id
- AND published.tenant_no = d.tenant_no
- SET d.status = 'published',
- d.is_latest_published = '1',
- d.update_by = 'sql-approver-dedup',
- d.update_time = NOW()
- WHERE d.del_flag = 0
- AND d.status = 'draft'
- AND published.app_id IS NULL;
- END$$
- DELIMITER ;
- CALL sp_oa_enable_approver_dedup();
- DROP PROCEDURE IF EXISTS sp_oa_enable_approver_dedup;
- -- 核对:最新已发布应由本脚本生成,且开关为 true
- SELECT app_id,
- tenant_no,
- version_no,
- status,
- is_latest_published,
- update_by,
- JSON_UNQUOTE(JSON_EXTRACT(advanced_settings_json, '$.approverDedup')) AS approver_dedup
- FROM oa_app_version
- WHERE del_flag = 0
- AND is_latest_published = '1'
- ORDER BY tenant_no, app_id;
|