Browse Source

Merge branch 'master' of http://116.63.33.55/git/read_opc

FinalYu 1 year ago
parent
commit
a9fdfb7459
19 changed files with 1583 additions and 530 deletions
  1. 4 1
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/ItemGroupDao.java
  2. 5 1
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/RawDataDao.java
  3. 13 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/DataSourceServiceImpl.java
  4. 21 10
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcAsyncTask.java
  5. 142 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java
  6. 330 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask3.java
  7. 145 154
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java
  8. 360 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask3.java
  9. 117 137
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java
  10. 324 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask3.java
  11. 25 6
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaTask.java
  12. 17 6
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/ScheduledTask.java
  13. 17 184
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/util/OpcDaUtil.java
  14. BIN
      chaunyi_opc/opc_da/src/main/resources/lib/org.openscada.opc.lib-1.5.0.jar
  15. 1 4
      chaunyi_opc/opc_da/src/main/resources/mapper/ChartDao.xml
  16. 17 11
      chaunyi_opc/opc_da/src/main/resources/mapper/ItemGroupDao.xml
  17. 39 10
      chaunyi_opc/opc_da/src/main/resources/mapper/RawDataDao.xml
  18. 5 3
      chaunyi_opc/opc_da/src/main/resources/mapper/ReportTableDao.xml
  19. 1 3
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/util/OpcUaUtil.java

+ 4 - 1
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/ItemGroupDao.java

@@ -66,5 +66,8 @@ public interface ItemGroupDao {
 
     List<Item> getItemListByGidList(List<ItemGroup> itemGroupList);
 
-    Integer updateItemTypeList(String strArr,String replaceStr);
+    Integer updateItemTypeList(String strArr, String replaceStr);
+
+    //修改数据组中全部数据项为基础属性
+    Integer updateItByItemGroupId(Integer itemGroupId,Integer itemType);
 }

+ 5 - 1
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/RawDataDao.java

