瀏覽代碼

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

Zt 1 年之前
父節點
當前提交
6bcda87393

+ 4 - 0
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/ChartItem.java

@@ -24,6 +24,10 @@ public class ChartItem implements Serializable {
      * 数据项id
      */
     private Integer itemId;
+    //虚拟字段,数据项名称
+    private String itemName;
+    //虚拟字段数据项描述
+    private String describe;
     /**
      * 结果集
      */

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

@@ -17,7 +17,7 @@ public class ReportTable extends BaseSchedule implements Serializable {
      */
     private String id;
     /**
-     * 报表类型,0手动,1自动,2事件,3自动子表,4事件子表(必填)
+     * 报表类型,0手动,1自动,2事件,3自动子表,4事件子表(必填),5设备,6设备子报表
      */
     private Integer reportTableType;
     /**

+ 1 - 0
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/enums/ModelEnum.java

@@ -9,6 +9,7 @@ public enum ModelEnum {
 
     RUNNING("运行", "RUNNING"),
     DATASOURCE("数据源配置", "DATASOURCE"),
+    DATADRIVER("数据驱动配置", "DATADRIVER"),
     TABLETEMPLATE("报表模板", "TABLETEMPLATE"),
     REPORTTABLE("报表", "TABLETEMPLATE"),
     DATAGROUP("数据组配置", "DATAGROUP"),

+ 3 - 2
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/controller/DataSourceController.java

@@ -161,7 +161,7 @@ public class DataSourceController {
      * @return
      */
     @PostMapping("/addDataSourceDriver")
-    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATASOURCE, OperationEnum = OperationEnum.ADD)
+    @WebLog(ServerEnum = ServerEnum.SERVER, ModelEnum = ModelEnum.DATADRIVER, OperationEnum = OperationEnum.ADD)
     public Result addDataSourceDriver(@RequestBody DataSourceDriver dataSourceDriver) {
         if (Blank.isEmpty(dataSourceDriver, dataSourceDriver.getDriverName(), dataSourceDriver.getClsId())) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源驱动名称、驱动不能为空");
@@ -176,7 +176,7 @@ public class DataSourceController {
      * @return
      */
     @PostMapping("/updateDataSourceDriver")
-    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATASOURCE, OperationEnum = OperationEnum.UPDATE)
+    @WebLog(ServerEnum = ServerEnum.SERVER, ModelEnum = ModelEnum.DATADRIVER, OperationEnum = OperationEnum.UPDATE)
     public Result updateDataSourceDriver(@RequestBody DataSourceDriver dataSourceDriver) {
         if (Blank.isEmpty(dataSourceDriver, dataSourceDriver.getId(), dataSourceDriver.getDriverName(), dataSourceDriver.getClsId())) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据源id、驱动名称、驱动不能为空");
@@ -215,6 +215,7 @@ public class DataSourceController {
      * @return
      */
     @PostMapping("/delDataSourceDriver")
+    @WebLog(ServerEnum = ServerEnum.SERVER, ModelEnum = ModelEnum.DATADRIVER, OperationEnum = OperationEnum.DELETE)
     public Result delDataSourceDriver(Integer id) {
         if (Blank.isEmpty(id)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "id不能为空");

+ 2 - 2
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/ChartServiceImpl.java

@@ -51,7 +51,7 @@ public class ChartServiceImpl implements ChartService {
         List<ChartItem> chartItemList = chart.getChartItemList();
         if (Blank.isNotEmpty(chartItemList)) {
             String chartType = chart.getChartType();
-            if (chartType.equals(ConstantStr.BAR_CHART)) {
+            if (chartType.equals(ConstantStr.PIE_CHART)) {
                 if (chartItemList.size() != 1) {
                     return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "饼状图只能配置一个数据项");
                 }
@@ -76,7 +76,7 @@ public class ChartServiceImpl implements ChartService {
         List<ChartItem> chartItemList = chart.getChartItemList();
         if (Blank.isNotEmpty(chartItemList)) {
             String chartType = chart.getChartType();
-            if (chartType.equals(ConstantStr.BAR_CHART)) {
+            if (chartType.equals(ConstantStr.PIE_CHART)) {
                 if (chartItemList.size() != 1) {
                     return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "饼状图只能配置一个数据项");
                 }

+ 131 - 308
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -13,11 +13,13 @@ 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.dcom.da.OPCSERVERSTATUS;
 import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.*;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -89,8 +91,8 @@ public class OpcDaChangeTask extends TimerTask {
         Integer readModeType = itemGroup.getReadModeType();
         Double modeValue = itemGroup.getModeValue();
         Integer dataSourceId = dataSource.getId();
-        SyncAccess access = null;
         try {
+            AtomicReference<Long> index = new AtomicReference<>(0L);
             server.connect();
             server.addStateListener(connected -> {
                 if (!connected) {
@@ -130,337 +132,158 @@ public class OpcDaChangeTask extends TimerTask {
                             }
                         }, 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 {
-            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;
+                }else{
+                    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 = "";
+                        while (true) {
+                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
                             }
-                        }
-                        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, bigDecimal) : bigDecimal;
-                                    Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                            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);
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                 }
-                            } catch (Exception e) {
-
+                                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 (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();
-                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)) {
-                                    //组装相应的原始数据
+                            if (System.currentTimeMillis() >= endTime) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
+                                if (Blank.isNotEmpty(sqlCurrentYmdh)) {
                                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                                    sqlCurrentYmdh = currentYmdh;
                                 }
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                timer.cancel();
+                                break;
                             }
-                            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);
+                            try {
+                                Thread.sleep(1000);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)){
+                                    break;
                                 }
-                            } 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);
+                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                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 {
-                                        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;
+                                        if (!sqlCurrentYmdh.equals(currentYmdh)) {
+                                            //组装相应的原始数据
+                                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
+                                            sqlCurrentYmdh = currentYmdh;
+                                        }
                                     }
-//                                    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);
+                                    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, bigDecimal) : bigDecimal;
+                                                Object oldValue = redisUtil.get(ConstantStr.VALUE + id + keyId);
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                        currentYmdhmss, index.get(), 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) {
-                            //执行组装数据库的原始数据
+                        }
+                    } 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);
-
-                            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);
+                            itemGroupDao.stopItemGroupById(itemGroup.getId(), 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();
+            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();
         }
     }
 }

