qiangdanxitong/database/V15__task_unlock_queue.sql
Your Name 7bb3c953ef feat: 实现任务排队解锁机制
- 新增任务排队解锁功能,确保先发布的任务优先被处理
- 添加系统设置中的任务排队配置(启用开关、每日解锁数、补充解锁数)
- 新增 TaskUnlockStatus 实体和 Mapper
- 新增 TaskUnlockService 处理排队解锁逻辑
- 新增 TaskStatusNotificationService 发送钉钉通知
- 更新 TaskItemService 和 TaskItemController 支持排队状态
- 前端新增 TaskStatusBadge 组件显示排队/抢单状态
- 更新 TaskCard 和 TaskHall 支持排队状态展示
- 添加数据库迁移脚本 V15
2026-01-29 10:36:38 +08:00

65 lines
3.3 KiB
SQL
Raw Permalink 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.

-- =====================================================
-- 任务排队解锁机制 - 数据库迁移脚本
-- 版本: 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;