migration-multi-schedule-rules.sql 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. -- ============================================================
  2. -- 智能轮灌系统V2 - 多定时规则支持
  3. -- 数据库迁移脚本
  4. -- 版本:1.0
  5. -- 日期:2026-03-02
  6. -- 说明:支持一个任务配置多个定时规则(模式A和模式B可共存)
  7. -- ============================================================
  8. -- ============================================================
  9. -- 1. 创建任务定时规则表
  10. -- ============================================================
  11. CREATE TABLE IF NOT EXISTS `wfauto_v2_task_schedule_rule` (
  12. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '规则ID',
  13. `task_id` BIGINT NOT NULL COMMENT '关联的任务ID',
  14. `rule_name` VARCHAR(100) COMMENT '规则名称(用于标识和管理)',
  15. `schedule_type` VARCHAR(20) NOT NULL COMMENT '定时类型:CRON / SIMPLE',
  16. -- CRON 模式字段
  17. `cron_expression` VARCHAR(100) COMMENT 'Cron表达式(schedule_type=CRON时必填)',
  18. -- SIMPLE 模式字段
  19. `start_time` DATETIME COMMENT '起始时间(schedule_type=SIMPLE时必填)',
  20. `interval_days` INT COMMENT '执行间隔天数(schedule_type=SIMPLE时必填)',
  21. `total_times` INT COMMENT '执行总次数(schedule_type=SIMPLE时必填)',
  22. `executed_count` INT DEFAULT 0 COMMENT '已执行次数',
  23. -- 状态控制
  24. `enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用:1启用 0禁用',
  25. `status` VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '规则状态:ACTIVE活跃 / COMPLETED已完成 / DISABLED已禁用',
  26. -- Quartz 调度关联
  27. `quartz_job_name` VARCHAR(100) COMMENT 'Quartz Job名称(自动生成)',
  28. `quartz_trigger_name` VARCHAR(100) COMMENT 'Quartz Trigger名称(自动生成)',
  29. -- 审计字段
  30. `tenant_id` BIGINT COMMENT '租户ID',
  31. `created_by` BIGINT COMMENT '创建人ID',
  32. `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  33. `updated_by` BIGINT COMMENT '更新人ID',
  34. `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  35. `deleted` TINYINT(1) DEFAULT 0 COMMENT '逻辑删除:0未删除 1已删除',
  36. PRIMARY KEY (`id`),
  37. KEY `idx_task_id` (`task_id`),
  38. KEY `idx_enabled_status` (`enabled`, `status`),
  39. KEY `idx_quartz_job` (`quartz_job_name`),
  40. KEY `idx_deleted` (`deleted`)
  41. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务定时规则表';
  42. -- ============================================================
  43. -- 2. 调整 irrigation_task 表(删除定时相关字段)
  44. -- ============================================================
  45. -- 注意:以下操作会删除旧的定时配置字段
  46. -- 建议先备份数据,或使用下面的数据迁移脚本
  47. ALTER TABLE `wfauto_v2_irrigation_task`
  48. DROP COLUMN IF EXISTS `schedule_type`,
  49. DROP COLUMN IF EXISTS `cron_expression`,
  50. DROP COLUMN IF EXISTS `start_time`,
  51. DROP COLUMN IF EXISTS `interval_days`,
  52. DROP COLUMN IF EXISTS `total_times`,
  53. DROP COLUMN IF EXISTS `executed_count`;
  54. -- ============================================================
  55. -- 3. 数据迁移(将旧的定时配置迁移到新表)
  56. -- ============================================================
  57. -- 为每个已有定时配置的任务创建对应的定时规则
  58. INSERT INTO `wfauto_v2_task_schedule_rule` (
  59. `task_id`,
  60. `rule_name`,
  61. `schedule_type`,
  62. `cron_expression`,
  63. `start_time`,
  64. `interval_days`,
  65. `total_times`,
  66. `executed_count`,
  67. `enabled`,
  68. `status`,
  69. `quartz_job_name`,
  70. `quartz_trigger_name`,
  71. `tenant_id`,
  72. `created_at`,
  73. `deleted`
  74. )
  75. SELECT
  76. t.`id` AS task_id,
  77. CONCAT('迁移规则-', t.`task_name`) AS rule_name,
  78. t.`schedule_type`,
  79. t.`cron_expression`,
  80. t.`start_time`,
  81. t.`interval_days`,
  82. t.`total_times`,
  83. IFNULL(t.`executed_count`, 0) AS executed_count,
  84. t.`enabled`,
  85. CASE
  86. WHEN t.`schedule_type` = 'SIMPLE' AND IFNULL(t.`executed_count`, 0) >= IFNULL(t.`total_times`, 0) AND t.`total_times` > 0
  87. THEN 'COMPLETED'
  88. ELSE 'ACTIVE'
  89. END AS status,
  90. NULL AS quartz_job_name, -- 将在应用启动时自动填充
  91. NULL AS quartz_trigger_name, -- 将在应用启动时自动填充
  92. t.`tenant_id`,
  93. NOW() AS created_at,
  94. 0 AS deleted
  95. FROM `wfauto_v2_irrigation_task` t
  96. WHERE t.`schedule_type` IS NOT NULL
  97. AND t.`deleted` = 0;
  98. -- 更新迁移后的规则,填充 Quartz 相关字段
  99. UPDATE `wfauto_v2_task_schedule_rule` r
  100. SET
  101. r.`quartz_job_name` = CONCAT('TASK_', r.`task_id`, '_RULE_', r.`id`),
  102. r.`quartz_trigger_name` = CONCAT('TRIGGER_', r.`task_id`, '_RULE_', r.`id`)
  103. WHERE r.`quartz_job_name` IS NULL;
  104. -- ============================================================
  105. -- 4. 验证迁移结果
  106. -- ============================================================
  107. -- 检查迁移的规则数量
  108. SELECT
  109. COUNT(*) AS total_rules,
  110. SUM(CASE WHEN schedule_type = 'CRON' THEN 1 ELSE 0 END) AS cron_rules,
  111. SUM(CASE WHEN schedule_type = 'SIMPLE' THEN 1 ELSE 0 END) AS simple_rules,
  112. SUM(CASE WHEN enabled = 1 THEN 1 ELSE 0 END) AS enabled_rules,
  113. SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) AS active_rules,
  114. SUM(CASE WHEN status = 'COMPLETED' THEN 1 ELSE 0 END) AS completed_rules
  115. FROM `wfauto_v2_task_schedule_rule`
  116. WHERE deleted = 0;
  117. -- 检查每个任务的规则数量
  118. SELECT
  119. t.id AS task_id,
  120. t.task_name,
  121. COUNT(r.id) AS rule_count
  122. FROM `wfauto_v2_irrigation_task` t
  123. LEFT JOIN `wfauto_v2_task_schedule_rule` r ON r.task_id = t.id AND r.deleted = 0
  124. WHERE t.deleted = 0
  125. GROUP BY t.id, t.task_name
  126. ORDER BY rule_count DESC;
  127. -- ============================================================
  128. -- 5. 回滚脚本(如果迁移失败需要回滚)
  129. -- ============================================================
  130. /*
  131. -- 删除定时规则表
  132. DROP TABLE IF EXISTS `wfauto_v2_task_schedule_rule`;
  133. -- 恢复 irrigation_task 表的定时字段
  134. ALTER TABLE `wfauto_v2_irrigation_task`
  135. ADD COLUMN `schedule_type` VARCHAR(20) COMMENT '定时类型:CRON / SIMPLE',
  136. ADD COLUMN `cron_expression` VARCHAR(100) COMMENT 'Cron表达式',
  137. ADD COLUMN `start_time` DATETIME COMMENT '起始时间',
  138. ADD COLUMN `interval_days` INT COMMENT '执行间隔天数',
  139. ADD COLUMN `total_times` INT COMMENT '执行总次数',
  140. ADD COLUMN `executed_count` INT DEFAULT 0 COMMENT '已执行次数';
  141. */
  142. -- ============================================================
  143. -- 6. 使用示例
  144. -- ============================================================
  145. /*
  146. -- 示例1:查询任务的所有定时规则
  147. SELECT * FROM `wfauto_v2_task_schedule_rule`
  148. WHERE task_id = 1 AND deleted = 0;
  149. -- 示例2:为任务添加新的定时规则
  150. INSERT INTO `wfauto_v2_task_schedule_rule` (
  151. task_id, rule_name, schedule_type, cron_expression,
  152. enabled, status, tenant_id, created_at
  153. ) VALUES (
  154. 1, '每周一三五凌晨2点', 'CRON', '0 0 2 ? * MON,WED,FRI',
  155. 1, 'ACTIVE', 1, NOW()
  156. );
  157. -- 示例3:禁用某个规则
  158. UPDATE `wfauto_v2_task_schedule_rule`
  159. SET enabled = 0, status = 'DISABLED', updated_at = NOW()
  160. WHERE id = 1;
  161. -- 示例4:标记SIMPLE规则为已完成
  162. UPDATE `wfauto_v2_task_schedule_rule`
  163. SET status = 'COMPLETED', enabled = 0, updated_at = NOW()
  164. WHERE id = 2 AND schedule_type = 'SIMPLE' AND executed_count >= total_times;
  165. */