| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- -- =====================================================================================
- -- 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;
|