@@ -30,6 +30,8 @@ public interface RawDataDao {
 
     Integer addCursorRawData(CursorRawData cursorRawData);
 
+    Integer addCursorRawDataList(List<CursorRawData> cursorRawDataList);
+
     RawData getRawData(Integer itemGroupId, Integer dataSourceId, String itemName, Long dataIndex);
 
     List<Long> getMeetIndexList(Integer itemGroupId, Integer dataSourceId, List<Item> itemList, String valueBelongTime, Integer isRecord);
@@ -56,7 +58,9 @@ public interface RawDataDao {
 
     Integer addAttachRawData(AttachRawData attachRawData);
 
-    Integer updateAttachRawData(AttachRawData attachRawData);
+    Integer addAttachRawDataList(List<AttachRawData> attachRawDataList);
+
+    Integer delAttachRawDataList(Integer itemGroupId,Integer dataSourceId,List<AttachRawData> attachRawDataList);
 
     List<Long> getEventRealIndexList(Integer itemGroupId, Integer dataSourceId, Integer itemId, List<Long> indexList);
 

+ 13 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/DataSourceServiceImpl.java

@@ -300,10 +300,12 @@ public class DataSourceServiceImpl implements DataSourceService {
     public synchronized Result updateDataSourceDriver(DataSourceDriver dataSourceDriver) {
         String clsId = dataSourceDriver.getClsId();
         if (OpcDaUtil.isAdapterClsId(clsId)) {
+            //查询数据库中原有的数据驱动
             DataSourceDriver dataSouceDriver1 = dataSourceDao.getDataSourceDriverNoId(dataSourceDriver);
             if (Blank.isNotEmpty(dataSouceDriver1)) {
                 return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "已经存在此种驱动的配置了");
             }
+            //修改数据驱动
             if (dataSourceDao.updateDataSourceDriver(dataSourceDriver) <= 0) {
                 return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改驱动配置失败");
             }
@@ -354,10 +356,21 @@ public class DataSourceServiceImpl implements DataSourceService {
 
     @Override
     public Result delDataSourceDriver(Integer id) {
+        DataSourceDriver dataSourceDriver = dataSourceDao.getDataSourceDriverByid(id);
         if (dataSourceDao.delDataSourceDriver(id) <= 0) {
             return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "删除失败");
         }
         dataSourceDao.delDriverBasicItem(id);
+        String clsId = dataSourceDriver.getClsId();
+        List<DataSource> dataSourceList = dataSourceDao.getDataSourceByclsId(clsId);
+        if (Blank.isNotEmpty(dataSourceList)) {
+            List<ItemGroup> itemGroupList = itemGroupDao.getIgListByDsId(dataSourceList);
+            if (Blank.isNotEmpty(itemGroupList)) {
+                for (ItemGroup itemGroup : itemGroupList) {
+                    itemGroupDao.updateItByItemGroupId(itemGroup.getId(),ConstantStr.BASIC_ATTRIBUTES);
+                }
+            }
+        }
         return Result.ok("删除成功");
     }
 

+ 21 - 10
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcAsyncTask.java

@@ -1,11 +1,12 @@
 package com.example.opc_da.task;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.example.opc_common.entity.*;
 import com.example.opc_common.enums.ResultEnum;
 import com.example.opc_common.exception.CustomException;
-import com.example.opc_common.util.*;
+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_da.dao.ItemGroupDao;
 import com.example.opc_da.dao.RawDataDao;
 import com.example.opc_da.dao.ReportTableDao;
@@ -58,14 +59,24 @@ public class OpcAsyncTask {
         }
     }
 
-    public synchronized void addAttachRawData(AttachRawData attachRawData) {
-        if (Blank.isNotEmpty(attachRawData)) {
-            AttachRawData attachRawData1 = rawDataDao.getAttachRawDataReal(attachRawData.getItemGroupId(), attachRawData.getDataSourceId(), attachRawData.getItemName());
-            if (Blank.isEmpty(attachRawData1)) {
-                rawDataDao.addAttachRawData(attachRawData);
-            } else {
-                rawDataDao.updateAttachRawData(attachRawData);
-            }
+    /**
+     * 新增一组临时数据
+     *
+     * @param cursorRawDataList
+     */
+    public void addCursorRawDataList(List<CursorRawData> cursorRawDataList) {
+        if (Blank.isNotEmpty(cursorRawDataList)) {
+            rawDataDao.addCursorRawDataList(cursorRawDataList);
+        }
+    }
+
+    public synchronized void addAttachRawDataList(List<AttachRawData> attachRawDataList) {
+        if (Blank.isNotEmpty(attachRawDataList)) {
+            AttachRawData attachRawData = attachRawDataList.get(0);
+            Integer itemGroupId = attachRawData.getItemGroupId();
+            Integer dataSourceId = attachRawData.getDataSourceId();
+            rawDataDao.delAttachRawDataList(itemGroupId, dataSourceId, attachRawDataList);
+            rawDataDao.addAttachRawDataList(attachRawDataList);
         }
     }
 

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

@@ -19,6 +19,8 @@ import org.openscada.opc.lib.da.*;
 import java.math.BigDecimal;
 import java.util.*;
 
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
 @Slf4j
 public class OpcDaChangeTask extends TimerTask {
 
@@ -44,6 +46,8 @@ public class OpcDaChangeTask extends TimerTask {
 
     private final List<com.example.opc_common.entity.Item> itemList;
 
+    private final String[] items;
+
     private final String timeFormat;
 
     private final Map<String, List<TableTemplate>> ttMap;
@@ -61,6 +65,7 @@ public class OpcDaChangeTask extends TimerTask {
                            DataSource dataSource,
                            Map<String, DataModel> map,
                            List<com.example.opc_common.entity.Item> itemList,
+                           String[] items,
                            String timeFormat,
                            Map<String, List<TableTemplate>> ttMap,
                            Long endTime) {
@@ -75,6 +80,7 @@ public class OpcDaChangeTask extends TimerTask {
         this.dataSource = dataSource;
         this.map = map;
         this.itemList = itemList;
+        this.items = items;
         this.timeFormat = timeFormat;
         this.ttMap = ttMap;
         this.endTime = endTime;
@@ -144,6 +150,142 @@ public class OpcDaChangeTask extends TimerTask {
             timer.cancel();
         }
         try {
+            Group group = server.addGroup();
+            Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+            itemSet.toArray(itemArr);
+            String sqlCurrentYmdh = "";
+            Long index = 0L;
+            while (true) {
+                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                if (Blank.isEmpty(flage)) {
+                    flage = false;
+                }
+                if (!flage) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    }
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    cronTaskRegister.removeCronTask(cronId);
+                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    timer.cancel();
+                    break;
+                }
+                if (System.currentTimeMillis() >= endTime) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                    }
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    timer.cancel();
+                    break;
+                }
+                try {
+                    Thread.sleep(1000);
+                    index++;
+                    Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                    List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                    for (Item key : resultMap.keySet()) {
+                        String keyId = key.getId();
+                        ItemState itemMap = resultMap.get(key);
+                        Map<String, Object> val = getVal(itemMap.getValue());
+                        String javaType = val.get("javaType").toString();
+                        Object value = val.get("value");
+                        Date time = itemMap.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);
+                                sqlCurrentYmdh = currentYmdh;
+                            }
+                        }
+                        if (!javaType.toLowerCase().equals("boolean")) {
+                            try {
+                                DataModel dm = map.get(keyId);
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                        && dm.getOperationRule().equals(value.toString())) {
+
+                                } else {
+                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                            bigDecimal;
+                                    Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh,
+                                            ConstantStr.IS_RECORD, new Date());
+                                    if (Blank.isEmpty(oldValue)) {
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        if ((MathUtil.isMeetChange((BigDecimal) oldValue,
+                                                dmData, new BigDecimal(modeValue), readModeType)).equals(ConstantStr.IS_RECORD)) {
+                                            cursorRawDataList.add(cursorRawData);
+                                        }
+                                    }
+                                    redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                }
+                            } catch (Exception e) {
+
+                            }
+                        }
+                    }
+                    if (Blank.isNotEmpty(cursorRawDataList)) {
+                        opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                        cursorRawDataList = new ArrayList<>();
+                    }
+                } catch (Exception e) {
+                    flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        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(server)) {
+                            server.dispose();
+                        }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
+                    }
+                }
+            }
+        } 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(server)) {
+                    server.dispose();
+                }
+                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+        try {
             access = new SyncAccess(server, 500);
             for (com.example.opc_common.entity.Item item : itemList) {
                 String itemId = item.getItemReadName();

+ 330 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask3.java

@@ -0,0 +1,330 @@
+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 OpcDaChangeTask3 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 Map<String, List<TableTemplate>> ttMap;
+
+    private final Long endTime;
+
+    public OpcDaChangeTask3(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,
+                            Map<String, List<TableTemplate>> ttMap,
+                            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.ttMap = ttMap;
+        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) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                "服务断开,马上进行重新连接",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        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));
+                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                                        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.STOP_IT);
+            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.STOP_IT);
+                            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.STOP_IT);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 145 - 154
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java

