-- ============================================
-- 1. 设备主表 (device) 扩展
-- ============================================

-- 新增协议类型字段
ALTER TABLE `device` 
ADD COLUMN `protocol_type` ENUM('8ADPRO', '8MULTI') NOT NULL DEFAULT '8ADPRO' 
    COMMENT '协议类型（8ADPRO=原协议，8MULTI=新协议）' AFTER `device_code`;

-- 新增电流量程字段（拆分为起点和终点）
ALTER TABLE `device` 
ADD COLUMN `current1_range_start` DECIMAL(10,3) DEFAULT 0 
    COMMENT '电流1量程起点（A），仅8Multi协议使用' AFTER `protocol_type`;

ALTER TABLE `device` 
ADD COLUMN `current1_range_end` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电流1量程终点（A），用于0-65535映射，8Multi设备必填' AFTER `current1_range_start`;

ALTER TABLE `device` 
ADD COLUMN `current2_range_start` DECIMAL(10,3) DEFAULT 0 
    COMMENT '电流2量程起点（A），仅8Multi协议使用' AFTER `current1_range_end`;

ALTER TABLE `device` 
ADD COLUMN `current2_range_end` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电流2量程终点（A），用于0-65535映射，8Multi设备必填' AFTER `current2_range_start`;

-- 新增质量量程字段（拆分为起点和终点）
ALTER TABLE `device` 
ADD COLUMN `quality1_range_start` DECIMAL(10,3) DEFAULT 0 
    COMMENT '质量1量程起点，仅8Multi协议使用' AFTER `current2_range_end`;

ALTER TABLE `device` 
ADD COLUMN `quality1_range_end` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '质量1量程终点，用于0-65535映射，8Multi设备必填' AFTER `quality1_range_start`;

ALTER TABLE `device` 
ADD COLUMN `quality1_unit` VARCHAR(10) DEFAULT NULL 
    COMMENT '质量1单位（前端配置，如kg/g）' AFTER `quality1_range_end`;

ALTER TABLE `device` 
ADD COLUMN `quality2_range_start` DECIMAL(10,3) DEFAULT 0 
    COMMENT '质量2量程起点，仅8Multi协议使用' AFTER `quality1_unit`;

ALTER TABLE `device` 
ADD COLUMN `quality2_range_end` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '质量2量程终点，用于0-65535映射，8Multi设备必填' AFTER `quality2_range_start`;

ALTER TABLE `device` 
ADD COLUMN `quality2_unit` VARCHAR(10) DEFAULT NULL 
    COMMENT '质量2单位（前端配置，如kg/g）' AFTER `quality2_range_end`;

-- 新增电流单位字段
ALTER TABLE `device` 
ADD COLUMN `current_unit` VARCHAR(10) DEFAULT 'A' 
    COMMENT '电流单位（前端配置，如A/mA）' AFTER `quality2_unit`;

-- 新增计数器基准值字段（用于清零功能）
ALTER TABLE `device` 
ADD COLUMN `counter1_baseline` INT DEFAULT 0 
    COMMENT '计数1基准值（清零后的基准）' AFTER `current_unit`;

ALTER TABLE `device` 
ADD COLUMN `counter2_baseline` INT DEFAULT 0 
    COMMENT '计数2基准值（清零后的基准）' AFTER `counter1_baseline`;

-- 新增电压配置字段（用于功率计算）
ALTER TABLE `device` 
ADD COLUMN `voltage1` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电压1配置（V），用于功率1计算，前端配置' AFTER `counter2_baseline`;

ALTER TABLE `device` 
ADD COLUMN `voltage2` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电压2配置（V），用于功率2计算，前端配置' AFTER `voltage1`;

-- ============================================
-- 2. 设备数据表 (device_data) 扩展
-- ============================================

-- 新增电流相关字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `current1_raw` INT UNSIGNED DEFAULT NULL 
    COMMENT '电流1原始值（0-65535），仅8Multi协议使用' AFTER `current_value`;

ALTER TABLE `device_data`
ADD COLUMN `current2_raw` INT UNSIGNED DEFAULT NULL 
    COMMENT '电流2原始值（0-65535），仅8Multi协议使用' AFTER `current1_raw`;

ALTER TABLE `device_data`
ADD COLUMN `current1_value` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电流1实际值（A，经量程转换），仅8Multi协议使用' AFTER `current2_raw`;

ALTER TABLE `device_data`
ADD COLUMN `current2_value` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '电流2实际值（A，经量程转换），仅8Multi协议使用' AFTER `current1_value`;

-- 新增质量相关字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `quality1_raw` INT UNSIGNED DEFAULT NULL 
    COMMENT '质量1原始值（0-65535），仅8Multi协议使用' AFTER `current2_value`;

