1.0.442.sql 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. -- =============================================================================
  2. -- 1.0.442 S5 MissedPrint 租户归属回填(一次性数据修复)
  3. --
  4. -- 背景
  5. -- MissedPrint(送货标签/箱码)由 SupplierShipmentService「生成标签」写入,
  6. -- 历史实现的 INSERT 未写 tenant_id,导致库中 152 行全部为 NULL,
  7. -- 下游 FUNC-S5-008 标签查询 / FUNC-S5-013 盘点结果无法按租户过滤,
  8. -- UATAdminA 登录可看到 797 租户的 104 行(已确认的跨租户读取)。
  9. -- 代码侧已在同批修复:INSERT 补 tenant_id、MdpHotWatch 的 UPDATE 补租户条件、
  10. -- 008/013 查询补 m.tenant_id = @TenantId。本脚本负责历史行回填。
  11. --
  12. -- 归属推导(唯一 SET 源:scm_shd.tenant_id)
  13. -- MissedPrint.ShipperNbr = scm_shd.shddh → scm_shd.tenant_id
  14. -- * 不用 Domain 推导:797 与 UAT 的 Domain 同为 8010,Domain 不是租户边界。
  15. -- * 不用 scm_shbq 作 SET 源:它只是标签明细的旁证,覆盖不全(22 行无对应箱码行)。
  16. --
  17. -- 回填前实测(2026-09-01,aidopdev)
  18. -- G1 MissedPrint 152 行,tenant_id 全部为 NULL
  19. -- G2 scm_shd 中 shddh 解析出多个 tenant_id 的:0(映射无歧义)
  20. -- G3 152 行全部可解析,不可解析 0
  21. -- G4 分布:797403760988229 = 104 / 838257186181189 = 48 / 其它 0 / 合计 152
  22. -- G5 scm_shd.tenant_id 为 NULL 或 0 的行:0
  23. -- G6 交叉验证 CreateUser → SysUser.TenantId:一致 152,矛盾 0
  24. -- G7 交叉验证 scm_shbq.xh = MissedPrint.BarCode:一致 130,矛盾 0,无对应 22
  25. --
  26. -- 幂等
  27. -- 仅更新 tenant_id IS NULL 的行;重复执行影响 0 行。
  28. -- =============================================================================
  29. -- 幂等前置:列不存在时补列(正常情况下列已存在,此处只做保险)
  30. SET @col_exists := (
  31. SELECT COUNT(*) FROM information_schema.COLUMNS
  32. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'MissedPrint' AND COLUMN_NAME = 'tenant_id');
  33. SET @sql := IF(@col_exists = 0,
  34. 'ALTER TABLE MissedPrint ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户Id''',
  35. 'SELECT 1');
  36. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  37. -- 回填:唯一 SET 源 = scm_shd.tenant_id
  38. UPDATE MissedPrint m
  39. JOIN (
  40. SELECT shddh, MIN(tenant_id) AS tenant_id
  41. FROM scm_shd
  42. WHERE tenant_id IS NOT NULL AND tenant_id > 0
  43. GROUP BY shddh
  44. HAVING COUNT(DISTINCT tenant_id) = 1 -- 有歧义的单号一律跳过,不猜
  45. ) d ON d.shddh = m.ShipperNbr
  46. SET m.tenant_id = d.tenant_id
  47. WHERE m.tenant_id IS NULL; -- 幂等:只补空,绝不覆盖已有归属
  48. -- 结果门禁在 1.0.442.verify.sql:still_null=0 / 797=104 / UAT=48 / 合计=152 / 与两路独立推导零矛盾。
  49. -- 若 verify 未过(例如回填前又新增了标签),AutoVersionUpdate 会抛错阻断启动 —— 这是有意的:
  50. -- 应先核对新行的归属再决定是否放宽 verify 中的数量断言,而不是让归属不明的行悄悄进库。