zhoupeng 1 år sedan
förälder
incheckning
3c2a33906c

+ 17 - 0
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/ReportTable.java

@@ -49,6 +49,8 @@ public class ReportTable extends BaseSchedule implements Serializable {
      * 事件驱动子表特有的数量
      */
     private Integer currentNum;
+    //是否生成计算时间(0不计算,1计算)
+    private Integer isGenCountTime;
     /**
      * 版本号
      */
@@ -90,6 +92,21 @@ public class ReportTable extends BaseSchedule implements Serializable {
 
     public ReportTable(Integer reportTableType, Integer tableTemplateId,
                        String userId, String reportTableName, String reportTableData,
+                       Integer currentNum, Integer isGenCountTime,
+                       Integer version, Date createTime) {
+        this.reportTableType = reportTableType;
+        this.tableTemplateId = tableTemplateId;
+        this.userId = userId;
+        this.reportTableName = reportTableName;
+        this.reportTableData = reportTableData;
+        this.currentNum = currentNum;
+        this.isGenCountTime = isGenCountTime;
+        this.version = version;
+        this.createTime = createTime;
+    }
+
+    public ReportTable(Integer reportTableType, Integer tableTemplateId,
+                       String userId, String reportTableName, String reportTableData,
                        Integer version, Date createTime) {
         this.reportTableType = reportTableType;
         this.tableTemplateId = tableTemplateId;

+ 2 - 0
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/ReportTableItem.java

@@ -28,6 +28,8 @@ public class ReportTableItem implements Serializable {
      * 数据项备注,虚拟字段
      */
     private String describe;
+    //时间项类型(0开始,1结束)
+    private Integer timeItemType;
     /**
      * 0取原始值,1取计算值
      */

+ 2 - 2
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/TableTemplateTableItem.java

@@ -20,10 +20,10 @@ public class TableTemplateTableItem implements Serializable {
     private String itemName;
     //虚拟字段,用于返回数据。数据源配置id
     private Integer dataSourceId;
-    //是否为事件驱动项0不是,1是
-    private Integer isDriverItem;
     //虚拟字段,用于返回属性类型
     private Integer itemType;
+    //时间项类型(0开始,1结束)
+    private Integer timeItemType;
     //占位符名字(必填)
     private String placeHolder;
     //横坐标,x轴(必填)

+ 0 - 4
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/ItemGroupServiceImpl.java

@@ -256,10 +256,6 @@ public class ItemGroupServiceImpl implements ItemGroupService {
             if (tttiCount > 0) {
                 return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组在报表中配置了相应的数据项无法删除");
             }
-            Long ttciCount = reportTableDao.getTtciCountByItemId(itemList);
-            if (ttciCount > 0) {
-                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组在报表中配置了相应的数据项无法删除");
-            }
         }
         itemGroupDao.delItemByGroupId(id);
         itemGroupDao.delItemGroupById(id);

+ 10 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -46,6 +46,8 @@ public class OpcDaChangeTask extends TimerTask {
 
     private final String timeFormat;
 
+    private final List<Integer> tableIdList;
+
     private final Long endTime;
 
     public OpcDaChangeTask(RedisUtil redisUtil,
@@ -60,6 +62,7 @@ public class OpcDaChangeTask extends TimerTask {
                            Map<String, DataModel> map,
                            List<com.example.opc_common.entity.Item> itemList,
                            String timeFormat,
+                           List<Integer> tableIdList,
                            Long endTime) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
@@ -73,6 +76,7 @@ public class OpcDaChangeTask extends TimerTask {
         this.map = map;
         this.itemList = itemList;
         this.timeFormat = timeFormat;
+        this.tableIdList = tableIdList;
         this.endTime = endTime;
     }
 
@@ -171,10 +175,12 @@ public class OpcDaChangeTask extends TimerTask {
                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), dm.getReplacingValue(),
                                             currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                     opcAsyncTask.addCursorRawData(cursorRawData);
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                 } else {
                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), JSON.toJSONString(data),
                                             currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                     opcAsyncTask.addCursorRawData(cursorRawData);
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                 }
                             } else {
                                 try {
@@ -183,6 +189,7 @@ public class OpcDaChangeTask extends TimerTask {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), dm.getReplacingValue(),
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     } else {
                                         BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                                 MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
@@ -192,6 +199,7 @@ public class OpcDaChangeTask extends TimerTask {
                                                 Blank.isEmpty(oldValue) ? ConstantStr.IS_RECORD : MathUtil.isMeetChange(oldValue,
                                                         dmData, new BigDecimal(modeValue), readModeType), new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                         oldValue = dmData;
                                     }
 //                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
@@ -208,10 +216,12 @@ public class OpcDaChangeTask extends TimerTask {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, dm.getReplacingValue(),
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     } else {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     }
                                 }
                             }

+ 318 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask2.java

@@ -0,0 +1,318 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.lib.da.Item;
+import org.openscada.opc.lib.da.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Slf4j
+public class OpcDaChangeTask2 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<com.example.opc_common.entity.Item> itemList;
+
+    private final String timeFormat;
+
+    private final Long endTime;
+
+    public OpcDaChangeTask2(RedisUtil redisUtil,
+                            OpcAsyncTask opcAsyncTask,
+                            String cronId,
+                            CronTaskRegister cronTaskRegister,
+                            ItemGroupDao itemGroupDao,
+                            MessageNoticeDao messageNoticeDao,
+                            Timer timer,
+                            ItemGroup itemGroup,
+                            DataSource dataSource,
+                            Map<String, DataModel> map,
+                            List<com.example.opc_common.entity.Item> itemList,
+                            String timeFormat,
+                            Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.timeFormat = timeFormat;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer readModeType = itemGroup.getReadModeType();
+        Double modeValue = itemGroup.getModeValue();
+        Integer dataSourceId = dataSource.getId();
+        SyncAccess access = null;
+        try {
+            server.connect();
+            server.addStateListener(connected -> {
+                if (!connected) {
+                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                            "服务断开,马山进行重新连接",
+                            ConstantStr.NO_READ));
+                    Timer listenerTimer = new Timer();
+                    listenerTimer.schedule(new TimerTask() {
+                        @Override
+                        public void run() {
+                            try {
+                                server.connect();
+                                if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
+                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                            "服务重新连接成功",
+                                            ConstantStr.NO_READ));
+                                    listenerTimer.cancel();
+                                }
+                            } catch (Exception e) {
+//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
+//                                String message = OpcDaUtil.genException(e.getMessage());
+//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
+//                                        message,
+//                                        ConstantStr.NO_READ));
+//                                listenerTimer.cancel();
+                            }
+                        }
+                    }, 60000);
+                }
+            });
+        } catch (Exception e) {
+            String message = OpcDaUtil.genException(e.getMessage());
+            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                    message,
+                    ConstantStr.NO_READ));
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+            cronTaskRegister.removeCronTask(cronId);
+            timer.cancel();
+        }
+        try {
+            access = new SyncAccess(server, 500);
+            for (com.example.opc_common.entity.Item item : itemList) {
+                String itemId = item.getItemReadName();
+                access.addItem(itemId, new DataCallback() {
+                    private BigDecimal oldValue;
+                    private String sqlCurrentYmdh = "";
+                    private Long index = 0L;
+
+                    @Override
+                    public void changed(Item item1, ItemState itemState) {
+                        index++;
+                        try {
+                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
+                            DataModel dm = map.get(itemId);
+                            //读取的值
+                            String javaType = String.valueOf(val.get("javaType"));
+                            Object value = val.get("value");
+                            //值对应取值的时间
+                            Date time = itemState.getTimestamp().getTime();
+                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                            if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                sqlCurrentYmdh = currentYmdh;
+                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                            } else {
+                                if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                    //组装相应的原始数据
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                    sqlCurrentYmdh = currentYmdh;
+                                }
+                            }
+                            String valueStr = value.toString();
+                            if (javaType.toLowerCase().equals("boolean")) {
+                                Boolean data = JSON.parseObject(valueStr, Boolean.class);
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), dm.getReplacingValue(),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), JSON.toJSONString(data),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                }
+                            } else {
+                                try {
+                                    BigDecimal bigDecimal = JSON.parseObject(valueStr, BigDecimal.class);
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    } else {
+                                        BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                                MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                                bigDecimal;
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                currentYmdhmss, index, currentYmdh,
+                                                Blank.isEmpty(oldValue) ? ConstantStr.IS_RECORD : MathUtil.isMeetChange(oldValue,
+                                                        dmData, new BigDecimal(modeValue), readModeType), new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                        oldValue = dmData;
+                                    }
+//                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
+//                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+//                                            bigDecimal;
+//                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+//                                            currentYmdhmss, index, currentYmdh,
+//                                            Blank.isEmpty(oldValue) ? ConstantStr.IS_RECORD : MathUtil.isMeetChange(oldValue,
+//                                                    dmData, new BigDecimal(modeValue), readModeType), new Date());
+//                                    opcAsyncTask.addCursorRawData(cursorRawData);
+//                                    oldValue = dmData;
+                                } catch (Exception e) {
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    }
+                                }
+                            }
+                        } catch (Exception e) {
+                            //执行组装数据库的原始数据
+                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行停止",
+                                    e.getMessage(),
+                                    ConstantStr.NO_READ));
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                            cronTaskRegister.removeCronTask(cronId);
+                            timer.cancel();
+                        }
+                    }
+                });
+            }
+            access.bind();
+            while (true) {
+                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                if (Blank.isEmpty(flage)) {
+                    flage = false;
+                }
+//                if (!access.isActive()) {
+//                    //执行组装数据库的数据,以及生成驱动报表
+//                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+//                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+//                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+//                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+//                            "服务异常停止了",
+//                            ConstantStr.NO_READ));
+//                    if (Blank.isNotEmpty(access)) {
+//                        access.clear();
+//                    }
+//                    if (Blank.isNotEmpty(server)) {
+//                        server.dispose();
+//                    }
+//                    itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+//                    cronTaskRegister.removeCronTask(cronId);
+//                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+//                    timer.cancel();
+//                    break;
+//                }
+                if (!flage) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    cronTaskRegister.removeCronTask(cronId);
+                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    timer.cancel();
+                    break;
+                }
+                if (System.currentTimeMillis() >= endTime) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    timer.cancel();
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+            if (Blank.isEmpty(flage)) {
+                flage = false;
+            }
+            if (!flage) {
+                //执行组装数据库的数据,以及生成驱动报表
+                String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                if (Blank.isNotEmpty(access)) {
+                    access.clear();
+                }
+                if (Blank.isNotEmpty(server)) {
+                    server.dispose();
+                }
+                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 9 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java

@@ -44,6 +44,8 @@ public class OpcDaExceedTask extends TimerTask {
 
     private final String timeFormat;
 
+    private final List<Integer> tableIdList;
+
     private final Long endTime;
 
     public OpcDaExceedTask(RedisUtil redisUtil,
@@ -58,6 +60,7 @@ public class OpcDaExceedTask extends TimerTask {
                            Map<String, DataModel> map,
                            List<com.example.opc_common.entity.Item> itemList,
                            String timeFormat,
+                           List<Integer> tableIdList,
                            Long endTime) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
@@ -71,6 +74,7 @@ public class OpcDaExceedTask extends TimerTask {
         this.map = map;
         this.itemList = itemList;
         this.timeFormat = timeFormat;
+        this.tableIdList = tableIdList;
         this.endTime = endTime;
     }
 
@@ -164,12 +168,16 @@ public class OpcDaExceedTask extends TimerTask {
                                 CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData), JSON.toJSONString(dmData),
                                         currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                 opcAsyncTask.addCursorRawData(cursorRawData);
+                                opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                             } else {
                                 try {
                                     BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                                     BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                             MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                             bigDecimal;
+                                    CursorRawData cursorRawData1 = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData1);
                                     if (isDriverItem.equals(ConstantStr.IS_DRIVER_ITEM)) {
                                         BigDecimal bigDecimal1 = new BigDecimal(modeValue);
                                         if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
@@ -247,6 +255,7 @@ public class OpcDaExceedTask extends TimerTask {
                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
                                             currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                     opcAsyncTask.addCursorRawData(cursorRawData);
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                 }
                             }
                         } catch (Exception e) {

+ 352 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask2.java

@@ -0,0 +1,352 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.lib.da.Item;
+import org.openscada.opc.lib.da.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+public class OpcDaExceedTask2 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<com.example.opc_common.entity.Item> itemList;
+
+    private final String timeFormat;
+
+    private final Long endTime;
+
+    public OpcDaExceedTask2(RedisUtil redisUtil,
+                            OpcAsyncTask opcAsyncTask,
+                            String cronId,
+                            CronTaskRegister cronTaskRegister,
+                            ItemGroupDao itemGroupDao,
+                            MessageNoticeDao messageNoticeDao,
+                            Timer timer,
+                            ItemGroup itemGroup,
+                            DataSource dataSource,
+                            Map<String, DataModel> map,
+                            List<com.example.opc_common.entity.Item> itemList,
+                            String timeFormat,
+                            Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.timeFormat = timeFormat;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer eventMode = itemGroup.getEventMode();
+        Double modeValue = itemGroup.getModeValue();
+        Integer dataSourceId = dataSource.getId();
+        SyncAccess access = null;
+        try {
+            server.connect();
+            server.addStateListener(connected -> {
+                if (!connected) {
+                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                            "服务断开,马山进行重新连接",
+                            ConstantStr.NO_READ));
+                    Timer listenerTimer = new Timer();
+                    listenerTimer.schedule(new TimerTask() {
+                        @Override
+                        public void run() {
+                            try {
+                                server.connect();
+                                if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
+                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                            "服务重新连接成功",
+                                            ConstantStr.NO_READ));
+                                    listenerTimer.cancel();
+                                }
+                            } catch (Exception e) {
+//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
+//                                String message = OpcDaUtil.genException(e.getMessage());
+//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
+//                                        message,
+//                                        ConstantStr.NO_READ));
+//                                listenerTimer.cancel();
+                            }
+                        }
+                    }, 60000);
+                }
+            });
+        }catch (Exception e){
+            String message = OpcDaUtil.genException(e.getMessage());
+            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                    message,
+                    ConstantStr.NO_READ));
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+            cronTaskRegister.removeCronTask(cronId);
+            timer.cancel();
+        }
+        try {
+            access = new SyncAccess(server, 500);
+            for (com.example.opc_common.entity.Item item : itemList) {
+                String itemId = item.getItemReadName();
+                Integer isDriverItem = item.getIsDriverItem();
+                access.addItem(itemId, new DataCallback() {
+                    private Long index = 0L;
+                    private BigDecimal oldValue;
+
+                    @Override
+                    public void changed(Item item1, ItemState itemState) {
+                        index++;
+                        try {
+                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
+                            DataModel dm = map.get(itemId);
+
+                            //读取的值
+                            Object value = val.get("value");
+                            String javaType = String.valueOf(val.get("javaType"));
+                            //值对应取值的时间
+                            Date time = itemState.getTimestamp().getTime();
+                            //归属时间
+                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                            if (isDriverItem.equals(ConstantStr.IS_DRIVER_ITEM)) {
+                                if (index % 20 == 0) {
+                                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
+                                    redisUtil.set(ConstantStr.INDEX + id, index, ConstantStr.TWO_HOUR);
+                                }
+                            }
+                            if (javaType.toLowerCase().equals("boolean")) {
+                                Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData), JSON.toJSONString(dmData),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                opcAsyncTask.addCursorRawData(cursorRawData);
+                            } else {
+                                try {
+                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                            bigDecimal;
+                                    if (isDriverItem.equals(ConstantStr.IS_DRIVER_ITEM)) {
+                                        BigDecimal bigDecimal1 = new BigDecimal(modeValue);
+                                        if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                            if (dmData.compareTo(bigDecimal1) == 1) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                        } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                            if (dmData.compareTo(bigDecimal1) == -1) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                        } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                            if (dmData.compareTo(bigDecimal1) == 0) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                        } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
+                                            if (oldValue.compareTo(bigDecimal1) != 1) {
+                                                if (dmData.compareTo(bigDecimal1) == 1) {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                }
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                            oldValue = dmData;
+                                        } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
+                                            if (oldValue.compareTo(bigDecimal1) != -1) {
+                                                if (dmData.compareTo(bigDecimal1) == -1) {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                }
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                            oldValue = dmData;
+                                        }
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    }
+                                } catch (Exception e) {
+                                    String valueStr = value.toString();
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                }
+                            }
+                        } catch (Exception e) {
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                            redisUtil.del(ConstantStr.INDEX + id);
+
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                                    e.getMessage(),
+                                    ConstantStr.NO_READ));
+                            e.printStackTrace();
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                            cronTaskRegister.removeCronTask(cronId);
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            timer.cancel();
+                        }
+                    }
+                });
+            }
+            access.bind();
+            while (true) {
+                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                if (Blank.isEmpty(flage)) {
+                    flage = false;
+                }
+//                if (!access.isActive()) {
+//                    Long index = Long.valueOf(String.valueOf(redisUtil.get(ConstantStr.INDEX + id)));
+//                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+//                    redisUtil.del(ConstantStr.INDEX + id);
+//
+//                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+//                            "服务异常停止了",
+//                            ConstantStr.NO_READ));
+//                    if (Blank.isNotEmpty(access)) {
+//                        access.clear();
+//                    }
+//                    if (Blank.isNotEmpty(server)) {
+//                        server.dispose();
+//                    }
+//                    itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+//                    cronTaskRegister.removeCronTask(cronId);
+//                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+//                    timer.cancel();
+//                    break;
+//                }
+                if (!flage) {
+                    Long index = Long.valueOf(String.valueOf(redisUtil.get(ConstantStr.INDEX + id)));
+                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                    redisUtil.del(ConstantStr.INDEX + id);
+
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    cronTaskRegister.removeCronTask(cronId);
+                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    timer.cancel();
+                    break;
+                }
+                if (System.currentTimeMillis() >= endTime) {
+                    Long index = Long.valueOf(String.valueOf(redisUtil.get(ConstantStr.INDEX + id)));
+                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                    redisUtil.del(ConstantStr.INDEX + id);
+
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    timer.cancel();
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+            if (Blank.isEmpty(flage)) {
+                flage = false;
+            }
+            if (!flage) {
+                //执行组装数据库的数据,以及生成驱动报表
+                String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                if (Blank.isNotEmpty(access)) {
+                    access.clear();
+                }
+                if (Blank.isNotEmpty(server)) {
+                    server.dispose();
+                }
+                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 10 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -46,6 +46,8 @@ public class OpcDaFrequencyTask extends TimerTask {
 
     private final String timeFormat;
 
+    private final List<Integer> tableIdList;
+
     private final Long endTime;
 
     public OpcDaFrequencyTask(RedisUtil redisUtil,
@@ -60,6 +62,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                               Map<String, DataModel> map,
                               List<com.example.opc_common.entity.Item> itemList,
                               String timeFormat,
+                              List<Integer> tableIdList,
                               Long endTime) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
@@ -73,6 +76,7 @@ public class OpcDaFrequencyTask extends TimerTask {
         this.map = map;
         this.itemList = itemList;
         this.timeFormat = timeFormat;
+        this.tableIdList = tableIdList;
         this.endTime = endTime;
     }
 
@@ -171,10 +175,12 @@ public class OpcDaFrequencyTask extends TimerTask {
                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), dm.getReplacingValue(),
                                             currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                     opcAsyncTask.addCursorRawData(cursorRawData);
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                 } else {
                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), JSON.toJSONString(data),
                                             currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                     opcAsyncTask.addCursorRawData(cursorRawData);
+                                    opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                 }
                             } else {
                                 try {
@@ -183,6 +189,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), dm.getReplacingValue(),
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     } else {
                                         BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                                 MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
@@ -190,16 +197,19 @@ public class OpcDaFrequencyTask extends TimerTask {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     }
                                 } catch (Exception e) {
                                     if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, dm.getReplacingValue(),
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     } else {
                                         CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
                                                 currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
                                         opcAsyncTask.addCursorRawData(cursorRawData);
+                                        opcAsyncTask.addDeviceRawData(tableIdList, cursorRawData);
                                     }
                                 }
                             }

