1.0.473.sql 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. -- ============================================================================
  2. -- S5-PURCHASE-RECEIPT-DISPLAY-FIX · Batch 2 存量订正
  3. -- ① UAT-A Golden Data 补数(源表 Domain / Supp / UM)
  4. -- ② 标准层旧身份键行清理(domain='null'),由重跑 MDP 链以正确 domain 重建
  5. --
  6. -- 背景(根因已在同批代码修复):
  7. -- PurchaseReceiptMdpSyncService.TransformStandardAsync 原先对展示列使用裸
  8. -- JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.x'))。MySQL 下 JSON null 经 JSON_UNQUOTE
  9. -- 产出**长度为 4 的字面量字符串 'null'**(实测 IS NULL = 0 / CHAR_LENGTH = 4),
  10. -- 于是 mdp_std_purchase_receipt 的 supp / sort_name / um / lot_serial / domain
  11. -- 落成 'null',采购收货单页面直接显示 null,前端 `|| '-'` 兜底对真值字符串无效。
  12. -- 代码侧已统一改走 MdpJsonSql.Str/Int/Dec(identity / JOIN 键刻意保留裸取值)。
  13. --
  14. -- 但仅修代码不足以让页面有值:本批 UAT Golden Data 的源单本身
  15. -- Domain / Supp / UM 全为 SQL NULL,维表(ItemMaster / SuppMaster / PurOrdDetail)
  16. -- 一律关联落空。故必须同时补源数据,本脚本即做这件事。
  17. --
  18. -- 取值依据(aidopdev 只读取证,2026-09-03):
  19. -- Domain = '8010'
  20. -- · 采购收货是采购单据,其域应与供应商主数据所在域一致。
  21. -- · 本批 5 张收货单对应的采购订单头 PurOrdMaster(UATA-PO-001..005).Supp 均为 'VEN00060'。
  22. -- · 租户 838257186181189 的 SuppMaster 共 14 行、**全部 Domain='8010'**,
  23. -- 其中 VEN00060 = 瑞贝德。该租户不存在任何其他 Domain 的供应商主数据,
  24. -- 故 '8010' 是唯一能让 供应商 维表命中的取值,且命中行属于**本租户自己**(无跨租户读)。
  25. -- · 原 PurOrdMaster.Domain='797403760988229' 是租户号误填、非 ERP 域,不采用;
  26. -- 本脚本亦不改 PurOrdMaster(不在采购收货链路上,避免扩大范围)。
  27. -- Supp = 'VEN00060'(取自对应 PurOrdMaster.Supp,非臆造)
  28. -- UM = 取自对应采购订单行 PurOrdDetail(PurOrd=OrdNbr, Line=OrdLine).UM(本批实测均为 'EA')
  29. -- LotSerial:**刻意不补**。上游无任何批次号来源(采购订单行、质检、库存事务均无),
  30. -- 按"不伪造"原则留 SQL NULL;修复后页面显示空白而非 'null',已满足展示口径。
  31. --
  32. -- 写入范围(DDL 0):
  33. -- PurOrdRctMaster UPDATE ≤5 行 tenant_id=838257186181189 AND CreateUser='UAT_GENERATOR'
  34. -- AND Receiver LIKE 'UATRCT-A-%' AND RctType='rc'
  35. -- PurOrdRctDetail UPDATE ≤10 行 同上范围
  36. -- PurOrdDetail UPDATE ≤10 行 tenant_id=838257186181189 AND PurOrd LIKE 'UATA-PO-%'
  37. -- (补 Domain,使收货 → 采购单号/请购单号 维表关联可用)
  38. -- mdp_stg_purchase_receipt DELETE ≤15 行 tenant_id=838257186181189 且 raw_data.Domain 为 JSON null
  39. -- mdp_std_purchase_receipt DELETE ≤10 行 tenant_id=838257186181189 AND domain='null'
  40. --
  41. -- 明确不做(防止范围蔓延):
  42. -- · 不动 tenant 838257212780613(UAT-B) / 838257237606469(UAT-DEMO) 的同类数据;
  43. -- · 不动非 UAT_GENERATOR 的任何业务行;
  44. -- · 不批量修复 PurOrdRctDetail 全表 240 行 Domain IS NULL;
  45. -- · 不做全库 'null' 清洗,不碰其他 mdp_std_* 表;
  46. -- · 不改 PurOrdMaster。
  47. --
  48. -- 幂等:源表三条 UPDATE 均以 "Domain IS NULL" 收敛,重复执行 0 行影响;
  49. -- DELETE 以 domain='null' 收敛,重跑后该条件不再成立。
  50. -- 顺序要求:本脚本执行后必须重跑 S5 采购收货 MDP 链
  51. -- (POST /api/AidopKanban/s5-purchase-receipt-mdp/refresh 或等价 inbound),
  52. -- 否则标准层将暂时为空——DELETE 后、重建前存在这一空窗,属预期。
  53. -- ============================================================================
  54. -- ── 执行前证据 ──
  55. SELECT 'BEFORE-src' AS phase,
  56. SUM(d.Domain IS NULL) AS detail_domain_null,
  57. SUM(d.Supp IS NULL) AS detail_supp_null,
  58. SUM(d.UM IS NULL) AS detail_um_null,
  59. COUNT(*) AS detail_rows
  60. FROM PurOrdRctDetail d
  61. WHERE d.tenant_id = 838257186181189
  62. AND d.CreateUser = 'UAT_GENERATOR'
  63. AND d.Receiver LIKE 'UATRCT-A-%';
  64. SELECT 'BEFORE-std' AS phase,
  65. COUNT(*) AS rows_,
  66. SUM(domain = 'null') AS domain_null,
  67. SUM(supp = 'null') AS supp_null,
  68. SUM(sort_name = 'null') AS sort_name_null,
  69. SUM(um = 'null') AS um_null,
  70. SUM(lot_serial = 'null') AS lot_serial_null
  71. FROM mdp_std_purchase_receipt
  72. WHERE tenant_id = 838257186181189;
  73. -- ── 1) 收货单主表:补 Domain / Supp(Supp 取自对应采购订单头)──
  74. UPDATE PurOrdRctMaster m
  75. SET m.Domain = '8010',
  76. m.Supp = (SELECT po.Supp FROM PurOrdMaster po
  77. WHERE po.tenant_id = m.tenant_id AND po.PurOrd = m.OrdNbr LIMIT 1),
  78. m.UpdateTime = NOW()
  79. WHERE m.tenant_id = 838257186181189
  80. AND m.CreateUser = 'UAT_GENERATOR'
  81. AND m.Receiver LIKE 'UATRCT-A-%'
  82. AND m.RctType = 'rc'
  83. AND m.Domain IS NULL;
  84. -- ── 2) 收货单明细:补 Domain / Supp / UM(UM 取自对应采购订单行)──
  85. UPDATE PurOrdRctDetail d
  86. SET d.Domain = '8010',
  87. d.Supp = (SELECT po.Supp FROM PurOrdMaster po
  88. WHERE po.tenant_id = d.tenant_id AND po.PurOrd = d.OrdNbr LIMIT 1),
  89. d.UM = (SELECT pd.UM FROM PurOrdDetail pd
  90. WHERE pd.tenant_id = d.tenant_id AND pd.PurOrd = d.OrdNbr AND pd.Line = d.OrdLine LIMIT 1),
  91. d.UpdateTime = NOW()
  92. WHERE d.tenant_id = 838257186181189
  93. AND d.CreateUser = 'UAT_GENERATOR'
  94. AND d.Receiver LIKE 'UATRCT-A-%'
  95. AND d.RctType = 'rc'
  96. AND d.Domain IS NULL;
  97. -- ── 3) 采购订单明细:补 Domain,使 收货 → 采购单号 / 请购单号 的维表关联成立 ──
  98. UPDATE PurOrdDetail
  99. SET Domain = '8010',
  100. UpdateTime = NOW()
  101. WHERE tenant_id = 838257186181189
  102. AND PurOrd LIKE 'UATA-PO-%'
  103. AND Domain IS NULL;
  104. -- ── 4) 贴源层:删除补数前的旧快照 ──
  105. -- mdp_entity.biz_key_expr = 'Domain,Receiver,Line'(明细)/ 'Domain,Receiver'(主表)。
  106. -- 补数前 Domain 为 NULL,贴源行的 source_biz_key 退化成 RecID(如 '900342');
  107. -- 补数后变成 '8010#UATRCT-A-0001#1'。uk_source_key 含 source_biz_key,
  108. -- 因此下一次 Pull 是**插新行而非就地更新**,旧快照(raw_data.Domain 为 JSON null)会残留,
  109. -- 并被 transform 重新生成一批 domain='null' 的标准层行 —— 同一收货行出现新旧两条。
  110. -- 只删"raw_data.Domain 为 JSON null"的旧快照,新快照(Domain='8010')不受影响;
  111. -- 全新环境(先跑本脚本再首次同步)下本语句为 0 行,无副作用。
  112. DELETE FROM mdp_stg_purchase_receipt
  113. WHERE tenant_id = 838257186181189
  114. AND JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.Receiver')) LIKE 'UATRCT-A-%'
  115. AND JSON_UNQUOTE(JSON_EXTRACT(raw_data,'$.Domain')) = 'null';
  116. -- ── 5) 标准层:删除旧身份键行(domain='null');重跑 MDP 会以 domain='8010' 重建 ──
  117. -- 唯一键 uk_mdp_std_pur_rct(tenant_id, domain, receiver, line) 含 domain,
  118. -- 源侧 Domain 变更后 upsert 会落新键,若不清理则同一张收货单出现新旧两行。
  119. DELETE FROM mdp_std_purchase_receipt
  120. WHERE tenant_id = 838257186181189
  121. AND domain = 'null'
  122. AND receiver LIKE 'UATRCT-A-%';
  123. -- ── 执行后证据(期望:源表三列 0 个 NULL;标准层本租户 0 行,待重跑重建为 10 行)──
  124. SELECT 'AFTER-src' AS phase,
  125. SUM(d.Domain IS NULL) AS detail_domain_null,
  126. SUM(d.Supp IS NULL) AS detail_supp_null,
  127. SUM(d.UM IS NULL) AS detail_um_null,
  128. COUNT(*) AS detail_rows
  129. FROM PurOrdRctDetail d
  130. WHERE d.tenant_id = 838257186181189
  131. AND d.CreateUser = 'UAT_GENERATOR'
  132. AND d.Receiver LIKE 'UATRCT-A-%';
  133. SELECT 'AFTER-std' AS phase, COUNT(*) AS rows_
  134. FROM mdp_std_purchase_receipt
  135. WHERE tenant_id = 838257186181189;