2026-05-10_s3_mdp_foundation_config.sql 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. -- S3 first batch MDP foundation and entity configuration for aidopdev.
  2. -- This script creates common MDP configuration/log tables and registers S3 first batch entities.
  3. -- It intentionally does not store database passwords.
  4. SET @tenant_id := 0;
  5. SET @source_code := 'AIDOPDEV_MYSQL';
  6. CREATE TABLE IF NOT EXISTS mdp_source (
  7. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  8. tenant_id BIGINT NOT NULL,
  9. source_code VARCHAR(50) NOT NULL,
  10. source_name VARCHAR(100) NOT NULL,
  11. source_type ENUM('DB','API') NOT NULL,
  12. status TINYINT DEFAULT 1,
  13. db_type ENUM('MySQL','SQLServer','Oracle','PostgreSQL'),
  14. db_host VARCHAR(200),
  15. db_port INT,
  16. db_name VARCHAR(100),
  17. db_user VARCHAR(100),
  18. db_password_enc VARCHAR(500),
  19. db_extra_params VARCHAR(500),
  20. api_base_url VARCHAR(500),
  21. api_auth_type ENUM('NONE','TOKEN','OAUTH2','APIKEY'),
  22. api_auth_config JSON,
  23. last_health_check DATETIME,
  24. health_status TINYINT DEFAULT 0,
  25. health_msg VARCHAR(500),
  26. remark VARCHAR(500),
  27. create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  28. update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  29. UNIQUE KEY uk_tenant_source (tenant_id, source_code)
  30. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MDP数据源配置';
  31. CREATE TABLE IF NOT EXISTS mdp_entity (
  32. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  33. tenant_id BIGINT NOT NULL,
  34. source_id BIGINT NOT NULL,
  35. entity_code VARCHAR(100) NOT NULL,
  36. entity_name VARCHAR(200) NOT NULL,
  37. entity_type ENUM('TABLE','VIEW','API') NOT NULL DEFAULT 'TABLE',
  38. source_table_name VARCHAR(200),
  39. source_api_path VARCHAR(500),
  40. api_config_id BIGINT,
  41. target_table_name VARCHAR(200),
  42. sync_mode ENUM('FULL','INCR','CDC','PAGE','CURSOR','TIME_WINDOW','NONE') DEFAULT 'INCR',
  43. incr_column VARCHAR(100),
  44. batch_size INT DEFAULT 5000,
  45. response_data_path VARCHAR(200),
  46. dedup_key_path VARCHAR(200),
  47. last_cursor VARCHAR(500),
  48. last_sync_to DATETIME,
  49. job_id VARCHAR(100),
  50. status TINYINT DEFAULT 1,
  51. remark VARCHAR(500),
  52. create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  53. update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  54. UNIQUE KEY uk_tenant_entity (tenant_id, entity_code),
  55. KEY idx_source (source_id),
  56. KEY idx_api_config (api_config_id)
  57. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MDP同步实体配置';
  58. CREATE TABLE IF NOT EXISTS mdp_field_mapping (
  59. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  60. entity_id BIGINT NOT NULL,
  61. source_field VARCHAR(200) NOT NULL,
  62. target_field VARCHAR(200) NOT NULL,
  63. field_type ENUM('DIRECT','JSONPATH','SCRIPT','CONST','LOOKUP') DEFAULT 'DIRECT',
  64. transform_script TEXT,
  65. const_value VARCHAR(500),
  66. lookup_table VARCHAR(200),
  67. is_required TINYINT DEFAULT 0,
  68. default_value VARCHAR(500),
  69. sort_order INT DEFAULT 0,
  70. create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  71. UNIQUE KEY uk_entity_field (entity_id, target_field)
  72. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MDP字段映射配置';
  73. CREATE TABLE IF NOT EXISTS mdp_sync_log (
  74. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  75. tenant_id BIGINT NOT NULL,
  76. entity_id BIGINT NOT NULL,
  77. source_code VARCHAR(50) NOT NULL,
  78. entity_name VARCHAR(200),
  79. sync_batch_id VARCHAR(50) NOT NULL,
  80. sync_type ENUM('FULL','INCR') NOT NULL,
  81. trigger_type ENUM('AUTO','MANUAL') DEFAULT 'AUTO',
  82. sync_start DATETIME,
  83. sync_end DATETIME,
  84. duration_ms INT,
  85. rows_read BIGINT DEFAULT 0,
  86. rows_insert BIGINT DEFAULT 0,
  87. rows_update BIGINT DEFAULT 0,
  88. rows_skip BIGINT DEFAULT 0,
  89. rows_error BIGINT DEFAULT 0,
  90. status ENUM('RUNNING','SUCCESS','PARTIAL','FAILED') DEFAULT 'RUNNING',
  91. error_msg TEXT,
  92. error_sample JSON,
  93. KEY idx_tenant_entity_time (tenant_id, entity_id, sync_start),
  94. KEY idx_batch (sync_batch_id),
  95. KEY idx_status (status)
  96. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='MDP同步执行日志';
  97. INSERT INTO mdp_source
  98. (tenant_id, source_code, source_name, source_type, status, db_type, db_host, db_port, db_name, db_user, db_password_enc, remark)
  99. VALUES
  100. (@tenant_id, @source_code, 'aidopdev 当前项目库', 'DB', 1, 'MySQL', NULL, 3306, 'aidopdev', NULL, NULL, 'S3供应协同首批迁移试点数据源,不在配置表保存明文密码')
  101. ON DUPLICATE KEY UPDATE
  102. source_name = VALUES(source_name),
  103. source_type = VALUES(source_type),
  104. status = VALUES(status),
  105. db_type = VALUES(db_type),
  106. db_port = VALUES(db_port),
  107. db_name = VALUES(db_name),
  108. remark = VALUES(remark),
  109. update_time = CURRENT_TIMESTAMP;
  110. SELECT @source_id := id
  111. FROM mdp_source
  112. WHERE tenant_id = @tenant_id
  113. AND source_code = @source_code
  114. LIMIT 1;
  115. CREATE TEMPORARY TABLE tmp_s3_mdp_entity (
  116. entity_code VARCHAR(100) PRIMARY KEY,
  117. entity_name VARCHAR(200) NOT NULL,
  118. source_table_name VARCHAR(200) NOT NULL,
  119. target_table_name VARCHAR(200) NOT NULL,
  120. sync_mode VARCHAR(20) NOT NULL,
  121. incr_column VARCHAR(100) NULL,
  122. source_row_id_expr VARCHAR(200) NULL,
  123. source_biz_key_expr VARCHAR(500) NOT NULL,
  124. remark VARCHAR(500) NULL
  125. );
  126. INSERT INTO tmp_s3_mdp_entity
  127. (entity_code, entity_name, source_table_name, target_table_name, sync_mode, incr_column, source_row_id_expr, source_biz_key_expr, remark)
  128. VALUES
  129. ('S3_SUPPLIER', 'S3供应商', 'SuppMaster', 'mdp_stg_supplier', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', Supp)', '供应商主数据,有样本'),
  130. ('S3_CONSIGNEE_SUPPLIER', 'S3供应商地址/补充', 'ConsigneeAddressMaster', 'mdp_stg_supplier', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', Address)', '供应商地址补充,业务键待后续实数校验'),
  131. ('S3_ITEM_ERP', 'S3旧式物料', 'ItemMaster', 'mdp_stg_item', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', ItemNum)', '旧式物料主数据,有样本'),
  132. ('S3_ITEM_NEW', 'S3新物料', 'ic_item', 'mdp_stg_item', 'INCR', 'update_time', 'Id', 'CONCAT(tenant_id, '':'', number)', '新物料主数据,有样本'),
  133. ('S3_SOURCE_LIST', 'S3货源清单', 'srm_purchase', 'mdp_stg_source_list', 'INCR', 'update_time', 'Id', 'CONCAT(number, '':'', supplier_number)', '货源清单,有样本'),
  134. ('S3_SUPPLY_DEMAND', 'S3物料需求计划', 'ic_demandschedule', 'mdp_stg_supply_demand', 'INCR', 'update_time', 'Id', 'CAST(Id AS CHAR)', '当前可为空,空表同步应视为成功'),
  135. ('S3_PURCHASE_REQUEST', 'S3采购申请', 'srm_pr_main', 'mdp_stg_supply_demand', 'INCR', 'update_time', 'Id', 'COALESCE(pr_billno, CAST(Id AS CHAR))', '当前可为空,空表同步应视为成功'),
  136. ('S3_PURCHASE_ORDER_MASTER', 'S3采购订单主表', 'PurOrdMaster', 'mdp_stg_purchase_order', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', PurOrd)', '已有生成验证样本'),
  137. ('S3_PURCHASE_ORDER_DETAIL', 'S3采购订单明细', 'PurOrdDetail', 'mdp_stg_purchase_order', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', PurOrd, '':'', Line)', '已有生成验证样本'),
  138. ('S3_DELIVERY_PLAN', 'S3交货计划', 'srm_polist_ds', 'mdp_stg_delivery', 'INCR', 'updatetime', 'Id', 'dsnum', '已有生成验证样本'),
  139. ('S3_SHIPPER_MASTER', 'S3送货单主表', 'scm_shd', 'mdp_stg_delivery', 'FULL', NULL, 'id', 'COALESCE(shddh, CAST(id AS CHAR))', '当前可为空,空表同步应视为成功'),
  140. ('S3_SHIPPER_DETAIL', 'S3送货单明细', 'scm_shdzb', 'mdp_stg_delivery', 'FULL', NULL, 'id', 'CONCAT(glid, '':'', id)', '当前可为空,空表同步应视为成功'),
  141. ('S3_RECEIPT_MASTER', 'S3收货主表', 'PurOrdRctMaster', 'mdp_stg_receipt', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', Receiver)', '当前可为空,业务键待后续实数校验'),
  142. ('S3_RECEIPT_DETAIL', 'S3收货明细', 'PurOrdRctDetail', 'mdp_stg_receipt', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', Receiver, '':'', Line)', '当前可为空,业务键待后续实数校验'),
  143. ('S3_WORK_ORDER_MASTER', 'S3工单主表', 'WorkOrdMaster', 'mdp_stg_work_order_material', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', WorkOrd)', '有少量样本'),
  144. ('S3_WORK_ORDER_DETAIL', 'S3工单组件', 'WorkOrdDetail', 'mdp_stg_work_order_material', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', WorkOrd, '':'', Op, '':'', ItemNum)', '有少量样本'),
  145. ('S3_WORK_ORDER_ROUTING', 'S3工单工序', 'WorkOrdRouting', 'mdp_stg_work_order_material', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', WorkOrd, '':'', OP)', '有少量样本'),
  146. ('S3_ROUTING_OUTSOURCE', 'S3工序外协配置', 'RoutingOpDetail', 'mdp_stg_work_order_material', 'INCR', 'UpdatedAt', 'RecID', 'CONCAT(Domain, '':'', RoutingCode, '':'', Op, '':'', SupplierCode)', '工序外协供应商口径使用 SupplierCode'),
  147. ('S3_INVENTORY', 'S3库存', 'InvMaster', 'mdp_stg_work_order_material', 'INCR', 'UpdateTime', 'RecID', 'CONCAT(Domain, '':'', ItemNum, '':'', Location)', '有少量样本');
  148. INSERT INTO mdp_entity
  149. (tenant_id, source_id, entity_code, entity_name, entity_type, source_table_name, target_table_name, sync_mode, incr_column, batch_size, status, remark)
  150. SELECT
  151. @tenant_id,
  152. @source_id,
  153. entity_code,
  154. entity_name,
  155. 'TABLE',
  156. source_table_name,
  157. target_table_name,
  158. sync_mode,
  159. incr_column,
  160. 5000,
  161. 1,
  162. remark
  163. FROM tmp_s3_mdp_entity
  164. ON DUPLICATE KEY UPDATE
  165. source_id = VALUES(source_id),
  166. entity_name = VALUES(entity_name),
  167. entity_type = VALUES(entity_type),
  168. source_table_name = VALUES(source_table_name),
  169. target_table_name = VALUES(target_table_name),
  170. sync_mode = VALUES(sync_mode),
  171. incr_column = VALUES(incr_column),
  172. batch_size = VALUES(batch_size),
  173. status = VALUES(status),
  174. remark = VALUES(remark),
  175. update_time = CURRENT_TIMESTAMP;
  176. INSERT INTO mdp_field_mapping
  177. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  178. SELECT e.id, 'tenant_id', 'tenant_id', 'DIRECT', NULL, NULL, 0, 10
  179. FROM mdp_entity e
  180. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  181. WHERE e.tenant_id = @tenant_id
  182. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), sort_order=VALUES(sort_order);
  183. INSERT INTO mdp_field_mapping
  184. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  185. SELECT e.id, 'CONST:AIDOP', 'source_system', 'CONST', NULL, 'AIDOP', 1, 20
  186. FROM mdp_entity e
  187. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  188. WHERE e.tenant_id = @tenant_id
  189. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), const_value=VALUES(const_value), is_required=VALUES(is_required), sort_order=VALUES(sort_order);
  190. INSERT INTO mdp_field_mapping
  191. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  192. SELECT e.id, CONCAT('CONST:', t.source_table_name), 'source_table', 'CONST', NULL, t.source_table_name, 1, 30
  193. FROM mdp_entity e
  194. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  195. WHERE e.tenant_id = @tenant_id
  196. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), const_value=VALUES(const_value), is_required=VALUES(is_required), sort_order=VALUES(sort_order);
  197. INSERT INTO mdp_field_mapping
  198. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  199. SELECT e.id, IFNULL(t.source_row_id_expr, ''), 'source_row_id', 'SCRIPT', t.source_row_id_expr, NULL, 0, 40
  200. FROM mdp_entity e
  201. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  202. WHERE e.tenant_id = @tenant_id
  203. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), transform_script=VALUES(transform_script), sort_order=VALUES(sort_order);
  204. INSERT INTO mdp_field_mapping
  205. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  206. SELECT e.id, t.source_biz_key_expr, 'source_biz_key', 'SCRIPT', t.source_biz_key_expr, NULL, 1, 50
  207. FROM mdp_entity e
  208. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  209. WHERE e.tenant_id = @tenant_id
  210. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), transform_script=VALUES(transform_script), is_required=VALUES(is_required), sort_order=VALUES(sort_order);
  211. INSERT INTO mdp_field_mapping
  212. (entity_id, source_field, target_field, field_type, transform_script, const_value, is_required, sort_order)
  213. SELECT e.id, 'TO_JSON(row)', 'raw_data', 'SCRIPT', 'TO_JSON(row)', NULL, 0, 60
  214. FROM mdp_entity e
  215. JOIN tmp_s3_mdp_entity t ON e.entity_code = t.entity_code
  216. WHERE e.tenant_id = @tenant_id
  217. ON DUPLICATE KEY UPDATE source_field=VALUES(source_field), field_type=VALUES(field_type), transform_script=VALUES(transform_script), sort_order=VALUES(sort_order);
  218. DROP TEMPORARY TABLE tmp_s3_mdp_entity;