+ 307 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask2.java

@@ -0,0 +1,307 @@
+package com.example.opc_da.task;
+
+import com.alibaba.fastjson.JSON;
+import com.example.opc_common.entity.*;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_common.util.DateUtil;
+import com.example.opc_common.util.MathUtil;
+import com.example.opc_da.dao.ItemGroupDao;
+import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dynamicSchedule.CronTaskRegister;
+import com.example.opc_da.util.OpcDaUtil;
+import com.example.opc_da.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.openscada.opc.dcom.da.OPCSERVERSTATE;
+import org.openscada.opc.lib.da.Item;
+import org.openscada.opc.lib.da.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Slf4j
+public class OpcDaFrequencyTask2 extends TimerTask {
+
+    private final RedisUtil redisUtil;
+
+    private final OpcAsyncTask opcAsyncTask;
+
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
+    private final ItemGroupDao itemGroupDao;
+
+    private final MessageNoticeDao messageNoticeDao;
+
+    private final Timer timer;
+
+    private final ItemGroup itemGroup;
+
+    private final DataSource dataSource;
+
+    private final Map<String, DataModel> map;
+
+    private final List<com.example.opc_common.entity.Item> itemList;
+
+    private final String timeFormat;
+
+    private final Long endTime;
+
+    public OpcDaFrequencyTask2(RedisUtil redisUtil,
+                               OpcAsyncTask opcAsyncTask,
+                               String cronId,
+                               CronTaskRegister cronTaskRegister,
+                               ItemGroupDao itemGroupDao,
+                               MessageNoticeDao messageNoticeDao,
+                               Timer timer,
+                               ItemGroup itemGroup,
+                               DataSource dataSource,
+                               Map<String, DataModel> map,
+                               List<com.example.opc_common.entity.Item> itemList,
+                               String timeFormat,
+                               Long endTime) {
+        this.redisUtil = redisUtil;
+        this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
+        this.itemGroupDao = itemGroupDao;
+        this.messageNoticeDao = messageNoticeDao;
+        this.timer = timer;
+        this.itemGroup = itemGroup;
+        this.dataSource = dataSource;
+        this.map = map;
+        this.itemList = itemList;
+        this.timeFormat = timeFormat;
+        this.endTime = endTime;
+    }
+
+    @Override
+    public void run() {
+        Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
+        SyncAccess access = null;
+        try {
+            server.connect();
+            server.addStateListener(connected -> {
+                if (!connected) {
+                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                            "服务断开,马山进行重新连接",
+                            ConstantStr.NO_READ));
+                    Timer listenerTimer = new Timer();
+                    listenerTimer.schedule(new TimerTask() {
+                        @Override
+                        public void run() {
+                            try {
+                                server.connect();
+                                if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
+                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
+                                            "服务重新连接成功",
+                                            ConstantStr.NO_READ));
+                                    listenerTimer.cancel();
+                                }
+                            } catch (Exception e) {
+//                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
+//                                String message = OpcDaUtil.genException(e.getMessage());
+//                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
+//                                        message,
+//                                        ConstantStr.NO_READ));
+//                                listenerTimer.cancel();
+                            }
+                        }
+                    }, 60000);
+                }
+            });
+        } catch (Exception e) {
+            String message = OpcDaUtil.genException(e.getMessage());
+            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                    message,
+                    ConstantStr.NO_READ));
+            if (Blank.isNotEmpty(server)) {
+                server.dispose();
+            }
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+            cronTaskRegister.removeCronTask(cronId);
+            timer.cancel();
+        }
+        try {
+            access = new SyncAccess(server, (int) (Math.round(itemGroup.getModeValue() * 1000)));
+//            AccessBase access = new Async20Access(server, (int) (itemGroup.getModeValue() * 1000), true);
+            for (com.example.opc_common.entity.Item item : itemList) {
+                String itemId = item.getItemReadName();
+                access.addItem(itemId, new DataCallback() {
+
+                    private String sqlCurrentYmdh = "";
+                    private Long index = 0L;
+
+                    @Override
+                    public void changed(Item item1, ItemState itemState) {
+                        index++;
+                        try {
+                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
+                            DataModel dm = map.get(itemId);
+                            //读取的值
+                            String javaType = String.valueOf(val.get("javaType"));
+                            Object value = val.get("value");
+                            //值对应取值的时间
+                            Date time = itemState.getTimestamp().getTime();
+                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                            if (Blank.isEmpty(sqlCurrentYmdh)) {
+                                sqlCurrentYmdh = currentYmdh;
+                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                            } else {
+                                if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                    //组装相应的原始数据
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                                    sqlCurrentYmdh = currentYmdh;
+                                }
+                            }
+                            String valueStr = value.toString();
+                            if (javaType.toLowerCase().equals("boolean")) {
+                                //存数据
+                                Boolean data = JSON.parseObject(valueStr, Boolean.class);
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), dm.getReplacingValue(),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), JSON.toJSONString(data),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                }
+                            } else {
+                                try {
+                                    BigDecimal bigDecimal = JSON.parseObject(valueStr, BigDecimal.class);
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    } else {
+                                        BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                                MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                                bigDecimal;
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    }
+                                } catch (Exception e) {
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
+                                    }
+                                }
+                            }
+                        } catch (Exception e) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+
+                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+                                    e.getMessage(),
+                                    ConstantStr.NO_READ));
+                            if (Blank.isNotEmpty(server)) {
+                                server.dispose();
+                            }
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                            cronTaskRegister.removeCronTask(cronId);
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                            timer.cancel();
+                        }
+                    }
+                });
+            }
+            access.bind();
+            while (true) {
+                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                if (Blank.isEmpty(flage)) {
+                    flage = false;
+                }
+//                if (!access.isActive()) {
+//                    //执行组装数据库的数据,以及生成驱动报表
+//                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+//                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+//                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+//                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+//                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
+//                            "服务异常停止了",
+//                            ConstantStr.NO_READ));
+//                    if (Blank.isNotEmpty(access)) {
+//                        access.clear();
+//                    }
+//                    if (Blank.isNotEmpty(server)) {
+//                        server.dispose();
+//                    }
+//                    itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+//                    cronTaskRegister.removeCronTask(cronId);
+//                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+//                    timer.cancel();
+//                    break;
+//                }
+                if (!flage) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    cronTaskRegister.removeCronTask(cronId);
+                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    timer.cancel();
+                    break;
+                }
+                if (System.currentTimeMillis() >= endTime) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+
+                    if (Blank.isNotEmpty(access)) {
+                        access.clear();
+                    }
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    timer.cancel();
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+            if (Blank.isEmpty(flage)) {
+                flage = false;
+            }
+            if (!flage) {
+                //执行组装数据库的数据,以及生成驱动报表
+                String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                if (Blank.isNotEmpty(access)) {
+                    access.clear();
+                }
+                if (Blank.isNotEmpty(server)) {
+                    server.dispose();
+                }
+                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 10 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaTask.java

@@ -11,6 +11,7 @@ import com.example.opc_common.util.MathUtil;
 import com.example.opc_da.dao.DataModelDao;
 import com.example.opc_da.dao.ItemGroupDao;
 import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_da.dao.ReportTableDao;
 import com.example.opc_da.dynamicSchedule.CronTaskRegister;
 import com.example.opc_da.util.OpcDaUtil;
 import com.example.opc_da.util.RedisUtil;
@@ -37,6 +38,9 @@ public class OpcDaTask {
     private ItemGroupDao itemGroupDao;
 
     @Autowired
+    private ReportTableDao reportTableDao;
+
+    @Autowired
     private OpcAsyncTask opcAsyncTask;
 
     @Autowired
@@ -76,6 +80,9 @@ public class OpcDaTask {
         if (Blank.isNotEmpty(basicItemList)) {
             List<DataModel> dmBasicItemList = dataModelDao.getDmListByItemList(basicItemList);
             Map<String, DataModel> basicMap = DataModel.genMap(basicItemList, dmBasicItemList);
+            //查看此数据组是否在设备报表中被配置
+            List<Integer> tableIdList = reportTableDao.getDeviceTableByItemId(basicItemList, ConstantStr.DEVICE_REPORT);
+            //有多少个报表,就存多少份,然后每20筛选一次数据
             if (readMode == ConstantStr.ON_FREQUENCY) {
                 timer.schedule(new OpcDaFrequencyTask(redisUtil,
                                 opcAsyncTask,
@@ -89,6 +96,7 @@ public class OpcDaTask {
                                 basicMap,
                                 basicItemList,
                                 timeFormat,
+                                tableIdList,
                                 endDate.getTime()),
                         startDate);
             } else if (readMode == ConstantStr.ON_CHANGE) {
@@ -104,6 +112,7 @@ public class OpcDaTask {
                                 basicMap,
                                 basicItemList,
                                 timeFormat,
+                                tableIdList,
                                 endDate.getTime()),
                         startDate);
             } else if (readMode == ConstantStr.EXCEED_SET_VALUE) {
@@ -119,6 +128,7 @@ public class OpcDaTask {
                                 basicMap,
                                 basicItemList,
                                 timeFormat,
+                                tableIdList,
                                 endDate.getTime()),
                         startDate);
             } else {

+ 150 - 30
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/ReportTableTask.java

@@ -399,17 +399,9 @@ public class ReportTableTask {
         Integer tableTemplateId = tableTemplate.getId();
         List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
         Integer eventNum = tableTemplate.getEventNum();
-        Integer eventMode = tableTemplate.getEventMode();
-        Double modeValue = tableTemplate.getModeValue();
         if (Blank.isEmpty(eventNum)) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动显示数量设置不能为空");
         }
-        if (Blank.isEmpty(eventMode)) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请选择阈值条件");
-        }
-        if (Blank.isEmpty(modeValue)) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请输入模式值");
-        }
 
         //根据模板生成相应的报表
         ReportTable reportTable = new ReportTable(
@@ -426,19 +418,11 @@ public class ReportTableTask {
         }
 
         if (Blank.isNotEmpty(tableTemplateItemList)) {
-            int count = 0;
             for (TableTemplateTableItem t : tableTemplateItemList) {
                 t.setTableTemplateId(tableTemplateId);
                 if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis(), t.getValueType())) {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标、取值类型都不能为空");
                 }
-                Integer isDriverItem = t.getIsDriverItem();
-                if (Blank.isNotEmpty(isDriverItem) && isDriverItem.equals(ConstantStr.IS_DRIVER_ITEM)) {
-                    count += 1;
-                }
-            }
-            if (count != 1) {
-                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,有且只有一个事件驱动项");
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
             reportTableDao.addTableTemplateItem(tableTemplateItemList);
@@ -456,17 +440,9 @@ public class ReportTableTask {
         Integer tableTemplateId = tableTemplate.getId();
         List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
         Integer eventNum = tableTemplate.getEventNum();
-        Integer eventMode = tableTemplate.getEventMode();
-        Double modeValue = tableTemplate.getModeValue();
         if (Blank.isEmpty(eventNum)) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动显示数量设置不能为空");
         }
-        if (Blank.isEmpty(eventMode)) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请选择阈值条件");
-        }
-        if (Blank.isEmpty(modeValue)) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请输入模式值");
-        }
 
         //根据模板修改相应的报表
 //        reportTable.setReportTableName(tableTemplate.getTemplateName());
@@ -482,19 +458,92 @@ public class ReportTableTask {
         //删除报表表格数据相关的数据项信息
         reportTableDao.delRtiByRtId(reportTableId);
         if (Blank.isNotEmpty(tableTemplateItemList)) {
-            int count = 0;
             for (TableTemplateTableItem t : tableTemplateItemList) {
                 t.setTableTemplateId(tableTemplateId);
                 if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis(), t.getValueType())) {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标、取值类型都不能为空");
                 }
-                Integer isDriverItem = t.getIsDriverItem();
-                if (Blank.isNotEmpty(isDriverItem) && isDriverItem.equals(ConstantStr.IS_DRIVER_ITEM)) {
-                    count += 1;
+            }
+            //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
+            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+        } else {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,不能没有数据项");
+        }
+    }
+
+    /**
+     * 设备报表模板新增,保存相应的数据项信息,生成相应的报表(设备报表不存在统计图)
+     *
+     * @param tableTemplate
+     */
+    public void addDeviceReport(TableTemplate tableTemplate) {
+        Integer tableTemplateId = tableTemplate.getId();
+        List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
+        Integer eventNum = tableTemplate.getEventNum();
+        Integer isGenCountTime = tableTemplate.getIsGenCountTime();
+        if (Blank.isEmpty(eventNum, isGenCountTime)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "显示数量,是否生成计算时间不能为空");
+        }
+        Integer variableType = tableTemplate.getVariableType();
+        if (Blank.isEmpty(variableType)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型不能为空");
+        }
+        Integer startItemId = tableTemplate.getStartItemId();
+        String startValue = tableTemplate.getStartValue();
+        Integer endItemId = tableTemplate.getEndItemId();
+        String endValue = tableTemplate.getEndValue();
+        if (Blank.isEmpty(startItemId, startValue, endItemId, endValue)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "开始数据项、开始值、结束数据项、结束值不能为空");
+        }
+        if (variableType.equals(ConstantStr.UNIVARIATE)) {
+            if (!startItemId.equals(endItemId)) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型为单变量时,开始、结束数据项应为同一个数据项");
+            }
+        } else if (variableType.equals(ConstantStr.BIVARIATE)) {
+            if (startItemId.equals(endItemId)) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型为双变量时,开始、结束数据项应不为同一个数据项");
+            }
+        } else {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型只能为单变量或者双变量");
+        }
+
+        //根据模板生成相应的报表
+        ReportTable reportTable = new ReportTable(
+                tableTemplate.getTemplateType(), tableTemplateId, tableTemplate.getUserId(), tableTemplate.getTemplateName(),
+                tableTemplate.getTemplateData(), eventNum, tableTemplate.getIsGenCountTime(), ConstantStr.DEFAULT_VERSION, tableTemplate.getCreateTime()
+        );
+        String userId = userUtil.getCurrentUserId();
+        ReportTable isExistReportTable = reportTableDao.getReportTableByName(userId, reportTable.getReportTableName());
+        if (Blank.isNotEmpty(isExistReportTable)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "已经存在此报表名称了,请修改");
+        }
+        if (reportTableDao.addReportTable(reportTable) <= 0) {
+            throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
+        }
+
+        if (Blank.isNotEmpty(tableTemplateItemList)) {
+            int startCount = 0;
+            int endCount = 0;
+            for (TableTemplateTableItem t : tableTemplateItemList) {
+                t.setTableTemplateId(tableTemplateId);
+                if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis(), t.getValueType())) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标、取值类型都不能为空");
+                }
+                Integer timeItemType = t.getTimeItemType();
+                if (Blank.isNotEmpty(timeItemType)) {
+                    if (timeItemType.equals(ConstantStr.START_TIME_ITEM)) {
+                        startCount++;
+                    }
+                    if (timeItemType.equals(ConstantStr.END_TIME_ITEM)) {
+                        endCount++;
+                    }
                 }
             }
