1.0.507.sql 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. -- =====================================================================================
  2. -- 1.0.507 · S0 MASTER DATA PLATFORM · PHASE 2 · BATCH 5
  3. --
  4. -- CustMaster → mdp_stg_s0_customer → dim_customer
  5. -- PersonSkill → mdp_stg_s0_person_skill → dim_person_skill
  6. --
  7. -- 身份口径(按「当前业务证据优先」判定,**不继承旧物理唯一键**):
  8. -- · Customer 身份 = tenant_id + Cust
  9. -- - CRUD 查重 = tenant + FactoryRefId + Cust,而 FactoryRefId 由 AdoS0OrgScope 仅按租户解析
  10. -- 并强制 stamp(payload 覆盖)⇒ 等价 tenant + Cust;DomainCode 只是可选列表筛选。
  11. -- - 数据实测:tenant+Cust / +Domain / +factory 三候选租户内重复全部 = 0;
  12. -- company/factory 每租户单一取值(常量、零区分力)。
  13. -- - 租户必须入身份:Cust 跨租户碰撞 4 个编码。
  14. -- · PersonSkill 身份 = tenant_id + Code
  15. -- - 现有消费方 AdoS0MfgLinePostsController.ResolvePersonSkillCodesAsync 已明确按 (租户, Code)
  16. -- 解析,并把「同租户跨公司/工厂重码」当作歧义**报错**,而非两个不同技能。
  17. -- - 数据实测:三候选租户内重复全部 = 0;Code 跨租户碰撞 5 个编码。
  18. --
  19. -- 🔴 源表 CustMaster 另有不含 tenant_id 的旧唯一键 uk_CustMaster_factory_cust(factory_ref_id, Cust),
  20. -- 且 factory_ref_id=1000 被两租户共用 —— 属源表治理缺陷(KNOWN-ISSUES I-016)。
  21. -- **本批 NO SOURCE TABLE DDL CHANGE**:不顺手治理它,dim 侧靠自己的 tenant 前缀保证隔离。
  22. --
  23. -- 边界:不复用历史 mdp_stg_customer(即便 0 行,它属 DOPDEMORQ/S1,不是 S0 authority);
  24. -- 不碰 mdp_std_item / mdp_std_supplier;不动 S0 CRUD / 前端 / S1–S9 既有对象。
  25. -- =====================================================================================
  26. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_customer` (
  27. `id` bigint NOT NULL AUTO_INCREMENT,
  28. `tenant_id` bigint NOT NULL DEFAULT 0,
  29. `factory_id` bigint DEFAULT NULL,
  30. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  31. `source_table` varchar(100) NOT NULL,
  32. `source_row_id` varchar(100) NOT NULL,
  33. `source_biz_key` varchar(300) DEFAULT NULL,
  34. `sync_batch_id` varchar(100) NOT NULL,
  35. `sync_time` datetime NOT NULL,
  36. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  37. `raw_data` json NOT NULL,
  38. `process_message` varchar(500) DEFAULT NULL,
  39. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  40. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  41. PRIMARY KEY (`id`),
  42. UNIQUE KEY `uk_stg_s0_customer` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  43. KEY `idx_stg_s0_customer_biz` (`source_biz_key`),
  44. KEY `idx_stg_s0_customer_batch` (`tenant_id`,`sync_batch_id`)
  45. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:客户(源 CustMaster)';
  46. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_person_skill` (
  47. `id` bigint NOT NULL AUTO_INCREMENT,
  48. `tenant_id` bigint NOT NULL DEFAULT 0,
  49. `factory_id` bigint DEFAULT NULL,
  50. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  51. `source_table` varchar(100) NOT NULL,
  52. `source_row_id` varchar(100) NOT NULL,
  53. `source_biz_key` varchar(300) DEFAULT NULL,
  54. `sync_batch_id` varchar(100) NOT NULL,
  55. `sync_time` datetime NOT NULL,
  56. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  57. `raw_data` json NOT NULL,
  58. `process_message` varchar(500) DEFAULT NULL,
  59. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  60. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  61. PRIMARY KEY (`id`),
  62. UNIQUE KEY `uk_stg_s0_person_skill` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  63. KEY `idx_stg_s0_person_skill_biz` (`source_biz_key`),
  64. KEY `idx_stg_s0_person_skill_batch` (`tenant_id`,`sync_batch_id`)
  65. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:人员技能字典(源 PersonSkill)';
  66. CREATE TABLE IF NOT EXISTS `dim_customer` (
  67. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用',
  68. `tenant_id` bigint NOT NULL COMMENT '租户',
  69. `customer_code` varchar(100) NOT NULL COMMENT '客户编码(**唯一业务键**)← $.Cust',
  70. `customer_name` varchar(200) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.SortName(源 1333/1333 填充)',
  71. `domain_code` varchar(50) DEFAULT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;**不是身份**',
  72. `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.company_ref_id;f(tenant),**不是身份**',
  73. `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.factory_ref_id;f(tenant),**不是身份**',
  74. `shipping_lead_time` int DEFAULT NULL COMMENT 'ATTRIBUTE ← $.CustShippingLT(源 1328/1333)',
  75. `is_active` tinyint(1) NOT NULL COMMENT '源 IsActive 透传',
  76. `is_confirmed` tinyint(1) NOT NULL COMMENT '源 IsConfirm 透传',
  77. `source_system` varchar(50) NOT NULL,
  78. `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用',
  79. `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime;源 1232/1333,允许 NULL',
  80. `sync_batch_id` varchar(64) NOT NULL,
  81. `sync_time` datetime NOT NULL,
  82. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  83. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  84. PRIMARY KEY (`id`),
  85. UNIQUE KEY `uk_dim_customer` (`tenant_id`,`customer_code`),
  86. KEY `idx_dim_customer_batch` (`sync_batch_id`)
  87. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:客户。源 CustMaster,FULL REPLACE。';
  88. CREATE TABLE IF NOT EXISTS `dim_person_skill` (
  89. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用',
  90. `tenant_id` bigint NOT NULL COMMENT '租户',
  91. `skill_code` varchar(100) NOT NULL COMMENT '技能编码(**唯一业务键**)← $.Code',
  92. `skill_name` varchar(200) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.Name',
  93. `skill_level` varchar(50) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.SkillLevel',
  94. `remark` varchar(500) DEFAULT NULL COMMENT 'ATTRIBUTE ← $.Remark',
  95. `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.CompanyRefId;**不是身份**',
  96. `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.FactoryRefId;**不是身份**',
  97. `is_active` tinyint(1) NOT NULL COMMENT '源 IsEnabled 透传',
  98. `source_system` varchar(50) NOT NULL,
  99. `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用',
  100. `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdatedAt(维护时间;源 5/46 非空 = 只有改过的行才有值)。不得用 CreatedAt 冒充',
  101. `sync_batch_id` varchar(64) NOT NULL,
  102. `sync_time` datetime NOT NULL,
  103. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  104. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  105. PRIMARY KEY (`id`),
  106. UNIQUE KEY `uk_dim_person_skill` (`tenant_id`,`skill_code`),
  107. KEY `idx_dim_person_skill_batch` (`sync_batch_id`)
  108. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:人员技能字典。源 PersonSkill,FULL REPLACE。不设父维度(EmpSkills.SkillNo 与本表 Code 实测 632/650 对不上)。';
  109. SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1);
  110. INSERT INTO `mdp_entity`
  111. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  112. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  113. `biz_key_expr`,`status`,`create_time`,`update_time`)
  114. SELECT 0, @src_id, 'S0_CUSTOMER', 'S0 客户主数据入站', 'TABLE',
  115. 'CustMaster', 'mdp_stg_s0_customer', 'FULL', NULL, 5000,
  116. 'Cust', 1, NOW(), NOW()
  117. WHERE @src_id IS NOT NULL
  118. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_CUSTOMER');
  119. INSERT INTO `mdp_entity`
  120. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  121. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  122. `biz_key_expr`,`status`,`create_time`,`update_time`)
  123. SELECT 0, @src_id, 'S0_PERSON_SKILL', 'S0 人员技能字典入站', 'TABLE',
  124. 'PersonSkill', 'mdp_stg_s0_person_skill', 'FULL', NULL, 5000,
  125. 'Code', 1, NOW(), NOW()
  126. WHERE @src_id IS NOT NULL
  127. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_PERSON_SKILL');
  128. -- ── 回滚(注释,非可执行)──────────────────────────────────────────────────────────
  129. -- DROP TABLE IF EXISTS `dim_person_skill`;
  130. -- DROP TABLE IF EXISTS `dim_customer`;
  131. -- DROP TABLE IF EXISTS `mdp_stg_s0_person_skill`;
  132. -- DROP TABLE IF EXISTS `mdp_stg_s0_customer`;
  133. -- DELETE FROM `mdp_entity` WHERE `tenant_id` = 0 AND `entity_code` IN ('S0_CUSTOMER','S0_PERSON_SKILL');