Parcourir la source

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

FinalYu il y a 2 ans
Parent
commit
5f598e109d

+ 13 - 3
chuanyi_server/src/main/java/com/judong/chuanyiserver/entity/RawData.java

@@ -33,10 +33,18 @@ public class RawData implements Serializable {
      */
     private String dataType;
     /**
-     * 值
+     * 数据集合(按照每个小时存为一个集合)
      */
     private String dataValue;
     /**
+     * 数据值对应的时间集合
+     */
+    private String dataValueTime;
+    /**
+     * 数据值归属时间,比如:2023-01-01 08,代表指定日期,指定小时的所有数据
+     */
+    private String valueBelongTime;
+    /**
      * 创建时间
      */
     private Date createTime;
@@ -45,14 +53,16 @@ public class RawData implements Serializable {
      * 无参构造方法被覆盖了,需要手动
      */
     @Tolerate
-    public RawData(){
+    public RawData() {
 
     }
 
-    public RawData(Integer dataSourceId, String itemName, String dataType, String dataValue, Date createTime) {
+    public RawData(Integer dataSourceId, String itemName, String dataType, String dataValue, String dataValueTime, String valueBelongTime, Date createTime) {
         this.dataSourceId = dataSourceId;
         this.itemName = itemName;
         this.dataType = dataType;
+        this.dataValueTime = dataValueTime;
+        this.valueBelongTime = valueBelongTime;
         this.dataValue = dataValue;
         this.createTime = createTime;
     }

+ 3 - 2
chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcAsyncTask.java

@@ -77,6 +77,7 @@ public class OpcAsyncTask {
                 List<NodeId> nodeIdList = OpcUaUtil.genNodeId(itemList);
                 while (flage) {
                     List<RawData> rawDataList = new ArrayList<>();
+//                    opcUaClient.readNamespaceTableAsync()
                     List<DataValue> valueList = opcUaClient.readValues(0.0, TimestampsToReturn.Both, nodeIdList).get();
                     Date date = new Date();
                     if (Blank.isNotEmpty(nodeIdList)) {
@@ -86,8 +87,8 @@ public class OpcAsyncTask {
                             Variant value = dataValue.getValue();
                             DataModel dm = map.get(nodeIdList.get(i));
                             ExpandedNodeId expandedNodeId = value.getDataType().get();
-                            rawDataList.add(new RawData(itemGroup.getDataSourceId(), nodeIdList.get(i).getIdentifier().toString(), expandedNodeId.getType().toString(),
-                                    Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(value.getValue().toString())).toString() : value.getValue().toString(), date));
+//                            rawDataList.add(new RawData(itemGroup.getDataSourceId(), nodeIdList.get(i).getIdentifier().toString(), expandedNodeId.getType().toString(),
+//                                    Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(value.getValue().toString())).toString() : value.getValue().toString(), date));
                         }
                     }
 //                    for (DataValue dataValue : valueList) {

+ 415 - 24
chuanyi_server/src/main/java/com/judong/chuanyiserver/opc/OpcDaTask.java

@@ -44,6 +44,8 @@ public class OpcDaTask extends TimerTask {
     @Override
     public void run() {
         Server server = OpcDaUtil.createServer(dataSource);
+        Integer id = itemGroup.getId();
+        Integer dataSourceId = dataSource.getId();
         try {
             if (itemGroup.getReadMode() == ConstantStr.ON_FREQUENCY) {
                 server.connect();
@@ -55,9 +57,86 @@ public class OpcDaTask extends TimerTask {
                             try {
                                 Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                                 DataModel dm = map.get(itemId);
+                                //读取的值
                                 String valStr = val.get("value").toString();
-                                opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
-                                        itemState.getTimestamp().getTime()));
+                                //值对应取值的时间
+                                Date time = itemState.getTimestamp().getTime();
+                                //归属时间
+                                String storageYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+                                String currentYmdh = DateUtil.dateChangeStr(time, "yyyy-MM-dd HH");
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+                                if (Blank.isEmpty(storageYmdh)) {
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                    List<String> dataValueList = new ArrayList<>();
+                                    dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                    redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                    List<String> dataValueTimeList = new ArrayList<>();
+                                    dataValueTimeList.add(currentYmdhmss);
+                                    redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                } else {
+                                    if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() == DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                        List<String> dataValueList = new ArrayList<>();
+                                        Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                        if (Blank.isNotEmpty(dataValueObject)) {
+                                            if (dataValueObject instanceof ArrayList<?>) {
+                                                for (Object o : (List<?>) dataValueObject) {
+                                                    dataValueList.add((String) o);
+                                                }
+                                            }
+                                        }
+                                        dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                        redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                        List<String> dataValueTimeList = new ArrayList<>();
+                                        Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                        if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                            if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                for (Object o : (List<?>) dataValueTimeObject) {
+                                                    dataValueTimeList.add((String) o);
+                                                }
+                                            }
+                                        }
+                                        dataValueTimeList.add(currentYmdhmss);
+                                        redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                    } else {
+                                        String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                        List<String> dataValueList = new ArrayList<>();
+                                        Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                        if (Blank.isNotEmpty(dataValueObject)) {
+                                            if (dataValueObject instanceof ArrayList<?>) {
+                                                for (Object o : (List<?>) dataValueObject) {
+                                                    dataValueList.add((String) o);
+                                                }
+                                            }
+                                        }
+
+                                        List<String> dataValueTimeList = new ArrayList<>();
+                                        Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                        if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                            if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                for (Object o : (List<?>) dataValueTimeObject) {
+                                                    dataValueTimeList.add((String) o);
+                                                }
+                                            }
+                                        }
+                                        //存数据
+                                        RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                        opcAsyncTask.addRawData(id, rawData);
+
+                                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                        dataValueList = new ArrayList<>();
+                                        dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                        redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                        dataValueTimeList = new ArrayList<>();
+                                        dataValueTimeList.add(currentYmdhmss);
+                                        redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                    }
+                                }
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
@@ -66,7 +145,7 @@ public class OpcDaTask extends TimerTask {
                 }
                 access.bind();
                 while (true) {
-                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
+                    Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
                     if (Blank.isEmpty(flage)) {
                         flage = false;
                     }
@@ -75,8 +154,11 @@ public class OpcDaTask extends TimerTask {
                         if (Blank.isNotEmpty(server)) {
                             server.dispose();
                         }
-                        redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                        itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+                        for (String itemId : itemIdList) {
+                            redisUtil.del(ConstantStr.ITEM_GROUP + id + itemId);
+                        }
+                        redisUtil.del(ConstantStr.ITEM_GROUP + id);
+                        itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
                         timer.cancel();
                         break;
                     }
@@ -93,19 +175,118 @@ public class OpcDaTask extends TimerTask {
                         public void changed(Item item, ItemState itemState) {
                             try {
                                 Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
+                                DataModel dm = map.get(itemId);
+                                //读取的值
+                                String valStr = val.get("value").toString();
+                                //值对应取值的时间
+                                Date time = itemState.getTimestamp().getTime();
+                                //归属时间
+                                String storageYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+                                String currentYmdh = DateUtil.dateChangeStr(time, "yyyy-MM-dd HH");
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
                                 if (Blank.isEmpty(valueMap)) {
                                     valueMap = val;
-                                    DataModel dm = map.get(itemId);
-                                    String valStr = val.get("value").toString();
-                                    opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
-                                            date));
+
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                    List<String> dataValueList = new ArrayList<>();
+                                    dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                    redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                    List<String> dataValueTimeList = new ArrayList<>();
+                                    dataValueTimeList.add(currentYmdhmss);
+                                    redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
                                 } else {
                                     if (!valueMap.equals(val)) {
-                                        valueMap = val;
-                                        DataModel dm = map.get(itemId);
-                                        String valStr = val.get("value").toString();
-                                        opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr,
-                                                itemState.getTimestamp().getTime()));
+                                        if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() == DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                            List<String> dataValueList = new ArrayList<>();
+                                            Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueObject)) {
+                                                if (dataValueObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueObject) {
+                                                        dataValueList.add((String) o);
+                                                    }
+                                                }
+                                            }
+                                            dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                            redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                            List<String> dataValueTimeList = new ArrayList<>();
+                                            Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueTimeObject) {
+                                                        dataValueTimeList.add((String) o);
+                                                    }
+                                                }
+                                            }
+                                            dataValueTimeList.add(currentYmdhmss);
+                                            redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                        } else {
+                                            String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                            List<String> dataValueList = new ArrayList<>();
+                                            Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueObject)) {
+                                                if (dataValueObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueObject) {
+                                                        dataValueList.add((String) o);
+                                                    }
+                                                }
+                                            }
+
+                                            List<String> dataValueTimeList = new ArrayList<>();
+                                            Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueTimeObject) {
+                                                        dataValueTimeList.add((String) o);
+                                                    }
+                                                }
+                                            }
+                                            //存数据
+                                            RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                            opcAsyncTask.addRawData(id, rawData);
+
+                                            redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                            dataValueList = new ArrayList<>();
+                                            dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                            redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                            dataValueTimeList = new ArrayList<>();
+                                            dataValueTimeList.add(currentYmdhmss);
+                                            redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                        }
+                                    } else {
+                                        if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() != DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                            String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                            List<String> dataValueList = new ArrayList<>();
+                                            Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueObject)) {
+                                                if (dataValueObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueObject) {
+                                                        dataValueList.add((String) o);
+                                                    }
+                                                }
+                                            }
+                                            redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                            List<String> dataValueTimeList = new ArrayList<>();
+                                            Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                            if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                    for (Object o : (List<?>) dataValueTimeObject) {
+                                                        dataValueTimeList.add((String) o);
+                                                    }
+                                                }
+                                            }
+                                            redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                            //存数据
+                                            RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                            opcAsyncTask.addRawData(id, rawData);
+                                        }
                                     }
                                 }
                             } catch (Exception e) {
@@ -143,16 +324,121 @@ public class OpcDaTask extends TimerTask {
                             try {
                                 Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                                 DataModel dm = map.get(itemId);
+                                //读取的值
                                 String valStr = val.get("value").toString();
                                 String dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr;
+                                //值对应取值的时间
+                                Date time = itemState.getTimestamp().getTime();
+                                //归属时间
+                                String storageYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+                                String currentYmdh = DateUtil.dateChangeStr(time, "yyyy-MM-dd HH");
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
                                 if (Blank.isNotEmpty(dmData)) {
                                     if (Double.valueOf(dmData) >= Double.valueOf(itemGroup.getModeValue())) {
-                                        opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), dmData,
-                                                date));
+                                        if (Blank.isEmpty(storageYmdh)) {
+                                            redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                            List<String> dataValueList = new ArrayList<>();
+                                            dataValueList.add(dmData);
+                                            redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                            List<String> dataValueTimeList = new ArrayList<>();
+                                            dataValueTimeList.add(currentYmdhmss);
+                                            redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                        } else {
+                                            if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() == DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                dataValueTimeList.add(currentYmdhmss);
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                            } else {
+                                                String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                //存数据
+                                                RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                                opcAsyncTask.addRawData(id, rawData);
+
+                                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                                dataValueList = new ArrayList<>();
+                                                dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                dataValueTimeList = new ArrayList<>();
+                                                dataValueTimeList.add(currentYmdhmss);
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                            }
+                                        }
+                                    } else {
+                                        if (Blank.isNotEmpty(storageYmdh)) {
+                                            if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() != DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                                String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                                //存数据
+                                                RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                                opcAsyncTask.addRawData(id, rawData);
+                                            }
+                                        }
                                     }
