-- 电站表
CREATE TABLE IF NOT EXISTS 
station(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    name TEXT(100) NOT NULL, --电站名称
    address TEXT(200) NOT NULL, --电站地址
    lng REAL NOT NULL, --经度
    lat REAL NOT NULL, --纬度
    time_zone TEXT(50) NOT NULL, --时区
    remark TEXT(1200), --备注
    UNIQUE(name) -- 电站名称唯一
);

-- -- 模板表
CREATE TABLE IF NOT EXISTS  
template(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    type TINYINT NOT NULL, --模板类别（0设备配置, 1北向配置）
    protocol_type INTEGER NOT NULL, --协议类型
    dev_type INTEGER, --设备类型
    name TEXT(100) NOT NULL, --名称
    remark TEXT(1200), --备注
    UNIQUE(name) --模板名称唯一
); 

-- -- 模板点位表
CREATE TABLE IF NOT EXISTS
template_point(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    template_id INTEGER NOT NULL, --模版Id
    protocol_type INTEGER NOT NULL, --协议类型
    dev_type INTEGER NOT NULL, --设备类型
    group_type INTEGER NOT NULL, --分组类型
    code INTEGER NOT NULL, --点位编号
    name TEXT(100) NOT NULL, --点位名称
    enname TEXT(100) NOT NULL, --点位英文名称
    data_type INTEGER NOT NULL, --数据类型
    attribute INTEGER NOT NULL, --点位属性
    func INTEGER NOT NULL, --点位功能
    reg_addr INTEGER NOT NULL, --点位地址
    bit_pos INTEGER NOT NULL, --字节开始位
    bit_num INTEGER NOT NULL, --字节数
    endian INTEGER NOT NULL, --字节顺序
    precision REAL NOT NULL, --精度
    ratio REAL NOT NULL, --系数
    offset REAL NOT NULL, --偏移量
    is_persisted TINYINT NOT NULL, --是否持久化
    storage_interval INTEGER NOT NULL, --存储周期
    mutate_bound REAL, --突变范围
    default_value REAL, --默认值
    min_value REAL, --最小值
    max_value REAL,  --最大值
    unit TEXT(20), --计量单位
    is_show TINYINT NOT NULL --是否展示
);

-- 设备表
CREATE TABLE IF NOT EXISTS
device(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    sn TEXT(50) NOT NULL, --设备sn
    type INTEGER NOT NULL, --设备类型
    code INTEGER NOT NULL, --设备编号
    name TEXT(100) NOT NULL, --设备名称
    protocol_type INTEGER NOT NULL, --协议类型, 参考： 主站通讯协议类型枚举
    template_id INTEGER NOT NULL, --模版Id
    sort_order INTEGER, --序号
    remark TEXT(1200), --备注
    status TINYINT, --状态
    UNIQUE(name), -- 设备名称唯一
    UNIQUE(type, code) -- 设备类型和设备编号唯一
);

-- 设备/北向配置协议表
CREATE TABLE IF NOT EXISTS 
protocol(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    related_id INTEGER NOT NULL, --关联Id
    template_type TINYINT NOT NULL, --模板类别（0设备配置, 1北向配置）
    type INTEGER NOT NULL, --协议类型
    name TEXT(100) NOT NULL, --协议名称
    content TEXT(1200) NOT NULL, --协议内容
    remark TEXT(1200), --备注
    UNIQUE(name) -- 协议名称唯一
);


