-- ============================================
-- SecMPS v2.0 数据库建表脚本
-- 数据库: gljs_main
-- 说明: 每个表和字段均包含 COMMENT 中文注释,供 Vol.Pro 代码生成器使用
-- ============================================

USE gljs_main;

-- ============================================
-- 1. 统一设备主表
-- ============================================
DROP TABLE IF EXISTS Base_Device;
CREATE TABLE Base_Device (
    DeviceId        CHAR(36) NOT NULL COMMENT '设备ID',
    DeviceName      NVARCHAR(100) NOT NULL COMMENT '设备名称',
    AdapterCode     NVARCHAR(50) NOT NULL COMMENT '来源适配器(owl/mc4)',
    SourceId        NVARCHAR(100) NOT NULL COMMENT '源系统设备ID',
    DeviceCategory  INT NOT NULL DEFAULT 1 COMMENT '设备大类(1视频/2IoT/3门禁/4道闸/5报警)',
    DeviceType      NVARCHAR(50) COMMENT '设备细分类型(GB28181/TempSensor)',
    RegionId        INT NULL COMMENT '所属区域ID',
    IsParent        TINYINT NOT NULL DEFAULT 0 COMMENT '是否父设备(0叶子/1可展开)',
    ParentDeviceId  CHAR(36) NULL COMMENT '父设备ID',
    IsOnline        TINYINT NOT NULL DEFAULT 0 COMMENT '在线状态(0离线/1在线)',
    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',
    LocalOverrides  TEXT COMMENT '本地覆盖字段JSON',
    SyncVersion     BIGINT DEFAULT 0 COMMENT '同步版本号',
    LastSyncTime    DATETIME COMMENT '上次同步时间',
    Enable          TINYINT DEFAULT 1 COMMENT '启用(0禁用/1启用)',
    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),
    UNIQUE INDEX IX_Base_Device_Adapter_Source (AdapterCode, SourceId),
    INDEX IX_Base_Device_RegionId (RegionId),
    INDEX IX_Base_Device_ParentId (ParentDeviceId)
) COMMENT '统一设备主表';

-- ============================================
-- 2. 视频设备扩展表
-- ============================================
DROP TABLE IF EXISTS Device_Video_Ext;
CREATE TABLE Device_Video_Ext (
    ExtId           CHAR(36) NOT NULL COMMENT '扩展记录ID',
    DeviceId        CHAR(36) NOT NULL COMMENT '关联设备ID',
    OwlDeviceId     NVARCHAR(64) NOT NULL COMMENT 'Owl系统设备ID',
    Protocol        INT DEFAULT 1 COMMENT '接入协议(1GB28181/2ONVIF/3RTMP/4RTSP)',
    Manufacturer    NVARCHAR(100) COMMENT '厂商',
    Model           NVARCHAR(100) COMMENT '设备型号',
    ChannelCount    INT DEFAULT 0 COMMENT '通道数量',
    OwlStatus       NVARCHAR(500) COMMENT 'Owl原始状态JSON',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (ExtId),
    UNIQUE INDEX IX_VideoExt_Owl (OwlDeviceId),
    INDEX IX_VideoExt_Device (DeviceId)
) COMMENT '视频设备扩展表';

-- ============================================
-- 3. 视频通道表
-- ============================================
DROP TABLE IF EXISTS Video_Channel;
CREATE TABLE Video_Channel (
    ChannelId       CHAR(36) NOT NULL COMMENT '通道ID',
    OwlChannelId    NVARCHAR(64) NOT NULL COMMENT 'Owl系统通道ID',
    DeviceId        CHAR(36) NOT NULL COMMENT '关联父设备ID',
    ChannelName     NVARCHAR(100) NOT NULL COMMENT '通道名称',
    ChannelNo       INT DEFAULT 0 COMMENT '通道编号',
    OwlStreamApp    NVARCHAR(50) COMMENT 'Owl流应用名',
    OwlStreamName   NVARCHAR(100) COMMENT 'Owl流名称',
    HasPtz          TINYINT DEFAULT 0 COMMENT '是否支持云台(0否/1是)',
    HasRecording    TINYINT DEFAULT 0 COMMENT '是否支持录像(0否/1是)',
    RecordMode      INT DEFAULT 0 COMMENT '录像模式(0不录像/1设备录像/2中心录像)',
    IsOnline        TINYINT DEFAULT 0 COMMENT '在线状态(0离线/1在线)',
    SnapshotUrl     NVARCHAR(500) COMMENT '快照地址',
    Location        NVARCHAR(200) COMMENT '安装位置',
    Lat             DOUBLE COMMENT '纬度',
    Lng             DOUBLE COMMENT '经度',
    Enable          TINYINT DEFAULT 1 COMMENT '启用(0禁用/1启用)',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (ChannelId),
    UNIQUE INDEX IX_Channel_Owl (OwlChannelId),
    INDEX IX_Channel_Device (DeviceId)
) COMMENT '视频通道表';

