Files
tuanwei-java/sql/20261102_add_declare_uniqueness.sql
T
weicw 0e4986330a feat(declare): 同一申报项目进行中只允许一条申报
- 新增 DeclareGuardService:按已通过/未处理驳回/待审核数判重,申报项目行加锁防连点
- 9 张申报表补 declare_id / declare_status / declare_remark,提交时写入并随审核结果回写
- 新增撤回、作废(强制放行)接口;挑战杯团队成员按手机号判重
- 申报项目支持配置允许重复提交与最多同时条数
- 迁移脚本 sql/20261102_add_declare_uniqueness.sql(含存量回填与重复清单)
2026-11-02 19:28:56 +08:00

118 lines
8.4 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.
-- 同一申报项目「进行中」只允许一条申报(见 docs/adr/0005-declare-uniqueness.md)
-- 1) 申报项目上配置是否允许重复提交、最多同时几条
ALTER TABLE gxmu_declare
ADD COLUMN allow_repeat TINYINT NOT NULL DEFAULT 0 COMMENT '是否允许重复提交 0否 1是',
ADD COLUMN max_pending INT NOT NULL DEFAULT 1 COMMENT '最多同时进行中的申报条数';
-- 2) 9 张申报表补充申报项目归属与状态
-- declare_status: 0草稿 1待审核 2通过 3驳回 4作废
ALTER TABLE gxmu_sjqn ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_sjtbzbsj ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_wshqtw ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_wshqtzb ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_yxgqtdgb ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_yxgqty ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_tzbcy_form ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_qmgc_form ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_wxxzx_project ADD COLUMN declare_id INT NULL, ADD COLUMN declare_status TINYINT NOT NULL DEFAULT 1, ADD COLUMN declare_remark VARCHAR(500) NULL;
ALTER TABLE gxmu_sjqn ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_sjtbzbsj ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_wshqtw ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_wshqtzb ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_yxgqtdgb ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_yxgqty ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_tzbcy_form ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_qmgc_form ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
ALTER TABLE gxmu_wxxzx_project ADD KEY idx_declare_user_status (declare_id, user_id, declare_status);
-- 3) 存量回填 declare_id:只在「模块 + 年度」能唯一对应到一条申报项目时回填,其余留空
-- (留空的记录不参与判重,另见 docs/adr/0005-declare-uniqueness.md 的存量处置)
UPDATE gxmu_sjqn t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_sjqn' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_sjtbzbsj t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_sjtbzbsj' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_wshqtw t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_wshqtw' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_wshqtzb t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_wshqtzb' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_yxgqtdgb t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_yxgqtdgb' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_yxgqty t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_yxgqty' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_tzbcy_form t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_tzbcy_form' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_qmgc_form t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_qmgc_form' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
UPDATE gxmu_wxxzx_project t JOIN (
SELECT module, year, MIN(id) AS id FROM gxmu_declare WHERE deleted = 0 GROUP BY module, year HAVING COUNT(*) = 1
) d ON d.module = 'gxmu_wxxzx_project' AND d.year = t.year
SET t.declare_id = d.id WHERE t.declare_id IS NULL;
-- 4) 存量回填 declare_status:按最新一条审核节点推断(0待审核 1通过 2不通过 -> 1待审核 2通过 3驳回)
UPDATE gxmu_sjqn t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_sjqn' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_sjtbzbsj t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_sjtbzbsj' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_wshqtw t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_wshqtw' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_wshqtzb t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_wshqtzb' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_yxgqtdgb t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_yxgqtdgb' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_yxgqty t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_yxgqty' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_tzbcy_form t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_tzbcy_form' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_qmgc_form t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_qmgc_form' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
UPDATE gxmu_wxxzx_project t JOIN (
SELECT pk, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY id DESC), ',', 1) AS latest
FROM gxmu_review_list WHERE module = 'gxmu_wxxzx_project' AND deleted = 0 GROUP BY pk
) r ON r.pk = t.id
SET t.declare_status = CASE WHEN r.latest = '2' THEN 3 WHEN r.latest = '1' THEN 2 ELSE 1 END;
-- 5) 存量重复清单(人工清理用,不自动处理)
-- SELECT 'gxmu_tzbcy_form' AS module, declare_id, user_id, COUNT(*) AS cnt
-- FROM gxmu_tzbcy_form WHERE declare_status = 1 AND deleted = 0 GROUP BY declare_id, user_id HAVING cnt > 1;