-- ===================================================== -- 任务排队解锁机制 - 数据库迁移脚本 -- 版本: V15 -- 日期: 2026-01-26 -- 说明: 实现任务排队解锁功能,确保先发布的任务优先被处理 -- ===================================================== -- 1. 创建任务解锁状态表 CREATE TABLE IF NOT EXISTS `task_unlock_status` ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', `task_item_id` BIGINT NOT NULL COMMENT '子任务ID', `dept_id` BIGINT NOT NULL COMMENT '接单部门ID', `publish_date` DATE NOT NULL COMMENT '任务发布日期(用于排队)', `is_unlocked` TINYINT(1) DEFAULT 0 COMMENT '是否已解锁: 0-未解锁(排队中), 1-已解锁(可抢单)', `unlock_time` DATETIME NULL COMMENT '解锁时间', `queue_position` INT DEFAULT 0 COMMENT '排队位置(动态计算,缓存用)', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_task_dept` (`task_item_id`, `dept_id`), INDEX `idx_dept_unlock` (`dept_id`, `is_unlocked`, `publish_date`), INDEX `idx_publish_date` (`publish_date`, `is_unlocked`), INDEX `idx_task_item` (`task_item_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务排队解锁状态表'; -- 2. 添加系统配置项(默认关闭,灰度测试后开启) INSERT INTO sys_config (config_key, config_value, config_group, config_name, description, value_type, built_in, sort_order) VALUES ('task_unlock_enabled', 'false', 'task', '任务排队解锁开关', '是否启用任务排队解锁机制,启用后新任务需排队等待解锁', 'boolean', 1, 100), ('task_unlock_daily_min', '5', 'task', '每日最少解锁数', '每个部门每天最少解锁的任务数量', 'number', 1, 101), ('task_unlock_batch_size', '5', 'task', '解锁批次大小', '每次补充解锁的任务数量', 'number', 1, 102) ON DUPLICATE KEY UPDATE config_value = VALUES(config_value), description = VALUES(description); -- 3. 初始化现有可接任务为已解锁状态(确保上线不影响现有业务) -- 注意:只处理招募类任务(release_type != 'assigned'),指定任务不进入排队池 INSERT IGNORE INTO task_unlock_status (task_item_id, dept_id, publish_date, is_unlocked, unlock_time, create_time) SELECT ti.id AS task_item_id, COALESCE( ti.receiver_dept_id, (SELECT CAST(SUBSTRING_INDEX(dt.allowed_dept_ids, ',', 1) AS UNSIGNED) FROM demand_type dt WHERE dt.id = t.demand_type_id LIMIT 1), t.publisher_dept_id ) AS dept_id, DATE(ti.create_time) AS publish_date, 1 AS is_unlocked, -- 已解锁 NOW() AS unlock_time, NOW() AS create_time FROM task_item ti INNER JOIN task t ON ti.task_id = t.id WHERE ti.status = 'pending' AND ti.is_locked = 0 AND t.deleted = 0 AND t.approval_status = 'approved' AND (t.release_type IS NULL OR t.release_type != 'assigned'); -- 排除指定任务 -- 4. 输出初始化结果 SELECT '初始化完成' AS status, COUNT(*) AS initialized_count, SUM(CASE WHEN is_unlocked = 1 THEN 1 ELSE 0 END) AS unlocked_count FROM task_unlock_status;