+ 191 - 185
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java

@@ -12,11 +12,14 @@ 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 org.openscada.opc.dcom.da.OPCSERVERSTATUS;
+import org.openscada.opc.lib.da.Group;
+import org.openscada.opc.lib.da.ItemState;
+import org.openscada.opc.lib.da.Server;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -89,6 +92,7 @@ public class OpcDaExceedTask extends TimerTask {
         Integer dataSourceId = dataSource.getId();
         String driverItem = OpcDaUtil.getDriverItem(itemList);
         try {
+            AtomicReference<Long> index = new AtomicReference<>(0L);
             server.connect();
             server.addStateListener(connected -> {
                 if (!connected) {
@@ -128,209 +132,211 @@ public class OpcDaExceedTask extends TimerTask {
                             }
                         }, 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 {
-            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);
+                }else{
+                    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);
+                        while (true) {
+                            Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                            if (Blank.isEmpty(flage)) {
+                                flage = false;
+                            }
+                            if (!flage) {
+                                //执行组装数据库的数据,以及生成驱动报表
+                                opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
 
-                    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);
+                                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.get() - 1L);
 
-                    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 (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                            String valStr = value.toString();
-                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                    currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                            cursorRawDataList.add(cursorRawData);
-                        } else {
-                            if (javaType.toLowerCase().equals("boolean")) {
-                                String varStr = value.toString();
-                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, varStr,varStr,
-                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                cursorRawDataList.add(cursorRawData);
-                            } else {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                    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, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                cursorRawDataList.add(cursorRawData);
-                                            } else {
-                                                cursorRawDataList = new ArrayList<>();
-                                                break;
-                                            }
-                                        } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
-                                            if (dmData.compareTo(bigDecimal1) == -1) {
-                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                cursorRawDataList.add(cursorRawData);
-                                            } else {
-                                                cursorRawDataList = new ArrayList<>();
-                                                break;
-                                            }
-                                        } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
-                                            if (dmData.compareTo(bigDecimal1) == 0) {
-                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                                cursorRawDataList.add(cursorRawData);
-                                            } else {
-                                                cursorRawDataList = new ArrayList<>();
-                                                break;
-                                            }
-                                        } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
-                                            if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
-                                                if (dmData.compareTo(bigDecimal1) == 1) {
+                                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                                if (Blank.isNotEmpty(server)) {
+                                    server.dispose();
+                                }
+                                timer.cancel();
+                                break;
+                            }
+                            try {
+                                Thread.sleep(1000);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)){
+                                    break;
+                                }
+                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                                for (org.openscada.opc.lib.da.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.get() % 20 == 0)) {
+                                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+                                    }
+                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                        String valStr = value.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        if (javaType.toLowerCase().equals("boolean")) {
+                                            String varStr = value.toString();
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, varStr,varStr,
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        } else {
+                                            try {
+                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                                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, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                                        if (dmData.compareTo(bigDecimal1) == -1) {
+                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                                        if (dmData.compareTo(bigDecimal1) == 0) {
+                                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            cursorRawDataList.add(cursorRawData);
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_EXCEED) {
+                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != 1) {
+                                                            if (dmData.compareTo(bigDecimal1) == 1) {
+                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                cursorRawDataList.add(cursorRawData);
+                                                            } else {
+                                                                cursorRawDataList = new ArrayList<>();
+                                                                break;
+                                                            }
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                    } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
+                                                        if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
+                                                            if (dmData.compareTo(bigDecimal1) == -1) {
+                                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
+                                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                                cursorRawDataList.add(cursorRawData);
+                                                            } else {
+                                                                cursorRawDataList = new ArrayList<>();
+                                                                break;
+                                                            }
+                                                        } else {
+                                                            cursorRawDataList = new ArrayList<>();
+                                                            break;
+                                                        }
+                                                        redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
+                                                    }
+                                                } else {
                                                     CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                                     cursorRawDataList.add(cursorRawData);
-                                                } else {
-                                                    cursorRawDataList = new ArrayList<>();
-                                                    break;
                                                 }
