1.0.544.sql 6.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. -- =====================================================================================
  2. -- 1.0.544 · S8 Stage-3 采购订单完成态标准事实层(mdp_std_purchase_order_completion)
  3. --
  4. -- ── 为什么必须是独立一张表 ──────────────────────────────────────────────────────────
  5. -- 采购订单的生命周期在拆库后由两个系统分阶段共管(见 doc/plan/旧DOP-MES-WMS/对接任务书/
  6. -- 附-字段共管矩阵.md §6/§7,以及 DataPlatform/Wms/PurOrdWmsPushService.cs 的
  7. -- 「Status 只建行写空串;收货态由 WMS 维护」):
  8. -- 建单阶段 → Ai-DOP(本库 PurOrdDetail,投影为 mdp_std_purchase_order.status)
  9. -- 收货/关闭 → WMS/MES(Source B 的 PurOrdDetail.Status)
  10. -- 两侧值域实测零重叠(本库 R/O 各 208/240 行、0 个 C;Source B 空串 97 行 + C 1 行、
  11. -- 0 个 R/O),且两侧 RecID 分属不相交 ID 空间,因此【不能】把 Source B 的执行态
  12. -- 覆盖进 mdp_std_purchase_order.status —— 那会把两个系统的事实混进同一列、抹掉 provenance。
  13. --
  14. -- ── Grain ───────────────────────────────────────────────────────────────────────────
  15. -- CANONICAL_GRAIN = (tenant_id, po_no, po_line)
  16. -- 依据:① Source B 的业务键是 (Domain, PurOrd, Line),而 Domain 在 165 实测只有 8010
  17. -- 一个账套,退化为 (PurOrd, Line);
  18. -- ② 实测本库 449/449 组 (po_no, po_line) 单租户、147/147 个 po_no 单租户,
  19. -- 与 MdpHotWatchService 的「采购单号本库唯一」断言一致;
  20. -- ③ mdp_std_purchase_order 无 domain 列,消费侧只能按 (tenant_id, po_no, po_line) 关联。
  21. -- domain / potype / source_row_id / source_id 是 provenance,【不进】唯一键。
  22. --
  23. -- ── 三态与可逆 ──────────────────────────────────────────────────────────────────────
  24. -- raw_status='C' → COMPLETED
  25. -- raw_status='' → NOT_COMPLETED
  26. -- raw_status IS NULL 或其它非空值 → UNKNOWN(绝不滑成 NOT_COMPLETED)
  27. -- Source B 无该行 → NOT_OBSERVED:【本表不落行】,绝不由 Source A 反向造行
  28. -- 上游 pr_WMS_UpdatePurOrdRctTransactionProcessing2 的写法是
  29. -- `Status=(case when ... then 'C' else '' end)`,退货会把 C 打回空串,
  30. -- 故本表是【当前状态】而非一次性事件,Writer 必须允许 COMPLETED → NOT_COMPLETED 回退。
  31. --
  32. -- ── 刻意不做 ────────────────────────────────────────────────────────────────────────
  33. -- 不建 completion_time:Source B 的 UpdateTime 会被 Ai-DOP 自己的 PO_WMS_POD 回推刷新
  34. -- (实测 98 行里 90 行的最后更新者是 DOP 用户或 MDP_HOT),无法表达「何时变成 C」。
  35. -- observed_at / sync_time 是观测时刻,【禁止】冒充业务完成时间。
  36. -- 不做订单级完成聚合;不做 ObjectCompleted;不读 IQC;不写任何源表。
  37. -- =====================================================================================
  38. CREATE TABLE IF NOT EXISTS `mdp_std_purchase_order_completion` (
  39. `id` BIGINT NOT NULL AUTO_INCREMENT,
  40. `tenant_id` BIGINT NOT NULL COMMENT '租户。权威 = HotWatch watch.TenantId 或本地 PO 身份反查;绝不由 Domain 推导',
  41. `factory_id` BIGINT NULL DEFAULT 1 COMMENT '工厂。Source B 无该概念,恒 1,保留以对齐 mdp_std_* 形状',
  42. `po_no` VARCHAR(100) NOT NULL COMMENT '采购单号 = Source B PurOrdDetail.PurOrd(canonical)',
  43. `po_line` VARCHAR(50) NOT NULL COMMENT '采购行号 = Source B PurOrdDetail.Line(canonical)',
  44. `domain` VARCHAR(24) NULL COMMENT 'Source B 账套 = PurOrdDetail.Domain(实测恒 8010)。仅作 provenance,【不是租户边界】,不进唯一键',
  45. `potype` VARCHAR(20) NULL COMMENT 'Source B PurOrdDetail.Potype,仅作上下文',
  46. `raw_status` VARCHAR(8) NULL COMMENT 'Source B PurOrdDetail.Status 原值(已 TRIM):C=收完关闭 / 空串=未完成 / NULL=源列为空',
  47. `completion_status` VARCHAR(20) NOT NULL COMMENT '完成结论:COMPLETED(C) / NOT_COMPLETED(空串) / UNKNOWN(NULL 或未知值)。派生自 raw_status,绝不来自 Source A',
  48. `source_system` VARCHAR(50) NOT NULL COMMENT '产出该事实的源系统编码(mdp_source.source_code),明示这是 WMS 侧事实',
  49. `source_id` BIGINT NULL COMMENT 'mdp_source.id,便于切源后追溯',
  50. `source_row_id` VARCHAR(100) NULL COMMENT 'Source B PurOrdDetail.RecID。source-local identity,禁止与本库 RecID 比较或判新旧',
  51. `source_update_time` DATETIME NULL COMMENT 'Source B UpdateTime。⚠️ 非权威:会被 PO_WMS_POD 回推刷新,禁止当作完成时间',
  52. `source_update_user` VARCHAR(50) NULL COMMENT 'Source B UpdateUser。用于区分 WMS 动作与 Ai-DOP 回推(MDP_HOT)',
  53. `observed_at` DATETIME NOT NULL COMMENT '本次观测到该状态的时刻。⚠️ 观测时间,禁止冒充业务完成时间',
  54. `sync_batch_id` VARCHAR(100) NOT NULL COMMENT '同步批次',
  55. `sync_time` DATETIME NOT NULL COMMENT '同步时间',
  56. `create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  57. `update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  58. PRIMARY KEY (`id`),
  59. UNIQUE KEY `uk_mdp_std_po_completion` (`tenant_id`, `po_no`, `po_line`),
  60. KEY `idx_std_po_compl_status` (`tenant_id`, `completion_status`),
  61. KEY `idx_std_po_compl_batch` (`sync_batch_id`)
  62. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  63. COMMENT='S8 Stage-3 采购订单完成态标准事实层。Grain = 一条采购行(tenant_id + po_no + po_line)。来源 = WMS/MES 执行系统,当前状态可逆';