-            if (count != 1) {
-                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,有且只有一个事件驱动项");
+            if (startCount != 1) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "开始时间项只能有一个");
+            }
+            if (endCount != 1) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "结束时间项只能有一个");
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
             reportTableDao.addTableTemplateItem(tableTemplateItemList);
@@ -503,6 +552,77 @@ public class ReportTableTask {
         }
     }
 
+
+    public void updateDeviceReport(TableTemplate tableTemplate, ReportTable reportTable) {
+        Integer tableTemplateId = tableTemplate.getId();
+        List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
+        Integer eventNum = tableTemplate.getEventNum();
+        Integer isGenCountTime = tableTemplate.getIsGenCountTime();
+        if (Blank.isEmpty(eventNum, isGenCountTime)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "显示数量,是否生成计算时间不能为空");
+        }
+        Integer variableType = tableTemplate.getVariableType();
+        if (Blank.isEmpty(variableType)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型不能为空");
+        }
+        Integer startItemId = tableTemplate.getStartItemId();
+        String startValue = tableTemplate.getStartValue();
+        Integer endItemId = tableTemplate.getEndItemId();
+        String endValue = tableTemplate.getEndValue();
+        if (Blank.isEmpty(startItemId, startValue, endItemId, endValue)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "开始数据项、开始值、结束数据项、结束值不能为空");
+        }
+        if (variableType.equals(ConstantStr.UNIVARIATE)) {
+            if (!startItemId.equals(endItemId)) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型为单变量时,开始、结束数据项应为同一个数据项");
+            }
+        } else if (variableType.equals(ConstantStr.BIVARIATE)) {
+            if (startItemId.equals(endItemId)) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型为双变量时,开始、结束数据项应不为同一个数据项");
+            }
+        } else {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型只能为单变量或者双变量");
+        }
+
+        //根据模板生成相应的报表
+        reportTable.setReportTableData(tableTemplate.getTemplateData());
+        reportTable.setIsGenCountTime(tableTemplate.getIsGenCountTime());
+        reportTable.setVersion(tableTemplate.getVersion());
+        if (reportTableDao.addReportTable(reportTable) <= 0) {
+            throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
+        }
+
+        if (Blank.isNotEmpty(tableTemplateItemList)) {
+            int startCount = 0;
+            int endCount = 0;
+            for (TableTemplateTableItem t : tableTemplateItemList) {
+                t.setTableTemplateId(tableTemplateId);
+                if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis(), t.getValueType())) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标、取值类型都不能为空");
+                }
+                Integer timeItemType = t.getTimeItemType();
+                if (Blank.isNotEmpty(timeItemType)) {
+                    if (timeItemType.equals(ConstantStr.START_TIME_ITEM)) {
+                        startCount++;
+                    }
+                    if (timeItemType.equals(ConstantStr.END_TIME_ITEM)) {
+                        endCount++;
+                    }
+                }
+            }
+            if (startCount != 1) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "开始时间项只能有一个");
+            }
+            if (endCount != 1) {
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "结束时间项只能有一个");
+            }
+            //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
+            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+        } else {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "设备报表不能没有数据项");
+        }
+    }
+
     /**
      * 根据报表获取手动报表相关的实时数据
      *