-                                            } else {
-                                                cursorRawDataList = new ArrayList<>();
-                                                break;
-                                            }
-                                            redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
-                                        } else if (eventMode == ConstantStr.EVENT_TRENDS_LOWER) {
-                                            if (((BigDecimal) redisUtil.get(ConstantStr.VALUE + id + keyId)).compareTo(bigDecimal1) != -1) {
-                                                if (dmData.compareTo(bigDecimal1) == -1) {
-                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                            } catch (Exception e) {
+                                                if (Blank.isNotEmpty(value)) {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
                                                     cursorRawDataList.add(cursorRawData);
                                                 } else {
-                                                    cursorRawDataList = new ArrayList<>();
-                                                    break;
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.NOT_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
                                                 }
-                                            } else {
-                                                cursorRawDataList = new ArrayList<>();
-                                                break;
                                             }
-                                            redisUtil.set(ConstantStr.VALUE + id + keyId, dmData, ConstantStr.TWO_HOUR);
                                         }
-                                    } else {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, bigDecimal.toString(), dmData.toString(),
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                        cursorRawDataList.add(cursorRawData);
                                     }
-                                } catch (Exception e) {
-                                    if (Blank.isNotEmpty(value)) {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, JSON.toJSONString(value), JSON.toJSONString(value),
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_RECORD, new Date());
-                                        cursorRawDataList.add(cursorRawData);
-                                    } else {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_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) {
+                                    //执行组装数据库的数据,以及生成驱动报表
+                                    opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get());
+                                    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();
                                 }
                             }
                         }
-                    }
-                    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) {
-                        //执行组装数据库的数据,以及生成驱动报表
-                        opcAsyncTask.packageEventTable(itemList, dataSourceId, index);
-                        redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-                        if (Blank.isNotEmpty(server)) {
-                            server.dispose();
+                    } catch (Exception e) {
+                        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
+                        if (Blank.isEmpty(flage)) {
+                            flage = false;
+                        }
+                        if (!flage) {
+                            //执行组装数据库的数据,以及生成驱动报表
+                            opcAsyncTask.packageEventTable(itemList, dataSourceId, index.get() - 1L);
+                            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();
                         }
-                        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) {
-                //执行组装数据库的数据,以及生成驱动报表
-                Long index = (Long) redisUtil.get(ConstantStr.INDEX + id);
-                opcAsyncTask.packageEventTable(itemList, dataSourceId, index - 1);
-                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();
+            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();
         }
     }
 }

+ 157 - 143
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -13,13 +13,14 @@ 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.dcom.da.OPCSERVERSTATUS;
 import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.ItemState;
 import org.openscada.opc.lib.da.Server;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static com.example.opc_da.util.OpcDaUtil.getVal;
 
