app_id_increment.sql 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. -- =============================================================================
  2. -- 应用域 app_id 增量脚本(MySQL 5.7+)
  3. -- 说明:
  4. -- 1. 新建 sys_app 应用主表,并与历史 magic number(10/20/30…)对齐
  5. -- 2. 为业务表增量添加 app_id 字段(可重复执行)
  6. -- 3. 可选:回填历史数据默认归属「销售」应用 app_id=20
  7. -- 执行前请备份;生产环境建议先在测试库验证
  8. -- =============================================================================
  9. SET NAMES utf8mb4;
  10. -- -----------------------------------------------------------------------------
  11. -- 1. 应用主表 sys_app
  12. -- -----------------------------------------------------------------------------
  13. CREATE TABLE IF NOT EXISTS `sys_app` (
  14. `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键,与 menu.app_id 等 FK 对齐',
  15. `app_code` VARCHAR(64) NOT NULL COMMENT '应用编码,全局唯一',
  16. `app_name` VARCHAR(128) NOT NULL COMMENT '应用名称',
  17. `app_title` VARCHAR(128) DEFAULT NULL COMMENT '前台标题',
  18. `icon` VARCHAR(255) DEFAULT NULL COMMENT '图标',
  19. `home_path` VARCHAR(255) DEFAULT NULL COMMENT '默认首页路由',
  20. `owner_by` BIGINT(20) DEFAULT NULL,
  21. `create_by` BIGINT(20) DEFAULT NULL,
  22. `update_by` BIGINT(20) DEFAULT NULL,
  23. `create_time` DATETIME DEFAULT NULL,
  24. `update_time` DATETIME DEFAULT NULL,
  25. `is_delete` TINYINT(1) DEFAULT 0 COMMENT '0未删除 1已删除',
  26. `enabled` TINYINT(1) DEFAULT 1 COMMENT '1启用 0禁用',
  27. `sort` INT(11) DEFAULT 0,
  28. PRIMARY KEY (`id`),
  29. UNIQUE KEY `uk_sys_app_app_code` (`app_code`)
  30. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统应用主数据';
  31. -- -----------------------------------------------------------------------------
  32. -- 2. 安全加列存储过程(列已存在则跳过)
  33. -- -----------------------------------------------------------------------------
  34. DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
  35. DELIMITER $$
  36. CREATE PROCEDURE `proc_add_column_if_not_exists`(
  37. IN p_table VARCHAR(64),
  38. IN p_column VARCHAR(64),
  39. IN p_ddl TEXT
  40. )
  41. BEGIN
  42. IF NOT EXISTS (
  43. SELECT 1
  44. FROM information_schema.COLUMNS
  45. WHERE TABLE_SCHEMA = DATABASE()
  46. AND TABLE_NAME = p_table
  47. AND COLUMN_NAME = p_column
  48. ) THEN
  49. SET @sql = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN ', p_ddl);
  50. PREPARE stmt FROM @sql;
  51. EXECUTE stmt;
  52. DEALLOCATE PREPARE stmt;
  53. END IF;
  54. END$$
  55. DELIMITER ;
  56. -- menu(多数环境已有 app_id,此处兜底)
  57. CALL proc_add_column_if_not_exists(
  58. 'menu',
  59. 'app_id',
  60. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `pid`'
  61. );
  62. -- 角色
  63. CALL proc_add_column_if_not_exists(
  64. 'role',
  65. 'app_id',
  66. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `remark`'
  67. );
  68. -- AI 提示词模板
  69. CALL proc_add_column_if_not_exists(
  70. 'agent_prompt_template',
  71. 'app_id',
  72. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `template_code`'
  73. );
  74. -- 站内消息记录
  75. CALL proc_add_column_if_not_exists(
  76. 'inside_message_record',
  77. 'app_id',
  78. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `title`'
  79. );
  80. -- 消息模板事件组
  81. CALL proc_add_column_if_not_exists(
  82. 'message_template_event_group',
  83. 'app_id',
  84. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `template_service_name`'
  85. );
  86. -- 消息模板明细
  87. CALL proc_add_column_if_not_exists(
  88. 'message_template_event_detail',
  89. 'app_id',
  90. '`app_id` BIGINT(20) NULL COMMENT ''所属应用 ID,对应 sys_app.id'' AFTER `template_event_id`'
  91. );
  92. DROP PROCEDURE IF EXISTS `proc_add_column_if_not_exists`;
  93. -- -----------------------------------------------------------------------------
  94. -- 3. 索引(不存在则创建)
  95. -- -----------------------------------------------------------------------------
  96. -- role
  97. SET @idx_exists := (
  98. SELECT COUNT(1) FROM information_schema.STATISTICS
  99. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'role' AND INDEX_NAME = 'idx_role_app_id'
  100. );
  101. SET @sql := IF(@idx_exists = 0, 'ALTER TABLE `role` ADD INDEX `idx_role_app_id` (`app_id`)', 'SELECT 1');
  102. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  103. -- agent_prompt_template
  104. SET @idx_exists := (
  105. SELECT COUNT(1) FROM information_schema.STATISTICS
  106. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'agent_prompt_template' AND INDEX_NAME = 'idx_agent_prompt_template_app_id'
  107. );
  108. SET @sql := IF(@idx_exists = 0, 'ALTER TABLE `agent_prompt_template` ADD INDEX `idx_agent_prompt_template_app_id` (`app_id`)', 'SELECT 1');
  109. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  110. -- inside_message_record
  111. SET @idx_exists := (
  112. SELECT COUNT(1) FROM information_schema.STATISTICS
  113. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'inside_message_record' AND INDEX_NAME = 'idx_inside_message_record_app_id'
  114. );
  115. SET @sql := IF(@idx_exists = 0, 'ALTER TABLE `inside_message_record` ADD INDEX `idx_inside_message_record_app_id` (`app_id`)', 'SELECT 1');
  116. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  117. -- message_template_event_group
  118. SET @idx_exists := (
  119. SELECT COUNT(1) FROM information_schema.STATISTICS
  120. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'message_template_event_group' AND INDEX_NAME = 'idx_msg_tpl_group_app_id'
  121. );
  122. SET @sql := IF(@idx_exists = 0, 'ALTER TABLE `message_template_event_group` ADD INDEX `idx_msg_tpl_group_app_id` (`app_id`)', 'SELECT 1');
  123. PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  124. -- -----------------------------------------------------------------------------
  125. -- 4. 初始化 sys_app(与历史 magic number 对齐,id 固定便于 menu.app_id 引用)
  126. -- -----------------------------------------------------------------------------
  127. SET @OLD_SQL_MODE = @@SQL_MODE;
  128. SET SESSION sql_mode = CONCAT(IFNULL(@@SQL_MODE, ''), ',NO_AUTO_VALUE_ON_ZERO');
  129. INSERT INTO `sys_app` (`id`, `app_code`, `app_name`, `app_title`, `home_path`, `enabled`, `sort`, `is_delete`, `create_time`)
  130. VALUES
  131. (0, 'main', '主应用', '主应用', NULL, 1, 0, 0, NOW()),
  132. (10, 'trade', '智能贸易', '智能贸易', NULL, 1, 10, 0, NOW()),
  133. (20, 'sales', '销售', '销售', NULL, 1, 20, 0, NOW()),
  134. (30, 'otr', 'OTR', 'OTR', NULL, 1, 30, 0, NOW()),
  135. (40, 'payroll', '工资', '工资', NULL, 1, 40, 0, NOW()),
  136. (50, 'project', '项目', '项目', NULL, 1, 50, 0, NOW()),
  137. (60, 'warehouse', '领存平台', '领存平台', NULL, 1, 60, 0, NOW())
  138. ON DUPLICATE KEY UPDATE
  139. `app_name` = VALUES(`app_name`),
  140. `app_title` = VALUES(`app_title`),
  141. `enabled` = VALUES(`enabled`),
  142. `sort` = VALUES(`sort`),
  143. `update_time`= NOW();
  144. SET SESSION sql_mode = @OLD_SQL_MODE;
  145. -- -----------------------------------------------------------------------------
  146. -- 5. 历史数据回填(按需执行,默认归到销售 app_id=20)
  147. -- 若 menu 已有 app_id 可不执行第一条
  148. -- -----------------------------------------------------------------------------
  149. -- UPDATE `menu` SET `app_id` = 20 WHERE `app_id` IS NULL;
  150. UPDATE `inside_message_record`
  151. SET `app_id` = 20
  152. WHERE `app_id` IS NULL;
  153. UPDATE `message_template_event_group`
  154. SET `app_id` = 20
  155. WHERE `app_id` IS NULL;
  156. UPDATE `message_template_event_detail` d
  157. INNER JOIN `message_template_event_group` g ON g.id = d.template_event_id
  158. SET d.`app_id` = g.`app_id`
  159. WHERE d.`app_id` IS NULL AND g.`app_id` IS NOT NULL;
  160. -- 角色、提示词模板:无历史 app 归属时可默认 20,或按业务自行 UPDATE
  161. -- UPDATE `role` SET `app_id` = 20 WHERE `app_id` IS NULL;
  162. -- UPDATE `agent_prompt_template` SET `app_id` = 20 WHERE `app_id` IS NULL;
  163. -- =============================================================================
  164. -- 验证
  165. -- SELECT id, app_code, app_name FROM sys_app ORDER BY sort;
  166. -- SHOW COLUMNS FROM inside_message_record LIKE 'app_id';
  167. -- =============================================================================