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