@@ -106,9 +107,15 @@ public class OpcDaFrequencyTask extends TimerTask {
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
         try {
+            AtomicReference<Long> index= new AtomicReference<>(0L);
             server.connect();
             server.addStateListener(connected -> {
-                log.info("--------" + connected);
+                log.info("-----" + connected);
+                try {
+                    Thread.sleep(500);
+                }catch (Exception e){
+
+                }
                 if (!connected) {
                     Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                     if (Blank.isEmpty(flage)) {
@@ -125,7 +132,9 @@ public class OpcDaFrequencyTask extends TimerTask {
                             @Override
                             public void run() {
                                 try {
+                                    log.info("-----服务开始重连");
                                     server.connect();
+                                    log.info("-----重连代码执行完毕");
                                     if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
                                         messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                                                 itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
@@ -146,6 +155,152 @@ public class OpcDaFrequencyTask extends TimerTask {
                             }
                         }, 60000);
                     }
+                } else {
+                    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 = "";
+                        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 (!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(count);
+                                OPCSERVERSTATUS serverState = server.getServerState();
+                                if (Blank.isEmpty(serverState)){
+                                    break;
+                                }
+                                Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
+                                index.getAndSet(index.get() + 1);
+                                log.info("-----" + index);
+                                List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                                for (org.openscada.opc.lib.da.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 (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                        String valStr = val.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } else {
+                                        if (javaType.toLowerCase().equals("boolean")) {
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        } else {
+                                            try {
+                                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                                BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
+                                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                cursorRawDataList.add(cursorRawData);
+                                            } catch (Exception e) {
+                                                if (Blank.isNotEmpty(value)) {
+                                                    String valStr = value.toString();
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                } else {
+                                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                                    cursorRawDataList.add(cursorRawData);
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                                if (Blank.isNotEmpty(cursorRawDataList)) {
+                                    opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                                    opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index.get());
+                                    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();
+                        }
+                    }
                 }
             });
         } catch (Exception e) {
@@ -161,146 +316,5 @@ public class OpcDaFrequencyTask extends TimerTask {
             cronTaskRegister.removeCronTask(cronId);
             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;
-            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 (!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(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 (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
-                            String valStr = val.toString();
-                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
-                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                            cursorRawDataList.add(cursorRawData);
-                        } else {
-                            if (javaType.toLowerCase().equals("boolean")) {
-                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
-                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                cursorRawDataList.add(cursorRawData);
-                            } else {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
-                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                    cursorRawDataList.add(cursorRawData);
-                                } catch (Exception e) {
-                                    if (Blank.isNotEmpty(value)) {
-                                        String valStr = value.toString();
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
-                                                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);
-                        opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index);
-                        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();
-            }
-        }
     }
 }

+ 164 - 176
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask1.java

@@ -15,12 +15,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.jinterop.dcom.common.JIException;
 import org.openscada.opc.dcom.da.OPCSERVERSTATE;
 import org.openscada.opc.lib.da.Group;
-import org.openscada.opc.lib.da.Item;
 import org.openscada.opc.lib.da.ItemState;
 import org.openscada.opc.lib.da.Server;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import static com.example.opc_da.util.OpcDaUtil.getVal;
 
 @Slf4j
 public class OpcDaFrequencyTask1 extends TimerTask {
@@ -45,10 +47,20 @@ public class OpcDaFrequencyTask1 extends TimerTask {
 
     private final Map<String, DataModel> map;
 
-    private final List<com.example.opc_common.entity.Item> itemList;
+    private final List<Item> itemList;
+
+    private final String[] items;
 
     private final String timeFormat;
 
+    private final List<TableTemplate> tableTemplates;
+
+    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
+
+    Map<Integer, String> itemReadMap;
+
+    private final Map<Integer, ReportTable> reportTableMap;
+
     private final Long endTime;
 
     public OpcDaFrequencyTask1(RedisUtil redisUtil,
@@ -61,8 +73,13 @@ public class OpcDaFrequencyTask1 extends TimerTask {
                                ItemGroup itemGroup,
                                DataSource dataSource,
                                Map<String, DataModel> map,
-                               List<com.example.opc_common.entity.Item> itemList,
+                               List<Item> itemList,
+                               String[] items,
                                String timeFormat,
+                               List<TableTemplate> tableTemplates,
+                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
+                               Map<Integer, String> itemReadMap,
+                               Map<Integer, ReportTable> reportTableMap,
                                Long endTime) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
@@ -75,7 +92,12 @@ public class OpcDaFrequencyTask1 extends TimerTask {
         this.dataSource = dataSource;
         this.map = map;
         this.itemList = itemList;
+        this.items = items;
         this.timeFormat = timeFormat;
+        this.tableTemplates = tableTemplates;
+        this.ttIdMap = ttIdMap;
+        this.itemReadMap = itemReadMap;
+        this.reportTableMap = reportTableMap;
         this.endTime = endTime;
     }
 
@@ -84,104 +106,113 @@ public class OpcDaFrequencyTask1 extends TimerTask {
         Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
-        Timer chTimer = new Timer();
         try {
             server.connect();
+            AtomicReference<Long> index = new AtomicReference<>(0L);
             server.addStateListener(connected -> {
+                log.info("-----" + connected);
                 if (!connected) {
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                            "服务断开,马山进行重新连接",
-                            ConstantStr.NO_READ));
-                    Timer listenerTimer = new Timer();
-                    listenerTimer.schedule(new TimerTask() {
-                        private int sum = 0;
+                    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) {
 
-                        @Override
-                        public void run() {
-                            try {
-                                sum++;
-                                if (sum > 3) {
-                                    redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-                                            "3次服务重新连接失败",
-                                            ConstantStr.NO_READ));
-                                    listenerTimer.cancel();
                                 }
-                                server.connect();
-                                if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                            "服务重新连接成功",
-                                            ConstantStr.NO_READ));
-                                    listenerTimer.cancel();
-                                }
-                            } catch (Exception e) {
-                                redisUtil.set(ConstantStr.ITEM_GROUP + id, false);
-                                String message = OpcDaUtil.genException(e.getMessage());
-                                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                        itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接失败",
-                                        message,
-                                        ConstantStr.NO_READ));
-                                listenerTimer.cancel();
                             }
-                        }
-                    }, 10000);
-                }
-            });
-        } 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);
-            chTimer.cancel();
-            timer.cancel();
-        }
-        try {
-            Group group = server.addGroup();
-            List<String> itemStrList = new ArrayList<>();
-            for (com.example.opc_common.entity.Item item : itemList) {
-                itemStrList.add(item.getItemReadName());
-            }
-            String[] items = itemStrList.toArray(new String[]{});
-            Map<String, Item> itemResult = group.addItems(items);
-            Set itemSet = new HashSet(itemResult.values());
-            Item[] itemArr = new Item[itemSet.size()];
-            itemSet.toArray(itemArr);
-
-            chTimer.schedule(new TimerTask() {
-                private String sqlCurrentYmdh = "";
-                private Long index = 0L;
-
-                @Override
-                public void run() {
-                    index++;
-                    Map<Item, ItemState> resultMap = null;
+                        }, 60000);
+                    }
+                } else {
+                    Group group = null;
+                    String sqlCurrentYmdh = "";
+                    Map<String, org.openscada.opc.lib.da.Item> itemResult = null;
                     try {
-                        resultMap = group.read(true, itemArr);
-                    } catch (JIException e) {
-                        throw new RuntimeException(e);
+                        group = server.addGroup();
+                        itemResult = group.addItems(items);
+                    } catch (Exception e) {
+//                        throw new RuntimeException(e);
                     }
-                    for (Item item : resultMap.keySet()) {
-                        String itemId = item.getId();
-                        ItemState itemState = resultMap.get(item);
+                    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);
+                    int count = (int) (Math.round(itemGroup.getModeValue() * 1000));
+                    while (true) {
+                        log.info("-----" + index);
+                        try {
+                            Thread.sleep(count);
+                        } catch (InterruptedException e) {
+
+                        }
+                        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;
+                        }
+                        Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = null;
                         try {
-                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
-                            DataModel dm = map.get(itemId);
-                            //读取的值
-                            String javaType = String.valueOf(val.get("javaType"));
+                            resultMap = group.read(true, itemArr);
+                            index.getAndSet(index.get() + 1);
+                        } catch (JIException e) {
+                            throw new RuntimeException(e);
+                        }
+                        List<CursorRawData> cursorRawDataList = new ArrayList<>();
+                        for (org.openscada.opc.lib.da.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 = itemState.getTimestamp().getTime();
+                            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);
@@ -189,105 +220,62 @@ public class OpcDaFrequencyTask1 extends TimerTask {
                                 if (!sqlCurrentYmdh.equals(currentYmdh)) {
                                     //组装相应的原始数据
                                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                     sqlCurrentYmdh = currentYmdh;
                                 }
                             }
-                            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.IS_RECORD, new Date());
-                                opcAsyncTask.addCursorRawData(cursorRawData);
+                            if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                                String valStr = val.toString();
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                        currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
                             } else {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
-                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
-                                            bigDecimal;
-                                    CursorRawData 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) {
-                                    String valueStr = value.toString();
-                                    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);
+                                if (javaType.toLowerCase().equals("boolean")) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
+                                            currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } else {
+                                    try {
+                                        BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                        BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
+                                                currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                        cursorRawDataList.add(cursorRawData);
+                                    } catch (Exception e) {
+                                        if (Blank.isNotEmpty(value)) {
+                                            String valStr = value.toString();
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        } else {
+                                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, "null", "null",
+                                                    currentYmdhmss, index.get(), currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                            cursorRawDataList.add(cursorRawData);
+                                        }
+                                    }
                                 }
                             }
