-- ============================================
-- SecMPS v3.0 数据库建表脚本（6张表）
-- 数据库: gljs_main
-- 扩展表已合并到 Base_Device.ExtraData(JSON)
-- ============================================

-- ============================================
-- 1. 统一设备主表
-- ExtraData(JSON) 承载所有适配器特有字段
-- DeviceGroup 路由到正确的网关Adapter和前端按钮组
-- ============================================
DROP TABLE IF EXISTS base_device;
CREATE TABLE base_device (
    DeviceId        INT AUTO_INCREMENT COMMENT '设备ID',
    DeviceName      NVARCHAR(100) NOT NULL COMMENT '设备名称',
    AdapterCode     NVARCHAR(50) NOT NULL COMMENT '来源适配器(类型:实例)',
    SourceId        NVARCHAR(100) NOT NULL COMMENT '源系统设备ID',
    DeviceCategory  NVARCHAR(50) NOT NULL COMMENT '设备种类(数据字典：门磁/空调/智能断路器/人行道闸/车辆道闸/485钥匙柜/网络钥匙柜/紧急报警按钮/红外报警器/门禁一体机/除湿_恒湿机/空调控制器/烟雾报警器/气体报警器/温湿度变送器/摄像机/硬盘录像机/动环采集器)',
    DeviceGroup     NVARCHAR(20) NOT NULL COMMENT '设备分组(数据字典：视频设备/IoT设备/门禁设备/道闸设备/报警设备)',
    PointId         INT NULL COMMENT '所属点位ID',
    GatewayNodeId   INT NULL COMMENT '所属网关节点ID',
    IsParent        NVARCHAR(20) NOT NULL DEFAULT '否' COMMENT '是否父设备(数据字典：是/否)',
    ParentDeviceId  INT NULL COMMENT '父设备ID(自引用,子设备挂父设备下)',
    IsOnline        NVARCHAR(20) NOT NULL DEFAULT '离线' COMMENT '在线状态(数据字典：在线/离线)',
    IpAddress       NVARCHAR(50) COMMENT 'IP地址',
    Port            INT COMMENT '端口',
    Location        NVARCHAR(200) COMMENT '安装位置',
    Lat             DOUBLE COMMENT '纬度',
    Lng             DOUBLE COMMENT '经度',
    MapModelId      NVARCHAR(100) COMMENT '三维地图模型ID',
    MapModelScale   FLOAT DEFAULT 1.0 COMMENT '模型缩放比例',
    MapModelRotation NVARCHAR(100) COMMENT '模型旋转角度(JSON)',
    ExtraData       TEXT COMMENT '适配器扩展数据JSON(Owl/MC4/门禁字段均存于此)',
    LastSyncTime    DATETIME COMMENT '上次同步时间',
    Enable          NVARCHAR(20) DEFAULT '启用' COMMENT '启用状态(数据字典：启用/禁用)',
    Remark          NVARCHAR(500) COMMENT '备注',
    CreateID        INT COMMENT '创建人ID',
    Creator         NVARCHAR(50) COMMENT '创建人',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    ModifyID        INT COMMENT '修改人ID',
    Modifier        NVARCHAR(50) COMMENT '修改人',
    ModifyDate      DATETIME COMMENT '修改时间',
    PRIMARY KEY (DeviceId),
    INDEX IX_Sync (AdapterCode, SourceId),
    INDEX IX_Point (PointId),
    INDEX IX_Parent (ParentDeviceId),
    INDEX IX_Gateway (GatewayNodeId),
    INDEX IX_Group (DeviceGroup)
) COMMENT '统一设备主表';

-- ============================================
-- 2. 视频通道表
-- DeviceId(INT) → base_device.DeviceId
-- ============================================
DROP TABLE IF EXISTS video_channel;
CREATE TABLE video_channel (
    ChannelId       INT AUTO_INCREMENT COMMENT '通道记录ID',
    OwlChannelId    NVARCHAR(64) NOT NULL COMMENT 'Owl系统通道ID',
    DeviceId        INT NOT NULL COMMENT '关联Base_Device设备ID',
    OwlStreamApp    NVARCHAR(50) COMMENT 'Owl流应用名',
    OwlStreamName   NVARCHAR(100) COMMENT 'Owl流名称',
    HasPtz          TINYINT DEFAULT 0 COMMENT '是否支持云台',
    HasRecording    TINYINT DEFAULT 0 COMMENT '是否支持录像',
    RecordMode      INT DEFAULT 0 COMMENT '录像模式',
    SnapshotUrl     NVARCHAR(500) COMMENT '快照地址',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (ChannelId),
    INDEX IX_Device (DeviceId),
    INDEX IX_Owl (OwlChannelId)
) COMMENT '视频通道表';