-- ============================================
-- 4. 录像记录表
-- ============================================
DROP TABLE IF EXISTS Video_Record;
CREATE TABLE Video_Record (
    RecordId        CHAR(36) NOT NULL COMMENT '录像记录ID',
    ChannelId       CHAR(36) 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_Record_Channel (ChannelId),
    INDEX IX_Record_Time (StartedAt)
) COMMENT '录像记录表';

-- ============================================
-- 5. IoT设备扩展表
-- ============================================
DROP TABLE IF EXISTS Device_IoT_Ext;
CREATE TABLE Device_IoT_Ext (
    ExtId           CHAR(36) NOT NULL COMMENT '扩展记录ID',
    DeviceId        CHAR(36) NOT NULL COMMENT '关联设备ID',
    Mc4DeviceId     INT NOT NULL COMMENT 'MC4.0设备ID',
    ObjectType      INT COMMENT 'MC4.0对象类型',
    Tag             NVARCHAR(100) COMMENT '设备标签',
    ParentId        INT COMMENT 'MC4.0父级ID',
    Mc4Option       NVARCHAR(500) COMMENT 'MC4.0原始配置JSON',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (ExtId),
    UNIQUE INDEX IX_IoTExt_Mc4 (Mc4DeviceId),
    INDEX IX_IoTExt_Device (DeviceId)
) COMMENT '采集设备扩展表';

-- ============================================
-- 6. 设备点位表
-- ============================================
DROP TABLE IF EXISTS IoT_DevicePoint;
CREATE TABLE IoT_DevicePoint (
    PointId         CHAR(36) NOT NULL COMMENT '点位ID',
    DeviceId        CHAR(36) NOT NULL COMMENT '关联设备ID',
    Mc4DeviceId     INT NOT NULL COMMENT 'MC4.0设备ID',
    PointIndex      INT NOT NULL COMMENT '点位索引',
    PointType       INT COMMENT '点位类型',
    PointTag        NVARCHAR(100) COMMENT '点位标签',
    PointName       NVARCHAR(100) NOT NULL COMMENT '点位名称',
    PointDesc       NVARCHAR(200) COMMENT '点位描述',
    Unit            NVARCHAR(50) COMMENT '单位(℃/%/V)',
    IsControlPoint  TINYINT DEFAULT 0 COMMENT '是否控制点(0只读/1可写)',
    Mc4Option       NVARCHAR(500) COMMENT 'MC4.0原始配置JSON',
    Enable          TINYINT DEFAULT 1 COMMENT '启用(0禁用/1启用)',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (PointId),
    UNIQUE INDEX IX_Point_Mc4 (Mc4DeviceId, PointIndex),
    INDEX IX_Point_Device (DeviceId)
) COMMENT '设备点位表';

-- ============================================
-- 7. 设备数据归档表（仅存历史快照，实时数据不入库）
-- ============================================
DROP TABLE IF EXISTS IoT_DeviceData;
CREATE TABLE IoT_DeviceData (
    DataId          CHAR(36) NOT NULL COMMENT '数据记录ID',
    DeviceId        CHAR(36) NOT NULL COMMENT '关联设备ID',
    PointId         CHAR(36) 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_Data_Device (DeviceId),
    INDEX IX_Data_Time (CreateDate)
) COMMENT '设备数据归档表(仅存历史快照)';

-- ============================================
-- 8. 告警记录表
-- ============================================
DROP TABLE IF EXISTS IoT_Alarm;
CREATE TABLE IoT_Alarm (
    AlarmId         CHAR(36) NOT NULL COMMENT '告警ID',
    Mc4AlarmId      NVARCHAR(64) NOT NULL COMMENT 'MC4.0告警ID',
    DeviceId        CHAR(36) COMMENT '关联设备ID',
    PointId         CHAR(36) COMMENT '关联点位ID',
    AlarmType       INT DEFAULT 0 COMMENT '告警类型',
    AlarmLevel      INT DEFAULT 1 COMMENT '告警等级(1提示/2普通/3重要/4紧急)',
    AlarmDesc       NVARCHAR(500) COMMENT '告警描述',
    AlarmValue      DOUBLE COMMENT '触发值',
    StartTime       DATETIME NOT NULL COMMENT '告警开始时间',
    EndTime         DATETIME COMMENT '告警结束时间',
    ConfirmTime     DATETIME COMMENT '确认时间',
    ConfirmUser     NVARCHAR(50) COMMENT '确认人',
    State           INT DEFAULT 1 COMMENT '状态(1未确认/2已确认/3已结束)',
    AdapterCode     NVARCHAR(50) COMMENT '来源适配器',
    CreateDate      DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (AlarmId),
    UNIQUE INDEX IX_Alarm_Mc4 (Mc4AlarmId),
    INDEX IX_Alarm_Device (DeviceId),
    INDEX IX_Alarm_Time (StartTime)
) COMMENT '告警记录表';