@@ -18,6 +18,8 @@ import org.openscada.opc.lib.da.*;
 import java.math.BigDecimal;
 import java.util.*;
 
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
 public class OpcDaExceedTask extends TimerTask {
 
     private final RedisUtil redisUtil;
@@ -42,6 +44,8 @@ public class OpcDaExceedTask extends TimerTask {
 
     private final List<com.example.opc_common.entity.Item> itemList;
 
+    private final String[] items;
+
     private final String timeFormat;
 
     private final Long endTime;
@@ -57,6 +61,7 @@ public class OpcDaExceedTask extends TimerTask {
                            DataSource dataSource,
                            Map<String, DataModel> map,
                            List<com.example.opc_common.entity.Item> itemList,
+                           String[] items,
                            String timeFormat,
                            Long endTime) {
         this.redisUtil = redisUtil;
@@ -70,6 +75,7 @@ public class OpcDaExceedTask extends TimerTask {
         this.dataSource = dataSource;
         this.map = map;
         this.itemList = itemList;
+        this.items = items;
         this.timeFormat = timeFormat;
         this.endTime = endTime;
     }
@@ -81,7 +87,7 @@ public class OpcDaExceedTask extends TimerTask {
         Integer eventMode = itemGroup.getEventMode();
         Double modeValue = itemGroup.getModeValue();
         Integer dataSourceId = dataSource.getId();
-        SyncAccess access = null;
+        String driverItem = OpcDaUtil.getDriverItem(itemList);
         try {
             server.connect();
             server.addStateListener(connected -> {
@@ -138,201 +144,189 @@ public class OpcDaExceedTask extends TimerTask {
             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;
+            Group group = server.addGroup();
+            Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+            itemSet.toArray(itemArr);
+            Long index = 0L;
+            while (true) {
+                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                if (Blank.isEmpty(flage)) {
+                    flage = false;
+                }
+                if (!flage) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
 
-                    @Override
-                    public void changed(Item item1, ItemState itemState) {
-                        index++;
-                        try {
-                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
-                            DataModel dm = map.get(itemId);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    cronTaskRegister.removeCronTask(cronId);
+                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                    timer.cancel();
+                    break;
+                }
+                if (System.currentTimeMillis() >= endTime) {
+                    //执行组装数据库的数据,以及生成驱动报表
+                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
 
-                            //读取的值
-                            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);
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                    if (Blank.isNotEmpty(server)) {
+                        server.dispose();
+                    }
+                    timer.cancel();
+                    break;
+                }
+                try {
+                    Thread.sleep(1000);
+                    index++;
+                    redisUtil.set(ConstantStr.INDEX + id, index);
+                    Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                    List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                    for (Item key : resultMap.keySet()) {
+                        String keyId = key.getId();
+                        ItemState itemMap = resultMap.get(key);
+                        Map<String, Object> val = getVal(itemMap.getValue());
+                        String javaType = val.get("javaType").toString();
+                        Object value = val.get("value");
+                        Date time = itemMap.getTimestamp().getTime();
+                        String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                        String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                        DataModel dm = map.get(keyId);
+                        if (keyId.equals(driverItem) && (index % 20 == 0)) {
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
+                        }
+                        if (javaType.toLowerCase().equals("boolean")) {
+                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                    && dm.getOperationRule().equals(value.toString())) {
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
                             } else {
-                                try {
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
+                            }
+                        } else {
+                            try {
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                        && dm.getOperationRule().equals(value.toString())) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } else {
                                     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)) {
+                                    if (keyId.equals(driverItem)) {
                                         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),
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                         currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                                cursorRawDataList.add(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);
+                                                cursorRawDataList = new ArrayList<>();
+                                                break;
                                             }
                                         } 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),
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                         currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                                cursorRawDataList.add(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);
+                                                cursorRawDataList = new ArrayList<>();
+                                                break;
                                             }
                                         } 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),
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                         currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                                cursorRawDataList.add(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);
+                                                cursorRawDataList = new ArrayList<>();
+                                                break;
                                             }
                                         } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
-                                            if (oldValue.compareTo(bigDecimal1) != 1) {
+                                            if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
                                                 if (dmData.compareTo(bigDecimal1) == 1) {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                             currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                    cursorRawDataList.add(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);
+                                                    cursorRawDataList = new ArrayList<>();
+                                                    break;
                                                 }
                                             } 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);
+                                                cursorRawDataList = new ArrayList<>();
+                                                break;
                                             }
-                                            oldValue = dmData;
+                                            redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                         } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
-                                            if (oldValue.compareTo(bigDecimal1) != -1) {
+                                            if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
                                                 if (dmData.compareTo(bigDecimal1) == -1) {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
                                                             currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                                    cursorRawDataList.add(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);
+                                                    cursorRawDataList = new ArrayList<>();
+                                                    break;
                                                 }
                                             } 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);
+                                                cursorRawDataList = new ArrayList<>();
+                                                break;
                                             }
-                                            oldValue = dmData;
+                                            redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                         }
                                     } 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);
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(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) {
+                                if (Blank.isNotEmpty(value)) {
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                            && dm.getOperationRule().equals(value.toString())) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    }
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(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.STOP_IT);
-                            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();
+                    if (Blank.isNotEmpty(cursorRawDataList)) {
+                        opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                        cursorRawDataList = new ArrayList<>();
                     }
-                    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();
+                } catch (Exception e) {
+                    flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
                     }
-                    if (Blank.isNotEmpty(server)) {
-                        server.dispose();
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
+                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                        if (Blank.isNotEmpty(server)) {
+                            server.dispose();
+                        }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
                     }
