数据层(V24 迁移): 逻辑删除无涂鸦绑定记录的孤儿涂鸦设备及其AI档案; 物理删除测试阶段的联动规则、场景与场景执行记录(条件相同但动作矛盾的测试数据); 保留产品/物模型/家庭/成员/活动日志。幂等可重复执行。 代码层(根治): TuyaCloudService.unbindUser 解绑时联动逻辑删除该用户的涂鸦设备与AI档案, 避免解绑后设备仍在列表被联动规则反复命中而刷错误日志; 采用逻辑删除, 用户重新绑定同步时 restoreById 自动恢复。
52 lines
2.6 KiB
SQL
52 lines
2.6 KiB
SQL
-- =====================================================================
|
||
-- V24 · 清理测试阶段遗留的孤儿涂鸦设备与测试联动数据
|
||
-- ---------------------------------------------------------------------
|
||
-- 背景:
|
||
-- 1) unbindUser 早期只物理删除 tuya_user_binding 绑定记录,不处理已同步的设备,
|
||
-- 于是产生"孤儿涂鸦设备":设备仍在设备列表,却已无涂鸦账号可控制。
|
||
-- 定时场景每分钟命中的联动规则会持续对它们下发指令,全部失败并刷错误日志。
|
||
-- (代码侧已修复:解绑时联动逻辑删除设备与 AI 档案,重新绑定同步时自动恢复)
|
||
-- 2) 测试阶段遗留的联动规则与场景:条件全部相同(switch_1 == true)但动作互相矛盾
|
||
-- (switch_1=true / switch_1=0 / {"1":"open"} 混用 dpId),会下发自相矛盾的指令。
|
||
--
|
||
-- 清理范围:
|
||
-- - 逻辑删除孤儿涂鸦设备(owner 已无涂鸦绑定记录)
|
||
-- - 逻辑删除指向这些设备的 AI 档案
|
||
-- - 删除测试联动规则与测试场景(含每分钟 cron 的 bb 场景)
|
||
-- 保留:产品与物模型(product / product_property / product_event / product_action),
|
||
-- 家庭与成员、设备活动日志(历史审计)等。
|
||
--
|
||
-- 无存储过程、无 DELIMITER;幂等可重复执行。
|
||
-- =====================================================================
|
||
|
||
-- ---------- 1) 逻辑删除孤儿涂鸦设备 ----------
|
||
UPDATE device d
|
||
SET d.deleted = 1,
|
||
d.update_time = NOW()
|
||
WHERE d.deleted = 0
|
||
AND d.platform = 'tuya'
|
||
AND d.owner_id > 0
|
||
AND NOT EXISTS (SELECT 1 FROM tuya_user_binding b WHERE b.member_id = d.owner_id);
|
||
|
||
-- ---------- 2) 逻辑删除已解绑用户的 AI 档案 ----------
|
||
-- 注意:这里按 owner_id 判定,而不是 JOIN device 比较 device_id——
|
||
-- ai_device_profile.device_id 与 device.device_id 的排序规则不同
|
||
-- (utf8mb4_unicode_ci vs utf8mb4_0900_ai_ci),跨表字符串比较会报
|
||
-- ERROR 1267 Illegal mix of collations。owner_id 为数值列,无此问题。
|
||
UPDATE ai_device_profile a
|
||
SET a.deleted = 1,
|
||
a.update_time = NOW()
|
||
WHERE a.deleted = 0
|
||
AND a.owner_id > 0
|
||
AND NOT EXISTS (SELECT 1 FROM tuya_user_binding b WHERE b.member_id = a.owner_id);
|
||
|
||
-- ---------- 3) 删除测试联动规则 ----------
|
||
DELETE FROM linkage_rule WHERE deleted = 0;
|
||
|
||
-- ---------- 4) 删除测试场景(bb 场景 cron 为每分钟执行) ----------
|
||
DELETE FROM scene WHERE deleted = 0;
|
||
|
||
-- ---------- 5) 清理场景执行记录 ----------
|
||
DELETE FROM scene_run;
|
||
|