1.0.506.sql 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. -- =====================================================================================
  2. -- 1.0.506 · S0 MASTER DATA PLATFORM · PHASE 2 · BATCH 4
  3. --
  4. -- 目标:在 Phase 1 已验证的 S0Dim 通用框架上扩展两个 C1 维度,**只加 Definition,不加服务**。
  5. -- EmployeeMaster → mdp_stg_s0_employee → dim_employee
  6. -- LineMaster → mdp_stg_s0_line → dim_line
  7. --
  8. -- 本批边界(与 Phase 1 一致):
  9. -- · 不建、不改、不删共享表 mdp_stg_location / mdp_stg_employee / mdp_stg_line
  10. -- (后两张属 DOPDEMORQ,当前 0 行,但不是 S0 的 authority —— 故另建 S0 专用 stg)
  11. -- · 不写 mdp_source / mdp_field_mapping;不碰 mdp_std_item / mdp_std_supplier
  12. -- · 不动 S1–S9 既有对象、不动 S0 CRUD、不动前端
  13. --
  14. -- 取号:开发期用 WIP 名,提交那刻按 origin/master 实际最大号 +1 改名为 1.0.<n>.sql
  15. -- (verify 脚本必须同批同号改名,AutoVersionUpdate 用 Path.ChangeExtension 配对)。
  16. --
  17. -- 租户契约(P0,实测依据):
  18. -- · Employee 身份 = tenant_id + Employee (Domain / company / factory 均为属性,非身份)
  19. -- · Line 身份 = tenant_id + Line (Domain / company / factory 均为属性,非身份)
  20. --
  21. -- 身份口径按「当前业务证据优先」重判(2026-09-07 Semantic Gate),**不继承旧物理唯一键**:
  22. -- · Employee CRUD 查重 = tenant + FactoryRefId + Employee,不含 Domain;而 FactoryRefId 由
  23. -- AdoS0OrgScope.ResolveAsync 仅按租户解析并强制 stamp ⇒ 等价于 tenant + Employee。
  24. -- · Employee 真实 consumer 一律 `ON p.Buyer=e.Employee AND e.tenant_id=p.tenant_id`(5 处),无一处用 Domain。
  25. -- · Line CRUD 无任何查重守卫;consumer GetLinesAsync 只用 (TenantId, Line)。
  26. -- · 数据实测:tenant+Employee 租户内重复=0;Line 四个候选租户内重复全部=0,
  27. -- 且每个租户在 LineMaster 只有 1 个 Domain / 1 个 company / 1 个 factory ⇒ 租户内常量、零区分力。
  28. -- · 租户仍必须入身份:Employee 跨租户碰撞 19 组 / 38 行,Line 20 组 / 80 行;
  29. -- Domain 与 factory_ref_id=1000 均被多租户复用,都不具备隔离能力。
  30. -- =====================================================================================
  31. -- ── 一、S0 专用贴源表(2 张)──────────────────────────────────────────────────────
  32. -- UK 刻意包含 source_system:共享表 mdp_stg_location 的 UK 不含它,导致同名源表在不同源
  33. -- 之间串键(Phase 1 已实证)。S0 自有表一律补上,即使当前只有一个源。
  34. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_employee` (
  35. `id` bigint NOT NULL AUTO_INCREMENT,
  36. `tenant_id` bigint NOT NULL DEFAULT 0,
  37. `factory_id` bigint DEFAULT NULL,
  38. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  39. `source_table` varchar(100) NOT NULL,
  40. `source_row_id` varchar(100) NOT NULL,
  41. `source_biz_key` varchar(300) DEFAULT NULL,
  42. `sync_batch_id` varchar(100) NOT NULL,
  43. `sync_time` datetime NOT NULL,
  44. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  45. `raw_data` json NOT NULL,
  46. `process_message` varchar(500) DEFAULT NULL,
  47. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  48. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  49. PRIMARY KEY (`id`),
  50. UNIQUE KEY `uk_stg_s0_employee` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  51. KEY `idx_stg_s0_employee_biz` (`source_biz_key`),
  52. KEY `idx_stg_s0_employee_batch` (`tenant_id`,`sync_batch_id`)
  53. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:雇员(源 EmployeeMaster)';
  54. CREATE TABLE IF NOT EXISTS `mdp_stg_s0_line` (
  55. `id` bigint NOT NULL AUTO_INCREMENT,
  56. `tenant_id` bigint NOT NULL DEFAULT 0,
  57. `factory_id` bigint DEFAULT NULL,
  58. `source_system` varchar(50) NOT NULL DEFAULT 'AIDOPDEV_MYSQL',
  59. `source_table` varchar(100) NOT NULL,
  60. `source_row_id` varchar(100) NOT NULL,
  61. `source_biz_key` varchar(300) DEFAULT NULL,
  62. `sync_batch_id` varchar(100) NOT NULL,
  63. `sync_time` datetime NOT NULL,
  64. `process_status` varchar(20) NOT NULL DEFAULT 'PENDING',
  65. `raw_data` json NOT NULL,
  66. `process_message` varchar(500) DEFAULT NULL,
  67. `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  68. `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  69. PRIMARY KEY (`id`),
  70. UNIQUE KEY `uk_stg_s0_line` (`tenant_id`,`source_system`,`source_table`,`source_row_id`),
  71. KEY `idx_stg_s0_line_biz` (`source_biz_key`),
  72. KEY `idx_stg_s0_line_batch` (`tenant_id`,`sync_batch_id`)
  73. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据贴源:生产线(源 LineMaster)';
  74. -- ── 二、维度表(2 张)────────────────────────────────────────────────────────────
  75. -- tenant_id 一律 NOT NULL 且为唯一键首列;FULL REPLACE 按 tenant_id 分区删改。
  76. --
  77. -- 舍弃的源列(明确记录,避免下次误以为漏了):
  78. -- EmployeeMaster:Sex / Phone / Email / BirthDate / MaritalStatus / City / Country /
  79. -- BusinessPhone / CarId / DefaultWorkLocation —— 个人信息或无主数据语义,
  80. -- 维度层不承载 PII;CreateUser/CreateTime/UpdateUser/RecID —— 审计列,非主数据属性。
  81. -- LineMaster: line_describe(恒空影子列,真列是 Describe)· PickingLocation(0/169 填充) ·
  82. -- location3(0/169) · VLocation / MidLocation / location2(各 28/169,
  83. -- 三个无标准语义的备用库位槽,含义未经业务确认)· CreateUser/CreateTime/UpdateUser/RecID。
  84. CREATE TABLE IF NOT EXISTS `dim_employee` (
  85. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用',
  86. `tenant_id` bigint NOT NULL COMMENT '租户',
  87. `company_id` bigint NOT NULL COMMENT '← $.company_ref_id;属性,不入身份',
  88. `factory_id` bigint NOT NULL COMMENT '← $.factory_ref_id;属性,不入身份(1000 被多租户共用,无隔离能力)',
  89. `employee_code` varchar(100) NOT NULL COMMENT '工号(**唯一业务键**)← $.Employee',
  90. `domain_code` varchar(50) NOT NULL COMMENT 'ATTRIBUTE ← $.Domain;仅供部门父连接与引用校验,**不是身份**',
  91. `employee_name` varchar(200) DEFAULT NULL COMMENT '← $.Name',
  92. `department_code` varchar(100) DEFAULT NULL COMMENT '← $.Department;自由文本软引用 dim_department,无 DB FK;NULL=未分配(不算孤儿)',
  93. `job_title` varchar(100) DEFAULT NULL COMMENT '← $.JobTitle',
  94. `work_center_code` varchar(100) DEFAULT NULL COMMENT '← $.WorkCtr;按业务键引用 dim_work_center,无 DB FK',
  95. `employment_status` varchar(50) DEFAULT NULL COMMENT '← $.EmploymentStatus',
  96. `date_employed` datetime DEFAULT NULL COMMENT '← $.DateEmployed',
  97. `date_terminated` datetime DEFAULT NULL COMMENT '← $.DateTerminated',
  98. `sys_user_id` bigint DEFAULT NULL COMMENT '← $.sys_user_id;稀疏(源 7/1105 非空)。**属性,绝不参与业务键**',
  99. `is_active` tinyint(1) NOT NULL COMMENT '源 IsActive 透传(raw_data 中为 JSON BOOLEAN)',
  100. `source_system` varchar(50) NOT NULL,
  101. `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用',
  102. `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime;源 97% 非空,允许 NULL,不得回填假时间',
  103. `sync_batch_id` varchar(64) NOT NULL,
  104. `sync_time` datetime NOT NULL,
  105. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  106. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  107. PRIMARY KEY (`id`),
  108. UNIQUE KEY `uk_dim_employee` (`tenant_id`,`employee_code`),
  109. KEY `idx_dim_employee_batch` (`sync_batch_id`),
  110. KEY `idx_dim_employee_dept` (`tenant_id`,`domain_code`,`department_code`)
  111. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:雇员。源 EmployeeMaster,FULL REPLACE。';
  112. CREATE TABLE IF NOT EXISTS `dim_line` (
  113. `id` bigint NOT NULL AUTO_INCREMENT COMMENT '技术行号;每轮 FULL 重建即变,禁止外部引用',
  114. `tenant_id` bigint NOT NULL COMMENT '租户',
  115. `company_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.company_ref_id;f(tenant),**不是身份**',
  116. `factory_id` bigint NOT NULL COMMENT 'LEGACY_SCOPE ← $.factory_ref_id;f(tenant),**不是身份**。⚠️ 绝不可设进 MdpPullContext.FactoryId,见 I-015',
  117. `line_code` varchar(100) NOT NULL COMMENT '产线编码(**唯一业务键**)← $.Line',
  118. `domain_code` varchar(50) NOT NULL COMMENT 'LEGACY_SCOPE ← $.Domain;租户内常量,**不是身份**',
  119. `line_name` varchar(255) DEFAULT NULL COMMENT '← $.Describe(真列;同表 line_describe 恒空,是影子列)',
  120. `line_type` varchar(50) DEFAULT NULL COMMENT '← $.LineType',
  121. `line_category` varchar(50) DEFAULT NULL COMMENT '← $.LineCategory',
  122. `workshop` varchar(50) DEFAULT NULL COMMENT '← $.Workshop',
  123. `location_code` varchar(50) DEFAULT NULL COMMENT '← $.Location;按业务键软引用 dim_location,无 DB FK',
  124. `is_active` tinyint(1) NOT NULL COMMENT '源 IsActive 透传',
  125. `source_system` varchar(50) NOT NULL,
  126. `source_biz_key` varchar(300) NOT NULL COMMENT '回溯 staging 用',
  127. `source_updated_at` datetime DEFAULT NULL COMMENT '← $.UpdateTime;源 100% 非空',
  128. `sync_batch_id` varchar(64) NOT NULL,
  129. `sync_time` datetime NOT NULL,
  130. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  131. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  132. PRIMARY KEY (`id`),
  133. UNIQUE KEY `uk_dim_line` (`tenant_id`,`line_code`),
  134. KEY `idx_dim_line_batch` (`sync_batch_id`)
  135. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='S0 主数据维度:生产线。源 LineMaster,FULL REPLACE。';
  136. -- ── 三、mdp_entity 入站配置(2 条,全 FULL)──────────────────────────────────────
  137. --
  138. -- · sync_mode 必须 FULL、incr_column 必须 NULL:Phase 2 既定策略。
  139. -- 即便 Employee UpdateTime 97%、Line 100%,也不切 INCR ——
  140. -- 留 incr_column 会让 BuildSelectSql 生成 "col > @cursor",使水位为 NULL 的行永久不可达
  141. -- (Employee 实测有 29 行 UpdateTime 为 NULL)。
  142. -- · biz_key_expr 是【源物理列名】逗号列表,须与 Definition.SourceBizKeyColumns 逐字一致,
  143. -- 否则 S0DimMaterializer.AssertEntityContractAsync 会当场报配置漂移。
  144. -- · batch_size 必须大于单租户最大行数(Employee 最大 613、Line 最大 109),5000 余量充足。
  145. SET @src_id = (SELECT `id` FROM `mdp_source` WHERE `source_code` = 'AIDOPDEV_MYSQL' LIMIT 1);
  146. INSERT INTO `mdp_entity`
  147. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  148. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  149. `biz_key_expr`,`status`,`create_time`,`update_time`)
  150. SELECT 0, @src_id, 'S0_EMPLOYEE', 'S0 雇员主数据入站', 'TABLE',
  151. 'EmployeeMaster', 'mdp_stg_s0_employee', 'FULL', NULL, 5000,
  152. 'Employee', 1, NOW(), NOW()
  153. WHERE @src_id IS NOT NULL
  154. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_EMPLOYEE');
  155. INSERT INTO `mdp_entity`
  156. (`tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  157. `source_table_name`,`target_table_name`,`sync_mode`,`incr_column`,`batch_size`,
  158. `biz_key_expr`,`status`,`create_time`,`update_time`)
  159. SELECT 0, @src_id, 'S0_LINE', 'S0 生产线主数据入站', 'TABLE',
  160. 'LineMaster', 'mdp_stg_s0_line', 'FULL', NULL, 5000,
  161. 'Line', 1, NOW(), NOW()
  162. WHERE @src_id IS NOT NULL
  163. AND NOT EXISTS (SELECT 1 FROM `mdp_entity` WHERE `entity_code` = 'S0_LINE');
  164. -- ── 回滚(注释,非可执行;执行前请确认无消费者)──────────────────────────────────
  165. -- DROP TABLE IF EXISTS `dim_line`;
  166. -- DROP TABLE IF EXISTS `dim_employee`;
  167. -- DROP TABLE IF EXISTS `mdp_stg_s0_line`;
  168. -- DROP TABLE IF EXISTS `mdp_stg_s0_employee`;
  169. -- DELETE FROM `mdp_entity` WHERE `tenant_id` = 0 AND `entity_code` IN ('S0_EMPLOYEE','S0_LINE');