Files
koc-loop/mysql/0020_task_recovery_merge.sql

126 lines
6.0 KiB
MySQL
Raw Normal View History

-- 任务模型物理合并:回收成为分发任务的第二阶段(单任务双阶段)
-- 上线前请先备份生产库;本迁移有 DELETE,回滚需依赖备份
ALTER TABLE tasks ADD COLUMN recovery_enabled INTEGER NOT NULL DEFAULT 1 AFTER related_task_id;
-- statement-breakpoint
ALTER TABLE tasks ADD COLUMN recovery_due_at TEXT NOT NULL DEFAULT ('') AFTER recovery_enabled;
-- statement-breakpoint
ALTER TABLE tasks ADD COLUMN recovery_instructions TEXT NOT NULL DEFAULT ('') AFTER recovery_due_at;
-- statement-breakpoint
ALTER TABLE tasks ADD COLUMN recovery_example_images TEXT NOT NULL DEFAULT ('[]') AFTER recovery_instructions;
-- statement-breakpoint
-- 老分发任务默认关回收;下方为有伴生回收的父任务重新置 1
UPDATE tasks SET recovery_enabled = 0 WHERE task_type = 'content_publish';
-- statement-breakpoint
-- 配对回收:回收字段并入父任务(说明/示例图取回收任务首条内容,截止取回收任务截止)
UPDATE tasks parent
JOIN tasks child ON child.related_task_id = parent.id
JOIN (
SELECT task_id, body, image_assets
FROM contents
WHERE id IN (SELECT MIN(id) FROM contents GROUP BY task_id)
) first_content ON first_content.task_id = child.id
SET parent.recovery_due_at = child.due_at,
parent.recovery_instructions = first_content.body,
parent.recovery_example_images = first_content.image_assets,
parent.recovery_enabled = 1
WHERE child.task_type = 'screenshot_collect';
-- statement-breakpoint
-- 配对回收:父任务无内容兜底(回收任务没有 contents 行时仍开通回收)
UPDATE tasks parent
JOIN tasks child ON child.related_task_id = parent.id
SET parent.recovery_due_at = child.due_at,
parent.recovery_instructions = '请提交发布后的笔记截图',
parent.recovery_example_images = '[]',
parent.recovery_enabled = 1
WHERE child.task_type = 'screenshot_collect'
AND parent.recovery_enabled = 0;
-- statement-breakpoint
-- 配对回收:截图提交记录搬到父任务同 content+partner 的分发行(父行已有提交时保留父行)
UPDATE distributions target
JOIN contents legacy_content ON legacy_content.id = target.content_id
JOIN distributions legacy ON legacy.content_id = legacy_content.related_content_id
AND legacy.partner_id = target.partner_id
JOIN tasks legacy_task ON legacy_task.id = legacy.task_id
SET target.result_screenshot_key = legacy.result_screenshot_key,
target.result_submitted_at = legacy.result_submitted_at
WHERE legacy_task.task_type = 'screenshot_collect'
AND legacy_task.related_task_id = target.task_id
AND target.result_submitted_at IS NULL;
-- statement-breakpoint
-- 配对回收:父任务里没有对应分发行时,保留为一条只挂回收字段的分发记录
INSERT INTO distributions (id, task_id, content_id, partner_id, status, result_screenshot_key, result_submitted_at, claimed_at)
SELECT
CONCAT('dist-m', LEFT(REPLACE(UUID(), '-', ''), 20)),
legacy_task.related_task_id,
legacy_content.related_content_id,
legacy.partner_id,
'claimed',
legacy.result_screenshot_key,
legacy.result_submitted_at,
legacy.claimed_at
FROM distributions legacy
JOIN contents legacy_content ON legacy_content.id = legacy.content_id
JOIN tasks legacy_task ON legacy_task.id = legacy.task_id
WHERE legacy_task.task_type = 'screenshot_collect'
AND legacy_task.related_task_id != ''
AND legacy_content.related_content_id != ''
AND NOT EXISTS (
SELECT 1 FROM distributions parent_dist
WHERE parent_dist.task_id = legacy_task.related_task_id
AND parent_dist.content_id = legacy_content.related_content_id
AND parent_dist.partner_id = legacy.partner_id
);
-- statement-breakpoint
-- 配对回收:清理伴生回收任务的分发/领取/内容/任务行
DELETE FROM distributions
WHERE task_id IN (SELECT id FROM (SELECT id FROM tasks WHERE task_type = 'screenshot_collect' AND related_task_id != '') AS doomed);
-- statement-breakpoint
DELETE FROM claims
WHERE task_id IN (SELECT id FROM (SELECT id FROM tasks WHERE task_type = 'screenshot_collect' AND related_task_id != '') AS doomed);
-- statement-breakpoint
DELETE FROM contents
WHERE task_id IN (SELECT id FROM (SELECT id FROM tasks WHERE task_type = 'screenshot_collect' AND related_task_id != '') AS doomed);
-- statement-breakpoint
DELETE FROM tasks WHERE task_type = 'screenshot_collect' AND related_task_id != '';
-- statement-breakpoint
-- 独立回收(无关联分发):无领取记录的直接删除
DELETE FROM contents
WHERE task_id IN (
SELECT id FROM (
SELECT t.id FROM tasks t
WHERE t.task_type = 'screenshot_collect'
AND (t.related_task_id IS NULL OR t.related_task_id = '')
AND NOT EXISTS (SELECT 1 FROM distributions d WHERE d.task_id = t.id)
) AS doomed
);
-- statement-breakpoint
DELETE FROM tasks
WHERE task_type = 'screenshot_collect'
AND (related_task_id IS NULL OR related_task_id = '')
AND id NOT IN (SELECT DISTINCT task_id FROM distributions);
-- statement-breakpoint
-- 独立回收(有领取记录):原地转正为单模型任务(发布阶段字段留空,仅存历史数据)
UPDATE tasks standalone
JOIN (
SELECT task_id, body, image_assets
FROM contents
WHERE id IN (SELECT MIN(id) FROM contents GROUP BY task_id)
) first_content ON first_content.task_id = standalone.id
SET standalone.task_type = 'content_publish',
standalone.recovery_due_at = standalone.due_at,
standalone.recovery_instructions = first_content.body,
standalone.recovery_example_images = first_content.image_assets,
standalone.recovery_enabled = 1
WHERE standalone.task_type = 'screenshot_collect';
-- statement-breakpoint
UPDATE tasks standalone
SET standalone.task_type = 'content_publish',
standalone.recovery_due_at = standalone.due_at,
standalone.recovery_instructions = '请提交发布后的笔记截图',
standalone.recovery_example_images = '[]',
standalone.recovery_enabled = 1
WHERE standalone.task_type = 'screenshot_collect';
-- statement-breakpoint
UPDATE contents SET related_content_id = '' WHERE related_content_id IS NOT NULL AND related_content_id != '';