-- ============================================
-- 3. 录像记录表
-- ChannelId(INT) → video_channel.ChannelId
-- ============================================
DROP TABLE IF EXISTS video_record;
CREATE TABLE video_record (
    RecordId        INT AUTO_INCREMENT COMMENT '录像记录ID',
    ChannelId       INT NOT NULL COMMENT '关联通道ID',
    OwlRecordId     INT NOT NULL COMMENT 'Owl录像记录ID',
    App             NVARCHAR(50) COMMENT '应用名',
    Stream          NVARCHAR(100) COMMENT '流ID',
    StartedAt       DATETIME NOT NULL COMMENT '录像开始时间',
    EndedAt         DATETIME COMMENT '录像结束时间',
    Duration        DOUBLE DEFAULT 0 COMMENT '录像时长(秒)',
    FilePath        NVARCHAR(500) COMMENT '文件路径',
    FileSize        BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (RecordId),
    INDEX IX_Channel (ChannelId),
    INDEX IX_Time (StartedAt)
) COMMENT '录像记录表';

-- ============================================
-- 4. 设备数据归档表
-- DeviceId(INT) → base_device.DeviceId
-- ============================================
DROP TABLE IF EXISTS iot_devicedata;
CREATE TABLE iot_devicedata (
    DataId          INT AUTO_INCREMENT COMMENT '数据记录ID',
    DeviceId        INT NOT NULL COMMENT '关联设备ID(子设备/点位)',
    PointValue      DOUBLE COMMENT '点位数值',
    UpdateTime      DATETIME NOT NULL COMMENT '数据更新时间',
    `Interval`      INT DEFAULT 0 COMMENT '采集间隔(毫秒)',
    ArchiveType     INT DEFAULT 1 COMMENT '归档类型(1小时/2日)',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (DataId),
    INDEX IX_Device (DeviceId),
    INDEX IX_Time (CreateDate)
) COMMENT '设备数据归档表';

-- ============================================
-- 5. 告警记录表（通用）
-- DeviceId(INT) → base_device.DeviceId
-- ============================================
DROP TABLE IF EXISTS iot_alarm;
CREATE TABLE iot_alarm (
    AlarmId         INT AUTO_INCREMENT COMMENT '告警ID',
    SourceAlarmId   NVARCHAR(100) NOT NULL COMMENT '源系统告警ID',
    DeviceId        INT NOT NULL COMMENT '关联设备ID',
    AlarmType       INT DEFAULT 0 COMMENT '告警类型',
    AlarmLevel      NVARCHAR(20) DEFAULT '提示' COMMENT '告警等级(数据字典：提示/普通/重要/紧急)',
    AlarmDesc       NVARCHAR(500) COMMENT '告警描述',
    AlarmValue      DOUBLE COMMENT '触发值',
    StartTime       DATETIME NOT NULL COMMENT '告警开始时间',
    EndTime         DATETIME COMMENT '告警结束时间',
    ConfirmTime     DATETIME COMMENT '确认时间',
    ConfirmUser     NVARCHAR(50) COMMENT '确认人',
    State           NVARCHAR(20) DEFAULT '未确认' COMMENT '状态(数据字典：未确认/已确认/已结束)',
    AdapterCode     NVARCHAR(50) COMMENT '来源适配器',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (AlarmId),
    INDEX IX_Device (DeviceId),
    INDEX IX_Source (SourceAlarmId),
    INDEX IX_Time (StartTime),
    INDEX IX_Level (AlarmLevel)
) COMMENT '告警记录表';

-- ============================================
-- 6. 网关节点注册表
-- ============================================
DROP TABLE IF EXISTS gateway_nodes;
CREATE TABLE gateway_nodes (
    NodeId          INT AUTO_INCREMENT COMMENT '网关节点ID',
    NodeCode        NVARCHAR(50) NOT NULL COMMENT '网关唯一编码',
    NodeName        NVARCHAR(100) NOT NULL COMMENT '网关名称',
    NodeToken       NVARCHAR(100) NOT NULL COMMENT '认证令牌',
    AdapterTypes    NVARCHAR(200) COMMENT '支持的适配器类型(网关上报)',
    BaseUrl         NVARCHAR(200) COMMENT '网关自身地址(网关上报)',
    LastHeartbeat   DATETIME COMMENT '上次心跳时间',
    IsOnline        NVARCHAR(20) DEFAULT '离线' COMMENT '在线状态(数据字典：在线/离线)',
    Enable          NVARCHAR(20) DEFAULT '启用' COMMENT '启用状态(数据字典：启用/禁用)',
    Remark          NVARCHAR(500) COMMENT '备注',
    CreateID        INT COMMENT '创建人ID',
    Creator         NVARCHAR(50) COMMENT '创建人',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    ModifyID        INT COMMENT '修改人ID',
    Modifier        NVARCHAR(50) COMMENT '修改人',
    ModifyDate      DATETIME COMMENT '修改时间',
    PRIMARY KEY (NodeId),
    UNIQUE INDEX IX_Code (NodeCode),
    INDEX IX_Online (IsOnline)
) COMMENT '网关节点注册表';