-                        } catch (JIException e) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-
-                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                                    e.getMessage(),
-                                    ConstantStr.NO_READ));
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                            cronTaskRegister.removeCronTask(cronId);
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            chTimer.cancel();
-                            timer.cancel();
+                        }
+                        if (Blank.isNotEmpty(cursorRawDataList)) {
+                            opcAsyncTask.addCursorRawDataList(cursorRawDataList);
+                            opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index.get());
+                            cursorRawDataList = new ArrayList<>();
                         }
                     }
                 }
-            }, new Date(), (int) (Math.round(itemGroup.getModeValue() * 1000)));
-
-            while (true) {
-                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();
-                    }
-                    cronTaskRegister.removeCronTask(cronId);
-                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                    chTimer.cancel();
-                    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(server)) {
-                        server.dispose();
-                    }
-                    chTimer.cancel();
-                    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(server)) {
-                    server.dispose();
-                }
-                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
-                cronTaskRegister.removeCronTask(cronId);
-                chTimer.cancel();
-                timer.cancel();
+            String message = OpcDaUtil.genException(e.getMessage());
+            log.info("-----我进入了这个异常,添加了条通知数据");
+            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();
         }
     }
 }

+ 157 - 152
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask2.java

@@ -13,12 +13,17 @@ 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.dcom.da.OPCSERVERSTATUS;
+import org.openscada.opc.lib.da.Group;
 import org.openscada.opc.lib.da.Item;
-import org.openscada.opc.lib.da.*;
+import org.openscada.opc.lib.da.ItemState;
+import org.openscada.opc.lib.da.Server;
 
 import java.math.BigDecimal;
 import java.util.*;
 
