Files
zkxw/docs/sql/migrations/2026-10-16-oa-approver-dedup-publish.sql
T
2026-10-17 11:46:53 +08:00

162 lines
4.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- 打开全部 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;