2026-10-16-oa-approver-dedup-publish.sql 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. -- =============================================================================
  2. -- 打开全部 OA 审批应用的「审批人去重」,并强制重新发布(2026-10-16)
  3. -- MySQL 5.7
  4. --
  5. -- 行为:
  6. -- 1. 每个已有「最新已发布」版本的应用:无论 approverDedup 当前是否已为 true,
  7. -- 一律复制为新的 published 行(表单、流程不变,开关强制 true),
  8. -- 旧的 is_latest_published 改为 0。
  9. -- 已在途实例仍指向旧 version id;新发起走新版本。
  10. -- 2. 全部未删除草稿:就地把 approverDedup 设为 true(不把草稿未完成改动一并发布)。
  11. -- 3. 从未发布过的应用:把版本号最大的那条草稿标为已发布,并打开开关。
  12. --
  13. -- 注意:本脚本会为每个已发布应用再升一版;短时间内重复执行会连续升版。
  14. -- =============================================================================
  15. DROP PROCEDURE IF EXISTS sp_oa_enable_approver_dedup;
  16. DELIMITER $$
  17. CREATE PROCEDURE sp_oa_enable_approver_dedup()
  18. BEGIN
  19. DECLARE v_done INT DEFAULT 0;
  20. DECLARE v_src_id VARCHAR(64);
  21. DECLARE v_app_id VARCHAR(64);
  22. DECLARE v_tenant VARCHAR(64);
  23. DECLARE v_next_no INT;
  24. DECLARE v_new_id VARCHAR(64);
  25. DECLARE v_advanced TEXT;
  26. -- 强制:所有当前最新已发布版本都重新发布一版
  27. DECLARE cur CURSOR FOR
  28. SELECT id, app_id, tenant_no
  29. FROM oa_app_version
  30. WHERE del_flag = 0
  31. AND is_latest_published = '1';
  32. DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
  33. OPEN cur;
  34. read_loop: LOOP
  35. FETCH cur INTO v_src_id, v_app_id, v_tenant;
  36. IF v_done = 1 THEN
  37. LEAVE read_loop;
  38. END IF;
  39. SELECT IFNULL(MAX(version_no), 0) + 1
  40. INTO v_next_no
  41. FROM oa_app_version
  42. WHERE app_id = v_app_id
  43. AND tenant_no = v_tenant;
  44. SET v_new_id = UPPER(REPLACE(UUID(), '-', ''));
  45. SELECT CAST(
  46. JSON_SET(
  47. CASE
  48. WHEN advanced_settings_json IS NULL
  49. OR advanced_settings_json = ''
  50. OR JSON_VALID(advanced_settings_json) = 0
  51. THEN CAST('{}' AS JSON)
  52. ELSE CAST(advanced_settings_json AS JSON)
  53. END,
  54. '$.approverDedup',
  55. CAST('true' AS JSON)
  56. ) AS CHAR
  57. )
  58. INTO v_advanced
  59. FROM oa_app_version
  60. WHERE id = v_src_id;
  61. INSERT INTO oa_app_version (
  62. id, app_id, version_no, status, is_latest_published,
  63. form_schema_json, flow_tree_json, advanced_settings_json,
  64. tenant_no, order_num, remark,
  65. create_by, create_dept_id, create_time,
  66. update_by, update_time, del_flag
  67. )
  68. SELECT
  69. v_new_id, app_id, v_next_no, 'published', '1',
  70. form_schema_json, flow_tree_json, v_advanced,
  71. tenant_no, order_num, remark,
  72. create_by, create_dept_id, NOW(),
  73. 'sql-approver-dedup', NOW(), 0
  74. FROM oa_app_version
  75. WHERE id = v_src_id;
  76. UPDATE oa_app_version
  77. SET is_latest_published = '0',
  78. update_by = 'sql-approver-dedup',
  79. update_time = NOW()
  80. WHERE id = v_src_id;
  81. END LOOP;
  82. CLOSE cur;
  83. -- 草稿只改开关,避免把未完成的表单/流程改动一起发布
  84. UPDATE oa_app_version
  85. SET advanced_settings_json = CAST(
  86. JSON_SET(
  87. CASE
  88. WHEN advanced_settings_json IS NULL
  89. OR advanced_settings_json = ''
  90. OR JSON_VALID(advanced_settings_json) = 0
  91. THEN CAST('{}' AS JSON)
  92. ELSE CAST(advanced_settings_json AS JSON)
  93. END,
  94. '$.approverDedup',
  95. CAST('true' AS JSON)
  96. ) AS CHAR
  97. ),
  98. update_by = 'sql-approver-dedup',
  99. update_time = NOW()
  100. WHERE del_flag = 0
  101. AND status = 'draft';
  102. -- 从未发布:提升当前最大版本号草稿
  103. UPDATE oa_app_version d
  104. INNER JOIN (
  105. SELECT app_id, tenant_no, MAX(version_no) AS version_no
  106. FROM oa_app_version
  107. WHERE del_flag = 0
  108. AND status = 'draft'
  109. GROUP BY app_id, tenant_no
  110. ) latest_draft
  111. ON latest_draft.app_id = d.app_id
  112. AND latest_draft.tenant_no = d.tenant_no
  113. AND latest_draft.version_no = d.version_no
  114. LEFT JOIN (
  115. SELECT app_id, tenant_no
  116. FROM oa_app_version
  117. WHERE del_flag = 0
  118. AND is_latest_published = '1'
  119. GROUP BY app_id, tenant_no
  120. ) published
  121. ON published.app_id = d.app_id
  122. AND published.tenant_no = d.tenant_no
  123. SET d.status = 'published',
  124. d.is_latest_published = '1',
  125. d.update_by = 'sql-approver-dedup',
  126. d.update_time = NOW()
  127. WHERE d.del_flag = 0
  128. AND d.status = 'draft'
  129. AND published.app_id IS NULL;
  130. END$$
  131. DELIMITER ;
  132. CALL sp_oa_enable_approver_dedup();
  133. DROP PROCEDURE IF EXISTS sp_oa_enable_approver_dedup;
  134. -- 核对:最新已发布应由本脚本生成,且开关为 true
  135. SELECT app_id,
  136. tenant_no,
  137. version_no,
  138. status,
  139. is_latest_published,
  140. update_by,
  141. JSON_UNQUOTE(JSON_EXTRACT(advanced_settings_json, '$.approverDedup')) AS approver_dedup
  142. FROM oa_app_version
  143. WHERE del_flag = 0
  144. AND is_latest_published = '1'
  145. ORDER BY tenant_no, app_id;