+import static com.example.opc_da.util.OpcDaUtil.getVal;
+
 @Slf4j
 public class OpcDaFrequencyTask2 extends TimerTask {
 
@@ -44,8 +49,18 @@ public class OpcDaFrequencyTask2 extends TimerTask {
 
     private final List<com.example.opc_common.entity.Item> itemList;
 
+    private final String[] items;
+
     private final String timeFormat;
 
+    private final List<TableTemplate> tableTemplates;
+
+    Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap;
+
+    Map<Integer, String> itemReadMap;
+
+    private final Map<Integer, ReportTable> reportTableMap;
+
     private final Long endTime;
 
     public OpcDaFrequencyTask2(RedisUtil redisUtil,
@@ -59,7 +74,12 @@ public class OpcDaFrequencyTask2 extends TimerTask {
                                DataSource dataSource,
                                Map<String, DataModel> map,
                                List<com.example.opc_common.entity.Item> itemList,
+                               String[] items,
                                String timeFormat,
+                               List<TableTemplate> tableTemplates,
+                               Map<Integer, Map<String, TableTemplateTableItem>> ttIdMap,
+                               Map<Integer, String> itemReadMap,
+                               Map<Integer, ReportTable> reportTableMap,
                                Long endTime) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
@@ -72,7 +92,12 @@ public class OpcDaFrequencyTask2 extends TimerTask {
         this.dataSource = dataSource;
         this.map = map;
         this.itemList = itemList;
+        this.items = items;
         this.timeFormat = timeFormat;
+        this.tableTemplates = tableTemplates;
+        this.ttIdMap = ttIdMap;
+        this.itemReadMap = itemReadMap;
+        this.reportTableMap = reportTableMap;
         this.endTime = endTime;
     }
 
@@ -81,29 +106,36 @@ public class OpcDaFrequencyTask2 extends TimerTask {
         Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
-        SyncAccess access = null;
         try {
             server.connect();
             server.addStateListener(connected -> {
+                log.info("-----" + connected);
                 if (!connected) {
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务断开",
-                            "服务断开,马山进行重新连接",
-                            ConstantStr.NO_READ));
-                    Timer listenerTimer = new Timer();
-                    listenerTimer.schedule(new TimerTask() {
-                        @Override
-                        public void run() {
-                            try {
-                                server.connect();
-                                if (Blank.isNotEmpty(server.getServerState()) && server.getServerState().getServerState() == OPCSERVERSTATE.OPC_STATUS_RUNNING) {
-                                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "服务重新连接成功",
-                                            "服务重新连接成功",
-                                            ConstantStr.NO_READ));
-                                    listenerTimer.cancel();
-                                }
-                            } catch (Exception e) {
+                    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(),
@@ -111,9 +143,10 @@ public class OpcDaFrequencyTask2 extends TimerTask {
 //                                        message,
 //                                        ConstantStr.NO_READ));
 //                                listenerTimer.cancel();
+                                }
                             }
-                        }
-                    }, 60000);
+                        }, 60000);
+                    }
                 }
             });
         } catch (Exception e) {
@@ -130,134 +163,26 @@ public class OpcDaFrequencyTask2 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);
-                            //读取的值
-                            String javaType = String.valueOf(val.get("javaType"));
-                            Object value = val.get("value");
-                            //值对应取值的时间
-                            Date time = itemState.getTimestamp().getTime();
-                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                            if (Blank.isEmpty(sqlCurrentYmdh)) {
-                                sqlCurrentYmdh = currentYmdh;
-                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                            } else {
-                                if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                    //组装相应的原始数据
-                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                                    sqlCurrentYmdh = currentYmdh;
-                                }
-                            }
-                            String valueStr = value.toString();
-                            if (javaType.toLowerCase().equals("boolean")) {
-                                //存数据
-                                Boolean data = JSON.parseObject(valueStr, Boolean.class);
-                                if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), dm.getReplacingValue(),
-                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                    opcAsyncTask.addCursorRawData(cursorRawData);
-                                } else {
-                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(data), JSON.toJSONString(data),
-                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                    opcAsyncTask.addCursorRawData(cursorRawData);
-                                }
-                            } else {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(valueStr, BigDecimal.class);
-                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), dm.getReplacingValue(),
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        opcAsyncTask.addCursorRawData(cursorRawData);
-                                    } else {
-                                        BigDecimal dmData = Blank.isNotEmpty(dm) ?
-                                                MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
-                                                bigDecimal;
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(bigDecimal), JSON.toJSONString(dmData),
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        opcAsyncTask.addCursorRawData(cursorRawData);
-                                    }
-                                } catch (Exception e) {
-                                    if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE) && dm.getOperationRule().equals(valueStr)) {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, dm.getReplacingValue(),
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        opcAsyncTask.addCursorRawData(cursorRawData);
-                                    } else {
-                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, valueStr, "".equals(valueStr) ? ConstantStr.STRING_EMPTY : valueStr,
-                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
-                                        opcAsyncTask.addCursorRawData(cursorRawData);
-                                    }
-                                }
-                            }
-                        } catch (Exception e) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-
-                            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                                    e.getMessage(),
-                                    ConstantStr.NO_READ));
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
-                            cronTaskRegister.removeCronTask(cronId);
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            timer.cancel();
-                        }
-                    }
-                });
-            }
-            access.bind();
+            Group group = server.addGroup();
+            Map<String, Item> itemResult = group.addItems(items);
+            Set itemSet = new HashSet(itemResult.values());
+            Item[] itemArr = new 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();
                     }
