소스 검색

云端修改报警记录同步到边缘端

lgy 3 년 전
부모
커밋
c1c58e8b7b

+ 4 - 0
src/main/java/com/persagy/cache/AlarmInfoCache.java

@@ -61,6 +61,10 @@ public class AlarmInfoCache {
         return alarmDefine.getItemCode() + "-" + alarmDefine.getObjId() + "-" + alarmDefine.getTargetId();
     }
 
+    public static String getAlarmDefineId(JSONObject alarmDefine) {
+        return alarmDefine.getString("itemCode") + "-" + alarmDefine.getString("objId") + "-" + alarmDefine.getString("targetId");
+    }
+
     /**
      * @param :
      * @description:获取报警状态 <报警定义标识,报警时间状态>

+ 43 - 36
src/main/java/com/persagy/client/GroupNettyClientHandler.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
+import com.persagy.entity.AlarmState;
 import com.persagy.entity.NettyMessage;
 import com.persagy.entity.ZktAlarmRecordDO;
 import com.persagy.job.NettyMessageQueue;
@@ -122,47 +123,13 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
     private void handlerMsg(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {
         if (StringUtil.isJSONObject((String) msg)) {
             NettyMessage message = StringUtil.tranferItemToDTO((String) msg, NettyMessage.class);
-            if (message.getOpCode() == 9) {
-                NettyMessage<AlarmDefine> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<AlarmDefine>>() {
-                });
-                List<AlarmDefine> definesList = AlarmDefineMessage.getContent();
-                if (CollectionUtil.isNotEmpty(definesList)) {
-                    try {
-                        LockUtil.getInstance().lock.lock();
-                        LockUtil.getInstance().setExecute(false);
-                        //加个等待,保证正在执行的逻辑执行成功
-                        Thread.sleep(4000);
-                        alarmDefineService.listAllAlarmDefine(definesList);
-                        LockUtil.getInstance().setExecute(true);
-                        LockUtil.getInstance().condition.signalAll();
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    } finally {
-                        LockUtil.getInstance().lock.unlock();
-                    }
-                }
-            } else if (message.getOpCode() == 7) {
+             if (message.getOpCode() == 7) {
                 NettyMessage<AlarmDefine> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<AlarmDefine>>() {
                 });
                 List<AlarmDefine> definesList = AlarmDefineMessage.getContent();
                 if (CollectionUtil.isNotEmpty(definesList)) {
                     alarmDefineService.listSomeAlarmDefine(definesList);
                 }
-            } else if (message.getOpCode() == 10) {
-                NettyMessage<AlarmDefine> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<AlarmDefine>>() {
-                });
-                List<AlarmDefine> definesList = AlarmDefineMessage.getContent();
-                if (CollectionUtil.isNotEmpty(definesList)) {
-                    alarmDefineService.deleteAlarmDefine(definesList);
-                }
-            } else if (message.getOpCode() == 11) {
-                //更新隔离的系统对象
-                NettyMessage<String> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<String>>() {
-                });
-                List<String> isolationSystemList = AlarmDefineMessage.getContent();
-                if (CollectionUtil.isNotEmpty(isolationSystemList)) {
-                    AlarmInfoCache.isolationSystemList = isolationSystemList;
-                }
             } else if (message.getOpCode() == 8) {
                 log.info("-----报警记录id推送----[{}]", message);
                 //{"id":"","objId":"","itemCode":""}  id为报警记录ID
@@ -178,7 +145,47 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                     zktAlarmRecordDO.setAlarmId(parseObject.getString("id"));
                     alarmRecordRepository.save(zktAlarmRecordDO);
                 }
-            }
+            } else if (message.getOpCode() == 9) {
+                 NettyMessage<AlarmDefine> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<AlarmDefine>>() {
+                 });
+                 List<AlarmDefine> definesList = AlarmDefineMessage.getContent();
+                 if (CollectionUtil.isNotEmpty(definesList)) {
+                     try {
+                         LockUtil.getInstance().lock.lock();
+                         LockUtil.getInstance().setExecute(false);
+                         //加个等待,保证正在执行的逻辑执行成功
+                         Thread.sleep(4000);
+                         alarmDefineService.listAllAlarmDefine(definesList);
+                         LockUtil.getInstance().setExecute(true);
+                         LockUtil.getInstance().condition.signalAll();
+                     } catch (InterruptedException e) {
+                         e.printStackTrace();
+                     } finally {
+                         LockUtil.getInstance().lock.unlock();
+                     }
+                 }
+             } else if (message.getOpCode() == 10) {
+                NettyMessage<AlarmDefine> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<AlarmDefine>>() {
+                });
+                List<AlarmDefine> definesList = AlarmDefineMessage.getContent();
+                if (CollectionUtil.isNotEmpty(definesList)) {
+                    alarmDefineService.deleteAlarmDefine(definesList);
+                }
+            } else if (message.getOpCode() == 11) {
+                //更新隔离的系统对象
+                NettyMessage<String> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<String>>() {
+                });
+                List<String> isolationSystemList = AlarmDefineMessage.getContent();
+                if (CollectionUtil.isNotEmpty(isolationSystemList)) {
+                    AlarmInfoCache.isolationSystemList = isolationSystemList;
+                }
+            } else if (message.getOpCode() == 12) {
+                 //云端更新报警记录状态
+                 NettyMessage<JSONObject> AlarmStateMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<JSONObject>>() {
+                 });
+                 List<JSONObject> stateList = AlarmStateMessage.getContent();
+                 alarmDefineService.updateAlarmDefine(stateList);
+             }
             NettyMessage response = new NettyMessage(3, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode());
             response.setRemark("已经收到消息");
             channelHandlerContext.write(response.toString());

+ 77 - 0
src/main/java/com/persagy/demo/netty/websocket/WebSocketClientTest.java

@@ -0,0 +1,77 @@
+package com.persagy.demo.netty.websocket;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.TimeInterval;
+import lombok.extern.slf4j.Slf4j;
+import org.java_websocket.WebSocket;
+import org.java_websocket.client.WebSocketClient;
+import org.java_websocket.handshake.ServerHandshake;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * @description: TODO
+ * @author:LuoGuangyi
+ * @company:PersagyTechnologyCo.,Ltd
+ * @since:2021/03/31 16:04
+ * @version:V1.0
+ **/
+@Slf4j
+public class WebSocketClientTest {
+    public static void main(String[] args) throws URISyntaxException {
+        createNewWebSocketClient();
+    }
+    private static WebSocketClient webSocketClient;
+    /**
+     * 创建websocket对象
+     *
+     * @return WebSocketClient
+     * @throws URISyntaxException
+     */
+    private static WebSocketClient createNewWebSocketClient() throws URISyntaxException {
+        String outCallWebSockertUrl = "ws://localhost:8888/websocket";
+        log.info("连接地址为:[{}]", outCallWebSockertUrl);
+        webSocketClient = new WebSocketClient(new URI(outCallWebSockertUrl)) {
+            @Override
+            public void onOpen(ServerHandshake serverHandshake) {
+                String msg = "{\"type\":2,\"msgInfo\":\"11\"}";
+                sendMsg(WebSocketClientTest.webSocketClient, msg);
+            }
+
+            @Override
+            public void onMessage(String msg) {
+                String message = msg;
+                System.out.println("-----------------"+message);
+            }
+
+            @Override
+            public void onClose(int code, String reason, boolean remote) {
+                log.warn("关闭连接,code[{}],reson[{}],remote[{}]", code, reason, remote);
+            }
+
+            @Override
+            public void onError(Exception e) {
+                log.error("连接异常", e);
+            }
+        };
+        //默认为60 ,阻塞时间稍长会超时,此处改成 1200
+        webSocketClient.setConnectionLostTimeout(1200);
+        webSocketClient.connect();
+        return webSocketClient;
+    }
+
+
+    public static void sendMsg(WebSocketClient webSocketClient, String message) {
+        log.info("websocket向服务端发送消息,消息为:{}", message);
+        TimeInterval timer = DateUtil.timer();
+        while (!webSocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
+            log.debug("正在建立通道,请稍等");
+            if (timer.interval() >= 5000) {
+                log.error("超过5秒钟还未打开连接,超时,不再等待");
+                return;
+            }
+        }
+        webSocketClient.send(message);
+    }
+}

