1.0.350.sql 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. -- 1.0.350:统一 S3/S4 MDP 的 tenant_id + factory_id 作用域,并修复贴源表审计字段漂移。
  2. SET NAMES utf8mb4;
  3. -- S4 STG:四张活动贴源表补 factory_id;历史数据归入默认工厂 1。
  4. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_iqc' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_stg_s4_iqc` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  5. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  6. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_return' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_stg_s4_return` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  7. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  8. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_shipment' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_stg_s4_shipment` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  9. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  10. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_shortage' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_stg_s4_shortage` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  11. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  12. -- S3 STD / DWD 与 S4 QC DWD:补齐 factory_id,消除中途丢失工厂作用域。
  13. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_std_delivery_schedule' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_std_delivery_schedule` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  14. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  15. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_std_delivery_result' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_std_delivery_result` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  16. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  17. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_std_material_readiness' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_std_material_readiness` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  18. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  19. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_std_process_outsource_order' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `mdp_std_process_outsource_order` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  20. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  21. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_supply_demand' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_supply_demand` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  22. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  23. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_supplier_delivery' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_supplier_delivery` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  24. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  25. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_supplier_risk' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_supplier_risk` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  26. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  27. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_process_outsource_delivery` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  28. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  29. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_material_readiness' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_material_readiness` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  30. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  31. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_material_shortage' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_material_shortage` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  32. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  33. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_qc_trans' AND COLUMN_NAME='factory_id')=0,'ALTER TABLE `dwd_qc_trans` ADD COLUMN `factory_id` BIGINT NOT NULL DEFAULT 1 AFTER `tenant_id`','DO 0');
  34. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  35. -- 全部 MDP 贴源表必须具备 create_time / update_time;补齐已发现的历史漂移。
  36. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_external_row' AND COLUMN_NAME='update_time')=0,'ALTER TABLE `mdp_stg_external_row` ADD COLUMN `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP','DO 0');
  37. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  38. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_ipqc_inspection' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_ipqc_inspection` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  39. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  40. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_ipqc_inspection_detail' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_ipqc_inspection_detail` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  41. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  42. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_outsource_issue' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_outsource_issue` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  43. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  44. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_outsource_issue_detail' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_outsource_issue_detail` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  45. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  46. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_return' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_s4_return` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  47. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  48. SET @sql := IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='mdp_stg_s4_shipment' AND COLUMN_NAME='create_time')=0,'ALTER TABLE `mdp_stg_s4_shipment` ADD COLUMN `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP','DO 0');
  49. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  50. -- 历史上该表的唯一键曾被异常启动流程移除,保留重复快照后按更新时间只留最新版本。
  51. CREATE TABLE IF NOT EXISTS `dwd_supplier_delivery_dup_bak_1_0_350` LIKE `dwd_supplier_delivery`;
  52. INSERT IGNORE INTO `dwd_supplier_delivery_dup_bak_1_0_350`
  53. SELECT old.*
  54. FROM `dwd_supplier_delivery` old
  55. JOIN `dwd_supplier_delivery` newer
  56. ON newer.tenant_id=old.tenant_id
  57. AND newer.factory_id=old.factory_id
  58. AND newer.po_no=old.po_no
  59. AND newer.po_line=old.po_line
  60. AND newer.stat_date=old.stat_date
  61. AND (
  62. newer.update_time>old.update_time
  63. OR (newer.update_time=old.update_time AND newer.calc_time>old.calc_time)
  64. OR (newer.update_time=old.update_time AND newer.calc_time=old.calc_time AND newer.id>old.id)
  65. );
  66. DELETE old
  67. FROM `dwd_supplier_delivery` old
  68. JOIN `dwd_supplier_delivery` newer
  69. ON newer.tenant_id=old.tenant_id
  70. AND newer.factory_id=old.factory_id
  71. AND newer.po_no=old.po_no
  72. AND newer.po_line=old.po_line
  73. AND newer.stat_date=old.stat_date
  74. AND (
  75. newer.update_time>old.update_time
  76. OR (newer.update_time=old.update_time AND newer.calc_time>old.calc_time)
  77. OR (newer.update_time=old.update_time AND newer.calc_time=old.calc_time AND newer.id>old.id)
  78. );
  79. -- 唯一键纳入工厂,避免同一租户不同工厂的同业务键互相覆盖。
  80. ALTER TABLE `mdp_stg_s4_iqc`
  81. DROP INDEX `uk_mdp_stg_s4_iqc`, ADD UNIQUE INDEX `uk_mdp_stg_s4_iqc` (`tenant_id`,`factory_id`,`source_table`,`source_row_id`),
  82. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_table`,`source_biz_key`);
  83. ALTER TABLE `mdp_stg_s4_return`
  84. DROP INDEX `uk_mdp_stg_s4_return`, ADD UNIQUE INDEX `uk_mdp_stg_s4_return` (`tenant_id`,`factory_id`,`source_table`,`source_row_id`),
  85. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_table`,`source_biz_key`);
  86. ALTER TABLE `mdp_stg_s4_shipment`
  87. DROP INDEX `uk_mdp_stg_s4_shipment`, ADD UNIQUE INDEX `uk_mdp_stg_s4_shipment` (`tenant_id`,`factory_id`,`source_table`,`source_row_id`),
  88. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_table`,`source_biz_key`);
  89. ALTER TABLE `mdp_stg_s4_shortage`
  90. DROP INDEX `uk_mdp_stg_s4_shortage`, ADD UNIQUE INDEX `uk_mdp_stg_s4_shortage` (`tenant_id`,`factory_id`,`source_table`,`source_row_id`),
  91. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_table`,`source_biz_key`);
  92. ALTER TABLE `mdp_std_delivery_schedule`
  93. DROP INDEX `uk_delivery_plan`, ADD UNIQUE INDEX `uk_delivery_plan` (`tenant_id`,`factory_id`,`delivery_plan_no`),
  94. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_biz_key`);
  95. ALTER TABLE `mdp_std_delivery_result`
  96. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_biz_key`);
  97. ALTER TABLE `mdp_std_material_readiness`
  98. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_biz_key`);
  99. ALTER TABLE `mdp_std_process_outsource_order`
  100. DROP INDEX `uk_source_key`, ADD UNIQUE INDEX `uk_source_key` (`tenant_id`,`factory_id`,`source_system`,`source_biz_key`);
  101. ALTER TABLE `dwd_supply_demand`
  102. DROP INDEX `uk_demand_stat`, ADD UNIQUE INDEX `uk_demand_stat` (`tenant_id`,`factory_id`,`stat_date`,`demand_no`,`demand_line`);
  103. SET @has_supplier_delivery_uk := (
  104. SELECT COUNT(*) FROM information_schema.STATISTICS
  105. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_supplier_delivery' AND INDEX_NAME='uk_po_line_stat'
  106. );
  107. SET @sql := IF(
  108. @has_supplier_delivery_uk>0,
  109. 'ALTER TABLE `dwd_supplier_delivery` DROP INDEX `uk_po_line_stat`, ADD UNIQUE INDEX `uk_po_line_stat` (`tenant_id`,`factory_id`,`po_no`,`po_line`,`stat_date`)',
  110. 'ALTER TABLE `dwd_supplier_delivery` ADD UNIQUE INDEX `uk_po_line_stat` (`tenant_id`,`factory_id`,`po_no`,`po_line`,`stat_date`)'
  111. );
  112. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  113. ALTER TABLE `dwd_supplier_risk`
  114. DROP INDEX `uk_supplier_risk`, ADD UNIQUE INDEX `uk_supplier_risk` (`tenant_id`,`factory_id`,`stat_date`,`supplier_code`,`item_code`,`risk_type`);
  115. CREATE TABLE IF NOT EXISTS `aidop_migration_derived_cleanup_log` (
  116. `id` BIGINT NOT NULL AUTO_INCREMENT,
  117. `migration_version` VARCHAR(32) NOT NULL,
  118. `table_name` VARCHAR(128) NOT NULL,
  119. `estimated_rows` BIGINT NOT NULL DEFAULT 0,
  120. `data_length` BIGINT NOT NULL DEFAULT 0,
  121. `reason` VARCHAR(500) NOT NULL,
  122. `captured_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  123. PRIMARY KEY (`id`),
  124. UNIQUE KEY `uk_migration_cleanup` (`migration_version`,`table_name`)
  125. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  126. INSERT INTO `aidop_migration_derived_cleanup_log`
  127. (`migration_version`,`table_name`,`estimated_rows`,`data_length`,`reason`)
  128. SELECT '1.0.350','dwd_process_outsource_delivery',IFNULL(TABLE_ROWS,0),IFNULL(DATA_LENGTH,0),
  129. '历史无作用域重算膨胀约 9628 万行;该表为可重建 DWD,清空后由 tenant+factory 作用域重新生成'
  130. FROM information_schema.TABLES
  131. WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='dwd_process_outsource_delivery'
  132. ON DUPLICATE KEY UPDATE reason=VALUES(reason);
  133. TRUNCATE TABLE `dwd_process_outsource_delivery`;
  134. ALTER TABLE `dwd_process_outsource_delivery`
  135. DROP INDEX `uk_work_op_stat`, ADD UNIQUE INDEX `uk_work_op_stat` (`tenant_id`,`factory_id`,`stat_date`,`work_order`,`op_code`,`po_no`,`po_line`);
  136. ALTER TABLE `dwd_material_readiness`
  137. DROP INDEX `uk_work_component_stat`, ADD UNIQUE INDEX `uk_work_component_stat` (`tenant_id`,`factory_id`,`stat_date`,`work_order`,`op_code`,`component_item_code`);
  138. ALTER TABLE `dwd_qc_trans`
  139. DROP INDEX `uk_dwd_qc_trans`, ADD UNIQUE INDEX `uk_dwd_qc_trans` (`tenant_id`,`factory_id`,`trans_date`,`item_code`,`supplier_code`,`batch_no`);
  140. CREATE INDEX `idx_mdp_std_delivery_schedule_scope` ON `mdp_std_delivery_schedule` (`tenant_id`,`factory_id`);
  141. CREATE INDEX `idx_mdp_std_delivery_result_scope` ON `mdp_std_delivery_result` (`tenant_id`,`factory_id`);
  142. CREATE INDEX `idx_mdp_std_material_readiness_scope` ON `mdp_std_material_readiness` (`tenant_id`,`factory_id`);
  143. CREATE INDEX `idx_mdp_std_process_outsource_scope` ON `mdp_std_process_outsource_order` (`tenant_id`,`factory_id`);
  144. CREATE INDEX `idx_dwd_material_shortage_scope` ON `dwd_material_shortage` (`tenant_id`,`factory_id`);