@@ -268,19 +193,102 @@ public class OpcDaFrequencyTask2 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);
+                    log.info("-----" + index);
+                    OPCSERVERSTATUS serverState = server.getServerState();
+                    log.info("-----" + serverState);
+                    log.info("-----" + group);
+                    Map<Item, ItemState> resultMap = group.read(true, itemArr);
+                    index++;
+                    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 (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {
+                            String valStr = val.toString();
+                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, DataModel.valueReplace(dm, valStr),
+                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                            cursorRawDataList.add(cursorRawData);
+                        } else {
+                            if (javaType.toLowerCase().equals("boolean")) {
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), value.toString(),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                cursorRawDataList.add(cursorRawData);
+                            } else {
+                                try {
+                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
+                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm, bigDecimal) : bigDecimal;
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, value.toString(), dmData.toString(),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_RECORD, new Date());
+                                    cursorRawDataList.add(cursorRawData);
+                                } catch (Exception e) {
+                                    if (Blank.isNotEmpty(value)) {
+                                        String valStr = value.toString();
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, keyId, javaType, valStr, valStr,
+                                                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);
+                        opcAsyncTask.packDeviceTable(cursorRawDataList, tableTemplates, ttIdMap, itemReadMap, reportTableMap, index);
+                        cursorRawDataList = new ArrayList<>();
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    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);
@@ -292,13 +300,10 @@ public class OpcDaFrequencyTask2 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();
                 }
-                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
+                itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
                 cronTaskRegister.removeCronTask(cronId);
                 timer.cancel();
             }

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

@@ -1,320 +0,0 @@
-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.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();
-            }
-        }
-    }
-}

+ 4 - 2
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/ScheduledTask.java

@@ -5,8 +5,10 @@ import com.example.opc_common.entity.AttachRawData;
 import com.example.opc_common.entity.DataSource;
 import com.example.opc_common.entity.Item;
 import com.example.opc_common.entity.ItemGroup;
-import com.example.opc_common.enums.ResultEnum;
-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_common.util.OpcUtil;
 import com.example.opc_da.dao.DataSourceDao;
 import com.example.opc_da.dao.ItemGroupDao;
 import com.example.opc_da.util.OpcDaUtil;

+ 5 - 81
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/Test.java

@@ -1,94 +1,18 @@
 package com.example.opc_da.task;
 
-import com.example.opc_common.entity.DataSource;
-import com.example.opc_common.enums.OpcDaDriverEnum;
-import com.example.opc_da.util.OpcDaUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.jinterop.dcom.common.JIException;
-import org.openscada.opc.lib.da.*;
 