ALTER TABLE `device_data`
ADD COLUMN `quality2_raw` INT UNSIGNED DEFAULT NULL 
    COMMENT '质量2原始值（0-65535），仅8Multi协议使用' AFTER `quality1_raw`;

ALTER TABLE `device_data`
ADD COLUMN `quality1_value` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '质量1实际值（kg，经量程转换），仅8Multi协议使用' AFTER `quality2_raw`;

ALTER TABLE `device_data`
ADD COLUMN `quality2_value` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '质量2实际值（kg，经量程转换），仅8Multi协议使用' AFTER `quality1_value`;

-- 新增湿度字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `humidity` DECIMAL(10,3) DEFAULT NULL 
    COMMENT '湿度值（%RH），仅8Multi协议使用' AFTER `quality2_value`;

-- 新增工作状态字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `status_work` TINYINT(1) DEFAULT NULL 
    COMMENT '工作状态（0=停止，1=工作），仅8Multi协议使用' AFTER `humidity`;

ALTER TABLE `device_data`
ADD COLUMN `status_stop` TINYINT(1) DEFAULT NULL 
    COMMENT '停机状态（0=运行，1=停机），仅8Multi协议使用' AFTER `status_work`;

ALTER TABLE `device_data`
ADD COLUMN `status_fault` TINYINT(1) DEFAULT NULL 
    COMMENT '故障状态（0=正常，1=故障），仅8Multi协议使用' AFTER `status_stop`;

ALTER TABLE `device_data`
ADD COLUMN `status_reset` TINYINT(1) DEFAULT NULL 
    COMMENT '清零状态（0=正常，1=清零），仅8Multi协议使用' AFTER `status_fault`;

-- 新增频率字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `frequency1` INT DEFAULT NULL 
    COMMENT '频率1原始值，仅8Multi协议使用' AFTER `status_reset`;

ALTER TABLE `device_data`
ADD COLUMN `frequency2` INT DEFAULT NULL 
    COMMENT '频率2原始值，仅8Multi协议使用' AFTER `frequency1`;

-- 新增计数器字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `counter1_current` INT DEFAULT NULL 
    COMMENT '计数1当前累计值（下位机传值），仅8Multi协议使用' AFTER `frequency2`;

ALTER TABLE `device_data`
ADD COLUMN `counter1_delta` INT DEFAULT NULL 
    COMMENT '计数1增量值（当前值-上次值），仅8Multi协议使用' AFTER `counter1_current`;

ALTER TABLE `device_data`
ADD COLUMN `counter2_current` INT DEFAULT NULL 
    COMMENT '计数2当前累计值（下位机传值），仅8Multi协议使用' AFTER `counter1_delta`;

ALTER TABLE `device_data`
ADD COLUMN `counter2_delta` INT DEFAULT NULL 
    COMMENT '计数2增量值（当前值-上次值），仅8Multi协议使用' AFTER `counter2_current`;

-- 新增8Multi专用的计数器总计字段（避免触发器冲突）
ALTER TABLE `device_data`
ADD COLUMN `counter1_total_8multi` BIGINT UNSIGNED DEFAULT NULL 
    COMMENT '计数1累计总数（8Multi专用，从清零基准值开始累计）' AFTER `counter2_delta`;

ALTER TABLE `device_data`
ADD COLUMN `counter2_total_8multi` BIGINT UNSIGNED DEFAULT NULL 
    COMMENT '计数2累计总数（8Multi专用，从清零基准值开始累计）' AFTER `counter1_total_8multi`;

-- 新增继电器状态字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `relay_power` TINYINT(1) DEFAULT NULL 
    COMMENT '继电器-供电状态（0=断开，1=闭合），仅8Multi协议使用' AFTER `counter2_total_8multi`;

ALTER TABLE `device_data`
ADD COLUMN `relay_alarm` TINYINT(1) DEFAULT NULL 
    COMMENT '继电器-报警状态（0=正常，1=报警），仅8Multi协议使用' AFTER `relay_power`;

-- 新增DO输出字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `do_soft_start` TINYINT(1) DEFAULT NULL 
    COMMENT 'DO-软启动（0=关，1=开），仅8Multi协议使用' AFTER `relay_alarm`;

ALTER TABLE `device_data`
ADD COLUMN `do_stop` TINYINT(1) DEFAULT NULL 
    COMMENT 'DO-停止（0=关，1=开），仅8Multi协议使用' AFTER `do_soft_start`;

-- 新增从机数据字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `slave_data1` INT DEFAULT NULL 
    COMMENT '485从机数据1，仅8Multi协议使用' AFTER `do_stop`;

ALTER TABLE `device_data`
ADD COLUMN `slave_data2` INT DEFAULT NULL 
    COMMENT '485从机数据2，仅8Multi协议使用' AFTER `slave_data1`;