-- 点位表
CREATE TABLE IF NOT EXISTS 
point(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    template_id INTEGER NOT NULL, --模版Id
    protocol_type INTEGER NOT NULL, --协议类型
    dev_type INTEGER NOT NULL, --设备类型
    group_type INTEGER NOT NULL, --分组类型
    code INTEGER NOT NULL, --点位编号
    name TEXT(100) NOT NULL, --点位名称
    data_type INTEGER NOT NULL, --数据类型
    attribute INTEGER NOT NULL, --点位属性
    func INTEGER NOT NULL, --点位功能
    reg_addr INTEGER NOT NULL, --点位地址
    bit_pos INTEGER NOT NULL, --字节开始位
    bit_num INTEGER NOT NULL, --字节数
    endian INTEGER NOT NULL, --字节顺序
    precision REAL NOT NULL, --精度
    ratio REAL NOT NULL, --系数
    offset REAL NOT NULL, --偏移量
    is_persisted TINYINT NOT NULL, --是否持久化
    storage_interval INTEGER NOT NULL, --存储周期
    mutate_bound REAL, --突变范围
    default_value REAL, --默认值
    min_value REAL, --最小值
    max_value REAL, --最大值
    unit TEXT(20), --计量单位
    is_show TINYINT NOT NULL --是否展示
);

-- 数据监视器
CREATE TABLE IF NOT EXISTS data_monitor (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 主键标识
    dev_type INTEGER NOT NULL,             -- 设备类型
    dev_id INTEGER NOT NULL,               -- 设备Id
    point_id INTEGER NOT NULL,             -- 点位Id
    interval INTEGER NOT NULL,             -- 处理周期
    level TINYINT NOT NULL,                -- 处理等级
    handle_method TINYINT NOT NULL         -- 处理方式
);

-- 拓扑结构表
CREATE TABLE IF NOT EXISTS
topology(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    parent_id INTEGER, --父Id 
    menu_tree TINYINT NOT NULL, --类型:0-虚拟节点，1-设备节点
    name TEXT(100), --层级名称
    dev_id INTEGER, --设备Id
    sort_order INTEGER NOT NULL, --序号
    remark TEXT(1200) --备注
);

-- EMS设备配置表
CREATE TABLE IF NOT EXISTS
ems_device_config(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    type INTEGER NOT NULL, --配置类型
    name TEXT(100) NOT NULL, --配置名称
    content TEXT(1200) NOT NULL, --配置内容
    UNIQUE(name) -- 配置名称唯一
);

-- 北向配置表
CREATE TABLE IF NOT EXISTS
north_config(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    name TEXT(100) NOT NULL, --配置名称
    protocol_type INTEGER NOT NULL, --协议类型，参考： 从站通讯协议类型枚举
    config_type TINYINT NOT NULL, --北向配置类型：0默认全部，1配置上传
    template_id INTEGER, --模版Id
    remark TEXT(1200), -- 备注信息
    UNIQUE(name) -- 配置名称唯一
);

-- 北向上报下发配置表
CREATE TABLE IF NOT EXISTS
up_dis_dev(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    north_config_id INTEGER NOT NULL, -- 外键，关联北向配置表
    up_dis_config_type INTEGER, --上报下发类型    
    dev_type INTEGER NOT NULL, --设备类型
    UNIQUE(dev_type) --设备类型和设备编号唯一
);

-- 北向上报下发点位信息表
CREATE TABLE IF NOT EXISTS
up_dis_point(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    up_dis_id INTEGER NOT NULL, -- 外键，上报设备信息表
    cloud_code TEXT(50) NOT NULL, -- 云平台编号
    cloud_name TEXT(100) NOT NULL, -- 云平台名称
    point_code INTEGER NOT NULL, -- 点位编号
    point_name TEXT(100) NOT NULL, -- 点位名称
    remark TEXT(1200), -- 备注信息
    UNIQUE(cloud_code) -- 云平台编号唯一
);

-- 削峰填谷日期配置表
CREATE TABLE IF NOT EXISTS
pv_date_config(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    pv_time_config_id INTEGER NOT NULL, -- 外键，关联区间时间配置表
    start_date TEXT(20) NOT NULL, -- 开始日期
    end_date TEXT(20) NOT NULL, -- 结束日期
    remark TEXT(1200) -- 备注信息
);

-- 削峰填谷时间配置表
CREATE TABLE IF NOT EXISTS
pv_time_config(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    name TEXT(100) NOT NULL, -- 配置名称
    remark TEXT(1200), -- 备注信息
    UNIQUE(name) -- 配置名称唯一
);