-import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 @Slf4j
 public class Test {
 
     public static void main(String[] args) {
-//        test1();
-        test2();
-    }
-
-    public static void test1() {
-        DataSource dataSource = new DataSource();
-        dataSource.setIpAddress("192.168.0.5");
-        dataSource.setIpUserName("administrator");
-        dataSource.setIpPassword("jd123456");
-        dataSource.setClsId(OpcDaDriverEnum.KEPSERVER.getValue());
-        Server server = OpcDaUtil.createServer(dataSource);
-        try {
-            server.connect();
-//            SyncAccess access = new SyncAccess(server, 1000);
-            AccessBase access = new SyncAccess(server, 1000);
-            List<String> stringList = new ArrayList<>();
-            stringList.add("_System._Time_PM");
-            stringList.add("通道 1._Statistics._FailedWrites");
-            stringList.add("通道 1._Statistics._MaxPendingReads");
-
-            for (String itemId : stringList) {
-                access.addItem(itemId, new DataCallback() {
-                    @Override
-                    public void changed(Item item, ItemState itemState) {
-                        log.info("item={},itemState={}", item, itemState);
-                    }
-                });
-            }
-            access.bind();
-            while (true) {
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+        AtomicReference<Long> index = new AtomicReference<>(0L);
+        for (int i = 0; i < 10; i++) {
+            index.getAndSet(index.get() + 1);
+            System.out.println(index);
         }
     }
 
-    public static void test2() {
-        DataSource dataSource = new DataSource();
-        dataSource.setIpAddress("192.168.0.5");
-        dataSource.setIpUserName("administrator");
-        dataSource.setIpPassword("jd123456");
-        dataSource.setClsId(OpcDaDriverEnum.KEPSERVER.getValue());
-        Server server = OpcDaUtil.createServer(dataSource);
-        try {
-            server.connect();
-            Group group = server.addGroup();
-            String[] items = {"_System._Time_PM", "通道 1._Statistics._FailedWrites", "通道 1._Statistics._MaxPendingReads"};
-            Map<String, 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);
-            Timer timer = new Timer();
-            timer.schedule(new TimerTask() {
-                int count = 0;
-
-                @Override
-                public void run() {
-                    log.info("{}", count++);
-                    Map<Item, ItemState> resultMap = null;
-                    try {
-                        resultMap = group.read(true, itemArr);
-                    } catch (JIException e) {
-                        throw new RuntimeException(e);
-                    }
-                    for (Item key : resultMap.keySet()) {
-                        ItemState itemState = resultMap.get(key);
-                        log.info("item={},itemState={}", key, itemState);
-                    }
-                }
-            },new Date(), 1000);
-            while (true){
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
 }

+ 20 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/TestUtil.java

@@ -0,0 +1,20 @@
+package com.example.opc_da.task;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class TestUtil {
+    private static final BlockingQueue SLEEPER = new ArrayBlockingQueue(1);
+    public static void main(String... args) throws InterruptedException {
+        for(int i=0;i<100;i++) {
+            long start = System.nanoTime();
+            SLEEPER.poll(1000, TimeUnit.MILLISECONDS);
+            long time = System.nanoTime() - start;
+//            System.out.printf("Sleep %5.1f%n", time/1e6);
+            System.out.println(System.currentTimeMillis());
+        }
+    }
+
+
+}

+ 54 - 50
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/util/OpcDaUtil.java

@@ -213,54 +213,55 @@ public class OpcDaUtil {
      * @return
      * @throws JIException
      */
-    public static Map<String, Object> getVal(JIVariant var) throws JIException {
+    public static Map<String, Object> getVal(JIVariant var) {
         Map<String, Object> map = new HashMap<>();
-        Object value;
-        int type = var.getType();
-        String javaType;
-        switch (type) {
-            case JIVariant.VT_I1://读到byte类型
+        try {
+            Object value;
+            int type = var.getType();
+            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();
-                break;
-            case JIVariant.VT_I4://读到int类型
-                javaType = "int";
-                value = var.getObjectAsInt();
-                break;
-            case JIVariant.VT_I8://读到long类型
-                javaType = "long";
-                value = var.getObjectAsLong();
-                break;
-            case JIVariant.VT_R4://读到float类型值
-                javaType = "float";
-                value = var.getObjectAsFloat();
-                break;
-            case JIVariant.VT_R8://读到double类型
-                javaType = "double";
-                value = var.getObjectAsDouble();
-                break;
-            case JIVariant.VT_BSTR://读到String类型值
-                javaType = "String";
-                value = var.getObjectAsString().getString().trim().replaceAll(",", "");
-                break;
-            case JIVariant.VT_BOOL://读到boolean类型
-                javaType = "boolean";
-                value = var.getObjectAsBoolean();
-                break;
-            case JIVariant.VT_DATE://读到date类型
-                javaType = "date";
-                value = var.getObjectAsDate();
-                break;
-            case JIVariant.VT_UI1://读到word类型(无符号整数)
-            case JIVariant.VT_UI2://读到word类型(无符号整数)
-            case JIVariant.VT_UI4://读到DWORD类型(无符号整数)
-                javaType = "word";//无符号类型
-                value = var.getObjectAsUnsigned().getValue();
-                break;
+                case JIVariant.VT_I2://读到short类型
+                    javaType = "short";
+                    value = var.getObjectAsShort();
+                    break;
+                case JIVariant.VT_I4://读到int类型
+                    javaType = "int";
+                    value = var.getObjectAsInt();
+                    break;
+                case JIVariant.VT_I8://读到long类型
+                    javaType = "long";
+                    value = var.getObjectAsLong();
+                    break;
+                case JIVariant.VT_R4://读到float类型值
+                    javaType = "float";
+                    value = var.getObjectAsFloat();
+                    break;
+                case JIVariant.VT_R8://读到double类型
+                    javaType = "double";
+                    value = var.getObjectAsDouble();
+                    break;
+                case JIVariant.VT_BSTR://读到String类型值
+                    javaType = "String";
+                    value = var.getObjectAsString().getString().trim().replaceAll(",", "");
+                    break;
+                case JIVariant.VT_BOOL://读到boolean类型
+                    javaType = "boolean";
+                    value = var.getObjectAsBoolean();
+                    break;
+                case JIVariant.VT_DATE://读到date类型
+                    javaType = "date";
+                    value = var.getObjectAsDate();
+                    break;
+                case JIVariant.VT_UI1://读到word类型(无符号整数)
+                case JIVariant.VT_UI2://读到word类型(无符号整数)
+                case JIVariant.VT_UI4://读到DWORD类型(无符号整数)
+                    javaType = "word";//无符号类型
+                    value = var.getObjectAsUnsigned().getValue();
+                    break;
 
 //            case JIVariant.VT_EMPTY:
 //                throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Variant is Empty.");
@@ -268,13 +269,16 @@ public class OpcDaUtil {
 //                throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Variant is null.");
 //            default:
 //                throw new JIException(JIErrorCodes.JI_VARIANT_IS_NULL, "Unknown Type.");
-            default:
-                javaType = "";
-                value = null;
-                break;
+                default:
+                    javaType = "";
+                    value = null;
+                    break;
+            }
+            map.put("javaType", javaType);
+            map.put("value", value);
+        }catch (Exception e){
+
         }
-        map.put("javaType", javaType);
-        map.put("value", value);
         return map;
     }
 

+ 2 - 0
chaunyi_opc/opc_da/src/main/resources/mapper/ChartDao.xml

@@ -95,6 +95,8 @@
              , tci.chart_id
              , tci.item_id
              , ti.item_group_id
+             , ti.item_name
+             , ti.describe
         from t_chart_item tci
                  left join t_item ti on tci.item_id = ti.id
         where tci.chart_id = #{chartId}