-- 新增触摸屏数据字段（8Multi协议）
ALTER TABLE `device_data`
ADD COLUMN `touchscreen_data` INT DEFAULT NULL 
    COMMENT '触摸屏数据，仅8Multi协议使用' AFTER `slave_data2`;

-- ============================================
-- 3. 动态字段配置表 (device_field_header_config) 扩展
-- ============================================

-- 扩展字段枚举，支持8Multi协议新增字段
ALTER TABLE `device_field_header_config`
MODIFY COLUMN `field_key` ENUM(
    -- 8ADPRO协议字段
    'analog1','analog2','analog3','analog4','analog5','analog6','analog7',
    'digital1','digital2','digital3','digital4','digital5','digital6',
    -- 8Multi协议新增字段
    'current1','current2','quality1','quality2','humidity',
    'frequency1','frequency2','slave_data1','slave_data2','touchscreen_data'
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL 
COMMENT '字段标识（支持8ADPRO和8Multi协议字段）';

-- ============================================
-- 4. 数据验证和索引优化
-- ============================================

-- 为protocol_type字段添加索引，提升查询性能
ALTER TABLE `device` 
ADD INDEX `idx_protocol_type` (`protocol_type`) USING BTREE;

-- 为device_data表的新增字段添加复合索引（可选，根据实际查询需求）
-- ALTER TABLE `device_data`
-- ADD INDEX `idx_dd_multi_status` (`device_id`, `status_work`, `status_fault`) USING BTREE;

-- ============================================
-- 5. 数据迁移和初始化
-- ============================================

-- 确保所有现有设备的protocol_type为8ADPRO（已通过DEFAULT设置）
UPDATE `device` SET `protocol_type` = '8ADPRO' WHERE `protocol_type` IS NULL;

-- ============================================
-- 6. 测试数据插入示例（可选）
-- ============================================

-- 插入一个8Multi协议测试设备
-- INSERT INTO `device` (
--     `device_no`, `device_name`, `protocol_type`, 
--     `current1_range`, `current2_range`, 
--     `quality1_range`, `quality2_range`,
--     `calibration_offset`, `calibration_factor`,
--     `is_active`, `created_at`, `updated_at`
-- ) VALUES (
--     9001, '8Multi测试设备1', '8MULTI',
--     100.0, 50.0,
--     1000.0, 500.0,
--     0.0, 1.0,
--     1, NOW(), NOW()
-- );

-- ============================================
-- 7. 回滚脚本（仅供紧急情况使用）
-- ============================================

/*
-- 回滚device表变更
ALTER TABLE `device` DROP COLUMN `calibration_factor`;
ALTER TABLE `device` DROP COLUMN `calibration_offset`;
ALTER TABLE `device` DROP COLUMN `quality2_range`;
ALTER TABLE `device` DROP COLUMN `quality1_range`;
ALTER TABLE `device` DROP COLUMN `current2_range`;
ALTER TABLE `device` DROP COLUMN `current1_range`;
ALTER TABLE `device` DROP COLUMN `protocol_type`;
ALTER TABLE `device` DROP INDEX `idx_protocol_type`;

-- 回滚device_data表变更
ALTER TABLE `device_data` DROP COLUMN `touchscreen_data`;
ALTER TABLE `device_data` DROP COLUMN `slave_data2`;
ALTER TABLE `device_data` DROP COLUMN `slave_data1`;
ALTER TABLE `device_data` DROP COLUMN `do_stop`;
ALTER TABLE `device_data` DROP COLUMN `do_soft_start`;
ALTER TABLE `device_data` DROP COLUMN `relay_alarm`;
ALTER TABLE `device_data` DROP COLUMN `relay_power`;
ALTER TABLE `device_data` DROP COLUMN `frequency2`;
ALTER TABLE `device_data` DROP COLUMN `frequency1`;
ALTER TABLE `device_data` DROP COLUMN `status_reset`;
ALTER TABLE `device_data` DROP COLUMN `status_fault`;
ALTER TABLE `device_data` DROP COLUMN `status_stop`;
ALTER TABLE `device_data` DROP COLUMN `status_work`;
ALTER TABLE `device_data` DROP COLUMN `humidity`;
ALTER TABLE `device_data` DROP COLUMN `quality2_value`;
ALTER TABLE `device_data` DROP COLUMN `quality1_value`;
ALTER TABLE `device_data` DROP COLUMN `quality2_raw`;
ALTER TABLE `device_data` DROP COLUMN `quality1_raw`;
ALTER TABLE `device_data` DROP COLUMN `current2_value`;
ALTER TABLE `device_data` DROP COLUMN `current1_value`;
ALTER TABLE `device_data` DROP COLUMN `current2_raw`;
ALTER TABLE `device_data` DROP COLUMN `current1_raw`;

-- 回滚device_field_header_config表变更
ALTER TABLE `device_field_header_config`
MODIFY COLUMN `field_key` ENUM(
    'analog1','analog2','analog3','analog4','analog5','analog6','analog7',
    'digital1','digital2','digital3','digital4','digital5','digital6'
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL 
COMMENT '字段标识（模拟量/开关量字段名）';
*/

-- ============================================
-- 8. 变更记录
-- ============================================

-- 版本: v2.1
-- 日期: 2025-11-15
-- 变更内容:
--   1. device表新增16个字段（协议类型、量程起点/终点配置、单位配置、计数器基准值、电压1/电压2）
--      - 量程字段拆分为起点和终点，支持非零起点量程
--      - 量程转换公式: 实际值=(原始值/65535)*(量程终点-量程起点)+量程起点
--      - 移除校准参数字段（不需要校准功能）
--      - 新增单位配置字段（质量单位、电流单位）
--      - 新增计数器基准值字段（用于清零功能）
--      - 新增两个独立的电压配置字段（用于功率计算）
--   2. device_data表新增28个字段（8Multi协议专属数据）
--      - 频率字段改为INT类型（显示原始值）
--      - 新增计数器累计值和增量值字段（支持减运算）
--      - 新增8Multi专用的计数器总计字段（counter1_total_8multi/counter2_total_8multi）
--      - 避免与8ADPRO的触发器冲突
--   3. device_field_header_config表扩展field_key枚举
--   4. 不修改现有触发器（保证8ADPRO功能完全不受影响）
--   5. 新增索引优化查询性能
-- 影响范围:
--   - 不影响现有8ADPRO设备功能（千万不要影响！）
--   - 所有新增字段均可空或有默认值
--   - 向后兼容，支持混合部署
-- 协议判断规则:
--   - device_no>200: 自动设置为8MULTI协议
--   - device_no<=200: 自动设置为8ADPRO协议
--   - 同一设备不能在两种协议之间切换
-- 协议解析规则:
--   - DI状态: U16格式取最后4位F然后取反
--   - 继电器+DO: U16格式取最后4位F然后取反（与DI状态解析规则相同）
--   - 设备开启判断: 电流1>=2A且电流2>=2A（与运算）
--   - 计数器: 下位机传累计值，后端计算增量（当前值-上次值）
--   - 频率: 显示原始值
--   - 从机数据: 直接展示原始值
--   - 功率计算: 功率1=电压1*电流1，功率2=电压2*电流2（分别计算，两个独立的电压配置）
-- 数据上报:
--   - 上报间隔: 10秒
--   - 数据去重: 相同数据全部存储
-- 状态指示灯:
--   - 工作=绿色，停机=黄色，故障=红色，报警=红色

-- ============================================
-- 6. 说明：不修改触发器（避免影响8ADPRO）
-- ============================================

-- 现有触发器update_counter_totals_on_insert保持不变
-- 该触发器处理8ADPRO的counter1_total和counter2_total字段
-- 8Multi使用独立的counter1_total_8multi和counter2_total_8multi字段
-- 两种协议完全隔离，互不干扰

-- ============================================
-- 执行完成提示
-- ============================================

SELECT '8Multi协议数据库变更脚本执行完成！' AS message,
       '请检查以下内容：' AS note,
       '1. device表是否新增16个字段（量程、单位、计数器基准值、电压1/电压2）' AS check1,
       '2. device_data表是否新增28个字段（含counter1_total_8multi/counter2_total_8multi）' AS check2,
       '3. device_field_header_config表枚举是否扩展' AS check3,
       '4. 现有触发器update_counter_totals_on_insert保持不变' AS check4,
       '5. 现有8ADPRO设备数据是否正常（千万不要影响！）' AS check5;

-- ============================================
-- 9. 性能优化索引（2025-11-16 新增）
-- ============================================

-- 为device_data表添加组合索引，大幅提升历史数据查询性能
-- 该索引会优化以下查询场景：
--   1. 按设备ID查询历史数据
--   2. 按时间倒序排序（最新数据在前）
--   3. 分页查询性能提升
-- 预期效果：查询速度从 500ms+ 降低到 10-50ms
CREATE INDEX idx_device_collected 
ON device_data(device_id, collected_at DESC);

-- 验证索引创建成功
SHOW INDEX FROM device_data WHERE Key_name = 'idx_device_collected';

-- 性能分析对比（可选，用于验证优化效果）
-- EXPLAIN SELECT * FROM device_data 
-- WHERE device_id = 3 
-- ORDER BY collected_at DESC 
-- LIMIT 10;

SELECT '性能优化索引创建完成！' AS message,
       '历史数据查询性能已优化' AS note;