-                                } else {
-                                    opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), "null",
-                                            date));
                                 }
                             } catch (Exception e) {
                                 e.printStackTrace();
@@ -189,16 +475,121 @@ public class OpcDaTask extends TimerTask {
                             try {
                                 Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                                 DataModel dm = map.get(itemId);
+                                //读取的值
                                 String valStr = val.get("value").toString();
                                 String dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr;
+                                //值对应取值的时间
+                                Date time = itemState.getTimestamp().getTime();
+                                //归属时间
+                                String storageYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+                                String currentYmdh = DateUtil.dateChangeStr(time, "yyyy-MM-dd HH");
+                                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
                                 if (Blank.isNotEmpty(dmData)) {
                                     if (Double.valueOf(dmData) <= Double.valueOf(itemGroup.getModeValue())) {
-                                        opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), dmData,
-                                                date));
+                                        if (Blank.isEmpty(storageYmdh)) {
+                                            redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                            List<String> dataValueList = new ArrayList<>();
+                                            dataValueList.add(dmData);
+                                            redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                            List<String> dataValueTimeList = new ArrayList<>();
+                                            dataValueTimeList.add(currentYmdhmss);
+                                            redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                        } else {
+                                            if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() == DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                dataValueTimeList.add(currentYmdhmss);
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                            } else {
+                                                String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                //存数据
+                                                RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                                opcAsyncTask.addRawData(id, rawData);
+
+                                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id + itemId, currentYmdh);
+
+                                                dataValueList = new ArrayList<>();
+                                                dataValueList.add(Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), Double.valueOf(valStr)).toString() : valStr);
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                dataValueTimeList = new ArrayList<>();
+                                                dataValueTimeList.add(currentYmdhmss);
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                            }
+                                        }
+                                    }else{
+                                        if (Blank.isNotEmpty(storageYmdh)) {
+                                            if (DateUtil.strChangeDate(storageYmdh, "yyyy-MM-dd HH").getTime() != DateUtil.strChangeDate(currentYmdh, "yyyy-MM-dd HH").getTime()) {
+                                                String valueBelongTime = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+
+                                                List<String> dataValueList = new ArrayList<>();
+                                                Object dataValueObject = redisUtil.get(ConstantStr.DATA_VALUE + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueObject)) {
+                                                    if (dataValueObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueObject) {
+                                                            dataValueList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                redisUtil.set(ConstantStr.DATA_VALUE + id + itemId, dataValueList);
+
+                                                List<String> dataValueTimeList = new ArrayList<>();
+                                                Object dataValueTimeObject = redisUtil.get(ConstantStr.DATA_VALUE_TIME + id + itemId);
+                                                if (Blank.isNotEmpty(dataValueTimeObject)) {
+                                                    if (dataValueTimeObject instanceof ArrayList<?>) {
+                                                        for (Object o : (List<?>) dataValueTimeObject) {
+                                                            dataValueTimeList.add((String) o);
+                                                        }
+                                                    }
+                                                }
+                                                redisUtil.set(ConstantStr.DATA_VALUE_TIME + id + itemId, dataValueTimeList);
+                                                //存数据
+                                                RawData rawData = new RawData(dataSourceId, itemId, val.get("javaType").toString(), String.valueOf(dataValueList), String.valueOf(dataValueTimeList), String.valueOf(valueBelongTime), new Date());
+                                                opcAsyncTask.addRawData(id, rawData);
+                                            }
+                                        }
                                     }
-                                } else {
-                                    opcAsyncTask.addRawData(itemGroup.getId(), new RawData(dataSource.getId(), itemId, val.get("javaType").toString(), "null",
-                                            date));
                                 }
                             } catch (Exception e) {
                                 e.printStackTrace();

+ 2 - 2
chuanyi_server/src/main/java/com/judong/chuanyiserver/service/impl/ItemGroupServiceImpl.java

@@ -251,7 +251,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 //如果驱动是kepserver,则不进行变化
                 if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.KEPSERVER.getValue())) {
                     timer.schedule(new OpcDaTask(redisUtil, opcAsyncTask, itemGroupDao, timer, itemGroup, dataSource, map, itemList),
-                            DateUtil.strChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
+                            DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
                 } else if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.OPCIFIX.getValue())) {
                     if (Blank.isNotEmpty(itemList)) {
                         for (int i = 0; i < itemList.size(); i++) {
@@ -262,7 +262,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                         }
                     }
                     timer.schedule(new OpcDaTask(redisUtil, opcAsyncTask, itemGroupDao, timer, itemGroup, dataSource, map, itemList),
-                            DateUtil.strChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
+                            DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
                 } else if (dataSource.getClsId().toUpperCase().equals(OpcDaDriverEnum.WINCC.getValue())) {
 
                 } else {

+ 4 - 1
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/ConstantStr.java

@@ -51,8 +51,11 @@ public class ConstantStr {
     public static final Integer STOP_IT = 0;
     public static final Integer START_UP = 1;
 
-    //itemGroup存入redis的常量键
+    //存入redis的常量键
     public static final String ITEM_GROUP = "itemGroup";
+    public static final String DATA_VALUE = "dataValue";
+    public static final String DATA_VALUE_TIME = "dataValueTime";
+    public static final String VALUE_BELONG_TIME = "valueBelongTime";
 
     //t_raw_data水平分表的个数
     public static final Integer SUB_TABLE_NUM = 5;

+ 24 - 3
chuanyi_server/src/main/java/com/judong/chuanyiserver/util/DateUtil.java

@@ -16,7 +16,7 @@ public class DateUtil {
      * @param dateStr
      * @return
      */
-    public static Date strChangeDate(String dateStr) {
+    public static Date strYmdhmsChangeDate(String dateStr) {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date date = null;
         try {
@@ -28,6 +28,27 @@ public class DateUtil {
     }
 
     /**
+     * 时间字符串转为Date类型
+     *
+     * @param dateStr
+     * @param pattern
+     * @return
+     */
+    public static Date strChangeDate(String dateStr, String pattern) {
+        if (Blank.isEmpty(pattern)) {
+            return null;
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+        Date date = null;
+        try {
+            date = sdf.parse(dateStr);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return date;
+    }
+
+    /**
      * Date时间转换为年月日时分秒毫秒字符串
      *
      * @param date
@@ -48,9 +69,9 @@ public class DateUtil {
     }
 
     /**
-     * Date时间转换为年月日时分秒毫秒字符串
+     * Date时间转换为字符串
      *
-     * @param date
+     * @param date    传入的date时间
      * @param pattern 时间字符串格式
      * @return
      */

+ 95 - 93
chuanyi_server/src/main/resources/mapper/RawDataDao.xml

@@ -4,18 +4,21 @@
 
     <insert id="addRawData">
         insert into t_raw_data${remainder}
-        (item_group_id, data_source_id, item_name, data_type, data_value, create_time)
+        (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time,
+         create_time)
         VALUES (#{itemGroupId}, #{rawData.dataSourceId}, #{rawData.itemName}, #{rawData.dataType}, #{rawData.dataValue},
-                #{rawData.createTime})
+                #{rawData.dataValueTime}, #{rawData.valueBelongTime}, #{rawData.createTime})
     </insert>
 
     <insert id="addRawDataList">
         insert into
         t_raw_data${remainder}
-        (item_group_id,data_source_id, item_name, data_type, data_value, create_time)
+        (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time,
+        create_time)
         VALUES
         <foreach collection="rawDataList" item="rawData" index="index" separator=",">
-            (#{itemGroupId},#{rawData.dataSourceId},#{rawData.itemName},#{rawData.dataType},#{rawData.dataValue},#{rawData.createTime})
+            (#{itemGroupId}, #{rawData.dataSourceId}, #{rawData.itemName}, #{rawData.dataType}, #{rawData.dataValue},
+            #{rawData.dataValueTime}, #{rawData.valueBelongTime}, #{rawData.createTime})
         </foreach>
     </insert>
 
@@ -54,8 +57,7 @@
         WHERE item_group_id = #{itemGroupId}
           AND data_source_id = #{dataSourceId}
           AND item_name = #{itemName}
-        ORDER BY create_time
-        LIMIT 6
+        ORDER BY create_time LIMIT 6
     </select>
 
     <select id="getPieData" resultType="java.util.Map">
@@ -71,93 +73,93 @@
     <select id="getTableDataEvery" resultType="java.util.Map">
         SELECT IF
                    (
-                       a.data_h &gt; 7,
-                       date_format(CONCAT(date_format(CURRENT_DATE() - 1, '%Y-%m-%d'), ' ', a.data_h, ':00:00'),
-                                   '%Y-%m-%d %H:%i'),
-                       date_format(CONCAT(date_format(CURRENT_DATE(), '%Y-%m-%d'), ' ', a.data_h, ':00:00'),
-                                   '%Y-%m-%d %H:%i')) dh,
-               a.data_v                               dv
-        FROM (
-                 SELECT CONCAT(timetable.HOUR, ':00:00') data_h,
-                        ifnull(avgtable.data_val, 0)     data_v
-                 FROM (
-                          SELECT 0 HOUR
-                          UNION ALL
-                          SELECT 1 HOUR
-                          UNION ALL
-                          SELECT 2 HOUR
-                          UNION ALL
-                          SELECT 3 HOUR
-                          UNION ALL
-                          SELECT 4 HOUR
-                          UNION ALL
-                          SELECT 5 HOUR
-                          UNION ALL
-                          SELECT 6 HOUR
-                          UNION ALL
-                          SELECT 7 HOUR
-                          UNION ALL
-                          SELECT 8 HOUR
-                          UNION ALL
-                          SELECT 9 HOUR
-                          UNION ALL
-                          SELECT 10 HOUR
-                          UNION ALL
-                          SELECT 11 HOUR
-                          UNION ALL
-                          SELECT 12 HOUR
-                          UNION ALL
-                          SELECT 13 HOUR
-                          UNION ALL
-                          SELECT 14 HOUR
-                          UNION ALL
-                          SELECT 15 HOUR
-                          UNION ALL
-                          SELECT 16 HOUR
-                          UNION ALL
-                          SELECT 17 HOUR
-                          UNION ALL
-                          SELECT 18 HOUR
-                          UNION ALL
-                          SELECT 19 HOUR
-                          UNION ALL
-                          SELECT 20 HOUR
-                          UNION ALL
-                          SELECT 21 HOUR
-                          UNION ALL
-                          SELECT 22 HOUR
-                          UNION ALL
-                          SELECT 23 HOUR
-                      ) timetable
-                          LEFT JOIN ((
-                                         SELECT HOUR
-                                                    (create_time) AS data_hour,
-                                                ${sqlParameter}( data_value ) AS data_val
-                                         FROM t_raw_data${remainder}
-                                         WHERE item_group_id = #{itemGroupId}
-                                           AND data_source_id = #{dataSourceId}
-                                           AND item_name = #{itemName}
-                                           AND date_format(create_time, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d')
-                                           AND date_format(create_time, '%Y-%m-%d %H') &lt;=
-                                               concat(date_format(now(), '%Y-%m-%d '), '07')
-                                         GROUP BY HOUR(create_time)
-                                     )
-                                     UNION ALL
-                                     (
-                                         SELECT HOUR
-                                                    (create_time),
-                                                ${sqlParameter}( data_value )
-                                         FROM t_raw_data${remainder}
-                                         WHERE item_group_id = #{itemGroupId}
-                                           AND data_source_id = #{dataSourceId}
-                                           AND item_name = #{itemName}
-                                           AND date_format(create_time, '%Y-%m-%d') =
-                                               date_format(CURRENT_DATE() - 1, '%Y-%m-%d')
-                                           AND date_format(create_time, '%Y-%m-%d %H') &gt;=
-                                               concat(date_format(CURRENT_DATE() - 1, '%Y-%m-%d '), '08')
-                                         GROUP BY HOUR(create_time))
-                 ) avgtable ON timetable.HOUR = avgtable.data_hour
-             ) a
+                           a.data_h &gt; 7,
+                           date_format(CONCAT(date_format(CURRENT_DATE() - 1, '%Y-%m-%d'), ' ', a.data_h, ':00:00'),
+                                       '%Y-%m-%d %H:%i'),
+                           date_format(CONCAT(date_format(CURRENT_DATE(), '%Y-%m-%d'), ' ', a.data_h, ':00:00'),
+                                       '%Y-%m-%d %H:%i')) dh,
+               a.data_v                                   dv
+        FROM (SELECT CONCAT(timetable.HOUR, ':00:00') data_h,
+                     ifnull(avgtable.data_val, 0)     data_v
+              FROM (SELECT 0 HOUR
+                    UNION ALL
+                    SELECT 1 HOUR
+                    UNION ALL
+                    SELECT 2 HOUR
+                    UNION ALL
+                    SELECT 3 HOUR
+                    UNION ALL
+                    SELECT 4 HOUR
+                    UNION ALL
+                    SELECT 5 HOUR
+                    UNION ALL
+                    SELECT 6 HOUR
+                    UNION ALL
+                    SELECT 7 HOUR
+                    UNION ALL
+                    SELECT 8 HOUR
+                    UNION ALL
+                    SELECT 9 HOUR
+                    UNION ALL
+                    SELECT 10 HOUR
+                    UNION ALL
+                    SELECT 11 HOUR
+                    UNION ALL
+                    SELECT 12 HOUR
+                    UNION ALL
+                    SELECT 13 HOUR
+                    UNION ALL
+                    SELECT 14 HOUR
+                    UNION ALL
+                    SELECT 15 HOUR
+                    UNION ALL
+                    SELECT 16 HOUR
+                    UNION ALL
+                    SELECT 17 HOUR
+                    UNION ALL
+                    SELECT 18 HOUR
+                    UNION ALL
+                    SELECT 19 HOUR
+                    UNION ALL
+                    SELECT 20 HOUR
+                    UNION ALL
+                    SELECT 21 HOUR
+                    UNION ALL
+                    SELECT 22 HOUR
+                    UNION ALL
+                    SELECT 23 HOUR) timetable
+                       LEFT JOIN ((SELECT HOUR
+                                       (create_time) AS data_hour, ${sqlParameter}( data_value ) AS data_val
+                                   FROM t_raw_data ${remainder}
+                                   WHERE item_group_id = #{itemGroupId}
+                                     AND data_source_id = #{dataSourceId}
+                                     AND item_name = #{itemName}
+                                     AND date_format(create_time
+                                       , '%Y-%m-%d') = date_format(now()
+                                       , '%Y-%m-%d')
+                                     AND date_format(create_time
+                                       , '%Y-%m-%d %H') &lt;=
+                                       concat(date_format(now()
+                                       , '%Y-%m-%d ')
+                                       , '07')
+                                   GROUP BY HOUR (create_time))
+                                  UNION ALL
+                                  (SELECT HOUR
+                                       (create_time), ${sqlParameter}( data_value )
+                                   FROM t_raw_data ${remainder}
+                                   WHERE item_group_id = #{itemGroupId}
+                                     AND data_source_id = #{dataSourceId}
+                                     AND item_name = #{itemName}
+                                     AND date_format(create_time
+                                       , '%Y-%m-%d') =
+                                       date_format(CURRENT_DATE () - 1
+                                       , '%Y-%m-%d')
+                                     AND date_format(create_time
+                                       , '%Y-%m-%d %H') &gt;=
+                                       concat(date_format(CURRENT_DATE () - 1
+                                       , '%Y-%m-%d ')
+                                       , '08')
+                                   GROUP BY HOUR (create_time))) avgtable ON timetable.HOUR = avgtable.data_hour) a
         ORDER BY dh
     </select>
 </mapper>