停止V4入站双写旧任务

This commit is contained in:
andy
2026-07-20 17:18:28 +07:00
parent d45ff5b4ed
commit 626e87abdb
16 changed files with 438 additions and 69 deletions

View File

@@ -0,0 +1,177 @@
# 开发 / 测试环境 V4 旧任务数据清理说明
## 1. 使用边界
本说明只适用于开发 / 测试环境,用于 M002 V4 主线停止双写旧 `workflow_reservation_task` 后,清理历史 smoke、fixture 或调试过程中遗留的旧任务数据。
项目当前决策:
- V4 后新业务主线只写 V4 模型:`workflow_reservation_v4_order_task``workflow_reservation_v4_task_card``workflow_reservation_v4_source_notification`
- 开发阶段不维护 V2/V3 旧任务兼容,测试数据可重建。
- 本清理策略不代表生产迁移方案;生产数据迁移必须在上线前单独设计、评审和演练。
## 2. 不清理的数据
以下数据不要通过本脚本清理:
- `platform_source_message_inbox`
- `workflow_reservation_v4_order_task`
- `workflow_reservation_v4_task_card`
- `workflow_reservation_v4_source_notification`
- `workflow_reservation_catalog_account`
- `workflow_reservation_catalog_code`
- 用户、角色、权限、菜单和酒店配置表
- `platform_superagent_dispatch_run`
- SourceMessage 原始链路和 SuperAgent dispatch 运行记录
## 3. 清理范围
清理目标为旧任务主模型和直接依赖旧 task 的开发测试数据:
- `workflow_reservation_opera_operation_attempt`
- `workflow_reservation_opera_operation`
- `workflow_reservation_audit_log``task_id` 指向旧任务的审计行
- `workflow_reservation_invoice_generation.task_id` 指向旧任务时置空,不删除生成记录
- `workflow_reservation_task_card`
- `workflow_reservation_task`
- `workflow_reservation_order.created_from_task_id` 指向旧任务时置空,不删除订单
`workflow_reservation_invoice_generation` 可能带可选 `task_id`。第一版只解除旧 task 引用,不默认删除催款单生成记录;如某次测试明确需要删除旧任务关联的催款单记录,应另行确认后按测试数据范围处理。
## 4. 执行前检查
先确认当前环境是开发或测试环境,并备份数据库或保留可重建脚本。
```sql
SELECT COUNT(*) AS legacy_task_count
FROM workflow_reservation_task;
SELECT hotel_id, task_status, COUNT(*) AS task_count
FROM workflow_reservation_task
GROUP BY hotel_id, task_status
ORDER BY hotel_id, task_status;
```
如只清理单酒店测试数据,先设置酒店 ID
```sql
SET @hotel_id = 'HOTEL-TEST';
```
## 5. 清理 SQL
```sql
START TRANSACTION;
CREATE TEMPORARY TABLE tmp_dev_legacy_reservation_task_ids (
id BIGINT PRIMARY KEY
);
INSERT INTO tmp_dev_legacy_reservation_task_ids (id)
SELECT id
FROM workflow_reservation_task
WHERE hotel_id = @hotel_id;
DELETE attempt
FROM workflow_reservation_opera_operation_attempt attempt
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = attempt.task_id
WHERE attempt.hotel_id = @hotel_id;
DELETE operation_row
FROM workflow_reservation_opera_operation operation_row
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = operation_row.task_id
WHERE operation_row.hotel_id = @hotel_id;
DELETE audit_row
FROM workflow_reservation_audit_log audit_row
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = audit_row.task_id
WHERE audit_row.hotel_id = @hotel_id;
UPDATE workflow_reservation_invoice_generation invoice_row
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = invoice_row.task_id
SET invoice_row.task_id = NULL,
invoice_row.updated_at = UTC_TIMESTAMP(6)
WHERE invoice_row.hotel_id = @hotel_id;
DELETE card
FROM workflow_reservation_task_card card
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = card.task_id
WHERE card.hotel_id = @hotel_id;
UPDATE workflow_reservation_order order_row
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = order_row.created_from_task_id
SET order_row.created_from_task_id = NULL,
order_row.updated_at = UTC_TIMESTAMP(6)
WHERE order_row.hotel_id = @hotel_id;
DELETE task
FROM workflow_reservation_task task
JOIN tmp_dev_legacy_reservation_task_ids legacy_task
ON legacy_task.id = task.id
WHERE task.hotel_id = @hotel_id;
DROP TEMPORARY TABLE tmp_dev_legacy_reservation_task_ids;
COMMIT;
```
如果确认要清理所有开发 / 测试酒店的旧任务,可去掉上述 SQL 中所有 `hotel_id = @hotel_id` 条件。不要在生产环境执行这种全量清理。
## 6. 执行后验证
单酒店清理时使用以下验证 SQL
```sql
SELECT COUNT(*) AS legacy_task_count
FROM workflow_reservation_task
WHERE hotel_id = @hotel_id;
SELECT COUNT(*) AS legacy_task_card_count
FROM workflow_reservation_task_card
WHERE hotel_id = @hotel_id;
SELECT COUNT(*) AS legacy_opera_operation_count
FROM workflow_reservation_opera_operation
WHERE hotel_id = @hotel_id;
SELECT COUNT(*) AS legacy_opera_attempt_count
FROM workflow_reservation_opera_operation_attempt
WHERE hotel_id = @hotel_id;
SELECT COUNT(*) AS legacy_invoice_task_link_count
FROM workflow_reservation_invoice_generation
WHERE hotel_id = @hotel_id
AND task_id IS NOT NULL;
```
如果执行的是全量开发 / 测试酒店清理,验证时同步去掉 `hotel_id = @hotel_id` 条件,确认全库旧任务及直接依赖已清空或解绑:
```sql
SELECT COUNT(*) AS legacy_task_count
FROM workflow_reservation_task;
SELECT COUNT(*) AS legacy_task_card_count
FROM workflow_reservation_task_card;
SELECT COUNT(*) AS legacy_opera_operation_count
FROM workflow_reservation_opera_operation;
SELECT COUNT(*) AS legacy_opera_attempt_count
FROM workflow_reservation_opera_operation_attempt;
SELECT COUNT(*) AS legacy_invoice_task_link_count
FROM workflow_reservation_invoice_generation
WHERE task_id IS NOT NULL;
```
订单列表验证口径:
- `GET /api/reservation/orders` 中新 V4 订单的 `open_work_item_count` 只看 V4 未完成订单任务。
- 清理后,新 V4 订单不应再返回旧 `next_processable_task_id`
- `platform_source_message_inbox`、V4 order task、V4 cards、V4 source notification、目录、用户权限和酒店配置应保持不变。