add_sms_device.sql 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. -- ============================================================
  2. -- 设备管理改造 - 数据库变更脚本
  3. -- 1. 新建 company_sms_device 表
  4. -- 2. company_sms_card 新增 device_id + slot_index
  5. -- 3. 数据迁移: 从 card 表提取设备数据
  6. -- 4. company_sms_card_middleware 新增 tenant_id
  7. -- ============================================================
  8. -- ========== 1. 新建设备表 ==========
  9. CREATE TABLE IF NOT EXISTS `company_sms_device` (
  10. `device_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '设备ID',
  11. `tenant_id` BIGINT NOT NULL COMMENT '所属租户',
  12. `company_user_id` BIGINT DEFAULT NULL COMMENT '绑定销售用户ID(NULL=未分配)',
  13. `device_name` VARCHAR(100) DEFAULT NULL COMMENT '设备名称',
  14. `imei` VARCHAR(50) NOT NULL COMMENT 'IMEI(唯一标识)',
  15. `app_version` VARCHAR(30) DEFAULT NULL COMMENT 'APP版本',
  16. `middleware_id` BIGINT DEFAULT NULL COMMENT '关联中间件ID',
  17. `last_heartbeat` DATETIME DEFAULT NULL COMMENT '最后心跳时间',
  18. `status` TINYINT DEFAULT 0 COMMENT '0离线/1在线/2禁用',
  19. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  20. `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  21. `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  22. PRIMARY KEY (`device_id`),
  23. UNIQUE KEY `uk_imei` (`imei`),
  24. KEY `idx_tenant_id` (`tenant_id`),
  25. KEY `idx_company_user_id` (`company_user_id`),
  26. KEY `idx_middleware_id` (`middleware_id`),
  27. KEY `idx_status` (`status`)
  28. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='手机设备管理';
  29. -- ========== 2. card 表新增 device 关联字段 ==========
  30. -- 使用存储过程检测列是否存在再ALTER
  31. DROP PROCEDURE IF EXISTS add_card_device_columns;
  32. DELIMITER //
  33. CREATE PROCEDURE add_card_device_columns()
  34. BEGIN
  35. IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
  36. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'company_sms_card' AND COLUMN_NAME = 'device_id') THEN
  37. ALTER TABLE company_sms_card ADD COLUMN device_id BIGINT DEFAULT NULL COMMENT '所属设备ID' AFTER tenant_id;
  38. END IF;
  39. IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
  40. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'company_sms_card' AND COLUMN_NAME = 'slot_index') THEN
  41. ALTER TABLE company_sms_card ADD COLUMN slot_index TINYINT DEFAULT 1 COMMENT '卡槽(1或2)' AFTER device_id;
  42. END IF;
  43. IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.STATISTICS
  44. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'company_sms_card' AND INDEX_NAME = 'idx_device_id') THEN
  45. ALTER TABLE company_sms_card ADD INDEX idx_device_id (device_id);
  46. END IF;
  47. END //
  48. DELIMITER ;
  49. CALL add_card_device_columns();
  50. DROP PROCEDURE add_card_device_columns;
  51. -- ========== 3. 数据迁移:从 card 表提取设备 ==========
  52. -- 按 imei 去重,每个唯一 imei 对应一台设备
  53. INSERT INTO company_sms_device (tenant_id, device_name, imei, app_version, last_heartbeat, status, create_time)
  54. SELECT c.tenant_id, MAX(c.device_name), c.imei, MAX(c.app_version), MAX(c.last_heartbeat), MAX(c.status), MIN(c.create_time)
  55. FROM company_sms_card c
  56. WHERE c.imei IS NOT NULL AND c.imei != ''
  57. AND NOT EXISTS (SELECT 1 FROM company_sms_device d WHERE d.imei = c.imei)
  58. GROUP BY c.tenant_id, c.imei;
  59. -- 回填 card.device_id
  60. UPDATE company_sms_card c
  61. INNER JOIN company_sms_device d ON c.imei = d.imei AND c.tenant_id = d.tenant_id
  62. SET c.device_id = d.device_id, c.slot_index = 1
  63. WHERE c.device_id IS NULL;
  64. -- 同一设备下第二张卡(phone2不为空且phone1不等于phone2)的slot_index设为2
  65. UPDATE company_sms_card c
  66. INNER JOIN company_sms_device d ON c.device_id = d.device_id
  67. SET c.slot_index = 2
  68. WHERE c.device_id IS NOT NULL
  69. AND c.phone_2 IS NOT NULL AND c.phone_2 != ''
  70. AND c.phone_1 IS NOT NULL AND c.phone_1 != c.phone_2
  71. AND c.card_id > (
  72. SELECT MIN(c2.card_id) FROM (SELECT card_id, device_id FROM company_sms_card) c2
  73. WHERE c2.device_id = c.device_id
  74. );
  75. -- ========== 4. 中间件表新增 tenant_id ==========
  76. DROP PROCEDURE IF EXISTS add_middleware_tenant_id;
  77. DELIMITER //
  78. CREATE PROCEDURE add_middleware_tenant_id()
  79. BEGIN
  80. IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
  81. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'company_sms_card_middleware' AND COLUMN_NAME = 'tenant_id') THEN
  82. ALTER TABLE company_sms_card_middleware ADD COLUMN tenant_id BIGINT DEFAULT NULL COMMENT '所属租户' AFTER api_id;
  83. END IF;
  84. END //
  85. DELIMITER ;
  86. CALL add_middleware_tenant_id();
  87. DROP PROCEDURE add_middleware_tenant_id;