add_all_tenant_id_fields.sql 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. -- ========================================================================
  2. -- 完整的租户ID字段迁移脚本(包含所有业务表)
  3. -- 生成时间:2026-04-22
  4. -- 适用于:MySQL 5.7+ / 8.0+
  5. -- 包含:Order、WorkOrder、Production 模块的所有业务表
  6. -- ========================================================================
  7. USE aidopdev;
  8. -- ========================================================================
  9. -- 第一部分:Order 模块业务表
  10. -- ========================================================================
  11. -- 1. 合同评审主表
  12. SET @sql = (SELECT IF(
  13. COUNT(*) = 0,
  14. 'ALTER TABLE ado_contract_review ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  15. 'SELECT ''ado_contract_review.tenant_id already exists'' AS info'
  16. ) FROM INFORMATION_SCHEMA.COLUMNS
  17. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ado_contract_review' AND COLUMN_NAME = 'tenant_id');
  18. PREPARE stmt FROM @sql;
  19. EXECUTE stmt;
  20. DEALLOCATE PREPARE stmt;
  21. -- 2. 合同评审流程节点表
  22. SET @sql = (SELECT IF(
  23. COUNT(*) = 0,
  24. 'ALTER TABLE ado_contract_review_flow ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  25. 'SELECT ''ado_contract_review_flow.tenant_id already exists'' AS info'
  26. ) FROM INFORMATION_SCHEMA.COLUMNS
  27. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ado_contract_review_flow' AND COLUMN_NAME = 'tenant_id');
  28. PREPARE stmt FROM @sql;
  29. EXECUTE stmt;
  30. DEALLOCATE PREPARE stmt;
  31. -- 3. 计划联动看板
  32. SET @sql = (SELECT IF(
  33. COUNT(*) = 0,
  34. 'ALTER TABLE LinkagePlan ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  35. 'SELECT ''LinkagePlan.tenant_id already exists'' AS info'
  36. ) FROM INFORMATION_SCHEMA.COLUMNS
  37. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'LinkagePlan' AND COLUMN_NAME = 'tenant_id');
  38. PREPARE stmt FROM @sql;
  39. EXECUTE stmt;
  40. DEALLOCATE PREPARE stmt;
  41. -- 4. 产品设计主表
  42. SET @sql = (SELECT IF(
  43. COUNT(*) = 0,
  44. 'ALTER TABLE ProductDesign ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  45. 'SELECT ''ProductDesign.tenant_id already exists'' AS info'
  46. ) FROM INFORMATION_SCHEMA.COLUMNS
  47. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ProductDesign' AND COLUMN_NAME = 'tenant_id');
  48. PREPARE stmt FROM @sql;
  49. EXECUTE stmt;
  50. DEALLOCATE PREPARE stmt;
  51. -- 5. 产品设计BOM表
  52. SET @sql = (SELECT IF(
  53. COUNT(*) = 0,
  54. 'ALTER TABLE ProductDesignBom ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  55. 'SELECT ''ProductDesignBom.tenant_id already exists'' AS info'
  56. ) FROM INFORMATION_SCHEMA.COLUMNS
  57. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ProductDesignBom' AND COLUMN_NAME = 'tenant_id');
  58. PREPARE stmt FROM @sql;
  59. EXECUTE stmt;
  60. DEALLOCATE PREPARE stmt;
  61. -- 6. 产品设计工艺表
  62. SET @sql = (SELECT IF(
  63. COUNT(*) = 0,
  64. 'ALTER TABLE ProductDesignRouting ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  65. 'SELECT ''ProductDesignRouting.tenant_id already exists'' AS info'
  66. ) FROM INFORMATION_SCHEMA.COLUMNS
  67. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ProductDesignRouting' AND COLUMN_NAME = 'tenant_id');
  68. PREPARE stmt FROM @sql;
  69. EXECUTE stmt;
  70. DEALLOCATE PREPARE stmt;
  71. -- 7. 销售订单明细表
  72. SET @sql = (SELECT IF(
  73. COUNT(*) = 0,
  74. 'ALTER TABLE crm_seorderentry ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  75. 'SELECT ''crm_seorderentry.tenant_id already exists'' AS info'
  76. ) FROM INFORMATION_SCHEMA.COLUMNS
  77. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'crm_seorderentry' AND COLUMN_NAME = 'tenant_id');
  78. PREPARE stmt FROM @sql;
  79. EXECUTE stmt;
  80. DEALLOCATE PREPARE stmt;
  81. -- 8. 发货计划主表
  82. SET @sql = (SELECT IF(
  83. COUNT(*) = 0,
  84. 'ALTER TABLE ShippingPlan ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  85. 'SELECT ''ShippingPlan.tenant_id already exists'' AS info'
  86. ) FROM INFORMATION_SCHEMA.COLUMNS
  87. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ShippingPlan' AND COLUMN_NAME = 'tenant_id');
  88. PREPARE stmt FROM @sql;
  89. EXECUTE stmt;
  90. DEALLOCATE PREPARE stmt;
  91. -- 9. 发货计划明细表
  92. SET @sql = (SELECT IF(
  93. COUNT(*) = 0,
  94. 'ALTER TABLE ShippingPlanDetail ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  95. 'SELECT ''ShippingPlanDetail.tenant_id already exists'' AS info'
  96. ) FROM INFORMATION_SCHEMA.COLUMNS
  97. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ShippingPlanDetail' AND COLUMN_NAME = 'tenant_id');
  98. PREPARE stmt FROM @sql;
  99. EXECUTE stmt;
  100. DEALLOCATE PREPARE stmt;
  101. -- 10. ASN发货单主表
  102. SET @sql = (SELECT IF(
  103. COUNT(*) = 0,
  104. 'ALTER TABLE AsnShipperMaster ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  105. 'SELECT ''AsnShipperMaster.tenant_id already exists'' AS info'
  106. ) FROM INFORMATION_SCHEMA.COLUMNS
  107. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'AsnShipperMaster' AND COLUMN_NAME = 'tenant_id');
  108. PREPARE stmt FROM @sql;
  109. EXECUTE stmt;
  110. DEALLOCATE PREPARE stmt;
  111. -- 11. ASN发货单明细表
  112. SET @sql = (SELECT IF(
  113. COUNT(*) = 0,
  114. 'ALTER TABLE AsnShipperDetail ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  115. 'SELECT ''AsnShipperDetail.tenant_id already exists'' AS info'
  116. ) FROM INFORMATION_SCHEMA.COLUMNS
  117. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'AsnShipperDetail' AND COLUMN_NAME = 'tenant_id');
  118. PREPARE stmt FROM @sql;
  119. EXECUTE stmt;
  120. DEALLOCATE PREPARE stmt;
  121. -- ========================================================================
  122. -- 第二部分:WorkOrder 模块业务表
  123. -- ========================================================================
  124. -- 12. 工单主数据
  125. SET @sql = (SELECT IF(
  126. COUNT(*) = 0,
  127. 'ALTER TABLE WorkOrdMaster ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  128. 'SELECT ''WorkOrdMaster.tenant_id already exists'' AS info'
  129. ) FROM INFORMATION_SCHEMA.COLUMNS
  130. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'WorkOrdMaster' AND COLUMN_NAME = 'tenant_id');
  131. PREPARE stmt FROM @sql;
  132. EXECUTE stmt;
  133. DEALLOCATE PREPARE stmt;
  134. -- 13. 工单物料明细
  135. SET @sql = (SELECT IF(
  136. COUNT(*) = 0,
  137. 'ALTER TABLE WorkOrdDetail ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  138. 'SELECT ''WorkOrdDetail.tenant_id already exists'' AS info'
  139. ) FROM INFORMATION_SCHEMA.COLUMNS
  140. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'WorkOrdDetail' AND COLUMN_NAME = 'tenant_id');
  141. PREPARE stmt FROM @sql;
  142. EXECUTE stmt;
  143. DEALLOCATE PREPARE stmt;
  144. -- 14. 工单工序表
  145. SET @sql = (SELECT IF(
  146. COUNT(*) = 0,
  147. 'ALTER TABLE WorkOrdRouting ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  148. 'SELECT ''WorkOrdRouting.tenant_id already exists'' AS info'
  149. ) FROM INFORMATION_SCHEMA.COLUMNS
  150. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'WorkOrdRouting' AND COLUMN_NAME = 'tenant_id');
  151. PREPARE stmt FROM @sql;
  152. EXECUTE stmt;
  153. DEALLOCATE PREPARE stmt;
  154. -- 15. 工单附属表
  155. SET @sql = (SELECT IF(
  156. COUNT(*) = 0,
  157. 'ALTER TABLE mes_moentry ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  158. 'SELECT ''mes_moentry.tenant_id already exists'' AS info'
  159. ) FROM INFORMATION_SCHEMA.COLUMNS
  160. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'mes_moentry' AND COLUMN_NAME = 'tenant_id');
  161. PREPARE stmt FROM @sql;
  162. EXECUTE stmt;
  163. DEALLOCATE PREPARE stmt;
  164. -- ========================================================================
  165. -- 第三部分:Production 模块业务表
  166. -- ========================================================================
  167. -- 16. 排产异常日志
  168. SET @sql = (SELECT IF(
  169. COUNT(*) = 0,
  170. 'ALTER TABLE ScheduleExceptionMaster ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  171. 'SELECT ''ScheduleExceptionMaster.tenant_id already exists'' AS info'
  172. ) FROM INFORMATION_SCHEMA.COLUMNS
  173. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ScheduleExceptionMaster' AND COLUMN_NAME = 'tenant_id');
  174. PREPARE stmt FROM @sql;
  175. EXECUTE stmt;
  176. DEALLOCATE PREPARE stmt;
  177. -- 17. 工序间衔接
  178. SET @sql = (SELECT IF(
  179. COUNT(*) = 0,
  180. 'ALTER TABLE PeriodSequenceDet ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  181. 'SELECT ''PeriodSequenceDet.tenant_id already exists'' AS info'
  182. ) FROM INFORMATION_SCHEMA.COLUMNS
  183. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'PeriodSequenceDet' AND COLUMN_NAME = 'tenant_id');
  184. PREPARE stmt FROM @sql;
  185. EXECUTE stmt;
  186. DEALLOCATE PREPARE stmt;
  187. -- 18. 排产结果
  188. SET @sql = (SELECT IF(
  189. COUNT(*) = 0,
  190. 'ALTER TABLE ScheduleResultOpMaster ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  191. 'SELECT ''ScheduleResultOpMaster.tenant_id already exists'' AS info'
  192. ) FROM INFORMATION_SCHEMA.COLUMNS
  193. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ScheduleResultOpMaster' AND COLUMN_NAME = 'tenant_id');
  194. PREPARE stmt FROM @sql;
  195. EXECUTE stmt;
  196. DEALLOCATE PREPARE stmt;
  197. -- 19. 产线工作日历表
  198. SET @sql = (SELECT IF(
  199. COUNT(*) = 0,
  200. 'ALTER TABLE ShopCalendarWorkCtr ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  201. 'SELECT ''ShopCalendarWorkCtr.tenant_id already exists'' AS info'
  202. ) FROM INFORMATION_SCHEMA.COLUMNS
  203. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ShopCalendarWorkCtr' AND COLUMN_NAME = 'tenant_id');
  204. PREPARE stmt FROM @sql;
  205. EXECUTE stmt;
  206. DEALLOCATE PREPARE stmt;
  207. -- 20. 产线休息时间表
  208. SET @sql = (SELECT IF(
  209. COUNT(*) = 0,
  210. 'ALTER TABLE QualityLineWorkDetail ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  211. 'SELECT ''QualityLineWorkDetail.tenant_id already exists'' AS info'
  212. ) FROM INFORMATION_SCHEMA.COLUMNS
  213. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'QualityLineWorkDetail' AND COLUMN_NAME = 'tenant_id');
  214. PREPARE stmt FROM @sql;
  215. EXECUTE stmt;
  216. DEALLOCATE PREPARE stmt;
  217. -- 21. 产线节假日表
  218. SET @sql = (SELECT IF(
  219. COUNT(*) = 0,
  220. 'ALTER TABLE HolidayMaster ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  221. 'SELECT ''HolidayMaster.tenant_id already exists'' AS info'
  222. ) FROM INFORMATION_SCHEMA.COLUMNS
  223. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'HolidayMaster' AND COLUMN_NAME = 'tenant_id');
  224. PREPARE stmt FROM @sql;
  225. EXECUTE stmt;
  226. DEALLOCATE PREPARE stmt;
  227. -- 22. 产线加班表
  228. SET @sql = (SELECT IF(
  229. COUNT(*) = 0,
  230. 'ALTER TABLE ResourceOccupancyTime ADD COLUMN tenant_id BIGINT NULL COMMENT ''租户ID(多租户隔离)''',
  231. 'SELECT ''ResourceOccupancyTime.tenant_id already exists'' AS info'
  232. ) FROM INFORMATION_SCHEMA.COLUMNS
  233. WHERE TABLE_SCHEMA = 'aidopdev' AND TABLE_NAME = 'ResourceOccupancyTime' AND COLUMN_NAME = 'tenant_id');
  234. PREPARE stmt FROM @sql;
  235. EXECUTE stmt;
  236. DEALLOCATE PREPARE stmt;
  237. -- ========================================================================
  238. -- 第四部分:创建租户ID索引(提升查询性能)
  239. -- ========================================================================
  240. -- Order 模块索引
  241. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ado_contract_review(tenant_id);
  242. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ado_contract_review_flow(tenant_id);
  243. CREATE INDEX IF NOT EXISTS idx_tenant_id ON LinkagePlan(tenant_id);
  244. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ProductDesign(tenant_id);
  245. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ProductDesignBom(tenant_id);
  246. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ProductDesignRouting(tenant_id);
  247. CREATE INDEX IF NOT EXISTS idx_tenant_id ON crm_seorder(tenant_id);
  248. CREATE INDEX IF NOT EXISTS idx_tenant_id ON crm_seorderentry(tenant_id);
  249. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ShippingPlan(tenant_id);
  250. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ShippingPlanDetail(tenant_id);
  251. CREATE INDEX IF NOT EXISTS idx_tenant_id ON AsnShipperMaster(tenant_id);
  252. CREATE INDEX IF NOT EXISTS idx_tenant_id ON AsnShipperDetail(tenant_id);
  253. -- WorkOrder 模块索引
  254. CREATE INDEX IF NOT EXISTS idx_tenant_id ON WorkOrdMaster(tenant_id);
  255. CREATE INDEX IF NOT EXISTS idx_tenant_id ON WorkOrdDetail(tenant_id);
  256. CREATE INDEX IF NOT EXISTS idx_tenant_id ON WorkOrdRouting(tenant_id);
  257. CREATE INDEX IF NOT EXISTS idx_tenant_id ON mes_morder(tenant_id);
  258. CREATE INDEX IF NOT EXISTS idx_tenant_id ON mes_moentry(tenant_id);
  259. -- Production 模块索引
  260. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ScheduleExceptionMaster(tenant_id);
  261. CREATE INDEX IF NOT EXISTS idx_tenant_id ON PeriodSequenceDet(tenant_id);
  262. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ScheduleResultOpMaster(tenant_id);
  263. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ShopCalendarWorkCtr(tenant_id);
  264. CREATE INDEX IF NOT EXISTS idx_tenant_id ON QualityLineWorkDetail(tenant_id);
  265. CREATE INDEX IF NOT EXISTS idx_tenant_id ON HolidayMaster(tenant_id);
  266. CREATE INDEX IF NOT EXISTS idx_tenant_id ON ResourceOccupancyTime(tenant_id);
  267. -- ========================================================================
  268. -- 第五部分:验证结果
  269. -- ========================================================================
  270. SELECT '================ 租户ID字段检查 ================' AS 检查项;
  271. SELECT
  272. TABLE_NAME AS 表名,
  273. COLUMN_NAME AS 字段名,
  274. COLUMN_TYPE AS 字段类型,
  275. IS_NULLABLE AS 是否可空,
  276. COLUMN_COMMENT AS 注释
  277. FROM INFORMATION_SCHEMA.COLUMNS
  278. WHERE TABLE_SCHEMA = 'aidopdev'
  279. AND COLUMN_NAME = 'tenant_id'
  280. ORDER BY TABLE_NAME;
  281. SELECT '================ 租户ID索引检查 ================' AS 检查项;
  282. SELECT
  283. TABLE_NAME AS 表名,
  284. INDEX_NAME AS 索引名,
  285. COLUMN_NAME AS 字段名,
  286. NON_UNIQUE AS 非唯一
  287. FROM INFORMATION_SCHEMA.STATISTICS
  288. WHERE TABLE_SCHEMA = 'aidopdev'
  289. AND COLUMN_NAME = 'tenant_id'
  290. AND INDEX_NAME = 'idx_tenant_id'
  291. ORDER BY TABLE_NAME;
  292. -- ========================================================================
  293. -- 完成!
  294. -- ========================================================================
  295. SELECT '✅ 所有业务表 tenant_id 字段添加完成!' AS 状态;
  296. SELECT CONCAT('共添加 ', COUNT(DISTINCT TABLE_NAME), ' 张表的 tenant_id 字段') AS 统计
  297. FROM INFORMATION_SCHEMA.COLUMNS
  298. WHERE TABLE_SCHEMA = 'aidopdev'
  299. AND COLUMN_NAME = 'tenant_id';