-                    timer.cancel();
-                    break;
                 }
             }
         } catch (Exception e) {
@@ -342,12 +336,9 @@ public class OpcDaExceedTask extends TimerTask {
             }
             if (!flage) {
                 //执行组装数据库的数据,以及生成驱动报表
-                String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                Long index = (Long) redisUtil.get(ConstantStr.INDEX + id);
+                opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
                 redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                if (Blank.isNotEmpty(access)) {
-                    access.clear();
-                }
                 if (Blank.isNotEmpty(server)) {
                     server.dispose();
                 }

+ 360 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask3.java

@@ -0,0 +1,360 @@
+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 OpcDaExceedTask3 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 OpcDaExceedTask3(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) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage) {
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                "服务断开,马上进行重新连接",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        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));
+                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                                        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.STOP_IT);
+            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.STOP_IT);
+                            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.STOP_IT);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 117 - 137
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -19,6 +19,8 @@ import org.openscada.opc.lib.da.*;
 import java.math.BigDecimal;
 import java.util.*;
 
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
 @Slf4j
 public class OpcDaFrequencyTask extends TimerTask {
 
@@ -44,6 +46,8 @@ public class OpcDaFrequencyTask extends TimerTask {
 
     private final List<com.example.opc_common.entity.Item> itemList;
 
+    private final String[] items;
+
     private final String timeFormat;
 
     private final Map<String, List<TableTemplate>> ttMap;
@@ -61,6 +65,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                               DataSource dataSource,
                               Map<String, DataModel> map,
                               List<com.example.opc_common.entity.Item> itemList,
+                              String[] items,
                               String timeFormat,
                               Map<String, List<TableTemplate>> ttMap,
                               Long endTime) {
@@ -75,6 +80,7 @@ public class OpcDaFrequencyTask extends TimerTask {
         this.dataSource = dataSource;
         this.map = map;
         this.itemList = itemList;
+        this.items = items;
         this.timeFormat = timeFormat;
         this.ttMap = ttMap;
         this.endTime = endTime;
@@ -85,7 +91,6 @@ public class OpcDaFrequencyTask extends TimerTask {
         Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
-        SyncAccess access = null;
         try {
             server.connect();
             server.addStateListener(connected -> {
@@ -94,7 +99,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                     if (Blank.isEmpty(flage)) {
                         flage = false;
                     }
-                    if (flage){
+                    if (flage) {
                         messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                                 itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
                                 "服务断开,马上进行重新连接",
@@ -142,140 +147,26 @@ public class OpcDaFrequencyTask extends TimerTask {
             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);
-                            List<TableTemplate> tableTemplates = ttMap.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.isNotEmpty(tableTemplates)) {
-                                //执行设备报表数据组装
-                                opcAsyncTask.packDeviceTable(id, itemId, val, currentYmdhmss, index, tableTemplates, dataSourceId, map);
-                            }
-                            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) {
-                            System.out.println("----"+e.getMessage());
-                            //执行组装数据库的数据,以及生成驱动报表
-                            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.STOP_IT);
-                            cronTaskRegister.removeCronTask(cronId);
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            timer.cancel();
-                        }
-                    }
-                });
-            }
-            access.bind();
+            Group group = server.addGroup();
+            Map<String, org.openscada.opc.lib.da.Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
+            itemSet.toArray(itemArr);
+            String sqlCurrentYmdh = "";
+            Long index = 0L;
+            int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
             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();
+                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                     }
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
@@ -286,19 +177,111 @@ public class OpcDaFrequencyTask extends TimerTask {
                 }
                 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();
+                    sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                     }
+                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
                     timer.cancel();
                     break;
                 }
+                try {
+                    Thread.sleep(count);
+                    index++;
+                    Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                    List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                    for (Item key : resultMap.keySet()) {
+                        String keyId = key.getId();
+                        ItemState itemMap = resultMap.get(key);
+                        Map<String, Object> val = getVal(itemMap.getValue());
+                        String javaType = val.get("javaType").toString();
+                        Object value = val.get("value");
+                        Date time = itemMap.getTimestamp().getTime();
+                        String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
+                        String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                        DataModel dm = map.get(keyId);
+                        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);
+                                sqlCurrentYmdh = currentYmdh;
+                            }
+                        }
+                        if (javaType.toLowerCase().equals("boolean")) {
+                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                    && dm.getOperationRule().equals(value.toString())) {
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
+                            } else {
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
+                            }
+                        } else {
+                            try {
+                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                        && dm.getOperationRule().equals(value.toString())) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } else {
+                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                            bigDecimal;
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                }
+                            } catch (Exception e) {
+                                if (Blank.isNotEmpty(value)) {
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)
+                                            && dm.getOperationRule().equals(value.toString())) {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), dm.getReplacingValue(),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    }
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                }
+                            }
+                        }
+                    }
+                    if (Blank.isNotEmpty(cursorRawDataList)) {
+                        opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                        cursorRawDataList = new ArrayList<>();
+                    }
+                } catch (Exception e) {
+                    flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (!flage) {
+                        //执行组装数据库的数据,以及生成驱动报表
+                        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(server)) {
+                            server.dispose();
+                        }
+                        itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        cronTaskRegister.removeCronTask(cronId);
+                        timer.cancel();
+                    }
+                }
             }
         } catch (Exception e) {
             Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
@@ -310,9 +293,6 @@ public class OpcDaFrequencyTask extends TimerTask {
                 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();
                 }

+ 324 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask3.java

@@ -0,0 +1,324 @@
+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 OpcDaFrequencyTask3 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 Map<String, List<TableTemplate>> ttMap;
+
+    private final Long endTime;
+
+    public OpcDaFrequencyTask3(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,
+                               Map<String, List<TableTemplate>> ttMap,
+                               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.ttMap = ttMap;
+        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) {
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                    if (Blank.isEmpty(flage)) {
+                        flage = false;
+                    }
+                    if (flage){
+                        messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
+                                itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
+                                "服务断开,马上进行重新连接",
+                                ConstantStr.NO_READ));
+                        itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
+                        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));
+                                        itemGroupDao.stopItemGroupById(id, ConstantStr.START_UP);
+                                        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);
+                            List<TableTemplate> tableTemplates = ttMap.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.isNotEmpty(tableTemplates)) {
+                                //执行设备报表数据组装
+                                opcAsyncTask.packDeviceTable(id, itemId, val, currentYmdhmss, index, tableTemplates, dataSourceId, map);
+                            }
+                            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) {
+                            System.out.println("----"+e.getMessage());
+                            //执行组装数据库的数据,以及生成驱动报表
+                            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.STOP_IT);
+                            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.STOP_IT);
+                cronTaskRegister.removeCronTask(cronId);
+                timer.cancel();
+            }
+        }
+    }
+}

