1.0.540.sql 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. -- =====================================================================================
  2. -- 1.0.540 · S5 IQC 报检分录补「采购单号」文档级身份(Document Identity Propagation)
  3. --
  4. -- ── 背景 ────────────────────────────────────────────────────────────────────────────
  5. -- `qms_qcp_insappnentry` 是 165(dopdemorq) 侧报检分录的**本地镜像**,由
  6. -- `DataPlatform/HotWatch/MdpHotWatchService.cs` 的 ApplyIqcAsync 做 UPSERT。
  7. --
  8. -- 镜像链在创建那一刻就握有采购单号,却没有落库:
  9. -- · 热关注登记的是 BizType='PUR_ORDER'、BizKey=<采购单号>
  10. -- · 取数 SQL 写的是 `... INNER JOIN PurOrdRctDetail d ON d.Receiver=e.FSRCORDERNUM
  11. -- AND d.ItemNum=e.FMATERIALCFG WHERE d.Domain=@d AND d.OrdNbr=@k`,@k 即该采购单号
  12. -- · 但 SELECT 只取 `e.*`,随后的 INSERT 也没有承载列 → 采购单号在 QUERY 层被丢弃
  13. --
  14. -- ── 为什么必须新增列,而不是复用既有列 ──────────────────────────────────────────────
  15. -- · `FSRCORDERNUM` **不能用**:上游实测 4/4 装的是**收货单号**(RC2026*),
  16. -- 取数 SQL 自身的 `d.Receiver = e.FSRCORDERNUM` 即其权威证据。写入采购单号会破坏既有语义。
  17. -- · `FORDERNUM` **不宜用**:它是 165 的镜像列(与 FORDERTYPE 配对),上游实测非空 0/4、
  18. -- 无列注释、本库无消费代码 —— 语义未经证实,且往源镜像列里塞本地派生值会破坏镜像契约,
  19. -- 上游日后一旦开始下发该字段即产生冲突。
  20. -- · 因此新增独立列,并置于表尾与其它 AiDOP 扩展列(operation_completion_time /
  21. -- process_instance_id / flowstate)同区,与 165 镜像列区块物理分开。
  22. --
  23. -- ── 本脚本不做 ──────────────────────────────────────────────────────────────────────
  24. -- 不补 PO 行号:上游 `FSRCBILLID` / `FSRCBILLENTRYSEQ` 实测 0/4 全空,属 SOURCE CONTRACT GAP。
  25. -- 禁止用 (Receiver, ItemNum) / 物料 / 供应商 / 批次 / 日期 反推行号 —— 本库实测该组合
  26. -- 最多可对应 13 个不同 PO 行(UATRCT-DEMO-0026 + 3521C0015,OrdLine 44~56)。
  27. -- 不回填历史:修复后由正式 Writer 幂等重新镜像,不手工 UPDATE,不给 fixture 猜值。
  28. --
  29. -- ── 为什么可空 ──────────────────────────────────────────────────────────────────────
  30. -- 本库 18 行分录中 14 行在上游已不存在(fixture/seed 残留),它们没有权威采购单号可填。
  31. -- 因此该列必须 NULL 且不得给默认值 —— 宁可为空,不造假。
  32. --
  33. -- ── 为什么不建索引 ──────────────────────────────────────────────────────────────────
  34. -- 当前该表 18 行,索引无收益。待下游查询确实证明需要时,再单独加 (tenant_id, purchase_order_no)。
  35. -- =====================================================================================
  36. SET @ddl := (SELECT IF(EXISTS(
  37. SELECT 1 FROM `information_schema`.`COLUMNS`
  38. WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'qms_qcp_insappnentry'
  39. AND `COLUMN_NAME` = 'purchase_order_no'),
  40. 'SELECT 1',
  41. 'ALTER TABLE `qms_qcp_insappnentry` ADD COLUMN `purchase_order_no` VARCHAR(80) NULL COMMENT ''采购单号(文档级)。来源=热关注 BizType=PUR_ORDER 的 BizKey,即取数 SQL 的 d.OrdNbr 作用域键。注意与 FSRCORDERNUM 区分:后者是收货单号。不承载 PO 行号'' AFTER `flowstate`'));
  42. PREPARE s FROM @ddl; EXECUTE s; DEALLOCATE PREPARE s;