Files
AIGC/demo/docs/task_status_cascade_trigger.sql
AIGC Developer 3c37006ebd feat: 添加任务状态级联触发器,优化支付和做同款功能
主要更新:
- 添加 MySQL 触发器实现 task_status 表到其他表的状态级联
- 移除控制器中的多表状态检查代码
- 完善做同款功能,支持参数传递
- 支付宝 USD 转 CNY 汇率转换
- 修复状态枚举映射问题

注意: 触发器仅在 task_status 更新时触发,部分代码仍直接更新业务表
2025-12-08 13:54:02 +08:00

109 lines
4.4 KiB
SQL
Raw 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.

-- ============================================
-- 任务状态级联更新触发器
--
-- 功能:当 task_status 表状态更新时,自动同步到:
-- - task_queue
-- - user_works
-- - text_to_video_tasks
-- - image_to_video_tasks
-- - storyboard_video_tasks
--
-- 执行方式:在 MySQL 客户端中执行此脚本
-- ============================================
-- 选择数据库
USE aigc_platform;
-- 先删除已存在的触发器
DROP TRIGGER IF EXISTS trg_task_status_update;
-- 修改分隔符
DELIMITER //
-- 创建触发器
-- 状态枚举说明:
-- task_status/task_queue: PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED, TIMEOUT
-- user_works: PROCESSING, COMPLETED, FAILED, DELETED (缺少 PENDING, CANCELLED, TIMEOUT)
-- 业务表: PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED (缺少 TIMEOUT)
--
-- 注意:分镜图(_image后缀)在task_status表中没有独立记录无需处理
CREATE TRIGGER trg_task_status_update
AFTER UPDATE ON task_status
FOR EACH ROW
BEGIN
IF NEW.status <> OLD.status THEN
-- 1. 更新 task_queue 表(状态枚举一致,直接同步)
UPDATE task_queue
SET status = NEW.status,
updated_at = NOW(),
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN NEW.error_message ELSE error_message END
WHERE task_id = NEW.task_id;
-- 2. 更新 user_works 表(需要状态映射)
-- PENDING -> PROCESSING, CANCELLED/TIMEOUT -> FAILED
UPDATE user_works
SET status = CASE
WHEN NEW.status IN ('PENDING', 'PROCESSING') THEN 'PROCESSING'
WHEN NEW.status = 'COMPLETED' THEN 'COMPLETED'
WHEN NEW.status IN ('FAILED', 'CANCELLED', 'TIMEOUT') THEN 'FAILED'
ELSE status
END,
updated_at = NOW(),
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
-- 3. 更新业务任务表TIMEOUT 映射为 FAILED
-- 文生视频 (txt2vid_*)
IF NEW.task_id LIKE 'txt2vid_%' THEN
UPDATE text_to_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
-- 图生视频 (img2vid_*)
IF NEW.task_id LIKE 'img2vid_%' THEN
UPDATE image_to_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
-- 分镜视频 (storyboard_*)
IF NEW.task_id LIKE 'storyboard_%' THEN
UPDATE storyboard_video_tasks
SET status = CASE WHEN NEW.status = 'TIMEOUT' THEN 'FAILED' ELSE NEW.status END,
updated_at = NOW(),
error_message = CASE WHEN NEW.status IN ('FAILED', 'TIMEOUT') THEN COALESCE(NEW.error_message, '任务超时') ELSE error_message END,
result_url = CASE WHEN NEW.status = 'COMPLETED' AND NEW.result_url IS NOT NULL THEN NEW.result_url ELSE result_url END
WHERE task_id = NEW.task_id;
END IF;
END IF;
END//
-- 恢复分隔符
DELIMITER ;
-- 验证触发器已创建
SHOW TRIGGERS LIKE 'task_status';
-- ============================================
-- 使用说明:
--
-- 1. 连接到 MySQL 数据库
-- 2. 选择对应的数据库: USE your_database_name;
-- 3. 执行此脚本
--
-- 注意事项:
-- - 触发器会在 task_status 表的 status 字段更新时自动执行
-- - 确保所有表都有 task_id 字段作为关联键
-- - 状态值使用字符串存储(如 'COMPLETED', 'FAILED' 等)
-- ============================================