+ 3 - 0
src/main/java/com/persagy/demo/netty/websocket/server/NettyServer.java

@@ -25,6 +25,9 @@ public class NettyServer {
         this.port = port;
     }
 
+    public static void main(String[] args) throws Exception {
+        new NettyServer(8888).start();
+    }
     public void start() throws Exception {
         EventLoopGroup bossGroup = new NioEventLoopGroup();
 

+ 1 - 0
src/main/java/com/persagy/entity/NettyMessage.java

@@ -28,6 +28,7 @@ public class NettyMessage<T> {
      * 10-云端推送删除的报警定义给边缘端(增量删除报警定义)、
      * 11-云端下发隔离系统给边缘端
      * 200 - 建立连接,此时的projectId == 项目id
+     * 12-云端更新报警状态
      */
     @JSONField()
     private int opCode;

+ 3 - 0
src/main/java/com/persagy/service/AlarmDefineService.java

@@ -1,5 +1,6 @@
 package com.persagy.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.persagy.entity.AlarmDefine;
 
 import java.util.List;
@@ -18,5 +19,7 @@ public interface AlarmDefineService {
 
     void deleteAlarmDefine(List<AlarmDefine> alarmDefineList);
 
+    void updateAlarmDefine(List<JSONObject> alarmDefineList);
+
     void updateAlarmDefine();
 }

+ 32 - 1
src/main/java/com/persagy/service/impl/AlarmDefineServiceImpl.java

@@ -1,8 +1,13 @@
 package com.persagy.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
+import com.persagy.entity.AlarmState;
+import com.persagy.entity.ZktAlarmRecordDO;
+import com.persagy.repository.AlarmRecordRepository;
 import com.persagy.service.AlarmDefineService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -21,7 +26,8 @@ import java.util.concurrent.ConcurrentHashMap;
 public class AlarmDefineServiceImpl implements AlarmDefineService {
     @Autowired
     AlarmInfoCache alarmInfoCache;
-
+    @Autowired
+    AlarmRecordRepository alarmRecordRepository;
     @Override
     public List listAllAlarmDefine(List<AlarmDefine> alarmDefineList) {
 //        String ad = "{\n" +
@@ -115,6 +121,31 @@ public class AlarmDefineServiceImpl implements AlarmDefineService {
         }
     }
 
+    @Override
+    public void updateAlarmDefine(List<JSONObject> alarmDefineList) {
+        if (CollectionUtil.isNotEmpty(alarmDefineList)) {
+            for (JSONObject stateItem : alarmDefineList) {
+                String defineId = AlarmInfoCache.getAlarmDefineId(stateItem);
+                AlarmState alarmState = new AlarmState(defineId);
+                String state = stateItem.getString("state");
+                //1:未恢复;2:已恢复;3:已过期
+                //报警状态( 0-正常 1-报警)
+                String newState = "1".equals(state) ? "1" : "0";
+                alarmState.setState(newState);
+                alarmInfoCache.setAlarmState(defineId, alarmState);
+                ZktAlarmRecordDO zktAlarmRecordDO = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO());
+                zktAlarmRecordDO.setDefinitionId(defineId);
+                zktAlarmRecordDO.setProjectId(stateItem.getString("projectId"));
+                zktAlarmRecordDO.setObjId(stateItem.getString("objId"));
+                zktAlarmRecordDO.setItemCode(stateItem.getString("itemCode"));
+                zktAlarmRecordDO.setTargetId(stateItem.getString("targetId"));
+                zktAlarmRecordDO.setState(stateItem.getString("state"));
+                alarmRecordRepository.save(zktAlarmRecordDO);
+            }
+        }
+    }
+
+
     /**
      * @description: 更新报警定义,把系统隔离的报警全部移除
      * 因为隔离和屏蔽的报警定义不产生报警,但是要恢复,所以只能实时判断,所有作废

+ 2 - 2
src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java

@@ -138,7 +138,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     }
                     //报警产生值满足(这里的满足不考虑报警持续时间)
                     if (triggerResult) {
-                        log.info("有一条满足报警条件{},----{}",paramMap,alarmDefine.getCondition());
+                        log.info("有一条满足报警条件{},-----{}----{}",defineId,paramMap,alarmDefine.getCondition());
                         if (alarmDefine.getOpen() == 0) {
                             log.info("报警定义ID为[{}]已经屏蔽", defineId);
                             return;
@@ -150,7 +150,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                         //报警的时候不考虑报警恢复,因为同时报警和报警恢复是不应该出现的
                         handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId, paramMap, meterId, funcId, value);
                     } else {
-                        log.info("不满足报警条件{},----{}",paramMap,alarmDefine.getCondition());
+                        log.info("不满足报警条件{},{}----{}",defineId,paramMap,alarmDefine.getCondition());
                         //当前数据正常
                         handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState, paramMap, meterId, funcId, value);
                     }

+ 2 - 2
src/main/resources/application-Pj4403070003.yml

@@ -3,7 +3,7 @@ group:
   code: WD   #标识哪个接团 比如万达使用WD
   alarm:
     #需要更改
-    host: 39.102.43.179 #netty IP   39.102.43.179
+    host: 127.0.0.1 #netty IP   39.102.43.179
     #需要更改
     port: 9986          #netty 端口8826
     #需要更改
@@ -14,7 +14,7 @@ terminal: #边缘端IOT采集程序地址
     #需要更改
     host: 39.96.55.242  #39.102.54.110
     #需要更改
-    port: 9984
+    port: 9988
     #需要更改
     suffix: websocket   #websocker后缀
 project:

+ 1 - 1
src/main/resources/application.yml

@@ -9,7 +9,7 @@ spring:
     active: Pj4403070003
   datasource:
     #需要更改
-    url: jdbc:mysql://39.102.43.179:9934/alarm-quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false
+    url: jdbc:mysql://39.102.43.179:9934/alarm-quartz-wd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false
     driver-class-name: com.mysql.jdbc.Driver  # mysql8.0以前使用com.mysql.jdbc.Driver
     #需要更改
     username: root

+ 224 - 192
src/main/resources/zkt_alarm_tables_mysql_innodb.sql

@@ -1,192 +1,224 @@
-#
-# In your Quartz properties file, you'll need to set
-# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
-#
-#
-# By: Ron Cordell - roncordell
-#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
-
-DROP TABLE IF EXISTS ZKT_ALARM_FIRED_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_PAUSED_TRIGGER_GRPS;
-DROP TABLE IF EXISTS ZKT_ALARM_SCHEDULER_STATE;
-DROP TABLE IF EXISTS ZKT_ALARM_LOCKS;
-DROP TABLE IF EXISTS ZKT_ALARM_SIMPLE_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_SIMPROP_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_CRON_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_BLOB_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_TRIGGERS;
-DROP TABLE IF EXISTS ZKT_ALARM_JOB_DETAILS;
-DROP TABLE IF EXISTS ZKT_ALARM_CALENDARS;
-DROP TABLE IF EXISTS `zkt_alarm_record`;
-
-
-CREATE TABLE ZKT_ALARM_JOB_DETAILS(
-SCHED_NAME VARCHAR(120) NOT NULL,
-JOB_NAME VARCHAR(190) NOT NULL,
-JOB_GROUP VARCHAR(190) NOT NULL,
-DESCRIPTION VARCHAR(250) NULL,
-JOB_CLASS_NAME VARCHAR(250) NOT NULL,
-IS_DURABLE VARCHAR(1) NOT NULL,
-IS_NONCONCURRENT VARCHAR(1) NOT NULL,
-IS_UPDATE_DATA VARCHAR(1) NOT NULL,
-REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
-JOB_DATA BLOB NULL,
-PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_TRIGGERS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-TRIGGER_NAME VARCHAR(190) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-JOB_NAME VARCHAR(190) NOT NULL,
-JOB_GROUP VARCHAR(190) NOT NULL,
-DESCRIPTION VARCHAR(250) NULL,
-NEXT_FIRE_TIME BIGINT(13) NULL,
-PREV_FIRE_TIME BIGINT(13) NULL,
-PRIORITY INTEGER NULL,
-TRIGGER_STATE VARCHAR(16) NOT NULL,
-TRIGGER_TYPE VARCHAR(8) NOT NULL,
-START_TIME BIGINT(13) NOT NULL,
-END_TIME BIGINT(13) NULL,
-CALENDAR_NAME VARCHAR(190) NULL,
-MISFIRE_INSTR SMALLINT(2) NULL,
-JOB_DATA BLOB NULL,
-PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
-FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
-REFERENCES ZKT_ALARM_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_SIMPLE_TRIGGERS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-TRIGGER_NAME VARCHAR(190) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-REPEAT_COUNT BIGINT(7) NOT NULL,
-REPEAT_INTERVAL BIGINT(12) NOT NULL,
-TIMES_TRIGGERED BIGINT(10) NOT NULL,
-PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
-FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-REFERENCES ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_CRON_TRIGGERS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-TRIGGER_NAME VARCHAR(190) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-CRON_EXPRESSION VARCHAR(120) NOT NULL,
-TIME_ZONE_ID VARCHAR(80),
-PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
-FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-REFERENCES ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_SIMPROP_TRIGGERS
-  (
-    SCHED_NAME VARCHAR(120) NOT NULL,
-    TRIGGER_NAME VARCHAR(190) NOT NULL,
-    TRIGGER_GROUP VARCHAR(190) NOT NULL,
-    STR_PROP_1 VARCHAR(512) NULL,
-    STR_PROP_2 VARCHAR(512) NULL,
-    STR_PROP_3 VARCHAR(512) NULL,
-    INT_PROP_1 INT NULL,
-    INT_PROP_2 INT NULL,
-    LONG_PROP_1 BIGINT NULL,
-    LONG_PROP_2 BIGINT NULL,
-    DEC_PROP_1 NUMERIC(13,4) NULL,
-    DEC_PROP_2 NUMERIC(13,4) NULL,
-    BOOL_PROP_1 VARCHAR(1) NULL,
-    BOOL_PROP_2 VARCHAR(1) NULL,
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-    REFERENCES ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_BLOB_TRIGGERS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-TRIGGER_NAME VARCHAR(190) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-BLOB_DATA BLOB NULL,
-PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
-INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
-FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-REFERENCES ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_CALENDARS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-CALENDAR_NAME VARCHAR(190) NOT NULL,
-CALENDAR BLOB NOT NULL,
-PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_PAUSED_TRIGGER_GRPS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_FIRED_TRIGGERS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-ENTRY_ID VARCHAR(95) NOT NULL,
-TRIGGER_NAME VARCHAR(190) NOT NULL,
-TRIGGER_GROUP VARCHAR(190) NOT NULL,
-INSTANCE_NAME VARCHAR(190) NOT NULL,
-FIRED_TIME BIGINT(13) NOT NULL,
-SCHED_TIME BIGINT(13) NOT NULL,
-PRIORITY INTEGER NOT NULL,
-STATE VARCHAR(16) NOT NULL,
-JOB_NAME VARCHAR(190) NULL,
-JOB_GROUP VARCHAR(190) NULL,
-IS_NONCONCURRENT VARCHAR(1) NULL,
-REQUESTS_RECOVERY VARCHAR(1) NULL,
-PRIMARY KEY (SCHED_NAME,ENTRY_ID))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_SCHEDULER_STATE (
-SCHED_NAME VARCHAR(120) NOT NULL,
-INSTANCE_NAME VARCHAR(190) NOT NULL,
-LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
-CHECKIN_INTERVAL BIGINT(13) NOT NULL,
-PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
-ENGINE=InnoDB;
-
-CREATE TABLE ZKT_ALARM_LOCKS (
-SCHED_NAME VARCHAR(120) NOT NULL,
-LOCK_NAME VARCHAR(40) NOT NULL,
-PRIMARY KEY (SCHED_NAME,LOCK_NAME))
-ENGINE=InnoDB;
-
-CREATE INDEX IDX_ZKT_ALARM_J_REQ_RECOVERY ON ZKT_ALARM_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
-CREATE INDEX IDX_ZKT_ALARM_J_GRP ON ZKT_ALARM_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
-
-CREATE INDEX IDX_ZKT_ALARM_T_J ON ZKT_ALARM_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_T_JG ON ZKT_ALARM_TRIGGERS(SCHED_NAME,JOB_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_T_C ON ZKT_ALARM_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
-CREATE INDEX IDX_ZKT_ALARM_T_G ON ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_T_STATE ON ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
-CREATE INDEX IDX_ZKT_ALARM_T_N_STATE ON ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
-CREATE INDEX IDX_ZKT_ALARM_T_N_G_STATE ON ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
-CREATE INDEX IDX_ZKT_ALARM_T_NEXT_FIRE_TIME ON ZKT_ALARM_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
-CREATE INDEX IDX_ZKT_ALARM_T_NFT_ST ON ZKT_ALARM_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
-CREATE INDEX IDX_ZKT_ALARM_T_NFT_MISFIRE ON ZKT_ALARM_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
-CREATE INDEX IDX_ZKT_ALARM_T_NFT_ST_MISFIRE ON ZKT_ALARM_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
-CREATE INDEX IDX_ZKT_ALARM_T_NFT_ST_MISFIRE_GRP ON ZKT_ALARM_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
-
-CREATE INDEX IDX_ZKT_ALARM_FT_TRIG_INST_NAME ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
-CREATE INDEX IDX_ZKT_ALARM_FT_INST_JOB_REQ_RCVRY ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
-CREATE INDEX IDX_ZKT_ALARM_FT_J_G ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_FT_JG ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_FT_T_G ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
-CREATE INDEX IDX_ZKT_ALARM_FT_TG ON ZKT_ALARM_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
-CREATE TABLE `zkt_alarm_record`  (
-                                     `definition_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '报警定义ID',
-                                     `item_code` varchar(42) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报警条目编码',
-                                     `obj_id` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '报警对象ID',
-                                     `state` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '报警定义对应最新一条报警记录状态',
-                                     `alarm_id` varchar(42) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '报警定义对应最新一条报警记录ID',
-                                     `alarm_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '报警时间',
-                                     `effect_end_time` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '报警生效结束时间(报警过期时间)',
-                                     `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
-                                     `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '报警名称',
-                                     PRIMARY KEY (`definition_id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '报警记录ID' ROW_FORMAT = Dynamic;
-commit;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+SET NAMES UTF8MB4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_BLOB_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_BLOB_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_BLOB_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `BLOB_DATA` BLOB NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  INDEX `SCHED_NAME`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  CONSTRAINT `ZKT_ALARM_BLOB_TRIGGERS_IBFK_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `ZKT_ALARM_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_CALENDARS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_CALENDARS`;
+CREATE TABLE `ZKT_ALARM_CALENDARS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `CALENDAR_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `CALENDAR` BLOB NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_CRON_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_CRON_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_CRON_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `CRON_EXPRESSION` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TIME_ZONE_ID` VARCHAR(80) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  CONSTRAINT `ZKT_ALARM_CRON_TRIGGERS_IBFK_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `ZKT_ALARM_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_FIRED_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_FIRED_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_FIRED_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `ENTRY_ID` VARCHAR(95) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `INSTANCE_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `FIRED_TIME` BIGINT(13) NOT NULL,
+  `SCHED_TIME` BIGINT(13) NOT NULL,
+  `PRIORITY` INT(11) NOT NULL,
+  `STATE` VARCHAR(16) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `JOB_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `IS_NONCONCURRENT` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `REQUESTS_RECOVERY` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_TRIG_INST_NAME`(`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_INST_JOB_REQ_RCVRY`(`SCHED_NAME`, `INSTANCE_NAME`, `REQUESTS_RECOVERY`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_J_G`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_T_G`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_FT_TG`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_JOB_DETAILS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_JOB_DETAILS`;
+CREATE TABLE `ZKT_ALARM_JOB_DETAILS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `DESCRIPTION` VARCHAR(250) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `JOB_CLASS_NAME` VARCHAR(250) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `IS_DURABLE` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `IS_NONCONCURRENT` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `IS_UPDATE_DATA` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `REQUESTS_RECOVERY` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_DATA` BLOB NULL,
+  PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_J_REQ_RECOVERY`(`SCHED_NAME`, `REQUESTS_RECOVERY`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_J_GRP`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_LOCKS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_LOCKS`;
+CREATE TABLE `ZKT_ALARM_LOCKS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `LOCK_NAME` VARCHAR(40) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_PAUSED_TRIGGER_GRPS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_PAUSED_TRIGGER_GRPS`;
+CREATE TABLE `ZKT_ALARM_PAUSED_TRIGGER_GRPS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_RECORD
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_RECORD`;
+CREATE TABLE `ZKT_ALARM_RECORD`  (
+  `DEFINITION_ID` VARCHAR(200) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL DEFAULT '''' COMMENT ''报警定义ID'',
+  `ITEM_CODE` VARCHAR(42) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL COMMENT ''报警条目编码'',
+  `OBJ_ID` VARCHAR(60) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL COMMENT ''报警对象ID'',
+  `TARGET_ID` VARCHAR(50) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警匹配规则ID'',
+  `STATE` VARCHAR(10) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警定义对应最新一条报警记录状态'',
+  `ALARM_ID` VARCHAR(42) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警定义对应最新一条报警记录ID'',
+  `ALARM_TIME` VARCHAR(20) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警时间'',
+  `EFFECT_END_TIME` VARCHAR(20) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警生效结束时间(报警过期时间)'',
+  `REMARK` VARCHAR(255) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''备注'',
+  `NAME` VARCHAR(100) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL COMMENT ''报警名称'',
+  `END_INFO` JSON NULL COMMENT ''报警结束值'',
+  `END_TIME` DATETIME(0) NULL DEFAULT NULL COMMENT ''报警结束时间'',
+  `PROJECT_ID` VARCHAR(50) CHARACTER SET UTF8MB4 COLLATE UTF8MB4_GENERAL_CI NULL DEFAULT NULL COMMENT ''项目ID'',
+  PRIMARY KEY (`DEFINITION_ID`) USING BTREE,
+  UNIQUE INDEX `INDEX_ALARM_ITEM_OBJ_TAR`(`ITEM_CODE`, `OBJ_ID`, `TARGET_ID`) USING BTREE COMMENT ''一个报警条目,一个对象在一个报警报警匹配规则只能对应一条报警定义''
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI COMMENT = ''报警记录ID'' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_SCHEDULER_STATE
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_SCHEDULER_STATE`;
+CREATE TABLE `ZKT_ALARM_SCHEDULER_STATE`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `INSTANCE_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `LAST_CHECKIN_TIME` BIGINT(13) NOT NULL,
+  `CHECKIN_INTERVAL` BIGINT(13) NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_SIMPLE_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_SIMPLE_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_SIMPLE_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `REPEAT_COUNT` BIGINT(7) NOT NULL,
+  `REPEAT_INTERVAL` BIGINT(12) NOT NULL,
+  `TIMES_TRIGGERED` BIGINT(10) NOT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  CONSTRAINT `ZKT_ALARM_SIMPLE_TRIGGERS_IBFK_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `ZKT_ALARM_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_SIMPROP_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_SIMPROP_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_SIMPROP_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `STR_PROP_1` VARCHAR(512) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `STR_PROP_2` VARCHAR(512) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `STR_PROP_3` VARCHAR(512) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `INT_PROP_1` INT(11) NULL DEFAULT NULL,
+  `INT_PROP_2` INT(11) NULL DEFAULT NULL,
+  `LONG_PROP_1` BIGINT(20) NULL DEFAULT NULL,
+  `LONG_PROP_2` BIGINT(20) NULL DEFAULT NULL,
+  `DEC_PROP_1` DECIMAL(13, 4) NULL DEFAULT NULL,
+  `DEC_PROP_2` DECIMAL(13, 4) NULL DEFAULT NULL,
+  `BOOL_PROP_1` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `BOOL_PROP_2` VARCHAR(1) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  CONSTRAINT `ZKT_ALARM_SIMPROP_TRIGGERS_IBFK_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `ZKT_ALARM_TRIGGERS` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- TABLE STRUCTURE FOR ZKT_ALARM_TRIGGERS
+-- ----------------------------
+DROP TABLE IF EXISTS `ZKT_ALARM_TRIGGERS`;
+CREATE TABLE `ZKT_ALARM_TRIGGERS`  (
+  `SCHED_NAME` VARCHAR(120) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `JOB_GROUP` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `DESCRIPTION` VARCHAR(250) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `NEXT_FIRE_TIME` BIGINT(13) NULL DEFAULT NULL,
+  `PREV_FIRE_TIME` BIGINT(13) NULL DEFAULT NULL,
+  `PRIORITY` INT(11) NULL DEFAULT NULL,
+  `TRIGGER_STATE` VARCHAR(16) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `TRIGGER_TYPE` VARCHAR(8) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NOT NULL,
+  `START_TIME` BIGINT(13) NOT NULL,
+  `END_TIME` BIGINT(13) NULL DEFAULT NULL,
+  `CALENDAR_NAME` VARCHAR(190) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI NULL DEFAULT NULL,
+  `MISFIRE_INSTR` SMALLINT(2) NULL DEFAULT NULL,
+  `JOB_DATA` BLOB NULL,
+  PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_J`(`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_JG`(`SCHED_NAME`, `JOB_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_C`(`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_G`(`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_STATE`(`SCHED_NAME`, `TRIGGER_STATE`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_N_STATE`(`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_N_G_STATE`(`SCHED_NAME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_NEXT_FIRE_TIME`(`SCHED_NAME`, `NEXT_FIRE_TIME`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_NFT_ST`(`SCHED_NAME`, `TRIGGER_STATE`, `NEXT_FIRE_TIME`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_NFT_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_NFT_ST_MISFIRE`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_STATE`) USING BTREE,
+  INDEX `IDX_ZKT_ALARM_T_NFT_ST_MISFIRE_GRP`(`SCHED_NAME`, `MISFIRE_INSTR`, `NEXT_FIRE_TIME`, `TRIGGER_GROUP`, `TRIGGER_STATE`) USING BTREE,
+  CONSTRAINT `ZKT_ALARM_TRIGGERS_IBFK_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `ZKT_ALARM_JOB_DETAILS` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = INNODB CHARACTER SET = UTF8 COLLATE = UTF8_GENERAL_CI ROW_FORMAT = DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
+