--  削峰填谷业务时间执行表
CREATE TABLE IF NOT EXISTS
pv_time_exe(
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
    time_section_config_id INTEGER NOT NULL, -- 外键，关联区间时间配置表
    start_time INTEGER NOT NULL, -- 当天云平台编号开始秒数
    end_time INTEGER NOT NULL, -- 当天云平台编号结束秒数
    power REAL NOT NULL, --执行功率
    remark TEXT(1200) -- 备注信息
);

-- 保护算法表
CREATE TABLE IF NOT EXISTS
protect_algorithm(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    transformer_capacity REAL NOT NULL, --变压器总容量(KW)
    ol_warn_limit_value REAL NOT NULL, --过载预警限流值(KW)
    ol_shutdown_value REAL NOT NULL, --过载关机值(KW)
    max_power REAL NOT NULL, --充放电功率上限
    demand_switch TINYINT, --防需量开关
    target_demand REAL, --目标需量(KW)
    de_warn_limit_value REAL, --需量预警限流值(KW)
    de_shutdown_value REAL, --需量关机值(KW)
    backflow_switch TINYINT, --防逆流开关
    bf_warn_limit_value REAL, --防逆流预警限流值(KW)
    bf_shutdown_value REAL, --防逆流关机值(KW)
    soc_forbid_chg TINYINT, --禁充SOC [55%-100%]
    soc_forbid_dischg TINYINT, --禁放SOC [0%-45%]
    remark TEXT(1200) --备注
);

-- 调试模式算法表
CREATE TABLE IF NOT EXISTS
debug_algorithm(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    active_power INTEGER NOT NULL, --目标有功功率(KW)
    reactive_power TINYINT NOT NULL, --目标无功功率(KW)
    pcs_switch TINYINT, --充放电开关 1 开 0 关
    protect_switch TINYINT, --保护算法开关
    remark TEXT(1200) --备注
);

-- 功率分配表
CREATE TABLE IF NOT EXISTS
allocate_power(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    pcs_num INTEGER NOT NULL, --pcs数量 
    chg_direction TINYINT NOT NULL, --充放电方向 1(正放 负充) -1(正充 负放)
    allocate_mode TINYINT, --下发功率模式：总功率（0），分相功率（1）
    remark TEXT(1200) --备注
);

-- 工作模式设置表
CREATE TABLE IF NOT EXISTS
work_mode_set(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    work_mode TINYINT NOT NULL, --工作模式:0关机模式、1待机模式、2调试模式、3削峰填谷模式、4需求响应模式、5负载跟踪模式
    remark TEXT(1200) --备注
);

-- DIDO逻辑设置表
CREATE TABLE IF NOT EXISTS
di_do_set(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    seq TINYINT NOT NULL, --DIDO序列号
    type TINYINT NOT NULL, --DIDO类型: 0DI，1DO
    cabinet_code TINYINT NOT NULL, --柜子编号
    strategy_seq TINYINT NOT NULL, --策略序号
    remark TEXT(1200) --备注
);

-- 温控算法表
CREATE TABLE IF NOT EXISTS
temp_ctrl_algorithm(
    id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
    mod INTEGER NOT NULL, --温度控制模式, 参考：温控模式
    work_cool_trig_temp REAL NOT NULL, --制冷触发温度(0-60℃)
    work_cool_hys REAL NOT NULL, --制冷回差(1-10℃)
    work_heat_trig_temp REAL NOT NULL, --制热触发温度(0-30℃)
    work_heat_hys REAL NOT NULL, --制热回差(1-10℃)
    standby_cool_trig_temp REAL, --制冷触发温度(0-60℃)
    standby_cool_hys REAL, --制冷回差(1-10℃)
    standby_heat_trig_temp REAL, --制热触发温度(0-30℃)
    standby_heat_hys REAL, --制热回差(1-10℃)
    standby_max_limit REAL, --开启自循环高温(0-60℃)
    standby_min_limit REAL, --开启自循环低温(0-30℃)
    standby_maxback_limit REAL, --自循环高温回温(1-10℃)
    standby_minback_limit REAL, --自循环低温回温(1-10℃)
	temp_cmd_normal INTEGER NOT NULL, --循环控制字
	temp_cmd_heat INTEGER NOT NULL, --制热控制字
	temp_cmd_cold INTEGER NOT NULL, --制冷控制字
    temp_cmd_open INTEGER NOT NULL, --开控制字
	temp_cmd_close INTEGER NOT NULL, --关控制字
    remark TEXT(1200) --备注
);