+ 25 - 6
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaTask.java

@@ -83,6 +83,11 @@ public class OpcDaTask {
             //查看此数据组是否在设备报表中被配置
             List<TableTemplate> tableTemplateList = reportTableDao.getDeviceTtByItemList(basicItemList, ConstantStr.DEVICE_REPORT);
             Map<String, List<TableTemplate>> ttMap = TableTemplate.genMap(basicItemList, tableTemplateList);
+            List<String> itemStrList = new ArrayList<>();
+            for (Item item : basicItemList) {
+                itemStrList.add(item.getItemReadName());
+            }
+            String[] items = itemStrList.toArray(new String[]{});
             //有多少个报表,就存多少份,然后每20筛选一次数据
             if (readMode == ConstantStr.ON_FREQUENCY) {
                 timer.schedule(new OpcDaFrequencyTask(redisUtil,
@@ -96,6 +101,7 @@ public class OpcDaTask {
                                 dataSource,
                                 basicMap,
                                 basicItemList,
+                                items,
                                 timeFormat,
                                 ttMap,
                                 endDate.getTime()),
@@ -112,6 +118,7 @@ public class OpcDaTask {
                                 dataSource,
                                 basicMap,
                                 basicItemList,
+                                items,
                                 timeFormat,
                                 ttMap,
                                 endDate.getTime()),
@@ -128,6 +135,7 @@ public class OpcDaTask {
                                 dataSource,
                                 basicMap,
                                 basicItemList,
+                                items,
                                 timeFormat,
                                 endDate.getTime()),
                         startDate);
@@ -159,6 +167,7 @@ public class OpcDaTask {
                     org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                     itemSet.toArray(itemArr);
                     Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                    List<AttachRawData> attachRawDataList = new ArrayList<>();
                     for (Item item : attachItemList) {
                         String itemReadName = item.getItemReadName();
                         DataModel dm = attachMap.get(itemReadName);
@@ -174,7 +183,7 @@ public class OpcDaTask {
                                     AttachRawData attachRawData = new AttachRawData(
                                             id, dataSource.getId(), keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
                                     );
-                                    opcAsyncTask.addAttachRawData(attachRawData);
+                                    attachRawDataList.add(attachRawData);
                                 } else {
                                     try {
                                         BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
@@ -183,18 +192,28 @@ public class OpcDaTask {
                                                 (Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) : bigDecimal).toString(),
                                                 DateUtil.dateChangeStrYmdhmss(time), new Date()
                                         );
-                                        opcAsyncTask.addAttachRawData(attachRawData);
+                                        attachRawDataList.add(attachRawData);
                                     } catch (Exception e) {
-                                        AttachRawData attachRawData = new AttachRawData(
-                                                id, dataSource.getId(), keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
-                                        );
-                                        opcAsyncTask.addAttachRawData(attachRawData);
+                                        if (Blank.isNotEmpty(value)) {
+                                            AttachRawData attachRawData = new AttachRawData(
+                                                    id, dataSource.getId(), keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
+                                            );
+                                            attachRawDataList.add(attachRawData);
+                                        } else {
+                                            AttachRawData attachRawData = new AttachRawData(
+                                                    id, dataSource.getId(), keyId, javaType, "null", "null", DateUtil.dateChangeStrYmdhmss(time), new Date()
+                                            );
+                                            attachRawDataList.add(attachRawData);
+                                        }
                                     }
                                 }
                                 break;
                             }
                         }
                     }
+                    if (Blank.isNotEmpty(attachItemList)) {
+                        opcAsyncTask.addAttachRawDataList(attachRawDataList);
+                    }
                 }
             } catch (Exception e) {
                 e.printStackTrace();

+ 17 - 6
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/ScheduledTask.java

@@ -74,6 +74,7 @@ public class ScheduledTask {
                                     org.openscada.opc.lib.da.Item[] itemArr = new org.openscada.opc.lib.da.Item[itemSet.size()];
                                     itemSet.toArray(itemArr);
                                     Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                    List<AttachRawData> attachRawDataList = new ArrayList<>();
                                     for (org.openscada.opc.lib.da.Item key : resultMap.keySet()) {
                                         String keyId = key.getId();
                                         ItemState itemMap = resultMap.get(key);
@@ -85,7 +86,7 @@ public class ScheduledTask {
                                             AttachRawData attachRawData = new AttachRawData(
                                                     itemGroupId, dataSourceId, keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
                                             );
-                                            opcAsyncTask.addAttachRawData(attachRawData);
+                                            attachRawDataList.add(attachRawData);
                                         } else {
                                             try {
                                                 BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
@@ -98,15 +99,25 @@ public class ScheduledTask {
                                                         itemGroupId, dataSourceId, keyId, javaType, bigDecimal.toString(),
                                                         bigDecimal.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
                                                 );
-                                                opcAsyncTask.addAttachRawData(attachRawData);
+                                                attachRawDataList.add(attachRawData);
                                             } catch (Exception e) {
-                                                AttachRawData attachRawData = new AttachRawData(
-                                                        itemGroupId, dataSourceId, keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
-                                                );
-                                                opcAsyncTask.addAttachRawData(attachRawData);
+                                                if (Blank.isNotEmpty(value)) {
+                                                    AttachRawData attachRawData = new AttachRawData(
+                                                            itemGroupId, dataSourceId, keyId, javaType, value.toString(), value.toString(), DateUtil.dateChangeStrYmdhmss(time), new Date()
+                                                    );
+                                                    attachRawDataList.add(attachRawData);
+                                                } else {
+                                                    AttachRawData attachRawData = new AttachRawData(
+                                                            itemGroupId, dataSourceId, keyId, javaType, "null", "null", DateUtil.dateChangeStrYmdhmss(time), new Date()
+                                                    );
+                                                    attachRawDataList.add(attachRawData);
+                                                }
                                             }
                                         }
                                     }
+                                    if (Blank.isNotEmpty(attachItemList)) {
+                                        opcAsyncTask.addAttachRawDataList(attachRawDataList);
+                                    }
                                 }
                             } catch (Exception e) {
                                 e.printStackTrace();

+ 17 - 184
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/util/OpcDaUtil.java

@@ -30,7 +30,6 @@ import org.openscada.opc.lib.list.ServerList;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
-import java.net.UnknownHostException;
 import java.util.*;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
@@ -102,186 +101,6 @@ public class OpcDaUtil {
     }
 
     /**
-     * opcda获取树
-     *
-     * @param dataSource
-     * @return
-     */
-    public static Result opcDaGetTree(DataSource dataSource) {
-        Server server = null;
-        try {
-            server = createServer(dataSource);
-            server.connect();
-            if (null == server.getServerState()) {
-                throw new CustomException(ResultEnum.NOT_FOUND.getRespCode(), "连接失败");
-            }
-            if (OPCSERVERSTATE.OPC_STATUS_RUNNING == server.getServerState().getServerState()) {
-                if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.KEPSERVER.getValue()) ||
-                        dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.OPCIFIX.getValue()) ||
-                        dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.YOKOGAWA.getValue())) {
-                    List<JSONObject> jsonObjectList = generServerTree(server);
-                    return Result.ok(jsonObjectList);
-                } else if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.WINCC.getValue()) ||
-                        dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.SCADA.getValue())) {
-                    List<JSONObject> jsonObjectList = generWinccTree(server);
-                    return Result.ok(jsonObjectList);
-                } else if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.PAS300.getValue())) {
-                    List<JSONObject> jsonObjectList = generPAS300Tree(server);
-                    return Result.ok(jsonObjectList);
-                } else {
-                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
-                }
-            }
-        } catch (Exception e) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), genException(e.getMessage()));
-        } finally {
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
-            }
-        }
-        return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
-    }
-
-    /**
-     * 获取KepServer,OpcIfix驱动的tree
-     *
-     * @param server
-     * @return
-     * @throws JIException
-     * @throws UnknownHostException
-     */
-    public static List<JSONObject> generServerTree(Server server) throws JIException, UnknownHostException {
-        List<JSONObject> jsonList = new ArrayList<>();
-        //获取服务器下所有ITEM列表,树形展示
-        TreeBrowser treeBrowser = server.getTreeBrowser();
-        //下面执行的这一段代码,是获取树慢的原因
-        long l = System.currentTimeMillis();
-        Branch browse = treeBrowser.browse();
-//        Branch browse = treeBrowser.browseBranches();
-//        Collection<String> accessPaths = server.getTreeBrowser().getAccessPaths("111");
-//        server.getTreeBrowser().
-        System.err.println(System.currentTimeMillis() - l + "ms");
-        if (Blank.isEmpty(browse)) {
-            return null;
-        }
-        Collection<Branch> branches = browse.getBranches();
-        for (Branch branch : branches) {
-//            Collection<Leaf> leaves = branch.getLeaves();
-            if (Blank.isNotEmpty(branch.getBranches())) {
-                JSONObject jsonObject = new JSONObject();
-                jsonObject.put("label", branch.getName());
-                jsonObject.put("children", recursionServerChildren(branch.getBranches()));
-                jsonList.add(jsonObject);
-            }
-        }
-        return jsonList;
-    }
-
-    /**
-     * 获取Wincc和SCADA驱动的tree
-     *
-     * @param server
-     * @return
-     * @throws JIException
-     * @throws UnknownHostException
-     */
-    public static List<JSONObject> generWinccTree(Server server) throws JIException, UnknownHostException {
-        List<JSONObject> jsonList = new ArrayList<>();
-        //获取服务器下所有ITEM列表,树形展示
-        TreeBrowser treeBrowser = server.getTreeBrowser();
-        Branch browse = treeBrowser.browse();
-        if (Blank.isEmpty(browse)) {
-            return null;
-        }
-        Collection<Branch> branches = browse.getBranches();
-        for (Branch branch : branches) {
-            JSONObject jsonObject = new JSONObject();
-            Collection<Leaf> leaves = branch.getLeaves();
-            jsonObject.put("label", branch.getName());
-            if (Blank.isNotEmpty(branch.getBranches())) {
-                jsonObject.put("children", recursionWinccChildren(branch.getBranches()));
-
-            }
-            List<String> leafNameList = new ArrayList<>();
-            if (Blank.isNotEmpty(leaves)) {
-                for (Leaf leaf : leaves) {
-                    leafNameList.add(leaf.getName());
-                }
-                Collections.reverse(leafNameList);
-            }
-            jsonObject.put("leaves", leafNameList);
-            jsonList.add(jsonObject);
-        }
-        return jsonList;
-    }
-
-    public static List<JSONObject> generPAS300Tree(Server server) throws JIException, UnknownHostException {
-        List<JSONObject> jsonList = new ArrayList<>();
-        //获取服务器下所有ITEM列表,树形展示
-        TreeBrowser treeBrowser = server.getTreeBrowser();
-        Branch browse = treeBrowser.browse();
-        if (Blank.isEmpty(browse)) {
-            return null;
-        }
-        Collection<Leaf> leaves = browse.getLeaves();
-        if (Blank.isNotEmpty(leaves)) {
-            for (Leaf leaf : leaves) {
-                JSONObject jsonObject = new JSONObject();
-                jsonObject.put("label", leaf.getName());
-                jsonList.add(jsonObject);
-            }
-        }
-        return jsonList;
-    }
-
-    public static List<JSONObject> recursionServerChildren(Collection<Branch> branchCollection) {
-        List<JSONObject> jsonList = new ArrayList<>();
-        for (Branch branch : branchCollection) {
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("label", branch.getName());
-            if (Blank.isNotEmpty(branch.getBranches())) {
-                jsonObject.put("children", recursionServerChildren(branch.getBranches()));
-            } else {
-                jsonObject.put("children", generServerLeaf(branch.getLeaves()));
-            }
-            jsonList.add(jsonObject);
-        }
-        return jsonList;
-    }
-
-    public static List<JSONObject> recursionWinccChildren(Collection<Branch> branchCollection) {
-        List<JSONObject> jsonList = new ArrayList<>();
-        for (Branch branch : branchCollection) {
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("label", branch.getName());
-            Collection<Leaf> leaves = branch.getLeaves();
-            if (Blank.isNotEmpty(branch.getBranches())) {
-                jsonObject.put("children", recursionWinccChildren(branch.getBranches()));
-            }
-            List<String> leafNameList = new ArrayList<>();
-            if (Blank.isNotEmpty(leaves)) {
-                for (Leaf leaf : leaves) {
-                    leafNameList.add(leaf.getName());
-                }
-                Collections.reverse(leafNameList);
-            }
-            jsonObject.put("leaves", leafNameList);
-            jsonList.add(jsonObject);
-        }
-        return jsonList;
-    }
-
-    public static List<JSONObject> generServerLeaf(Collection<Leaf> leaves) {
-        List<JSONObject> jsonObjectList = new ArrayList<>();
-        for (Leaf leaf : leaves) {
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("label", leaf.getName());
-            jsonObjectList.add(jsonObject);
-        }
-        return jsonObjectList;
-    }
-
-    /**
      * 获取opcda连接下的所有驱动
      *
      * @param dataSource
@@ -401,6 +220,9 @@ public class OpcDaUtil {
         String javaType;
         switch (type) {
             case JIVariant.VT_I1://读到byte类型
+//                javaType="byte";
+//                value = var.getObject();
+//                break;
             case JIVariant.VT_I2://读到short类型
                 javaType = "short";
                 value = var.getObjectAsShort();
@@ -533,11 +355,22 @@ public class OpcDaUtil {
         return null;
     }
 
-    public static Boolean isGood(Short quality) {
+    public static String isGood(Short quality) {
         if (quality == 192) {
-            return true;
+            return "good";
         }
-        return false;
+        return "bad";
+    }
+
+    public static String getDriverItem(List<Item> itemList) {
+        String itemStr = "";
+        for (Item item : itemList) {
+            if ((item.getIsDriverItem()).equals(ConstantStr.IS_DRIVER_ITEM)) {
+                itemStr = item.getItemReadName();
+                break;
+            }
+        }
+        return itemStr;
     }
 
     public static String genException(String message) {

BIN
chaunyi_opc/opc_da/src/main/resources/lib/org.openscada.opc.lib-1.5.0.jar


+ 1 - 4
chaunyi_opc/opc_da/src/main/resources/mapper/ChartDao.xml

@@ -98,9 +98,6 @@
     </select>
 
     <select id="getChartByUserGroupId" resultType="com.example.opc_common.entity.Chart">
-        id
-        ,user_id, chart_type, chart_name, value_taking_mode, bucket_type, bucket_value,
-                             start_time, end_time, standby
         SELECT tc.id,
                tc.user_id,
                tc.chart_type,
@@ -114,7 +111,7 @@
                tc.standby
         FROM t_chart tc
                  INNER JOIN (SELECT chart_id FROM t_chart_user_group WHERE user_group_id = #{userGroupId}) tcug
-                            ON trt.id = tcug.chart_id;
+                            ON tc.id = tcug.chart_id;
     </select>
 
     <select id="getAllOkChartCount" resultType="java.lang.Long">

+ 17 - 11
chaunyi_opc/opc_da/src/main/resources/mapper/ItemGroupDao.xml

@@ -89,6 +89,12 @@
             }
     </update>
 
+    <update id="updateItByItemGroupId">
+        update t_item
+        set item_type=#{itemType}
+        where item_group_id = #{itemGroupId}
+    </update>
+
     <delete id="delItemByGroupId">
         delete
         from t_item
@@ -254,18 +260,18 @@
 
     <select id="getAttributesItemList" resultType="com.example.opc_common.entity.Item">
         select ti.id,
-               ti.item_group_id,
-               ti.item_name,
-               ti.item_read_name,
-               ti.item_type,
-               ti.node_index,
-               ti.data_type,
-               ti.`describe`,
-               ti.data_model_id,
-               ti.is_driver_item,
-               tdm.operation_rule
+        ti.item_group_id,
+        ti.item_name,
+        ti.item_read_name,
+        ti.item_type,
+        ti.node_index,
+        ti.data_type,
+        ti.`describe`,
+        ti.data_model_id,
+        ti.is_driver_item,
+        tdm.operation_rule
         FROM t_item ti
-                 LEFT JOIN t_data_model tdm ON ti.data_model_id = tdm.id
+        LEFT JOIN t_data_model tdm ON ti.data_model_id = tdm.id
         where ti.item_group_id = #{itemGroupId}
         <if test="itemType != null">
             and ti.item_type = #{itemType}

+ 39 - 10
chaunyi_opc/opc_da/src/main/resources/mapper/RawDataDao.xml

@@ -38,6 +38,22 @@
                 #{dataValueTime}, #{dataIndex}, #{valueBelongTime}, #{isRecord}, #{createTime})
     </insert>
 
+
+    <insert id="addCursorRawDataList">
+        insert into t_raw_data
+        (item_group_id, data_source_id, item_name, data_type, org_data_value, data_value, data_value_time, data_index,
+        value_belong_time,
+        is_record, create_time)
+        VALUES
+        <foreach collection="cursorRawDataList" item="cursorRawData" separator=",">
+            (#{cursorRawData.itemGroupId}, #{cursorRawData.dataSourceId}, #{cursorRawData.itemName},
+            #{cursorRawData.dataType},
+            #{cursorRawData.orgDataValue}, #{cursorRawData.dataValue},
+            #{cursorRawData.dataValueTime}, #{cursorRawData.dataIndex},
+            #{cursorRawData.valueBelongTime}, #{cursorRawData.isRecord}, #{cursorRawData.createTime})
+        </foreach>
+    </insert>
+
     <insert id="addAttachRawData">
         insert into t_attach_raw_data
         (item_group_id, data_source_id, item_name, data_type, org_data_value, data_value,
@@ -48,16 +64,19 @@
                 #{dataValueTime}, #{createTime})
     </insert>
 
-    <update id="updateAttachRawData">
-        update t_attach_raw_data
-        set data_type=#{dataType},
-            org_data_value=#{orgDataValue},
-            data_value=#{dataValue},
-            data_value_time=#{dataValueTime}
-        where item_group_id = #{itemGroupId}
-          and data_source_id = #{dataSourceId}
-          and item_name = #{itemName}
-    </update>
+    <insert id="addAttachRawDataList">
+        insert into t_attach_raw_data
+        (item_group_id, data_source_id, item_name, data_type, org_data_value, data_value,
+        data_value_time,
+        create_time)
+        VALUES
+        <foreach collection="attachRawDataList" item="attachRawData" separator=",">
+            (#{attachRawData.itemGroupId}, #{attachRawData.dataSourceId}, #{attachRawData.itemName},
+            #{attachRawData.dataType},
+            #{attachRawData.orgDataValue}, #{attachRawData.dataValue},
+            #{attachRawData.dataValueTime}, #{attachRawData.createTime})
+        </foreach>
+    </insert>
 
     <delete id="delCursorRawDataList">
         delete
@@ -74,6 +93,16 @@
           and data_index &lt;= #{dataIndex}
     </delete>
 
+    <delete id="delAttachRawDataList">
+        delete from t_attach_raw_data
+        where item_group_id=#{itemGroupId}
+        and data_source_id=#{dataSourceId}
+        and item_name in
+        <foreach collection="attachRawDataList" item="attachRawData" separator="," open="(" close=")">
+            #{attachRawData.itemName}
+        </foreach>
+    </delete>
+
     <select id="getLineOrBarData" resultType="com.example.opc_common.entity.RawData">
         SELECT id, data_source_id, item_name, data_type, data_value, create_time
         FROM t_raw_data${remainder}

+ 5 - 3
chaunyi_opc/opc_da/src/main/resources/mapper/ReportTableDao.xml

@@ -88,12 +88,15 @@
     <insert id="addTableTemplate" parameterType="com.example.opc_common.entity.TableTemplate" useGeneratedKeys="true"
             keyProperty="id">
         insert into t_table_template(user_id, template_name, template_type, template_data,
-                                     event_num, version,
+                                     event_num, is_gen_count_time, variable_type, start_item_id,
+                                     start_value, end_item_id, end_value, version,
                                      update_time,
                                      create_time)
             VALUE ( #{userId},
             #{templateName}, #{templateType},
-            #{templateData}, #{eventNum}, #{version},#{updateTime},#{createTime}
+            #{templateData}, #{eventNum}, #{isGenCountTime},#{variableType},#{startItemId},#{startValue},
+            #{endItemId},#{endValue},
+            #{version},#{updateTime},#{createTime}
             )
     </insert>
 
@@ -443,7 +446,6 @@
                trt.user_id,
                trt.report_table_name,
                trt.start_time,
-               trt.value_condition,
                trt.report_table_type,
                trt.version,
                trt.cron_id,

+ 1 - 3
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/util/OpcUaUtil.java

@@ -13,8 +13,6 @@ import com.example.opc_common.util.MathUtil;
 import com.example.opc_common.util.Result;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.sdk.client.SessionActivityListener;
-import org.eclipse.milo.opcua.sdk.client.api.ServiceFaultListener;
 import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfig;
 import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
 import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider;
@@ -287,7 +285,7 @@ public class OpcUaUtil {
                 jsonObject.put("dataSourceName", dataSource.getDataSourceName());
                 jsonObject.put("itemName", mapName.get(itemName));
                 StatusCode statusCode = dataValue.getStatusCode();
-                jsonObject.put("quality", statusCode.isGood());
+                jsonObject.put("quality", statusCode.isGood() ? "good" : "bad");
                 Variant value = dataValue.getValue();
                 ExpandedNodeId expandedNodeId = value.getDataType().get();
                 String javaType = OpcUaUtil.getValType(dataValue);