0e4986330a
- 新增 DeclareGuardService:按已通过/未处理驳回/待审核数判重,申报项目行加锁防连点 - 9 张申报表补 declare_id / declare_status / declare_remark,提交时写入并随审核结果回写 - 新增撤回、作废(强制放行)接口;挑战杯团队成员按手机号判重 - 申报项目支持配置允许重复提交与最多同时条数 - 迁移脚本 sql/20261102_add_declare_uniqueness.sql(含存量回填与重复清单)
118 lines
8.4 KiB
SQL
118 lines
8.4 KiB
SQL
-- 同一申报项目「进行中」只允许一条申报(见 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;
|