-- 高级设置
CREATE TABLE IF NOT EXISTS
advanced_setting (
  id INTEGER PRIMARY KEY AUTOINCREMENT, --主键标识
  key TEXT NOT NULL, --设置项
  value TEXT NOT NULL --设置值
);

-- 升级记录
CREATE TABLE IF NOT EXISTS
upgrade_record(
   id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键标识
   version TEXT NOT NULL, -- 升级版本号
   path TEXT, -- 升级包位置
   err_msg TEXT, -- 升级错误信息
   status TINYINT NOT NULL DEFAULT 1, -- 升级状态 (0：待升级, 1: 升级成功, 2:升级失败)
   start_time TIMESTAMP, -- 升级开始时间
   end_time TIMESTAMP -- 升级结束时间
);

-- -------------------------------------------------------------初始化数据------------------------------------------------------------------

-- ----------------------------
-- Records of ems_device_config
-- ----------------------------
-- INSERT INTO "ems_device_config" VALUES (1, 0, '串口1', '{"uartId":1,"data":3,"stop":0,"baud":0,"parity":0,"address":"/dev/ttyS9"}');
--INSERT INTO "ems_device_config" VALUES (2, 0, '串口2', '{"uartId":2,"data":3,"stop":0,"baud":0,"parity":0,"address":"/dev/ttyS5"}');
--INSERT INTO "ems_device_config" VALUES (3, 0, '串口3', '{"uartId":3,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyS3"}');
--INSERT INTO "ems_device_config" VALUES (4, 0, '串口4', '{"uartId":4,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyS4"}');
--INSERT INTO "ems_device_config" VALUES (5, 0, '串口5', '{"uartId":5,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyS7"}');
--INSERT INTO "ems_device_config" VALUES (6, 0, '串口6', '{"uartId":6,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyS8"}');
--INSERT INTO "ems_device_config" VALUES (7, 0, '串口7', '{"uartId":7,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyS0"}');
--INSERT INTO "ems_device_config" VALUES (8, 0, '串口8', '{"uartId":8,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyXRUSB1"}');
--INSERT INTO "ems_device_config" VALUES (9, 0, '串口9', '{"uartId":9,"data":3,"stop":0,"baud":5,"parity":0,"address":"/dev/ttyXRUSB2"}');
--INSERT INTO "ems_device_config" VALUES (10, 1, '网口1', '{"netId":0,"isDHCP":0, "ip":"192.168.0.123", "mask":"255.255.255.0", "gateway":"", "address":""}');
--INSERT INTO "ems_device_config" VALUES (11, 1, '网口2', '{"netId":1,"isDHCP":0, "ip":"172.18.39.44", "mask":"255.255.255.0", "gateway":"", "address":""}');
--INSERT INTO "ems_device_config" VALUES (12, 1, '网口3', '{"netId":2,"isDHCP":0, "ip":"192.168.2.123", "mask":"255.255.255.0", "gateway":"", "address":""}');
--INSERT INTO "ems_device_config" VALUES (13, 1, '网口4', '{"netId":3,"isDHCP":0, "ip":"192.168.3.123", "mask":"255.255.255.0", "gateway":"", "address":""}');
--INSERT INTO "ems_device_config" VALUES (14, 4, 'Wifi配置', '{"wifiName": "company", "wifiPassword": "12345678", "enable": 0}');
--INSERT INTO "ems_device_config" VALUES (15, 5, '4G配置', '{"cmdContent": "quectel-CM &", "enable": 0}');
--INSERT INTO "ems_device_config" VALUES (16, 6, '对时配置', '{"isNtp": 0, "port": 0, "address": "", "manualTime": "2024/10/12 18:20:20"}');
