- 新增任务排队解锁功能,确保先发布的任务优先被处理 - 添加系统设置中的任务排队配置(启用开关、每日解锁数、补充解锁数) - 新增 TaskUnlockStatus 实体和 Mapper - 新增 TaskUnlockService 处理排队解锁逻辑 - 新增 TaskStatusNotificationService 发送钉钉通知 - 更新 TaskItemService 和 TaskItemController 支持排队状态 - 前端新增 TaskStatusBadge 组件显示排队/抢单状态 - 更新 TaskCard 和 TaskHall 支持排队状态展示 - 添加数据库迁移脚本 V15
65 lines
3.3 KiB
SQL
65 lines
3.3 KiB
SQL
-- =====================================================
|
||
-- 任务排队解锁机制 - 数据库迁移脚本
|
||
-- 版本: 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;
|