Răsfoiți Sursa

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

FinalYu 2 ani în urmă
părinte
comite
62c097077f
48 a modificat fișierele cu 1253 adăugiri și 1907 ștergeri
  1. 15 6
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/CursorRawData.java
  2. 4 5
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/ItemGroup.java
  3. 6 3
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/RawData.java
  4. 4 3
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/ConstantStr.java
  5. 10 0
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/JavaTypeUtil.java
  6. 4 4
      chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/MathUtil.java
  7. 0 67
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/config/InitRunner.java
  8. 1 1
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/config/InterceptorConfig.java
  9. 19 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/controller/DataModelController.java
  10. 11 3
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/controller/ItemGroupController.java
  11. 4 14
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/RawDataDao.java
  12. 63 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dynamicSchedule/DynamicScheduleConfig.java
  13. 2 0
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/ItemGroupService.java
  14. 17 18
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/ItemGroupServiceImpl.java
  15. 96 148
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcAsyncTask.java
  16. 8 27
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java
  17. 51 58
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java
  18. 14 93
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java
  19. 0 233
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaLowseTask.java
  20. 0 199
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaSpecifyTask.java
  21. 19 55
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaTask.java
  22. 2 2
      chaunyi_opc/opc_da/src/main/java/com/example/opc_da/util/OpcDaUtil.java
  23. 11 7
      chaunyi_opc/opc_da/src/main/resources/mapper/ItemGroupDao.xml
  24. 28 77
      chaunyi_opc/opc_da/src/main/resources/mapper/RawDataDao.xml
  25. 1 91
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/config/InitRunner.java
  26. 61 0
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/config/SpringContextUtils.java
  27. 3 1
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dao/ItemGroupDao.java
  28. 8 1
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dao/RawDataDao.java
  29. 77 0
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/CronTaskRegister.java
  30. 81 0
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/DynamicScheduleConfig.java
  31. 24 0
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/ScheduleConfig.java
  32. 57 0
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/SchedulingRunnable.java
  33. 21 10
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/service/impl/ItemGroupServiceImpl.java
  34. 89 99
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcAsyncTask.java
  35. 53 51
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaChangeTask.java
  36. 80 77
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaExceedTask.java
  37. 56 107
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaFrequencyTask.java
  38. 0 196
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaLowerTask.java
  39. 128 111
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaTask.java
  40. 0 91
      chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaWeekTask.java
  41. 10 1
      chaunyi_opc/opc_ua/src/main/resources/mapper/ItemGroupDao.xml
  42. 51 1
      chaunyi_opc/opc_ua/src/main/resources/mapper/RawDataDao.xml
  43. 21 18
      reado-app/.hbuilderx/launch.json
  44. 2 2
      reado-app/pages/login/index.vue
  45. 8 6
      reado-app/pages/message/index.vue
  46. 7 5
      reado-app/pages/reportForm/index.vue
  47. 22 14
      reado-app/pages/reportForm/report-detail/index.vue
  48. 4 2
      reado-app/pages/reportForm/report-detail/recordDetail.vue

+ 15 - 6
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/EventRawData.java → chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/CursorRawData.java

@@ -6,8 +6,11 @@ import lombok.experimental.Tolerate;
 import java.io.Serializable;
 import java.util.Date;
 
+/**
+ * 临时原始数据表类
+ */
 @Data
-public class EventRawData implements Serializable {
+public class CursorRawData implements Serializable {
 
     private static final long serialVersionUID = -96536212774977561L;
 
@@ -39,7 +42,6 @@ public class EventRawData implements Serializable {
      * 数据值对应的时间集合
      */
     private String dataValueTime;
-
     /**
      * 数据索引
      */
@@ -49,6 +51,10 @@ public class EventRawData implements Serializable {
      */
     private String valueBelongTime;
     /**
+     * 是否满足差值改变。0不是,1是
+     */
+    private Integer isMeetChange;
+    /**
      * 创建时间
      */
     private Date createTime;
@@ -57,19 +63,22 @@ public class EventRawData implements Serializable {
      * 无参构造方法被覆盖了,需要手动
      */
     @Tolerate
-    public EventRawData() {
+    public CursorRawData() {
 
     }
 
-    public EventRawData(Integer itemGroupId, Integer dataSourceId, String itemName, String dataType, String dataValue, String dataValueTime, String valueBelongTime, Date createTime, Long itemIndex) {
+    public CursorRawData(Integer itemGroupId, Integer dataSourceId, String itemName,
+                         String dataType, String dataValue, String dataValueTime, Long dataIndex, String valueBelongTime, Integer isMeetChange,
+                         Date createTime) {
         this.itemGroupId = itemGroupId;
         this.dataSourceId = dataSourceId;
         this.itemName = itemName;
         this.dataType = dataType;
+        this.dataValue = dataValue;
         this.dataValueTime = dataValueTime;
+        this.dataIndex = dataIndex;
         this.valueBelongTime = valueBelongTime;
-        this.dataValue = dataValue;
+        this.isMeetChange = isMeetChange;
         this.createTime = createTime;
-//        this.itemIndex = itemIndex;
     }
 }

+ 4 - 5
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/ItemGroup.java

@@ -36,6 +36,10 @@ public class ItemGroup extends BaseSchedule implements Serializable {
      */
     private Integer readMode;
     /**
+     * 事件驱动产生的条件,0大于,1小于(0,1,值只对应数值类型),2为boolean类型
+     */
+    private Integer eventMode;
+    /**
      * 读取模式对应的类型,0绝对值,1百分率
      */
     private Integer readModeType;
@@ -44,11 +48,6 @@ public class ItemGroup extends BaseSchedule implements Serializable {
      */
     private Double modeValue;
     /**
-     * 指定时间对应的模式值
-     */
-    private String modeValueTime;
-
-    /**
      * 读取周,0周天,1周一,2周二,...6周六
      */
     private String readWeek;

+ 6 - 3
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/entity/RawData.java

@@ -6,6 +6,9 @@ import lombok.experimental.Tolerate;
 import java.io.Serializable;
 import java.util.Date;
 
+/**
+ * 原始数据表
+ */
 @Data
 public class RawData implements Serializable {
 
@@ -42,7 +45,7 @@ public class RawData implements Serializable {
     /**
      * 数据索引
      */
-    private Long dataIndex;
+    private String dataIndex;
     /**
      * 数据值归属时间,比如:2023-01-01 08,代表指定日期,指定小时的所有数据
      */
@@ -50,7 +53,7 @@ public class RawData implements Serializable {
     /**
      * 是否满足差值改变。0不是,1是
      */
-    private Integer isMeetChange;
+    private String isMeetChange;
     /**
      * 创建时间
      */
@@ -65,7 +68,7 @@ public class RawData implements Serializable {
     }
 
     public RawData(Integer itemGroupId, Integer dataSourceId, String itemName,
-                   String dataType, String dataValue, String dataValueTime, Long dataIndex, String valueBelongTime, Integer isMeetChange,
+                   String dataType, String dataValue, String dataValueTime, String dataIndex, String valueBelongTime, String isMeetChange,
                    Date createTime) {
         this.itemGroupId = itemGroupId;
         this.dataSourceId = dataSourceId;

+ 4 - 3
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/ConstantStr.java

@@ -57,9 +57,10 @@ public class ConstantStr {
 
     public static final Integer DEFAULT_VERSION = 0;
 
-    //配置启用状态,0停用,1启用
+    //配置启用状态,0正常停止,1启用,2异常停止
     public static final Integer STOP_IT = 0;
     public static final Integer START_UP = 1;
+    public static final Integer EXCEPT_STOP_UP = 2;
 
     //存入redis的常量键
     public static final String ITEM_GROUP = "itemGroup";
@@ -92,10 +93,10 @@ public class ConstantStr {
     public static final Integer ABSOLUTE_VALUE = 0;
     public static final Integer PERCENT_AGE = 1;
 
-    //事件驱动条件,0大于,1小于(0,1,值只对应数值类型),2为boolean类型
+    //事件驱动条件,0大于,1小于(0,1,值只对应数值类型),2为等于
     public static final Integer EVENT_MODEL_EXCEED = 0;
     public static final Integer EVENT_MODEL_LOWER = 1;
-    public static final Integer EVENT_MODEL_BOOLEAN = 2;
+    public static final Integer EVENT_MODEL_EQUAL = 2;
 
     public static final Integer BOOLEAN_FALSE = 0;
     public static final Integer BOOLEAN_TRUE = 1;

+ 10 - 0
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/JavaTypeUtil.java

@@ -59,4 +59,14 @@ public class JavaTypeUtil {
         }
         return dataList;
     }
+
+    public static List<Long> objChangeListLong(Object dataObject) {
+        List<Long> dataList = new ArrayList<>();
+        if (dataObject instanceof ArrayList<?>) {
+            for (Object o : (List<?>) dataObject) {
+                dataList.add((Long) o);
+            }
+        }
+        return dataList;
+    }
 }

+ 4 - 4
chaunyi_opc/opc_common/src/main/java/com/example/opc_common/util/MathUtil.java

@@ -17,20 +17,20 @@ public class MathUtil {
      * 四则混合运算
      *
      * @param parameter  变量代表字符串
-     * @param MathString 数学表达式字符串
+     * @param mathString 数学表达式字符串
      * @param value      变量值
      * @return
      * @throws ParseException
      */
-    public static BigDecimal quadricOperation(String parameter, String MathString, BigDecimal value) {
-        if (Blank.isEmpty(parameter, MathString, value)) {
+    public static BigDecimal quadricOperation(String parameter, String mathString, BigDecimal value) {
+        if (Blank.isEmpty(parameter, mathString, value)) {
             throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "数学参数,表达式,数据值不能为空");
         }
         Scope scope = new Scope();
         Variable a = scope.getVariable(parameter);
         a.setValue(value);
         try {
-            Expression expr = Parser.parse(MathString, scope);
+            Expression expr = Parser.parse(mathString, scope);
             return expr.evaluate();
         } catch (Exception e) {
             e.printStackTrace();

+ 0 - 67
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/config/InitRunner.java

@@ -1,29 +1,16 @@
 package com.example.opc_da.config;
 
 import com.example.opc_common.entity.DataSource;
-import com.example.opc_common.entity.DataSourceType;
-import com.example.opc_common.entity.ItemGroup;
 import com.example.opc_common.enums.DataSourceTypeEnum;
-import com.example.opc_common.enums.OpcDaDriverEnum;
-import com.example.opc_common.enums.ResultEnum;
-import com.example.opc_common.exception.CustomException;
 import com.example.opc_common.util.Blank;
-import com.example.opc_common.util.ConstantStr;
 import com.example.opc_da.dao.DataSourceDao;
-import com.example.opc_da.dao.ItemGroupDao;
-import com.example.opc_da.dynamicSchedule.CronTaskRegister;
-import com.example.opc_da.dynamicSchedule.SchedulingRunnable;
 import com.example.opc_da.task.OpcAsyncTask;
-import com.example.opc_da.task.OpcDaTask;
-import com.example.opc_da.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
 
 import javax.annotation.PostConstruct;
 import java.util.List;
-import java.util.UUID;
 
 /**
  * 项目初始化配置
@@ -36,20 +23,8 @@ public class InitRunner {
     private DataSourceDao dataSourceDao;
 
     @Autowired
-    private ItemGroupDao itemGroupDao;
-
-    @Autowired
     private OpcAsyncTask opcAsyncTask;
 
-    @Autowired
-    private RedisUtil redisUtil;
-
-    @Autowired
-    private CronTaskRegister cronTaskRegister;
-
-    @Value("${opc_storage.time_format}")
-    private String timeFormat;
-
     @PostConstruct
     public void initData() {
         //将ua和da的树,加载到redis中去
@@ -67,47 +42,5 @@ public class InitRunner {
                 }
             }
         }
-
-        //将已经启动的服务重新启动
-        List<ItemGroup> itemGroupList = itemGroupDao.getAllItemGroup(null);
-        if (Blank.isNotEmpty(itemGroupList)) {
-            for (ItemGroup itemGroup : itemGroupList) {
-                DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
-                String clsId = dataSource.getClsId().toUpperCase();
-                DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
-                if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue()) ||
-                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_AE_ALARMS.getValue()) ||
-                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue())) {
-                    if (itemGroup.getRunState() == ConstantStr.START_UP) {
-                        if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
-                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组配置的数据源的ip地址,帐户,密码都不能为空");
-                        }
-                        Integer id = itemGroup.getId();
-                        redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
-                        if (clsId.equals(OpcDaDriverEnum.KEPSERVER.getValue()) ||
-                                clsId.equals(OpcDaDriverEnum.OPCIFIX.getValue()) ||
-                                clsId.equals(OpcDaDriverEnum.WINCC.getValue()) ||
-                                clsId.equals(OpcDaDriverEnum.SCADA.getValue()) ||
-                                clsId.equals(OpcDaDriverEnum.YOKOGAWA.getValue()) ||
-                                clsId.equals(OpcDaDriverEnum.PAS300.getValue())
-                        ) {
-                            //新增定时器任务
-                            String cronId = "";
-                            String cron = "0 0 0 ? * " + itemGroup.getReadWeek();
-                            if (Blank.isEmpty(itemGroup.getCronId())) {
-                                cronId = UUID.randomUUID().toString().replace("-", "");
-                            } else {
-                                cronId = itemGroup.getCronId();
-                            }
-                            SchedulingRunnable task = new SchedulingRunnable(OpcDaTask.class, "opcDaTask", new Object[]{itemGroup, dataSource, cronId});
-                            cronTaskRegister.addCronTask(task, cronId, cron);
-                            itemGroupDao.runItemGroupById(id, ConstantStr.START_UP, cronId);
-                        } else {
-                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
-                        }
-                    }
-                }
-            }
-        }
     }
 }

+ 1 - 1
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/config/InterceptorConfig.java

@@ -44,7 +44,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
                 .excludePathPatterns("/page/static/**")
                 .excludePathPatterns("/app/static/**")
                 .excludePathPatterns("/favicon.ico")
-//                .excludePathPatterns("/**")
+                .excludePathPatterns("/**")
         ;
     }
 }

+ 19 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/controller/DataModelController.java

@@ -6,6 +6,7 @@ import com.example.opc_common.enums.OperationEnum;
 import com.example.opc_common.enums.ResultEnum;
 import com.example.opc_common.enums.ServerEnum;
 import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.MathUtil;
 import com.example.opc_common.util.Result;
 import com.example.opc_da.annotation.WebLog;
 import com.example.opc_da.service.DataModelService;
@@ -13,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 
 @RestController
 @RequestMapping("dataModel")
@@ -112,4 +114,21 @@ public class DataModelController {
         return dataModelService.testDataModelById(id, dataValue);
     }
 
+    /**
+     * 测试数据模型的值
+     *
+     * @param parameter  变量代表字符串
+     * @param mathString 数学表达式字符串
+     * @param dataValue  变量值
+     * @return
+     */
+    @GetMapping("/testDataModelByModel")
+    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATAMODEL, OperationEnum = OperationEnum.TEST)
+    public Result testDataModelByModel(String parameter, String mathString, Double dataValue) {
+        if (Blank.isEmpty(parameter, mathString, dataValue)) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return Result.ok(MathUtil.quadricOperation(parameter, mathString, new BigDecimal(dataValue)));
+    }
+
 }

+ 11 - 3
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/controller/ItemGroupController.java

@@ -34,8 +34,8 @@ public class ItemGroupController {
     @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATAGROUP, OperationEnum = OperationEnum.ADD)
     public Result addItemGroup(@RequestBody ItemGroup itemGroup) {
         if (Blank.isEmpty(itemGroup, itemGroup.getGroupName(), itemGroup.getReadMode(),
-                itemGroup.getStartReadTime(), itemGroup.getEndReadTime(), itemGroup.getReadWeek())) {
-            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "组名称,读取模式,开始结束读取时间,选择周不能为空");
+                itemGroup.getStartReadTime(), itemGroup.getEndReadTime())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "组名称,读取模式,开始结束读取时间不能为空");
         }
         return itemGroupService.addItemGroup(itemGroup);
     }
@@ -163,7 +163,7 @@ public class ItemGroupController {
      * @return
      */
     @GetMapping("/getTableItemGroupById/{id}")
-    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.REPORTTABLE, OperationEnum = OperationEnum.SELECT)
+    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.DATAGROUP, OperationEnum = OperationEnum.SELECT)
     public Result getTableItemGroupById(@PathVariable Integer id) {
         if (Blank.isEmpty(id)) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
@@ -171,4 +171,12 @@ public class ItemGroupController {
         return itemGroupService.getTableItemGroupById(id);
     }
 
+    @PostMapping("batchSetExpresses")
+    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.REPORTTABLE, OperationEnum = OperationEnum.SELECT)
+    public Result batchSetExpresses(@RequestBody ItemGroup itemGroup) {
+        if (Blank.isEmpty(itemGroup, itemGroup.getItemList())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组的标签不能为空");
+        }
+        return itemGroupService.batchSetExpresses(itemGroup);
+    }
 }

+ 4 - 14
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dao/RawDataDao.java

@@ -1,6 +1,6 @@
 package com.example.opc_da.dao;
 
-import com.example.opc_common.entity.EventRawData;
+import com.example.opc_common.entity.CursorRawData;
 import com.example.opc_common.entity.Item;
 import com.example.opc_common.entity.RawData;
 import org.springframework.stereotype.Repository;
@@ -25,25 +25,15 @@ public interface RawDataDao {
 
     List<RawData> getPieChartData(Integer itemGroupId, Integer remainder, Integer dataSourceId, String itemName, String startBelongTime, String endBelongTime);
 
-    List<RawData> getTempRawDataList(Item item, Integer dataSourceId, String valueBelongTime);
+    List<CursorRawData> getCursorRawDataList(Item item, Integer dataSourceId, String valueBelongTime, List<Long> indexList);
 
-    Integer delRawDataList(List<RawData> rawDataList, String valueBelongTime);
+    Integer delCursorRawDataList(Integer itemGroupId, Integer dataSourceId, String valueBelongTime);
 
-    Integer addTempRawData(RawData rawData);
+    Integer addCursorRawData(CursorRawData cursorRawData);
 
     RawData getRawDataList(Item item, Integer remainder, Integer dataSourceId, String valueBelongTime);
 
-    List<EventRawData> getEventRawDataList(Item item, Integer dataSourceId, String valueBelongTime);
-
-    Integer addEventRawData(EventRawData eventRawData);
-
-    Integer delEventRawDataList(List<Integer> idList);
-
     Integer updateRawData(Integer remainder, RawData rawData);
 
-    List<Long> getEventRawDataIndexList(Item item, Integer dataSourceId, String valueBelongTime);
-
-    Integer delEventRawDataListByIndex(Item item, Integer dataSourceId, String valueBelongTime, List<Long> indexList);
-
     List<Long> getMeetIndexList(Integer itemGroupId, Integer dataSourceId, List<Item> itemList, String valueBelongTime, Integer notMeetChange);
 }

+ 63 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/dynamicSchedule/DynamicScheduleConfig.java

@@ -1,9 +1,19 @@
 package com.example.opc_da.dynamicSchedule;
 
+import com.example.opc_common.entity.DataSource;
+import com.example.opc_common.entity.DataSourceType;
+import com.example.opc_common.entity.ItemGroup;
 import com.example.opc_common.entity.ReportTable;
+import com.example.opc_common.enums.DataSourceTypeEnum;
+import com.example.opc_common.enums.OpcDaDriverEnum;
+import com.example.opc_common.enums.ResultEnum;
+import com.example.opc_common.exception.CustomException;
 import com.example.opc_common.util.Blank;
 import com.example.opc_common.util.ConstantStr;
+import com.example.opc_da.dao.DataSourceDao;
+import com.example.opc_da.dao.ItemGroupDao;
 import com.example.opc_da.dao.ReportTableDao;
+import com.example.opc_da.task.OpcDaTask;
 import com.example.opc_da.task.ReportTableTask;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
@@ -12,6 +22,7 @@ import org.springframework.scheduling.config.ScheduledTaskRegistrar;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.UUID;
 
 @Slf4j
 @Configuration
@@ -22,6 +33,12 @@ public class DynamicScheduleConfig implements SchedulingConfigurer {
     ReportTableDao reportTableDao;
 
     @Resource
+    private ItemGroupDao itemGroupDao;
+
+    @Resource
+    private DataSourceDao dataSourceDao;
+
+    @Resource
     CronTaskRegister cronTaskRegister;
 
     @Override
@@ -38,5 +55,51 @@ public class DynamicScheduleConfig implements SchedulingConfigurer {
                 cronTaskRegister.addCronTask(new SchedulingRunnable(ReportTableTask.class, "getTableData", new Object[]{reportTable}), reportTable.getCronId(), reportTable.getCron());
             }
         }
+
+        List<ItemGroup> itemGroupList = itemGroupDao.getAllItemGroup(null);
+        if (Blank.isNotEmpty(itemGroupList)) {
+            for (ItemGroup itemGroup : itemGroupList) {
+                String readWeek = itemGroup.getReadWeek();
+                DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
+                String clsId = dataSource.getClsId().toUpperCase();
+                DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
+                if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_DA_REAL.getValue()) ||
+                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_AE_ALARMS.getValue()) ||
+                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_HDA_HISTORY.getValue())) {
+                    if (itemGroup.getRunState() == ConstantStr.START_UP) {
+                        if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组配置的数据源的ip地址,帐户,密码都不能为空");
+                        }
+                        Integer id = itemGroup.getId();
+                        if (clsId.equals(OpcDaDriverEnum.KEPSERVER.getValue()) ||
+                                clsId.equals(OpcDaDriverEnum.OPCIFIX.getValue()) ||
+                                clsId.equals(OpcDaDriverEnum.WINCC.getValue()) ||
+                                clsId.equals(OpcDaDriverEnum.SCADA.getValue()) ||
+                                clsId.equals(OpcDaDriverEnum.YOKOGAWA.getValue()) ||
+                                clsId.equals(OpcDaDriverEnum.PAS300.getValue())
+                        ) {
+                            //新增定时器任务
+                            String cronId = "";
+                            String cron = "0 0 0 ? * ";
+                            if (Blank.isEmpty(readWeek)) {
+                                cron = cron + "MON,TUE,WED,THU,FRI,SAT,SUN";
+                            } else {
+                                cron = cron + itemGroup.getReadWeek();
+                            }
+                            if (Blank.isEmpty(itemGroup.getCronId())) {
+                                cronId = UUID.randomUUID().toString().replace("-", "");
+                            } else {
+                                cronId = itemGroup.getCronId();
+                            }
+                            SchedulingRunnable task = new SchedulingRunnable(OpcDaTask.class, "opcDaTask", new Object[]{itemGroup, dataSource, cronId});
+                            cronTaskRegister.addCronTask(task, cronId, cron);
+                            itemGroupDao.runItemGroupById(id, ConstantStr.START_UP, cronId);
+                        } else {
+                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
+                        }
+                    }
+                }
+            }
+        }
     }
 }

+ 2 - 0
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/ItemGroupService.java

@@ -26,4 +26,6 @@ public interface ItemGroupService {
     Result deleteItemByIdList(List<Integer> idList);
 
     Result getItemById(Integer id);
+
+    Result batchSetExpresses(ItemGroup itemGroup);
 }

+ 17 - 18
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/service/impl/ItemGroupServiceImpl.java

@@ -57,9 +57,6 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     private DataModelDao dataModelDao;
 
     @Autowired
-    private MessageNoticeDao messageNoticeDao;
-
-    @Autowired
     private RestTemplate restTemplate;
 
     @Value("${opc_ua_server.address}")
@@ -70,8 +67,6 @@ public class ItemGroupServiceImpl implements ItemGroupService {
         String userId = userUtil.getCurrentUserId();
         itemGroup.setUserId(userId);
         Integer readMode = itemGroup.getReadMode();
-        String startReadTime = itemGroup.getStartReadTime();
-        String endReadTime = itemGroup.getEndReadTime();
         if (readMode != ConstantStr.ON_CHANGE && readMode != ConstantStr.EXCEED_SET_VALUE &&
                 readMode != ConstantStr.SPECIFY_TIME) {
             return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种类型的读取模式");
@@ -88,17 +83,11 @@ public class ItemGroupServiceImpl implements ItemGroupService {
             if (Blank.isEmpty(itemGroup.getReadModeType())) {
                 return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请选择一种比较类型");
             }
-            if (Blank.isEmpty(itemGroup.getModeValueTime())) {
-                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请输入模式值");
+            if (Blank.isEmpty(itemGroup.getEventMode())) {
+                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "阈值条件");
             }
-        }
-        if (readMode == ConstantStr.SPECIFY_TIME) {
-            String modeValueTime = itemGroup.getModeValueTime();
-            Long startLong = DateUtil.strChangeDate(startReadTime, "HH:mm:ss").getTime();
-            Long endLong = DateUtil.strChangeDate(endReadTime, "HH:mm:ss").getTime();
-            Long modeLong = DateUtil.strChangeDate(modeValueTime, "HH:mm:ss").getTime();
-            if (!(modeLong > startLong && modeLong < endLong)) {
-                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "指定时间,是介于开始,结束读取时间之间");
+            if (Blank.isEmpty(itemGroup.getModeValue())) {
+                return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "请输入模式值");
             }
         }
         DataSource dataSource = dataSourceDao.getDataSourceById(itemGroup.getDataSourceId());
@@ -200,6 +189,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     @Override
     public Result runItemGroupById(Integer id, Integer runState) {
         ItemGroup itemGroup = itemGroupDao.getItemGroupById(id);
+        String readWeek = itemGroup.getReadWeek();
         DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
         DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
         String dataSourceTypeKey = dataSourceType.getDataSourceTypeKey();
@@ -218,7 +208,6 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组配置的数据源的ip地址,帐户,密码都不能为空");
                 }
-                redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
                 if (clsId.equals(OpcDaDriverEnum.KEPSERVER.getValue()) ||
                         clsId.equals(OpcDaDriverEnum.OPCIFIX.getValue()) ||
                         clsId.equals(OpcDaDriverEnum.WINCC.getValue()) ||
@@ -228,7 +217,12 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                 ) {
                     //新增定时器任务
                     String cronId = "";
-                    String cron = "0 0 0 ? * " + itemGroup.getReadWeek();
+                    String cron = "0 0 0 ? * ";
+                    if (Blank.isEmpty(readWeek)) {
+                        cron = cron + "MON,TUE,WED,THU,FRI,SAT,SUN";
+                    } else {
+                        cron = cron + itemGroup.getReadWeek();
+                    }
                     if (Blank.isEmpty(itemGroup.getCronId())) {
                         cronId = UUID.randomUUID().toString().replace("-", "");
                     } else {
@@ -242,7 +236,6 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                     throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种驱动类型");
                 }
             } else if (runState.equals(ConstantStr.STOP_IT)) {
-                redisUtil.del(ConstantStr.ITEM_GROUP + id);
                 itemGroupDao.stopItemGroupById(id, runState);
                 cronTaskRegister.removeCronTask(itemGroup.getCronId());
                 return Result.ok("停用成功");
@@ -380,4 +373,10 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     public Result getItemById(Integer id) {
         return Result.ok(itemGroupDao.getItemById(id));
     }
+
+    @Override
+    public Result batchSetExpresses(ItemGroup itemGroup) {
+        List<Item> itemList = itemGroup.getItemList();
+        return null;
+    }
 }

+ 96 - 148
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcAsyncTask.java

@@ -9,7 +9,7 @@ import com.example.opc_common.enums.OpcDaDriverEnum;
 import com.example.opc_common.util.Blank;
 import com.example.opc_common.util.ConstantStr;
 import com.example.opc_common.util.DateUtil;
-import com.example.opc_da.dao.MessageNoticeDao;
+import com.example.opc_common.util.JavaTypeUtil;
 import com.example.opc_da.dao.RawDataDao;
 import com.example.opc_da.dao.ReportTableDao;
 import com.example.opc_da.util.OpcDaUtil;
@@ -27,16 +27,15 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 @Component
 @Async("threadPoolTaskExecutor")
 @Slf4j
 public class OpcAsyncTask {
 
-    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
-
     @Resource
     private RawDataDao rawDataDao;
 
@@ -49,102 +48,100 @@ public class OpcAsyncTask {
     @Autowired
     private ReportTableDao reportTableDao;
 
-    @Autowired
-    private MessageNoticeDao messageNoticeDao;
-
     @Value("${opc_ua_server.address}")
     private String opcUaUrl;
 
     /**
      * 新增一条临时数据
      *
-     * @param rawData
+     * @param cursorRawData
      */
-    public void addTempRawData(RawData rawData) {
-        if (Blank.isNotEmpty(rawData)) {
-            rawDataDao.addTempRawData(rawData);
+    public void addCursorRawData(CursorRawData cursorRawData) {
+        if (Blank.isNotEmpty(cursorRawData)) {
+            rawDataDao.addCursorRawData(cursorRawData);
         }
     }
 
     public synchronized void packageRawDataList(List<Item> itemList, Integer dataSourceId, String sqlCurrentYmdh) {
         try {
-            Thread.sleep(5000);
+            Thread.sleep(3000);
         } catch (Exception e) {
             e.printStackTrace();
         }
-        log.info("我进行了数据组装,归属时间为{}", sqlCurrentYmdh);
+//        log.info("我进行了数据组装,归属时间为{}", sqlCurrentYmdh);
         if (Blank.isNotEmpty(itemList)) {
-            Item item = itemList.get(0);
-            Integer itemGroupId = item.getItemGroupId();
+            Item item_ = itemList.get(0);
+            Integer itemGroupId = item_.getItemGroupId();
             int remainder = itemGroupId % ConstantStr.SUB_TABLE_NUM;
             //获取原始数据表中,满足记录的数据
             List<Long> indexList = rawDataDao.getMeetIndexList(itemGroupId, dataSourceId, itemList, sqlCurrentYmdh, ConstantStr.NOT_MEET_CHANGE);
-        }
-//        if (Blank.isNotEmpty(itemList)) {
-//            Item item1 = itemList.get(0);
-//            Integer itemGroupId = item1.getItemGroupId();
-//            Integer remainder = itemGroupId % ConstantStr.SUB_TABLE_NUM;
-//            for (Item item : itemList) {
-//                RawData oldRawData = rawDataDao.getRawDataList(item, remainder, dataSourceId, sqlCurrentYmdh);
-//                List<RawData> rawDataList = rawDataDao.getTempRawDataList(item, dataSourceId, sqlCurrentYmdh);
-//                if (Blank.isNotEmpty(rawDataList)) {
-//                    RawData rawData1 = rawDataList.get(0);
-//                    String itemName = rawData1.getItemName();
-//                    String dataType = rawData1.getDataType();
-//                    if (dataType.equals("boolean")) {
-//                        List<Boolean> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), Boolean[].class))) : new ArrayList<>();
-//                        List<String> dataTimeList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValueTime(), String[].class))) : new ArrayList<>();
-//                        for (RawData rawData : rawDataList) {
-//                            dataList.add(JSON.parseObject(rawData.getDataValue(), Boolean.class));
-//                            dataTimeList.add(rawData.getDataValueTime());
-//                        }
-//                        RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                        if (Blank.isEmpty(oldRawData)) {
-//                            rawDataDao.addRawData(remainder, rawData);
-//                        } else {
-//                            rawDataDao.updateRawData(remainder, rawData);
-//                        }
-//                    } else {
-//                        List<String> dataTimeList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValueTime(), String[].class))) : new ArrayList<>();
-//                        try {
-//                            List<BigDecimal> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), BigDecimal[].class))) : new ArrayList<>();
-//                            for (RawData rawData : rawDataList) {
-//                                BigDecimal bigDecimal = JSON.parseObject(rawData.getDataValue(), BigDecimal.class);
-//                                dataList.add(bigDecimal);
-//                                dataTimeList.add(rawData.getDataValueTime());
-//                            }
-//                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                    JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                            if (Blank.isEmpty(oldRawData)) {
-//                                rawDataDao.addRawData(remainder, rawData);
-//                            } else {
-//                                rawDataDao.updateRawData(remainder, rawData);
-//                            }
-//                        } catch (Exception e) {
-//                            List<String> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), String[].class))) : new ArrayList<>();
-//                            for (RawData rawData : rawDataList) {
-//                                dataList.add(rawData.getDataValue());
-//                                dataTimeList.add(rawData.getDataValueTime());
-//                            }
-//                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                    JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                            if (Blank.isEmpty(oldRawData)) {
-//                                rawDataDao.addRawData(remainder, rawData);
-//                            } else {
-//                                rawDataDao.updateRawData(remainder, rawData);
-//                            }
-//                        }
-//                    }
-//                    rawDataDao.delRawDataList(rawDataList, sqlCurrentYmdh);
-//                }
-//            }
-//        }
-    }
+            if (Blank.isNotEmpty(indexList)) {
+                for (Item item : itemList) {
+                    //从临时表中获取相应的数据
+                    List<CursorRawData> cursorRawDataList = rawDataDao.getCursorRawDataList(item, dataSourceId, sqlCurrentYmdh, indexList);
+                    if (Blank.isNotEmpty(cursorRawDataList)) {
+                        CursorRawData cursorRawData_ = cursorRawDataList.get(0);
+                        String itemName = cursorRawData_.getItemName();
+                        String dataType = cursorRawData_.getDataType();
+                        if (dataType.toLowerCase().equals("boolean")) {
+                            List<Boolean> dataList = new ArrayList<>();
+                            List<String> dataTimeList = new ArrayList<>();
+                            List<Long> dataIndexList = new ArrayList<>();
+                            List<Integer> isMeetChangeList = new ArrayList<>();
+                            for (CursorRawData cursorRawData : cursorRawDataList) {
+                                dataList.add(JSON.parseObject(cursorRawData.getDataValue(), Boolean.class));
+                                dataTimeList.add(cursorRawData.getDataValueTime());
+                                dataIndexList.add(cursorRawData.getDataIndex());
+                                isMeetChangeList.add(cursorRawData.getIsMeetChange());
+                            }
+                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                    JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                            rawDataDao.addRawData(remainder, rawData);
+                        } else {
+                            try {
+                                List<BigDecimal> dataList = new ArrayList<>();
+                                List<String> dataTimeList = new ArrayList<>();
+                                List<Long> dataIndexList = new ArrayList<>();
+                                List<Integer> isMeetChangeList = new ArrayList<>();
+                                for (CursorRawData cursorRawData : cursorRawDataList) {
+                                    dataList.add(JSON.parseObject(cursorRawData.getDataValue(), BigDecimal.class));
+                                    dataTimeList.add(cursorRawData.getDataValueTime());
+                                    dataIndexList.add(cursorRawData.getDataIndex());
+                                    isMeetChangeList.add(cursorRawData.getIsMeetChange());
+                                }
+                                RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                        JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                                rawDataDao.addRawData(remainder, rawData);
+                            } catch (Exception e) {
+                                List<String> dataList = new ArrayList<>();
+                                List<String> dataTimeList = new ArrayList<>();
+                                List<Long> dataIndexList = new ArrayList<>();
+                                List<Integer> isMeetChangeList = new ArrayList<>();
+                                for (CursorRawData cursorRawData : cursorRawDataList) {
+                                    dataList.add(cursorRawData.getDataValue());
+                                    dataTimeList.add(cursorRawData.getDataValueTime());
+                                    dataIndexList.add(cursorRawData.getDataIndex());
+                                    isMeetChangeList.add(cursorRawData.getIsMeetChange());
+                                }
+                                RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                        JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                                rawDataDao.addRawData(remainder, rawData);
+                            }
+                        }
+                    }
+                }
+            }
+            //删除临时表中的相应的数据
+            rawDataDao.delCursorRawDataList(itemGroupId, dataSourceId, sqlCurrentYmdh);
 
-    public void addEventRawData(EventRawData eventRawData) {
-        if (Blank.isNotEmpty(eventRawData)) {
-            rawDataDao.addEventRawData(eventRawData);
+            //如果有事件驱动报表,则生成事件驱动报表
+            for (Item item : itemList) {
+                Integer tableReportId = item.getTableReportId();
+                if (Blank.isNotEmpty(tableReportId)) {
+                    eventTable(tableReportId, dataSourceId, itemList, sqlCurrentYmdh);
+                    break;
+                }
+            }
         }
     }
 
@@ -211,55 +208,23 @@ public class OpcAsyncTask {
     /**
      * 事件驱动报表异步添加数据
      */
-    public void eventTable(Integer dataSourceId, List<Item> itemList, String sqlCurrentYmdh) {
-        try {
-            Thread.sleep(5000);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Integer tableReportId = null;
-        Item eventItem = null;
-        if (Blank.isNotEmpty(itemList)) {
-            for (Item item : itemList) {
-                if (Blank.isNotEmpty(item.getTableReportId())) {
-                    tableReportId = item.getTableReportId();
-                    eventItem = item;
-                    break;
-                }
-            }
-        }
-        List<Long> eventRawDataIndexList = rawDataDao.getEventRawDataIndexList(eventItem, dataSourceId, sqlCurrentYmdh);
-        if (Blank.isNotEmpty(itemList)) {
-            for (Item item : itemList) {
-                rawDataDao.delEventRawDataListByIndex(item, dataSourceId, sqlCurrentYmdh, eventRawDataIndexList);
-            }
-        }
-        if (Blank.isEmpty(tableReportId)) {
-            return;
-        }
+    public void eventTable(Integer tableReportId, Integer dataSourceId, List<Item> itemList, String sqlCurrentYmdh) {
         ReportTable reportTable = reportTableDao.getReportTableById(tableReportId);
         String reportTableData = reportTable.getReportTableData();
         JSONObject jsonObject = JSONObject.parseObject(reportTableData);
         JSONArray objects = new JSONArray();
         if (Blank.isNotEmpty(itemList)) {
+            Integer remainder = itemList.get(0).getItemGroupId() % ConstantStr.SUB_TABLE_NUM;
             for (int i = 0; i < itemList.size(); i++) {
-                List<EventRawData> eventRawDataList = rawDataDao.getEventRawDataList(itemList.get(i), dataSourceId, sqlCurrentYmdh);
-                if (Blank.isNotEmpty(eventRawDataList)) {
+                RawData rawData = rawDataDao.getRawDataList(itemList.get(i), remainder, dataSourceId, sqlCurrentYmdh);
+                if (Blank.isNotEmpty(rawData)) {
                     JSONObject jsonObject1 = new JSONObject();
-                    EventRawData eventRawData = eventRawDataList.get(0);
-                    String dataType = eventRawData.getDataType();
+                    String dataType = rawData.getDataType();
                     if (dataType.toLowerCase().equals("boolean")) {
-                        List<Boolean> dataList = new ArrayList<>();
-                        List<String> dataTimeList = new ArrayList<>();
-                        List<Long> dataIndexList = new ArrayList<>();
-                        List<Integer> idList = new ArrayList<>();
-                        for (EventRawData eventRawData1 : eventRawDataList) {
-                            dataList.add(JSON.parseObject(eventRawData1.getDataValue(), Boolean.class));
-                            dataTimeList.add(eventRawData1.getDataValueTime());
-//                            dataIndexList.add(eventRawData1.getItemIndex());
-                            idList.add(eventRawData1.getId());
-                        }
-                        jsonObject1.put("itemGroupId", eventRawData.getItemGroupId());
+                        List<Boolean> dataList = JavaTypeUtil.objChangeListBool(rawData.getDataValue());
+                        List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                        List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
+                        jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                         jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                         jsonObject1.put("itemName", itemList.get(i).getItemName());
                         jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
@@ -267,20 +232,12 @@ public class OpcAsyncTask {
                         jsonObject1.put("dataTimeList", dataTimeList);
                         jsonObject1.put("dataIndexList", dataIndexList);
                         objects.set(i, jsonObject1);
-                        rawDataDao.delEventRawDataList(idList);
                     } else {
                         try {
-                            List<BigDecimal> dataList = new ArrayList<>();
-                            List<String> dataTimeList = new ArrayList<>();
-                            List<Long> dataIndexList = new ArrayList<>();
-                            List<Integer> idList = new ArrayList<>();
-                            for (EventRawData eventRawData1 : eventRawDataList) {
-                                dataList.add(JSON.parseObject(eventRawData1.getDataValue(), BigDecimal.class));
-                                dataTimeList.add(eventRawData1.getDataValueTime());
-//                                dataIndexList.add(eventRawData1.getItemIndex());
-                                idList.add(eventRawData1.getId());
-                            }
-                            jsonObject1.put("itemGroupId", eventRawData.getItemGroupId());
+                            List<BigDecimal> dataList = JavaTypeUtil.objChangeListBig(rawData.getDataValue());
+                            List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                            List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
+                            jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                             jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                             jsonObject1.put("itemName", itemList.get(i).getItemName());
                             jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
@@ -288,19 +245,11 @@ public class OpcAsyncTask {
                             jsonObject1.put("dataTimeList", dataTimeList);
                             jsonObject1.put("dataIndexList", dataIndexList);
                             objects.set(i, jsonObject1);
-                            rawDataDao.delEventRawDataList(idList);
                         } catch (Exception e) {
-                            List<String> dataList = new ArrayList<>();
-                            List<String> dataTimeList = new ArrayList<>();
-                            List<Long> dataIndexList = new ArrayList<>();
-                            List<Integer> idList = new ArrayList<>();
-                            for (EventRawData eventRawData1 : eventRawDataList) {
-                                dataList.add(eventRawData1.getDataValue());
-                                dataTimeList.add(eventRawData1.getDataValueTime());
-//                                dataIndexList.add(eventRawData1.getItemIndex());
-                                idList.add(eventRawData1.getId());
-                            }
-                            jsonObject1.put("itemGroupId", eventRawData.getItemGroupId());
+                            List<String> dataList = JavaTypeUtil.objChangeListStr(rawData.getDataValue());
+                            List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                            List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
+                            jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                             jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                             jsonObject1.put("itemName", itemList.get(i).getItemName());
                             jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
@@ -308,7 +257,6 @@ public class OpcAsyncTask {
                             jsonObject1.put("dataTimeList", dataTimeList);
                             jsonObject1.put("dataIndexList", dataIndexList);
                             objects.set(i, jsonObject1);
-                            rawDataDao.delEventRawDataList(idList);
                         }
                     }
                 }
@@ -318,7 +266,7 @@ public class OpcAsyncTask {
         ReportTable reportTable1 = new ReportTable();
         reportTable1.setTableTemplateId(reportTable.getTableTemplateId());
         reportTable1.setUserId(reportTable.getUserId());
-        reportTable1.setReportTableName(reportTable.getReportTableName() + "_" + DateUtil.dateChangeStr(new Date(), "yyyyMMddHHmmss"));
+        reportTable1.setReportTableName(reportTable.getReportTableName() + "_" + (Blank.isNotEmpty(itemList) ? itemList.get(0).getItemGroupName() : "") + "_" + DateUtil.dateChangeStr(new Date(), "yyyyMMddHHmmss"));
         reportTable1.setReportTableData(jsonObject.toJSONString());
         reportTable1.setReportValueFormat(reportTable.getReportValueFormat());
         reportTable1.setIsAutoReport(ConstantStr.EVENT_GENERATE_REPORT);

+ 8 - 27
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -118,25 +118,25 @@ public class OpcDaChangeTask extends TimerTask {
                             }
                             if (javaType.toLowerCase().equals("boolean")) {
                                 Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
-                                RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
                                         currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
-                                opcAsyncTask.addTempRawData(rawData);
+                                opcAsyncTask.addCursorRawData(cursorRawData);
                             } else {
                                 try {
                                     BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                                     BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                             MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                             bigDecimal;
-                                    RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
                                             currentYmdhmss, index, currentYmdh,
                                             Blank.isEmpty(oldValue) ? ConstantStr.NOT_MEET_CHANGE : MathUtil.isMeetChange(oldValue,
                                                     dmData, new BigDecimal(modeValue), readModeType), new Date());
-                                    opcAsyncTask.addTempRawData(rawData);
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                     oldValue = dmData;
                                 } catch (Exception e) {
-                                    RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
                                             currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
-                                    opcAsyncTask.addTempRawData(rawData);
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                 }
                             }
                         } catch (Exception e) {
@@ -151,11 +151,7 @@ public class OpcDaChangeTask extends TimerTask {
                             if (Blank.isNotEmpty(server)) {
                                 server.dispose();
                             }
-                            for (com.example.opc_common.entity.Item item_ : itemList) {
-                                redisUtil.del(ConstantStr.ITEM_GROUP + id + item_.getItemReadName());
-                            }
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                             cronTaskRegister.removeCronTask(cronId);
                             timer.cancel();
                         }
@@ -164,30 +160,16 @@ public class OpcDaChangeTask extends TimerTask {
             }
             access.bind();
             while (true) {
-                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                if (Blank.isEmpty(flage)) {
-                    flage = false;
-                }
                 if (System.currentTimeMillis() >= endTime) {
-                    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()) + "运行停止",
-                            "请刷新检查组的运行状态",
-                            ConstantStr.NO_READ));
                     access.unbind();
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
-                    redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                    cronTaskRegister.removeCronTask(cronId);
                     timer.cancel();
                     break;
                 }
@@ -201,8 +183,7 @@ public class OpcDaChangeTask extends TimerTask {
             if (Blank.isNotEmpty(server)) {
                 server.dispose();
             }
-            redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
+            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.EXCEPT_STOP_UP);
             cronTaskRegister.removeCronTask(cronId);
             timer.cancel();
         }

+ 51 - 58
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaExceedTask.java

@@ -79,6 +79,8 @@ public class OpcDaExceedTask extends TimerTask {
     public void run() {
         Server server = OpcDaUtil.createServer(dataSource);
         Integer id = itemGroup.getId();
+        Integer eventMode = itemGroup.getEventMode();
+        Double modeValue = itemGroup.getModeValue();
         Integer dataSourceId = dataSource.getId();
         try {
             server.connect();
@@ -86,9 +88,6 @@ public class OpcDaExceedTask extends TimerTask {
             for (com.example.opc_common.entity.Item item : itemList) {
                 String itemId = item.getItemReadName();
                 Integer tableReportId = item.getTableReportId();
-                if (Blank.isNotEmpty(tableReportId)) {
-                    eventFlage = true;
-                }
                 access.addItem(itemId, new DataCallback() {
                     private String sqlCurrentYmdh = "";
                     private Long index = 0L;
@@ -99,7 +98,6 @@ public class OpcDaExceedTask extends TimerTask {
                         try {
                             Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                             DataModel dm = map.get(itemId);
-                            BigDecimal bigModeValue = new BigDecimal(itemGroup.getModeValue());
 
                             //读取的值
                             Object value = val.get("value");
@@ -108,64 +106,76 @@ public class OpcDaExceedTask extends TimerTask {
                             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.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                                    if (  Blank.isNotEmpty(tableReportId)) {
-                                        opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                                    }
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                     redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                     sqlCurrentYmdh = currentYmdh;
                                 }
                             }
-                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-
-                            if (!javaType.toLowerCase().equals("boolean")) {
+                            if (javaType.toLowerCase().equals("boolean")) {
+                                Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                opcAsyncTask.addCursorRawData(cursorRawData);
+                            } else {
                                 try {
                                     BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) : bigDecimal;
-                                    if (dmData.compareTo(bigModeValue) == 1) {
-//                                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                currentYmdhmss, currentYmdh, new Date());
-//                                        opcAsyncTask.addTempRawData(rawData);
-
-                                        if ( Blank.isNotEmpty(tableReportId)) {
-//                                            BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                            if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                                if (dmData.compareTo(bigEventValue) == 1) {
-//                                                    EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                            currentYmdhmss, currentYmdh, new Date(), index);
-//                                                    opcAsyncTask.addEventRawData(eventRawData);
-//                                                }
-//                                            } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                                if (dmData.compareTo(bigEventValue) == -1) {
-//                                                    EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                            currentYmdhmss, currentYmdh, new Date(), index);
-//                                                    opcAsyncTask.addEventRawData(eventRawData);
-//                                                }
-//                                            }
-                                        } else {
-                                            if (eventFlage) {
-                                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                                        currentYmdhmss, currentYmdh, new Date(), index);
-                                                opcAsyncTask.addEventRawData(eventRawData);
+                                    BigDecimal dmData = Blank.isNotEmpty(dm) ?
+                                            MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
+                                            bigDecimal;
+                                    if (Blank.isNotEmpty(tableReportId)) {
+                                        BigDecimal bigDecimal1 = new BigDecimal(modeValue);
+                                        if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                            if (dmData.compareTo(bigDecimal1) == 1) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                        } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                            if (dmData.compareTo(bigDecimal1) == -1) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            }
+                                        } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                            if (dmData.compareTo(bigDecimal1) == 0) {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
+                                            } else {
+                                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                        currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                                opcAsyncTask.addCursorRawData(cursorRawData);
                                             }
                                         }
+                                    } else {
+                                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                        opcAsyncTask.addCursorRawData(cursorRawData);
                                     }
                                 } catch (Exception e) {
-
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                 }
                             }
                         } catch (Exception e) {
                             //执行组装数据库的数据,以及生成驱动报表
                             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            if ( Blank.isNotEmpty(tableReportId)) {
-                                opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                            }
                             redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
                             messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
@@ -176,7 +186,6 @@ public class OpcDaExceedTask extends TimerTask {
                             if (Blank.isNotEmpty(server)) {
                                 server.dispose();
                             }
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
                             itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
                             cronTaskRegister.removeCronTask(cronId);
                             timer.cancel();
@@ -186,31 +195,16 @@ public class OpcDaExceedTask extends TimerTask {
             }
             access.bind();
             while (true) {
-                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                if (Blank.isEmpty(flage)) {
-                    flage = false;
-                }
                 if (System.currentTimeMillis() >= endTime) {
-                    flage = false;
-                }
-                if (!flage) {
                     //执行组装数据库的数据,以及生成驱动报表
                     String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
                     redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行停止",
-                            "请刷新检查组的运行状态",
-                            ConstantStr.NO_READ));
                     access.unbind();
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
-                    redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                    cronTaskRegister.removeCronTask(cronId);
                     timer.cancel();
                     break;
                 }
@@ -224,7 +218,6 @@ public class OpcDaExceedTask extends TimerTask {
             if (Blank.isNotEmpty(server)) {
                 server.dispose();
             }
-            redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
             itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
             cronTaskRegister.removeCronTask(cronId);
             timer.cancel();

+ 14 - 93
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -45,8 +45,6 @@ public class OpcDaFrequencyTask extends TimerTask {
 
     private final Long endTime;
 
-    private Boolean eventFlage = false;
-
     public OpcDaFrequencyTask(RedisUtil redisUtil,
                               OpcAsyncTask opcAsyncTask,
                               String cronId,
@@ -86,10 +84,6 @@ public class OpcDaFrequencyTask extends TimerTask {
 //            AccessBase access = new Async20Access(server, (int) (itemGroup.getModeValue() * 1000), true);
             for (com.example.opc_common.entity.Item item : itemList) {
                 String itemId = item.getItemReadName();
-                Integer tableReportId = item.getTableReportId();
-                if (Blank.isNotEmpty(tableReportId)) {
-                    eventFlage = true;
-                }
                 access.addItem(itemId, new DataCallback() {
 
                     private String sqlCurrentYmdh = "";
@@ -97,7 +91,7 @@ public class OpcDaFrequencyTask extends TimerTask {
 
                     @Override
                     public void changed(Item item1, ItemState itemState) {
-                        index += 1L;
+                        index++;
                         try {
                             Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
                             DataModel dm = map.get(itemId);
@@ -107,97 +101,42 @@ public class OpcDaFrequencyTask extends TimerTask {
                             //值对应取值的时间
                             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.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                                    if (Blank.isNotEmpty(tableReportId)) {
-                                        opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                                    }
+                                    //组装相应的原始数据
+                                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                     redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                     sqlCurrentYmdh = currentYmdh;
                                 }
                             }
-                            //服务器读取的时间
-                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                            //如果redis中存储的年月日时的时间为空,说明还未进行数据的保存
                             if (javaType.toLowerCase().equals("boolean")) {
                                 //存数据
                                 Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
-//                                RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                        currentYmdhmss, currentYmdh, new Date());
-//                                opcAsyncTask.addTempRawData(rawData);
-
-                                if (Blank.isNotEmpty(tableReportId)) {
-//                                    if (eventMode.equals(ConstantStr.EVENT_MODEL_BOOLEAN)) {
-//                                        if ((dmData ? ConstantStr.BOOLEAN_TRUE : ConstantStr.BOOLEAN_FALSE).equals(eventValue.intValue())) {
-//                                            EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                    currentYmdhmss, currentYmdh, new Date(), index);
-//                                            opcAsyncTask.addEventRawData(eventRawData);
-//                                        }
-//                                    }
-                                } else {
-                                    if (eventFlage) {
-                                        EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                                currentYmdhmss, currentYmdh, new Date(), index);
-                                        opcAsyncTask.addEventRawData(eventRawData);
-                                    }
-                                }
+                                CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                        currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                opcAsyncTask.addCursorRawData(cursorRawData);
                             } else {
                                 try {
                                     BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                                     BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                             MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                             bigDecimal;
-//                                    RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                            currentYmdhmss, currentYmdh, new Date());
-//                                    opcAsyncTask.addTempRawData(rawData);
-
-                                    if (Blank.isNotEmpty(tableReportId)) {
-//                                        BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                        if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                            if (dmData.compareTo(bigEventValue) == 1) {
-//                                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                        currentYmdhmss, currentYmdh, new Date(), index);
-//                                                opcAsyncTask.addEventRawData(eventRawData);
-//                                            }
-//                                        } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                            if (dmData.compareTo(bigEventValue) == -1) {
-//                                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                        currentYmdhmss, currentYmdh, new Date(), index);
-//                                                opcAsyncTask.addEventRawData(eventRawData);
-//                                            }
-//                                        }
-                                    } else {
-                                        if (eventFlage) {
-                                            EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                                    currentYmdhmss, currentYmdh, new Date(), index);
-                                            opcAsyncTask.addEventRawData(eventRawData);
-                                        }
-                                    }
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                 } catch (Exception e) {
-//                                    RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                            currentYmdhmss, currentYmdh, new Date());
-//                                    opcAsyncTask.addTempRawData(rawData);
-
-                                    if (Blank.isEmpty(tableReportId)) {
-                                        if (eventFlage) {
-                                            EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-                                                    currentYmdhmss, currentYmdh, new Date(), index);
-                                            opcAsyncTask.addEventRawData(eventRawData);
-                                        }
-                                    }
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                 }
                             }
                         } catch (Exception e) {
                             //执行组装数据库的数据,以及生成驱动报表
                             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            if (Blank.isNotEmpty(tableReportId)) {
-                                opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                            }
                             redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
                             messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
@@ -207,8 +146,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                             if (Blank.isNotEmpty(server)) {
                                 server.dispose();
                             }
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
+                            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                             cronTaskRegister.removeCronTask(cronId);
                             timer.cancel();
                         }
@@ -217,32 +155,16 @@ public class OpcDaFrequencyTask extends TimerTask {
             }
             access.bind();
             while (true) {
-                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-                if (Blank.isEmpty(flage)) {
-                    flage = false;
-                }
                 if (System.currentTimeMillis() >= endTime) {
-                    flage = false;
-                }
-                if (!flage) {
                     //执行组装数据库的数据,以及生成驱动报表
                     String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
                     redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行停止",
-                            "请刷新检查组的运行状态",
-                            ConstantStr.NO_READ));
                     access.unbind();
                     if (Blank.isNotEmpty(server)) {
                         server.dispose();
                     }
-
-                    redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                    itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
-                    cronTaskRegister.removeCronTask(cronId);
                     timer.cancel();
                     break;
                 }
@@ -256,7 +178,6 @@ public class OpcDaFrequencyTask extends TimerTask {
             if (Blank.isNotEmpty(server)) {
                 server.dispose();
             }
-            redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
             itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
             cronTaskRegister.removeCronTask(cronId);
             timer.cancel();

+ 0 - 233
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaLowseTask.java

@@ -1,233 +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 org.openscada.opc.lib.da.Item;
-import org.openscada.opc.lib.da.*;
-
-import java.math.BigDecimal;
-import java.util.*;
-
-public class OpcDaLowseTask extends TimerTask {
-
-    private final RedisUtil redisUtil;
-
-    private final OpcAsyncTask opcAsyncTask;
-
-    private final String cronId;
-
-    private final CronTaskRegister cronTaskRegister;
-
-    private final ItemGroupDao itemGroupDao;
-
-    private final MessageNoticeDao messageNoticeDao;
-
-    private final Timer timer;
-
-    private final ItemGroup itemGroup;
-
-    private final DataSource dataSource;
-
-    private final Map<String, DataModel> map;
-
-    private final List<com.example.opc_common.entity.Item> itemList;
-
-    private final String timeFormat;
-
-    private final Long endTime;
-
-    private Boolean eventFlage = false;
-
-    public OpcDaLowseTask(RedisUtil redisUtil,
-                          OpcAsyncTask opcAsyncTask,
-                          String cronId,
-                          CronTaskRegister cronTaskRegister,
-                          ItemGroupDao itemGroupDao,
-                          MessageNoticeDao messageNoticeDao,
-                          Timer timer,
-                          ItemGroup itemGroup,
-                          DataSource dataSource,
-                          Map<String, DataModel> map,
-                          List<com.example.opc_common.entity.Item> itemList,
-                          String timeFormat,
-                          Long endTime) {
-        this.redisUtil = redisUtil;
-        this.opcAsyncTask = opcAsyncTask;
-        this.cronId = cronId;
-        this.cronTaskRegister = cronTaskRegister;
-        this.itemGroupDao = itemGroupDao;
-        this.messageNoticeDao = messageNoticeDao;
-        this.timer = timer;
-        this.itemGroup = itemGroup;
-        this.dataSource = dataSource;
-        this.map = map;
-        this.itemList = itemList;
-        this.timeFormat = timeFormat;
-        this.endTime = endTime;
-    }
-
-    @Override
-    public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
-        Integer id = itemGroup.getId();
-        Integer dataSourceId = dataSource.getId();
-        try {
-            server.connect();
-            SyncAccess access = new SyncAccess(server, 1000);
-            for (com.example.opc_common.entity.Item item : itemList) {
-                String itemId = item.getItemReadName();
-                Integer tableReportId = item.getTableReportId();
-                if (Blank.isNotEmpty(tableReportId)) {
-                    eventFlage = true;
-                }
-                access.addItem(itemId, new DataCallback() {
-                    private String sqlCurrentYmdh = "";
-                    private Long index = 0L;
-
-                    @Override
-                    public void changed(Item item1, ItemState itemState) {
-                        index += 1L;
-                        try {
-                            Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
-                            DataModel dm = map.get(itemId);
-                            BigDecimal bigModeValue = new BigDecimal(itemGroup.getModeValue());
-
-                            //读取的值
-                            Object value = val.get("value");
-                            String javaType = String.valueOf(val.get("javaType"));
-                            //值对应取值的时间
-                            Date time = itemState.getTimestamp().getTime();
-                            //归属时间
-                            String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                            if (Blank.isEmpty(sqlCurrentYmdh)) {
-                                sqlCurrentYmdh = currentYmdh;
-                                redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                            } else {
-                                if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                                    //组装相应的数据
-//                                    opcAsyncTask.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                                    if (Blank.isNotEmpty(tableReportId)) {
-                                        opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                                    }
-                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                                    sqlCurrentYmdh = currentYmdh;
-                                }
-                            }
-                            String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-
-                            if (!javaType.toLowerCase().equals("boolean")) {
-                                try {
-                                    BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                    BigDecimal dmData = Blank.isNotEmpty(dm) ? MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) : bigDecimal;
-                                    if (dmData.compareTo(bigModeValue) == -1) {
-//                                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                currentYmdhmss, currentYmdh, new Date());
-//                                        opcAsyncTask.addTempRawData(rawData);
-
-                                        if (Blank.isNotEmpty(tableReportId)) {
-//                                            BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                            if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                                if (dmData.compareTo(bigEventValue) == 1) {
-//                                                    EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                            currentYmdhmss, currentYmdh, new Date(), index);
-//                                                    opcAsyncTask.addEventRawData(eventRawData);
-//                                                }
-//                                            } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                                if (dmData.compareTo(bigEventValue) == -1) {
-//                                                    EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                                            currentYmdhmss, currentYmdh, new Date(), index);
-//                                                    opcAsyncTask.addEventRawData(eventRawData);
-//                                                }
-//                                            }
-                                        } else {
-                                            if (eventFlage) {
-                                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                                        currentYmdhmss, currentYmdh, new Date(), index);
-                                                opcAsyncTask.addEventRawData(eventRawData);
-                                            }
-                                        }
-                                    }
-                                } catch (Exception e) {
-
-                                }
-                            }
-                        } catch (Exception e) {
-                            //执行组装数据库的数据,以及生成驱动报表
-                            opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                            if (Blank.isNotEmpty(tableReportId)) {
-                                opcAsyncTask.eventTable(dataSourceId, itemList, 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));
-                            e.printStackTrace();
-                            if (Blank.isNotEmpty(server)) {
-                                server.dispose();
-                            }
-                            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                            itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
-                            cronTaskRegister.removeCronTask(cronId);
-                            timer.cancel();
-                        }
-                    }
-                });
-            }
-            access.bind();
-            while (true) {
-                Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                if (Blank.isEmpty(flage)) {
-                    flage = false;
-                }
-                if (System.currentTimeMillis() >= endTime) {
-                    flage = false;
-                }
-                if (!flage) {
-                    //执行组装数据库的数据,以及生成驱动报表
-                    String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
-                    opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                    redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-
-                    messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                            itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行停止",
-                            "请刷新检查组的运行状态",
-                            ConstantStr.NO_READ));
-                    access.unbind();
-                    if (Blank.isNotEmpty(server)) {
-                        server.dispose();
-                    }
-                    redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-                    itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-                    cronTaskRegister.removeCronTask(cronId);
-                    timer.cancel();
-                    break;
-                }
-            }
-        } 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();
-            }
-            redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-            itemGroupDao.stopItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
-        }
-    }
-}

+ 0 - 199
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaSpecifyTask.java

@@ -1,199 +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.lib.da.Group;
-import org.openscada.opc.lib.da.ItemState;
-import org.openscada.opc.lib.da.Server;
-
-import java.math.BigDecimal;
-import java.util.*;
-
-@Slf4j
-public class OpcDaSpecifyTask 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> dmMap;
-
-    private final List<com.example.opc_common.entity.Item> itemList;
-
-    private final String[] items;
-
-    private final String timeFormat;
-
-    private Boolean eventFlage = false;
-
-    public OpcDaSpecifyTask(RedisUtil redisUtil,
-                            OpcAsyncTask opcAsyncTask,
-                            String cronId,
-                            CronTaskRegister cronTaskRegister,
-                            ItemGroupDao itemGroupDao,
-                            MessageNoticeDao messageNoticeDao,
-                            Timer timer,
-                            ItemGroup itemGroup,
-                            DataSource dataSource,
-                            Map<String, DataModel> dmMap,
-                            List<com.example.opc_common.entity.Item> itemList,
-                            String[] items,
-                            String timeFormat) {
-        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.dmMap = dmMap;
-        this.itemList = itemList;
-        this.items = items;
-        this.timeFormat = timeFormat;
-    }
-
-    @Override
-    public void run() {
-        Server server = OpcDaUtil.createServer(dataSource);
-        Integer id = itemGroup.getId();
-        Integer dataSourceId = dataSource.getId();
-        String sqlCurrentYmdh = "";
-        try {
-            server.connect();
-            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);
-            Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
-            List<EventRawData> eventRawDataList = new ArrayList<>();
-            for (com.example.opc_common.entity.Item item : itemList) {
-                String itemReadName = item.getItemReadName();
-                Integer tableReportId = item.getTableReportId();
-                DataModel dm = dmMap.get(itemReadName);
-                for (org.openscada.opc.lib.da.Item item1 : resultMap.keySet()) {
-                    String itemId = item1.getId();
-                    if (item.getItemReadName().equals(itemId)) {
-                        ItemState itemState = resultMap.get(item1);
-                        Map<String, Object> val = OpcDaUtil.getVal(itemState.getValue());
-                        String javaType = val.get("javaType").toString();
-                        Object value = val.get("value");
-
-                        //值对应取值的时间
-                        Date time = itemState.getTimestamp().getTime();
-                        String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                        sqlCurrentYmdh = currentYmdh;
-                        //服务器读取的时间
-                        String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-
-                        if (javaType.toLowerCase().equals("boolean")) {
-                            //存数据
-                            Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
-//                            RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                    currentYmdhmss, currentYmdh, new Date());
-//                            opcAsyncTask.addTempRawData(rawData);
-//                            opcAsyncTask.packageRawData(item, dataSourceId, currentYmdh);
-
-                            EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                    currentYmdhmss, currentYmdh, new Date(), 0L);
-                            eventRawDataList.add(eventRawData);
-
-                            if (Blank.isNotEmpty(tableReportId)) {
-//                                if (eventMode.equals(ConstantStr.EVENT_MODEL_BOOLEAN)) {
-//                                    if ((dmData ? ConstantStr.BOOLEAN_TRUE : ConstantStr.BOOLEAN_FALSE).equals(eventValue.intValue())) {
-//                                        eventFlage = true;
-//                                    }
-//                                }
-                            }
-                        } else {
-                            try {
-                                BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                                BigDecimal dmData = Blank.isNotEmpty(dm) ?
-                                        MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
-                                        bigDecimal;
-//                                RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                        currentYmdhmss, currentYmdh, new Date());
-//                                opcAsyncTask.addTempRawData(rawData);
-
-                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-                                        currentYmdhmss, currentYmdh, new Date(), 0L);
-                                eventRawDataList.add(eventRawData);
-
-                                if ( Blank.isNotEmpty(tableReportId)) {
-//                                    BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                    if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                        if (dmData.compareTo(bigEventValue) == 1) {
-//                                            eventFlage = true;
-//                                        }
-//                                    } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                        if (dmData.compareTo(bigEventValue) == -1) {
-//                                            eventFlage = true;
-//                                        }
-//                                    }
-                                }
-                            } catch (Exception e) {
-//                                RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                        currentYmdhmss, currentYmdh, new Date());
-//                                opcAsyncTask.addTempRawData(rawData);
-
-                                EventRawData eventRawData = new EventRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-                                        currentYmdhmss, currentYmdh, new Date(), 0L);
-                                eventRawDataList.add(eventRawData);
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (eventFlage) {
-                if (Blank.isNotEmpty(eventRawDataList)) {
-                    for (EventRawData eventRawData : eventRawDataList) {
-                        opcAsyncTask.addEventRawData(eventRawData);
-                    }
-                    if (Blank.isNotEmpty(sqlCurrentYmdh)) {
-                        opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                    }
-                }
-            }
-
-        } catch (Exception e) {
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    e.getMessage(),
-                    ConstantStr.NO_READ));
-            if (Blank.isNotEmpty(server)) {
-                server.dispose();
-            }
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.stopItemGroupById(id, ConstantStr.STOP_IT);
-            cronTaskRegister.removeCronTask(cronId);
-            timer.cancel();
-        }
-    }
-}

+ 19 - 55
chaunyi_opc/opc_da/src/main/java/com/example/opc_da/task/OpcDaTask.java

@@ -1,21 +1,20 @@
 package com.example.opc_da.task;
 
-import com.example.opc_common.entity.*;
+import com.example.opc_common.entity.DataModel;
+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.exception.CustomException;
 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.Result;
 import com.example.opc_da.dao.DataModelDao;
 import com.example.opc_da.dao.ItemGroupDao;
 import com.example.opc_da.dao.MessageNoticeDao;
 import com.example.opc_da.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.lib.da.Group;
-import org.openscada.opc.lib.da.Server;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -55,16 +54,14 @@ public class OpcDaTask {
         Timer timer = new Timer();
         String startTime = DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime();
         String endTime = DateUtil.getCurrentYmd() + " " + itemGroup.getEndReadTime();
-//        Date startDate = DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime());
-//        Date endDate = DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getEndReadTime());
         Date startDate = DateUtil.strYmdhmsChangeDate(startTime);
         Date endDate = DateUtil.strYmdhmsChangeDate(endTime);
-        log.info("timer开始执行的时间字符串为{}", startTime);
-        log.info("timer结束执行的时间字符串为{}", endTime);
-        log.info("timer开始执行的时间为{}", DateUtil.dateChangeStrYmdhmss(startDate));
-        log.info("timer结束执行的时间为{}", DateUtil.dateChangeStrYmdhmss(endDate));
-        log.info("timer结束执行时间戳为{}", endDate.getTime());
-        log.info("目前系统的时间戳为{}", System.currentTimeMillis());
+//        log.info("timer开始执行的时间字符串为{}", startTime);
+//        log.info("timer结束执行的时间字符串为{}", endTime);
+//        log.info("timer开始执行的时间为{}", DateUtil.dateChangeStrYmdhmss(startDate));
+//        log.info("timer结束执行的时间为{}", DateUtil.dateChangeStrYmdhmss(endDate));
+//        log.info("timer结束执行时间戳为{}", endDate.getTime());
+//        log.info("目前系统的时间戳为{}", System.currentTimeMillis());
 
         Boolean flage = false;
         //获取组中所有标签的数据模型,并转换为map<itemName,DataModel>
@@ -92,26 +89,8 @@ public class OpcDaTask {
                 }
             }
         }
-        List<String> itemStrList = itemGroupDao.getItemReadNameById(itemGroup.getId());
-        String[] items = itemStrList.toArray(new String[]{});
-//        if (readMode == ConstantStr.ON_FREQUENCY) {
-//            timer.schedule(new OpcDaFrequencyTask(redisUtil,
-//                            opcAsyncTask,
-//                            cronId,
-//                            cronTaskRegister,
-//                            itemGroupDao,
-//                            messageNoticeDao,
-//                            timer,
-//                            itemGroup,
-//                            dataSource,
-//                            map,
-//                            allItemList,
-//                            timeFormat,
-//                            endDate.getTime()),
-//                    startDate);
-//        } else
-        if (readMode == ConstantStr.ON_CHANGE) {
-            timer.schedule(new OpcDaChangeTask(redisUtil,
+        if (readMode == ConstantStr.ON_FREQUENCY) {
+            timer.schedule(new OpcDaFrequencyTask(redisUtil,
                             opcAsyncTask,
                             cronId,
                             cronTaskRegister,
@@ -125,8 +104,8 @@ public class OpcDaTask {
                             timeFormat,
                             endDate.getTime()),
                     startDate);
-        } else if (readMode == ConstantStr.EXCEED_SET_VALUE) {
-            timer.schedule(new OpcDaExceedTask(redisUtil,
+        } else if (readMode == ConstantStr.ON_CHANGE) {
+            timer.schedule(new OpcDaChangeTask(redisUtil,
                             opcAsyncTask,
                             cronId,
                             cronTaskRegister,
@@ -139,24 +118,9 @@ public class OpcDaTask {
                             allItemList,
                             timeFormat,
                             endDate.getTime()),
-                    startDate, 1000);
-//        } else if (readMode == ConstantStr.LOWER_SET_VALUE) {
-//            timer.schedule(new OpcDaLowseTask(redisUtil,
-//                            opcAsyncTask,
-//                            cronId,
-//                            cronTaskRegister,
-//                            itemGroupDao,
-//                            messageNoticeDao,
-//                            timer,
-//                            itemGroup,
-//                            dataSource,
-//                            map,
-//                            allItemList,
-//                            timeFormat,
-//                            endDate.getTime()),
-//                    startDate);
-        } else if (readMode == ConstantStr.SPECIFY_TIME) {
-            timer.schedule(new OpcDaSpecifyTask(redisUtil,
+                    startDate);
+        } else if (readMode == ConstantStr.EXCEED_SET_VALUE) {
+            timer.schedule(new OpcDaExceedTask(redisUtil,
                             opcAsyncTask,
                             cronId,
                             cronTaskRegister,
@@ -167,8 +131,8 @@ public class OpcDaTask {
                             dataSource,
                             map,
                             allItemList,
-                            items,
-                            timeFormat),
+                            timeFormat,
+                            endDate.getTime()),
                     startDate);
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配其他类型的读取模式");

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

@@ -469,7 +469,7 @@ public class OpcDaUtil {
 
     public static String genException(String message) {
         if (Blank.isEmpty(message)) {
-            return "";
+            return "通信异常,请联系管理员";
         }
         if (message.contains("0x00000005")) {
             return "账号或密码错误";
@@ -485,6 +485,6 @@ public class OpcDaUtil {
         } else if (message.contains("0x80040153")) {
             return "注册表中未找到此驱动,可能是注册表未删除干净";
         }
-        return message;
+        return "通信异常(" + message + ")";
     }
 }

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

@@ -4,7 +4,7 @@
 
     <sql id="itemGroup">
         id
-        , user_id, group_name, group_describe, data_source_id, read_mode, read_mode_type, mode_value, mode_value_time,
+        , user_id, group_name, group_describe, data_source_id, read_mode, event_mode, read_mode_type, mode_value,
             read_week, run_state, cron_id, start_read_time, end_read_time , create_time
     </sql>
 
@@ -15,10 +15,12 @@
 
     <insert id="addItemGroup" parameterType="com.example.opc_common.entity.ItemGroup" useGeneratedKeys="true"
             keyProperty="id">
-        insert into t_item_group(user_id, group_name, group_describe, data_source_id, read_mode, read_mode_type,
-                                 mode_value, mode_value_time, read_week, start_read_time, end_read_time, create_time)
-        values (#{userId}, #{groupName}, #{groupDescribe}, #{dataSourceId}, #{readMode}, #{readModeType}, #{modeValue},
-                #{modeValueTime}, #{readWeek}, #{startReadTime}, #{endReadTime}, now())
+        insert into t_item_group(user_id, group_name, group_describe, data_source_id, read_mode, event_mode,
+                                 read_mode_type,
+                                 mode_value, read_week, start_read_time, end_read_time, create_time)
+        values (#{userId}, #{groupName}, #{groupDescribe}, #{dataSourceId}, #{readMode}, #{eventMode}, #{readModeType},
+                #{modeValue},
+                #{readWeek}, #{startReadTime}, #{endReadTime}, now())
     </insert>
 
     <insert id="addItem">
@@ -37,9 +39,9 @@
             group_describe=#{groupDescribe},
             data_source_id=#{dataSourceId},
             read_mode=#{readMode},
+            event_mode=#{eventMode},
             read_mode_type=#{readModeType},
             mode_value=#{modeValue},
-            mode_value_time=#{modeValueTime},
             read_week=#{readWeek},
             start_read_time=#{startReadTime},
             end_read_time=#{endReadTime}
@@ -118,7 +120,9 @@
         select
         <include refid="itemGroup"/>
         from t_item_group
-        where user_id = #{userId}
+        <if test="userId != null and userId != ''">
+            where user_id = #{userId}
+        </if>
     </select>
 
     <select id="getItemGroupByNameNoId" resultType="com.example.opc_common.entity.ItemGroup">

+ 28 - 77
chaunyi_opc/opc_da/src/main/resources/mapper/RawDataDao.xml

@@ -2,23 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.example.opc_da.dao.RawDataDao">
 
-    <sql id="rawData">
+    <sql id="cursorRawData">
         id
         , item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, data_index, value_belong_time, is_meet_change, create_time
     </sql>
 
-    <sql id="eventRawData">
+    <sql id="rawData">
         id
-        , item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time, create_time ,item_index
+        , item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, data_index, value_belong_time, is_meet_change, create_time
     </sql>
 
     <insert id="addRawData">
         insert into t_raw_data${remainder}
-        (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time,
-         create_time)
+        (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, data_index,
+         value_belong_time,
+         is_meet_change, create_time)
         VALUES (#{rawData.itemGroupId}, #{rawData.dataSourceId}, #{rawData.itemName}, #{rawData.dataType},
                 #{rawData.dataValue},
-                #{rawData.dataValueTime}, #{rawData.valueBelongTime}, #{rawData.createTime})
+                #{rawData.dataValueTime}, #{rawData.dataIndex}, #{rawData.valueBelongTime}, #{rawData.isMeetChange},
+                #{rawData.createTime})
     </insert>
 
     <insert id="addRawDataList">
@@ -33,7 +35,7 @@
         </foreach>
     </insert>
 
-    <insert id="addTempRawData">
+    <insert id="addCursorRawData">
         insert into t_raw_data
         (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, data_index,
          value_belong_time,
@@ -43,15 +45,6 @@
                 #{dataValueTime}, #{dataIndex}, #{valueBelongTime}, #{isMeetChange}, #{createTime})
     </insert>
 
-    <insert id="addEventRawData">
-        insert into t_event_raw_data
-        (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time,
-         create_time, item_index)
-        VALUES (#{itemGroupId}, #{dataSourceId}, #{itemName}, #{dataType},
-                #{dataValue},
-                #{dataValueTime}, #{valueBelongTime}, #{createTime}, #{itemIndex})
-    </insert>
-
     <update id="updateRawData">
         update t_raw_data${remainder}
         set data_value=#{rawData.dataValue},
@@ -59,41 +52,12 @@
         where id = #{rawData.id}
     </update>
 
-    <delete id="delRawDataList">
+    <delete id="delCursorRawDataList">
         delete
         from t_raw_data
-        where value_belong_time = #{valueBelongTime}
-        <if test="rawDataList!= null and rawDataList.size() >0">
-            AND id IN
-            <foreach collection="rawDataList" item="rawData" separator="," open="(" close=")">
-                #{rawData.id}
-            </foreach>
-        </if>
-    </delete>
-
-    <delete id="delEventRawDataList">
-        <if test="idList!= null and idList.size() >0">
-            delete
-            from t_event_raw_data
-            where id IN
-            <foreach collection="idList" item="id" separator="," open="(" close=")">
-                #{id}
-            </foreach>
-        </if>
-    </delete>
-
-    <delete id="delEventRawDataListByIndex">
-        <if test="indexList!= null and indexList.size() >0">
-            delete
-            from t_event_raw_data
-            where item_group_id = #{item.itemGroupId}
-            and data_source_id = #{dataSourceId}
-            and item_name = #{item.itemReadName}
-            and value_belong_time = #{valueBelongTime} and item_index not IN
-            <foreach collection="indexList" item="index" separator="," open="(" close=")">
-                #{index}
-            </foreach>
-        </if>
+        where item_group_id = #{itemGroupId}
+          and data_source_id = #{dataSourceId}
+          and value_belong_time = #{valueBelongTime}
     </delete>
 
     <select id="getLineOrBarData" resultType="com.example.opc_common.entity.RawData">
@@ -151,15 +115,21 @@
         ORDER BY value_belong_time
     </select>
 
-    <select id="getTempRawDataList" resultType="com.example.opc_common.entity.RawData">
-        select
-        <include refid="rawData"/>
-        from t_raw_data
-        where item_group_id = #{item.itemGroupId}
-        and data_source_id = #{dataSourceId}
-        and item_name = #{item.itemReadName}
-        and value_belong_time = #{valueBelongTime}
-        order by data_value_time desc
+    <select id="getCursorRawDataList" resultType="com.example.opc_common.entity.CursorRawData">
+        <if test="itemList!= null and itemList.size() >0">
+            select
+            <include refid="cursorRawData"/>
+            from t_raw_data
+            where item_group_id = #{item.itemGroupId}
+            and data_source_id = #{dataSourceId}
+            and item_name = #{item.itemReadName}
+            and value_belong_time = #{valueBelongTime}
+            and data_index in
+            <foreach collection="indexList" item="index" separator="," open="(" close=")">
+                #{index}
+            </foreach>
+            order by data_index desc
+        </if>
     </select>
 
     <select id="getRawDataList" resultType="com.example.opc_common.entity.RawData">
@@ -172,25 +142,6 @@
         and value_belong_time = #{valueBelongTime}
     </select>
 
-    <select id="getEventRawDataList" resultType="com.example.opc_common.entity.EventRawData">
-        select
-        <include refid="eventRawData"/>
-        from t_event_raw_data
-        where item_group_id = #{item.itemGroupId}
-        and data_source_id = #{dataSourceId}
-        and item_name = #{item.itemReadName}
-        and value_belong_time = #{valueBelongTime}
-    </select>
-
-    <select id="getEventRawDataIndexList" resultType="java.lang.Long">
-        select item_index
-        from t_event_raw_data
-        where item_group_id = #{item.itemGroupId}
-          and data_source_id = #{dataSourceId}
-          and item_name = #{item.itemReadName}
-          and value_belong_time = #{valueBelongTime}
-    </select>
-
     <select id="getMeetIndexList" resultType="java.lang.Long">
         SELECT
         data_index

+ 1 - 91
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/config/InitRunner.java

@@ -1,30 +1,17 @@
 package com.example.opc_ua.config;
 
-import com.example.opc_common.entity.*;
+import com.example.opc_common.entity.DataSource;
 import com.example.opc_common.enums.DataSourceTypeEnum;
-import com.example.opc_common.enums.OpcDaDriverEnum;
-import com.example.opc_common.enums.ResultEnum;
-import com.example.opc_common.exception.CustomException;
 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_ua.dao.DataModelDao;
 import com.example.opc_ua.dao.DataSourceDao;
-import com.example.opc_ua.dao.ItemGroupDao;
-import com.example.opc_ua.dao.MessageNoticeDao;
 import com.example.opc_ua.task.OpcAsyncTask;
-import com.example.opc_ua.task.OpcUaTask;
-import com.example.opc_ua.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;
 
 import javax.annotation.PostConstruct;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Timer;
 
 @Slf4j
 @Configuration
@@ -36,22 +23,6 @@ public class InitRunner {
     @Autowired
     private OpcAsyncTask opcAsyncTask;
 
-    @Autowired
-    private ItemGroupDao itemGroupDao;
-
-    @Autowired
-    private DataModelDao dataModelDao;
-
-    @Autowired
-    private MessageNoticeDao messageNoticeDao;
-
-    @Autowired
-    private RedisUtil redisUtil;
-
-    @Value("${opc_storage.time_format}")
-    private String timeFormat;
-
-
     @PostConstruct
     public void initData() {
         //将ua和da的树,加载到redis中去
@@ -73,66 +44,5 @@ public class InitRunner {
                 }
             }
         }
-
-        //将已经启动的服务重新启动
-        List<ItemGroup> itemGroupList = itemGroupDao.getAllItemGroup(null);
-        if (Blank.isNotEmpty(itemGroupList)) {
-            for (ItemGroup itemGroup : itemGroupList) {
-                DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
-                DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
-                if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_REAL.getValue()) ||
-                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_HISTORY.getValue())) {
-                    if (itemGroup.getRunState() == ConstantStr.START_UP) {
-                        if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
-                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "ip地址,帐户,密码都不能为空");
-                        }
-                        Integer id = itemGroup.getId();
-                        redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
-                        Boolean flage = false;
-                        //获取组中所有标签的数据模型,并转换为map<itemName,DataModel>
-                        List<Item> allItemList = itemGroupDao.getItemListByGroupId(id);
-                        itemGroup.setItemList(allItemList);
-                        if (Blank.isNotEmpty(allItemList)) {
-                            for (Item item : allItemList) {
-                                if (Blank.isNotEmpty(item.getDataModelId())) {
-                                    flage = true;
-                                    break;
-                                }
-                            }
-                        }
-                        Map<String, DataModel> map = new HashMap<>();
-                        if (flage) {
-                            List<DataModel> dmListByItemList = dataModelDao.getDmListByItemList(allItemList);
-                            if (Blank.isNotEmpty(dmListByItemList)) {
-                                for (int i = 0; i < allItemList.size(); i++) {
-                                    for (DataModel dm : dmListByItemList) {
-                                        if (dm.getId() == allItemList.get(i).getDataModelId()) {
-                                            map.put(allItemList.get(i).getItemReadName(), dm);
-                                            break;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                        redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
-                        Timer timer = new Timer();
-                        List<Item> itemList = itemGroupDao.getItemListByGroupId(id);
-                        //异步读取opcUA数据并保存
-                        timer.schedule(new OpcUaTask(redisUtil,
-                                        opcAsyncTask,
-                                        itemGroupDao,
-                                        messageNoticeDao,
-                                        timer,
-                                        itemGroup,
-                                        dataSource,
-                                        map,
-                                        itemList,
-                                        timeFormat),
-                                DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
-                        itemGroupDao.runItemGroupById(id, ConstantStr.START_UP);
-                    }
-                }
-            }
-        }
     }
 }

+ 61 - 0
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/config/SpringContextUtils.java

@@ -0,0 +1,61 @@
+package com.example.opc_ua.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtils implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext = null;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        if (SpringContextUtils.applicationContext == null) {
+            SpringContextUtils.applicationContext = applicationContext;
+        }
+    }
+
+    /**
+     * 获取ApplicationContext
+     *
+     * @return
+     */
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    /**
+     * 通过name获取Bean
+     *
+     * @param name
+     * @return
+     */
+    public static Object getBean(String name) {
+        return getApplicationContext().getBean(name);
+    }
+
+    /**
+     * 通过class获取Bean
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(Class<T> clazz) {
+        return getApplicationContext().getBean(clazz);
+    }
+
+    /**
+     * 通过name和clazz返回指定的Bean
+     *
+     * @param name
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(String name, Class<T> clazz) {
+        return getApplicationContext().getBean(name, clazz);
+    }
+}

+ 3 - 1
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dao/ItemGroupDao.java

@@ -13,7 +13,9 @@ public interface ItemGroupDao {
 
     List<Item> getItemListByGroupId(Integer itemGroupId);
 
-    Integer runItemGroupById(Integer id, Integer runState);
+    Integer runItemGroupById(Integer id, Integer runState, String cronId);
+
+    Integer stopItemGroupById(Integer id, Integer runState);
 
     List<ItemGroup> getAllItemGroup(String userId);
 }

+ 8 - 1
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dao/RawDataDao.java

@@ -1,5 +1,6 @@
 package com.example.opc_ua.dao;
 
+import com.example.opc_common.entity.CursorRawData;
 import com.example.opc_common.entity.Item;
 import com.example.opc_common.entity.RawData;
 import org.springframework.stereotype.Repository;
@@ -13,7 +14,7 @@ public interface RawDataDao {
 
     Integer addRawDataList(Integer itemGroupId, Integer remainder, List<RawData> rawDataList);
 
-    Integer addTempRawData(RawData rawData);
+    Integer addCursorRawData(CursorRawData cursorRawData);
 
     RawData getRawDataList(Item item, Integer remainder, Integer dataSourceId, String valueBelongTime);
 
@@ -28,4 +29,10 @@ public interface RawDataDao {
     Integer delEventRawDataList(Item item, Integer dataSourceId, String valueBelongTime);
 
     Integer updateRawData(Integer remainder, RawData rawData);
+
+    List<Long> getMeetIndexList(Integer itemGroupId, Integer dataSourceId, List<Item> itemList, String valueBelongTime, Integer notMeetChange);
+
+    List<CursorRawData> getCursorRawDataList(Item item, Integer dataSourceId, String valueBelongTime, List<Long> indexList);
+
+    Integer delCursorRawDataList(Integer itemGroupId, Integer dataSourceId, String valueBelongTime);
 }

+ 77 - 0
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/CronTaskRegister.java

@@ -0,0 +1,77 @@
+package com.example.opc_ua.dynamicSchedule;
+
+import com.example.opc_common.dynamicSchedule.ScheduledTask;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.config.CronTask;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 定时器注册类,增加定时器任务,删除定时器任务
+ */
+@Component
+public class CronTaskRegister implements DisposableBean {
+
+    @Resource
+    TaskScheduler taskScheduler;
+
+    private final Map<String, ScheduledTask> scheduledTaskMap = new ConcurrentHashMap<>();
+
+    public TaskScheduler getTaskScheduler() {
+        return this.taskScheduler;
+    }
+
+    /**
+     * 新增定时器任务
+     *
+     * @param task
+     * @param cron
+     */
+    public void addCronTask(Runnable task, String cronId, String cron) {
+        addCronTask(new CronTask(task, cron), cronId);
+    }
+
+    public void addCronTask(CronTask cronTask, String cronId) {
+        if (cronTask != null) {
+            if (this.scheduledTaskMap.containsKey(cronId)) {
+                removeCronTask(cronId);
+            }
+            //重新添加
+            this.scheduledTaskMap.put(cronId, scheduleCronTask(cronTask));
+        }
+    }
+
+    /**
+     * 移除定时器
+     *
+     * @param cronId
+     */
+    public void removeCronTask(String cronId) {
+        try {
+            ScheduledTask scheduledTask = this.scheduledTaskMap.remove(cronId);
+            if (scheduledTask != null) {
+                scheduledTask.cancel();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public ScheduledTask scheduleCronTask(CronTask cronTask) {
+        ScheduledTask scheduledTask = new ScheduledTask();
+        scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());
+        return scheduledTask;
+    }
+
+    @Override
+    public void destroy() throws Exception {
+        for (ScheduledTask task : this.scheduledTaskMap.values()) {
+            task.cancel();
+        }
+        this.scheduledTaskMap.clear();
+    }
+}

+ 81 - 0
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/DynamicScheduleConfig.java

@@ -0,0 +1,81 @@
+package com.example.opc_ua.dynamicSchedule;
+
+import com.example.opc_common.entity.DataSource;
+import com.example.opc_common.entity.DataSourceType;
+import com.example.opc_common.entity.ItemGroup;
+import com.example.opc_common.enums.DataSourceTypeEnum;
+import com.example.opc_common.enums.ResultEnum;
+import com.example.opc_common.exception.CustomException;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.ConstantStr;
+import com.example.opc_ua.dao.DataSourceDao;
+import com.example.opc_ua.dao.ItemGroupDao;
+import com.example.opc_ua.task.OpcUaTask;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+@Configuration
+public class DynamicScheduleConfig implements SchedulingConfigurer {
+
+    @Resource
+    CronTaskRegister cronTaskRegister;
+
+    @Resource
+    private DataSourceDao dataSourceDao;
+
+    @Resource
+    private ItemGroupDao itemGroupDao;
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
+
+        List<ItemGroup> itemGroupList = itemGroupDao.getAllItemGroup(null);
+        if (Blank.isNotEmpty(itemGroupList)) {
+            for (ItemGroup itemGroup : itemGroupList) {
+                String readWeek = itemGroup.getReadWeek();
+                DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
+                DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
+                if (dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_REAL.getValue()) ||
+                        dataSourceType.getDataSourceTypeKey().equals(DataSourceTypeEnum.OPC_UA_HISTORY.getValue())) {
+                    if (itemGroup.getRunState() == ConstantStr.START_UP) {
+                        if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组配置的数据源的ip地址,帐户,密码都不能为空");
+                        }
+                        Integer id = itemGroup.getId();
+                        if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpPort(), dataSource.getIsAnonymous())) {
+                            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据组配置的数据源的ip地址,端口号,匿名方式都不能为空");
+                        }
+                        if (dataSource.getIsAnonymous() == ConstantStr.NOT_ANONYMOUS) {
+                            if (Blank.isEmpty(dataSource.getIpUserName(), dataSource.getIpPassword())) {
+                                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "选择不匿名方式,需要填写帐户和密码");
+                            }
+                        }
+                        //新增定时器任务
+                        String cronId = "";
+                        String cron = "0 0 0 ? * ";
+                        if (Blank.isEmpty(readWeek)) {
+                            cron = cron + "MON,TUE,WED,THU,FRI,SAT,SUN";
+                        } else {
+                            cron = cron + itemGroup.getReadWeek();
+                        }
+                        if (Blank.isEmpty(itemGroup.getCronId())) {
+                            cronId = UUID.randomUUID().toString().replace("-", "");
+                        } else {
+                            cronId = itemGroup.getCronId();
+                        }
+                        SchedulingRunnable task = new SchedulingRunnable(OpcUaTask.class, "opcUaTask", new Object[]{itemGroup, dataSource, cronId});
+                        cronTaskRegister.addCronTask(task, cronId, cron);
+                        itemGroupDao.runItemGroupById(id, ConstantStr.START_UP, cronId);
+                    }
+                }
+            }
+        }
+    }
+}

+ 24 - 0
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/ScheduleConfig.java

@@ -0,0 +1,24 @@
+package com.example.opc_ua.dynamicSchedule;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+@Configuration
+public class ScheduleConfig {
+
+    /**
+     * 线程池
+     * @return
+     */
+    @Bean
+    public TaskScheduler taskScheduler() {
+        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+        //定时任务执行线程池核心线程数
+        taskScheduler.setPoolSize(50);
+        taskScheduler.setRemoveOnCancelPolicy(true);
+        taskScheduler.setThreadNamePrefix("schedule-task-");
+        return taskScheduler;
+    }
+}

+ 57 - 0
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/dynamicSchedule/SchedulingRunnable.java

@@ -0,0 +1,57 @@
+package com.example.opc_ua.dynamicSchedule;
+
+import com.example.opc_ua.config.SpringContextUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Method;
+
+public class SchedulingRunnable implements Runnable {
+
+    private static final Logger logger = LoggerFactory.getLogger(SchedulingRunnable.class);
+
+    private Class clazz;
+    private String className;
+
+    private String methodName;
+
+    private Object[] params;
+
+    public SchedulingRunnable(Class clazz, String methodName, Object... params) {
+        this.clazz = clazz;
+        className = clazz.getName();
+        this.methodName = methodName;
+        this.params = params;
+    }
+
+    @Override
+    public void run() {
+        logger.info("定时任务开始执行 -bean:{},方法:{},参数:{}", className, methodName, params);
+
+        long startTime = System.currentTimeMillis();
+        try {
+            Object target = SpringContextUtils.getBean(clazz);
+            Method method = null;
+            if (null != params && params.length > 0) {
+                Class<?>[] paramCls = new Class[params.length];
+                for (int i = 0; i < params.length; i++) {
+                    paramCls[i] = params[i].getClass();
+                }
+                method = target.getClass().getDeclaredMethod(methodName, paramCls);
+            } else {
+                method = target.getClass().getDeclaredMethod(methodName);
+            }
+            ReflectionUtils.makeAccessible(method);
+            if (null != params && params.length > 0) {
+                method.invoke(target, params);
+            } else {
+                method.invoke(target);
+            }
+        } catch (Exception e) {
+            logger.error(String.format("定时任务执行异常 - bean:%s,方法:%s,参数:%s ", className, methodName, params), e);
+        }
+        long times = System.currentTimeMillis() - startTime;
+        logger.info("定时任务执行结束 - bean:{},方法:{},参数:{},耗时:{} 毫秒", className, methodName, params, times);
+    }
+}

+ 21 - 10
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/service/impl/ItemGroupServiceImpl.java

@@ -6,25 +6,27 @@ import com.example.opc_common.enums.ResultEnum;
 import com.example.opc_common.exception.CustomException;
 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.Result;
 import com.example.opc_ua.dao.DataModelDao;
 import com.example.opc_ua.dao.DataSourceDao;
 import com.example.opc_ua.dao.ItemGroupDao;
 import com.example.opc_ua.dao.MessageNoticeDao;
+import com.example.opc_ua.dynamicSchedule.CronTaskRegister;
+import com.example.opc_ua.dynamicSchedule.SchedulingRunnable;
 import com.example.opc_ua.service.ItemGroupService;
 import com.example.opc_ua.task.OpcAsyncTask;
 import com.example.opc_ua.task.OpcUaTask;
-import com.example.opc_ua.task.OpcUaWeekTask;
 import com.example.opc_ua.util.OpcUaUtil;
 import com.example.opc_ua.util.RedisUtil;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
 
 @Service
 @Transactional
@@ -43,6 +45,9 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     private RedisUtil redisUtil;
 
     @Resource
+    private CronTaskRegister cronTaskRegister;
+
+    @Resource
     private OpcAsyncTask opcAsyncTask;
 
     @Resource
@@ -100,6 +105,7 @@ public class ItemGroupServiceImpl implements ItemGroupService {
     @Override
     public Result runItemGroupById(Integer id, Integer runState) {
         ItemGroup itemGroup = itemGroupDao.getItemGroupById(id);
+        String readWeek = itemGroup.getReadWeek();
         DataSource dataSource = DataSource.convertPassword(dataSourceDao.getDataSourceById(itemGroup.getDataSourceId()));
         DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
 
@@ -117,23 +123,28 @@ public class ItemGroupServiceImpl implements ItemGroupService {
                         throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "选择不匿名方式,需要填写帐户和密码");
                     }
                 }
-                redisUtil.set(ConstantStr.ITEM_GROUP + id, true);
                 //新增定时器任务
                 String cronId = "";
-                String cron = "0 0 0 ? * " + itemGroup.getReadWeek();
+                String cron = "0 0 0 ? * ";
+                if (Blank.isEmpty(readWeek)) {
+                    cron = cron + "MON,TUE,WED,THU,FRI,SAT,SUN";
+                } else {
+                    cron = cron + itemGroup.getReadWeek();
+                }
                 if (Blank.isEmpty(itemGroup.getCronId())) {
                     cronId = UUID.randomUUID().toString().replace("-", "");
                 } else {
                     cronId = itemGroup.getCronId();
                 }
-                itemGroupDao.runItemGroupById(id, runState);
+                SchedulingRunnable task = new SchedulingRunnable(OpcUaTask.class, "opcUaTask", new Object[]{itemGroup, dataSource, cronId});
+                cronTaskRegister.addCronTask(task, cronId, cron);
+                itemGroupDao.runItemGroupById(id, runState, cronId);
                 return Result.ok("启动成功");
             } else {
-                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "目前还没有此种类型的连接方式");
+                throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前还没有此种类型的连接方式");
             }
         } else if (runState.equals(ConstantStr.STOP_IT)) {
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.runItemGroupById(id, runState);
+            itemGroupDao.stopItemGroupById(id, runState);
             return Result.ok("停用成功");
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());

+ 89 - 99
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcAsyncTask.java

@@ -7,6 +7,7 @@ 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.JavaTypeUtil;
 import com.example.opc_ua.dao.RawDataDao;
 import com.example.opc_ua.dao.ReportTableDao;
 import com.example.opc_ua.util.OpcUaUtil;
@@ -50,11 +51,11 @@ public class OpcAsyncTask {
     /**
      * 新增一条临时数据
      *
-     * @param rawData
+     * @param cursorRawData
      */
-    public void addTempRawData(RawData rawData) {
-        if (Blank.isNotEmpty(rawData)) {
-            rawDataDao.addTempRawData(rawData);
+    public void addCursorRawData(CursorRawData cursorRawData) {
+        if (Blank.isNotEmpty(cursorRawData)) {
+            rawDataDao.addCursorRawData(cursorRawData);
         }
     }
 
@@ -131,68 +132,81 @@ public class OpcAsyncTask {
 
     public void packageRawDataList(List<Item> itemList, Integer dataSourceId, String sqlCurrentYmdh) {
         try {
-            Thread.sleep(5000);
+            Thread.sleep(3000);
         } catch (Exception e) {
             e.printStackTrace();
         }
-
         if (Blank.isNotEmpty(itemList)) {
-            Item item1 = itemList.get(0);
-            Integer itemGroupId = item1.getItemGroupId();
-            Integer remainder = itemGroupId % ConstantStr.SUB_TABLE_NUM;
-            for (Item item : itemList) {
-                RawData oldRawData = rawDataDao.getRawDataList(item, remainder, dataSourceId, sqlCurrentYmdh);
-                List<RawData> rawDataList = rawDataDao.getTempRawDataList(item, dataSourceId, sqlCurrentYmdh);
-                if (Blank.isNotEmpty(rawDataList)) {
-                    RawData rawData1 = rawDataList.get(0);
-                    String itemName = rawData1.getItemName();
-                    String dataType = rawData1.getDataType();
-                    if (dataType.equals("boolean")) {
-                        List<Boolean> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), Boolean[].class))) : new ArrayList<>();
-                        List<String> dataTimeList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValueTime(), String[].class))) : new ArrayList<>();
-                        for (RawData rawData : rawDataList) {
-                            dataList.add(JSON.parseObject(rawData.getDataValue(), Boolean.class));
-                            dataTimeList.add(rawData.getDataValueTime());
-                        }
-//                        RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                        if (Blank.isEmpty(oldRawData)) {
-//                            rawDataDao.addRawData(remainder, rawData);
-//                        } else {
-//                            rawDataDao.updateRawData(remainder, rawData);
-//                        }
-                    } else {
-                        List<String> dataTimeList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValueTime(), String[].class))) : new ArrayList<>();
-                        try {
-                            List<BigDecimal> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), BigDecimal[].class))) : new ArrayList<>();
-                            for (RawData rawData : rawDataList) {
-                                BigDecimal bigDecimal = JSON.parseObject(rawData.getDataValue(), BigDecimal.class);
-                                dataList.add(bigDecimal);
-                                dataTimeList.add(rawData.getDataValueTime());
+            Item item_ = itemList.get(0);
+            Integer itemGroupId = item_.getItemGroupId();
+            int remainder = itemGroupId % ConstantStr.SUB_TABLE_NUM;
+            //获取原始数据表中,满足记录的数据
+            List<Long> indexList = rawDataDao.getMeetIndexList(itemGroupId, dataSourceId, itemList, sqlCurrentYmdh, ConstantStr.NOT_MEET_CHANGE);
+            if (Blank.isNotEmpty(indexList)) {
+                for (Item item : itemList) {
+                    //从临时表中获取相应的数据
+                    List<CursorRawData> cursorRawDataList = rawDataDao.getCursorRawDataList(item, dataSourceId, sqlCurrentYmdh, indexList);
+                    if (Blank.isNotEmpty(cursorRawDataList)) {
+                        CursorRawData cursorRawData_ = cursorRawDataList.get(0);
+                        String itemName = cursorRawData_.getItemName();
+                        String dataType = cursorRawData_.getDataType();
+                        if (dataType.toLowerCase().equals("boolean")) {
+                            List<Boolean> dataList = new ArrayList<>();
+                            List<String> dataTimeList = new ArrayList<>();
+                            List<Long> dataIndexList = new ArrayList<>();
+                            List<Integer> isMeetChangeList = new ArrayList<>();
+                            for (CursorRawData cursorRawData : cursorRawDataList) {
+                                dataList.add(JSON.parseObject(cursorRawData.getDataValue(), Boolean.class));
+                                dataTimeList.add(cursorRawData.getDataValueTime());
+                                dataIndexList.add(cursorRawData.getDataIndex());
+                                isMeetChangeList.add(cursorRawData.getIsMeetChange());
                             }
-//                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                    JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                            if (Blank.isEmpty(oldRawData)) {
-//                                rawDataDao.addRawData(remainder, rawData);
-//                            } else {
-//                                rawDataDao.updateRawData(remainder, rawData);
-//                            }
-                        } catch (Exception e) {
-                            List<String> dataList = Blank.isNotEmpty(oldRawData) ? new ArrayList<>(Arrays.asList(JSON.parseObject(oldRawData.getDataValue(), String[].class))) : new ArrayList<>();
-                            for (RawData rawData : rawDataList) {
-                                dataList.add(rawData.getDataValue());
-                                dataTimeList.add(rawData.getDataValueTime());
+                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                    JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                            rawDataDao.addRawData(remainder, rawData);
+                        } else {
+                            try {
+                                List<BigDecimal> dataList = new ArrayList<>();
+                                List<String> dataTimeList = new ArrayList<>();
+                                List<Long> dataIndexList = new ArrayList<>();
+                                List<Integer> isMeetChangeList = new ArrayList<>();
+                                for (CursorRawData cursorRawData : cursorRawDataList) {
+                                    dataList.add(JSON.parseObject(cursorRawData.getDataValue(), BigDecimal.class));
+                                    dataTimeList.add(cursorRawData.getDataValueTime());
+                                    dataIndexList.add(cursorRawData.getDataIndex());
+                                    isMeetChangeList.add(cursorRawData.getIsMeetChange());
+                                }
+                                RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                        JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                                rawDataDao.addRawData(remainder, rawData);
+                            } catch (Exception e) {
+                                List<String> dataList = new ArrayList<>();
+                                List<String> dataTimeList = new ArrayList<>();
+                                List<Long> dataIndexList = new ArrayList<>();
+                                List<Integer> isMeetChangeList = new ArrayList<>();
+                                for (CursorRawData cursorRawData : cursorRawDataList) {
+                                    dataList.add(cursorRawData.getDataValue());
+                                    dataTimeList.add(cursorRawData.getDataValueTime());
+                                    dataIndexList.add(cursorRawData.getDataIndex());
+                                    isMeetChangeList.add(cursorRawData.getIsMeetChange());
+                                }
+                                RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
+                                        JSON.toJSONString(dataTimeList), JSON.toJSONString(dataIndexList), sqlCurrentYmdh, JSON.toJSONString(isMeetChangeList), new Date());
+                                rawDataDao.addRawData(remainder, rawData);
                             }
-//                            RawData rawData = new RawData(itemGroupId, dataSourceId, itemName, dataType, JSON.toJSONString(dataList),
-//                                    JSON.toJSONString(dataTimeList), sqlCurrentYmdh, new Date());
-//                            if (Blank.isEmpty(oldRawData)) {
-//                                rawDataDao.addRawData(remainder, rawData);
-//                            } else {
-//                                rawDataDao.updateRawData(remainder, rawData);
-//                            }
                         }
                     }
-                    rawDataDao.delRawDataList(rawDataList, sqlCurrentYmdh);
+                }
+            }
+            //删除临时表中的相应的数据
+            rawDataDao.delCursorRawDataList(itemGroupId, dataSourceId, sqlCurrentYmdh);
+
+            //如果有事件驱动报表,则生成事件驱动报表
+            for (Item item : itemList) {
+                Integer tableReportId = item.getTableReportId();
+                if (Blank.isNotEmpty(tableReportId)) {
+                    eventTable(tableReportId, dataSourceId, itemList, sqlCurrentYmdh);
+                    break;
                 }
             }
         }
@@ -219,89 +233,65 @@ public class OpcAsyncTask {
     /**
      * 事件驱动报表异步添加数据
      */
-    public void eventTable(Integer dataSourceId, List<Item> itemList, String sqlCurrentYmdh) {
-        try {
-            Thread.sleep(5000);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        Integer tableReportId = null;
-        if (Blank.isNotEmpty(itemList)) {
-            for (Item item : itemList) {
-//                if (Blank.isNotEmpty(item.getEventMode()) && Blank.isNotEmpty(item.getEventValue()) && Blank.isNotEmpty(item.getTableReportId())) {
-//                    tableReportId = item.getTableReportId();
-//                    break;
-//                }
-            }
-        }
-        if (Blank.isEmpty(tableReportId)) {
-            return;
-        }
+    public void eventTable(Integer tableReportId,Integer dataSourceId, List<Item> itemList, String sqlCurrentYmdh) {
         ReportTable reportTable = reportTableDao.getReportTableById(tableReportId);
         String reportTableData = reportTable.getReportTableData();
         JSONObject jsonObject = JSONObject.parseObject(reportTableData);
         JSONArray objects = new JSONArray();
         if (Blank.isNotEmpty(itemList)) {
+            Integer remainder = itemList.get(0).getItemGroupId() % ConstantStr.SUB_TABLE_NUM;
             for (int i = 0; i < itemList.size(); i++) {
-                List<RawData> rawDataList = rawDataDao.getEventRawDataList(itemList.get(i), dataSourceId, sqlCurrentYmdh);
-                if (Blank.isNotEmpty(rawDataList)) {
+                RawData rawData = rawDataDao.getRawDataList(itemList.get(i), remainder, dataSourceId, sqlCurrentYmdh);
+                if (Blank.isNotEmpty(rawData)) {
                     JSONObject jsonObject1 = new JSONObject();
-                    RawData rawData = rawDataList.get(0);
                     String dataType = rawData.getDataType();
                     if (dataType.toLowerCase().equals("boolean")) {
-                        List<Boolean> dataList = new ArrayList<>();
-                        List<String> dataTimeList = new ArrayList<>();
-                        for (RawData rawData1 : rawDataList) {
-                            dataList.add(JSON.parseObject(rawData1.getDataValue(), Boolean.class));
-                            dataTimeList.add(rawData1.getDataValueTime());
-                        }
+                        List<Boolean> dataList = JavaTypeUtil.objChangeListBool(rawData.getDataValue());
+                        List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                        List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
                         jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                         jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                         jsonObject1.put("itemName", itemList.get(i).getItemName());
                         jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
                         jsonObject1.put("dataList", dataList);
                         jsonObject1.put("dataTimeList", dataTimeList);
+                        jsonObject1.put("dataIndexList", dataIndexList);
                         objects.set(i, jsonObject1);
                     } else {
                         try {
-                            List<BigDecimal> dataList = new ArrayList<>();
-                            List<String> dataTimeList = new ArrayList<>();
-                            for (RawData rawData1 : rawDataList) {
-                                dataList.add(JSON.parseObject(rawData1.getDataValue(), BigDecimal.class));
-                                dataTimeList.add(rawData1.getDataValueTime());
-                            }
+                            List<BigDecimal> dataList = JavaTypeUtil.objChangeListBig(rawData.getDataValue());
+                            List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                            List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
                             jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                             jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                             jsonObject1.put("itemName", itemList.get(i).getItemName());
                             jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
                             jsonObject1.put("dataList", dataList);
                             jsonObject1.put("dataTimeList", dataTimeList);
+                            jsonObject1.put("dataIndexList", dataIndexList);
                             objects.set(i, jsonObject1);
                         } catch (Exception e) {
-                            List<String> dataList = new ArrayList<>();
-                            List<String> dataTimeList = new ArrayList<>();
-                            for (RawData rawData1 : rawDataList) {
-                                dataList.add(rawData1.getDataValue());
-                                dataTimeList.add(rawData1.getDataValueTime());
-                            }
+                            List<String> dataList = JavaTypeUtil.objChangeListStr(rawData.getDataValue());
+                            List<String> dataTimeList = JavaTypeUtil.objChangeListStr(rawData.getDataValueTime());
+                            List<Long> dataIndexList = JavaTypeUtil.objChangeListLong(rawData.getDataIndex());
                             jsonObject1.put("itemGroupId", rawData.getItemGroupId());
                             jsonObject1.put("itemGroupName", itemList.get(i).getItemGroupName());
                             jsonObject1.put("itemName", itemList.get(i).getItemName());
                             jsonObject1.put("describe", Blank.isEmpty(itemList.get(i).getDescribe()) ? itemList.get(i).getItemName() : itemList.get(i).getDescribe());
                             jsonObject1.put("dataList", dataList);
                             jsonObject1.put("dataTimeList", dataTimeList);
+                            jsonObject1.put("dataIndexList", dataIndexList);
                             objects.set(i, jsonObject1);
                         }
                     }
                 }
-                rawDataDao.delEventRawDataList(itemList.get(i), dataSourceId, sqlCurrentYmdh);
             }
         }
         jsonObject.put("eventTables", objects);
         ReportTable reportTable1 = new ReportTable();
         reportTable1.setTableTemplateId(reportTable.getTableTemplateId());
         reportTable1.setUserId(reportTable.getUserId());
-        reportTable1.setReportTableName(reportTable.getReportTableName() + "_" + DateUtil.dateChangeStr(new Date(), "yyyyMMddHHmmss"));
+        reportTable1.setReportTableName(reportTable.getReportTableName() + "_" + (Blank.isNotEmpty(itemList) ? itemList.get(0).getItemGroupName() : "") + "_" + DateUtil.dateChangeStr(new Date(), "yyyyMMddHHmmss"));
         reportTable1.setReportTableData(jsonObject.toJSONString());
         reportTable1.setReportValueFormat(reportTable.getReportValueFormat());
         reportTable1.setIsAutoReport(ConstantStr.EVENT_GENERATE_REPORT);

+ 53 - 51
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaChangeTask.java

@@ -2,9 +2,13 @@ package com.example.opc_ua.task;
 
 import com.alibaba.fastjson.JSON;
 import com.example.opc_common.entity.*;
-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.MathUtil;
 import com.example.opc_ua.dao.ItemGroupDao;
 import com.example.opc_ua.dao.MessageNoticeDao;
+import com.example.opc_ua.dynamicSchedule.CronTaskRegister;
 import com.example.opc_ua.util.OpcUaUtil;
 import com.example.opc_ua.util.RedisUtil;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
@@ -21,6 +25,10 @@ public class OpcUaChangeTask extends TimerTask {
 
     private final OpcAsyncTask opcAsyncTask;
 
+    private final String cronId;
+
+    private final CronTaskRegister cronTaskRegister;
+
     private final ItemGroupDao itemGroupDao;
 
     private final MessageNoticeDao messageNoticeDao;
@@ -39,10 +47,16 @@ public class OpcUaChangeTask extends TimerTask {
 
     private final String timeFormat;
 
-    private Boolean eventFlage = false;
+    private final Long endTime;
+
+    private String sqlCurrentYmdh;
+
+    private Long index = 0L;
 
     public OpcUaChangeTask(RedisUtil redisUtil,
                            OpcAsyncTask opcAsyncTask,
+                           String cronId,
+                           CronTaskRegister cronTaskRegister,
                            ItemGroupDao itemGroupDao,
                            MessageNoticeDao messageNoticeDao,
                            OpcUaClient opcUaClient,
@@ -51,9 +65,13 @@ public class OpcUaChangeTask extends TimerTask {
                            ItemGroup itemGroup,
                            DataSource dataSource,
                            Timer timer,
-                           String timeFormat) {
+                           String timeFormat,
+                           Long endTime
+    ) {
         this.redisUtil = redisUtil;
         this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
         this.itemGroupDao = itemGroupDao;
         this.messageNoticeDao = messageNoticeDao;
         this.opcUaClient = opcUaClient;
@@ -63,19 +81,22 @@ public class OpcUaChangeTask extends TimerTask {
         this.dataSource = dataSource;
         this.timer = timer;
         this.timeFormat = timeFormat;
+        this.endTime = endTime;
     }
 
     @Override
     public void run() {
+        index++;
         Integer id = itemGroup.getId();
+        Integer readModeType = itemGroup.getReadModeType();
+        Double modeValue = itemGroup.getModeValue();
         Integer dataSourceId = dataSource.getId();
         for (Item item : itemList) {
             String itemId = item.getItemReadName();
-            Integer tableReportId = item.getTableReportId();
             NodeId n = new NodeId(item.getNodeIndex(), itemId);
             DataModel dm = map.get(itemId);
             Object redisValue = redisUtil.get(ConstantStr.VALUE + id + itemId);
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
+            BigDecimal oldValue = JSON.parseObject(redisValue.toString(), BigDecimal.class);
             try {
                 DataValue dataValue = opcUaClient.readValue(0.0, TimestampsToReturn.Both, n).get();
                 if (!dataValue.getStatusCode().isGood()) {
@@ -87,88 +108,69 @@ public class OpcUaChangeTask extends TimerTask {
 
                 //归属时间
                 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.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                        if (Blank.isNotEmpty(tableReportId)) {
-                            opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                        }
-                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                         sqlCurrentYmdh = currentYmdh;
                     }
                 }
-                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
                 if (javaType.toLowerCase().equals("boolean")) {
-                    if (JSON.parseObject(redisValue.toString(), Boolean.class) != JSON.parseObject(value.toString(), Boolean.class)) {
-                        redisUtil.set(ConstantStr.VALUE + id + itemId, JSON.parseObject(value.toString(), Boolean.class), ConstantStr.TWO_HOUR);
-                        Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-
-                    }
+                    Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
+                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                    opcAsyncTask.addCursorRawData(cursorRawData);
                 } else {
                     try {
                         BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                         BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                 MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                 bigDecimal;
-//                        if (JSON.parseObject(redisValue.toString(), BigDecimal.class).compareTo(dmData) != 0) {
-//                            RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                    currentYmdhmss, currentYmdh, new Date());
-//                            opcAsyncTask.addTempRawData(rawData);
-//
-//                        }
+                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                currentYmdhmss, index, currentYmdh,
+                                Blank.isEmpty(oldValue) ? ConstantStr.NOT_MEET_CHANGE : MathUtil.isMeetChange(oldValue,
+                                        dmData, new BigDecimal(modeValue), readModeType), new Date());
+                        opcAsyncTask.addCursorRawData(cursorRawData);
+                        redisUtil.set(ConstantStr.VALUE + id + itemId, dmData, ConstantStr.TWO_HOUR);
                     } catch (Exception e) {
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-
+                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                        opcAsyncTask.addCursorRawData(cursorRawData);
                     }
                 }
             } catch (Exception e) {
                 //执行组装数据库的数据,以及生成驱动报表
                 opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                if ( Blank.isNotEmpty(tableReportId)) {
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                }
-                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
+                redisUtil.del(ConstantStr.VALUE + id + itemId);
 
                 messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                         itemGroup.getGroupName() + "-" + itemId + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                        e.getMessage(),
+                        OpcUaUtil.genException(e.getMessage()),
                         ConstantStr.NO_READ));
+
+                itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                 if (Blank.isNotEmpty(opcUaClient)) {
                     opcUaClient.disconnect();
                 }
-
-                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-                timer.cancel();
+                cronTaskRegister.removeCronTask(cronId);
+                if (Blank.isNotEmpty(timer)) {
+                    timer.cancel();
+                }
             }
         }
-        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-        if (Blank.isEmpty(flage)) {
-            flage = false;
-        }
-        if (!flage) {
+        if (System.currentTimeMillis() >= endTime) {
             //执行组装数据库的数据,以及生成驱动报表
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-            opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-            redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
             if (Blank.isNotEmpty(opcUaClient)) {
                 opcUaClient.disconnect();
             }
-
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-            timer.cancel();
+            if (Blank.isNotEmpty(timer)) {
+                timer.cancel();
+            }
         }
     }
 }

+ 80 - 77
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaExceedTask.java

@@ -2,11 +2,14 @@ package com.example.opc_ua.task;
 
 import com.alibaba.fastjson.JSON;
 import com.example.opc_common.entity.*;
-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.MathUtil;
 import com.example.opc_ua.dao.ItemGroupDao;
 import com.example.opc_ua.dao.MessageNoticeDao;
+import com.example.opc_ua.dynamicSchedule.CronTaskRegister;
 import com.example.opc_ua.util.OpcUaUtil;
-import com.example.opc_ua.util.RedisUtil;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
 import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
 import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
@@ -17,10 +20,12 @@ import java.util.*;
 
 public class OpcUaExceedTask 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;
@@ -39,10 +44,15 @@ public class OpcUaExceedTask extends TimerTask {
 
     private final String timeFormat;
 
-    private Boolean eventFlage = false;
+    private final Long endTime;
+
+    private String sqlCurrentYmdh;
+
+    private Long index = 0L;
 
-    public OpcUaExceedTask(RedisUtil redisUtil,
-                           OpcAsyncTask opcAsyncTask,
+    public OpcUaExceedTask(OpcAsyncTask opcAsyncTask,
+                           String cronId,
+                           CronTaskRegister cronTaskRegister,
                            ItemGroupDao itemGroupDao,
                            MessageNoticeDao messageNoticeDao,
                            OpcUaClient opcUaClient,
@@ -51,9 +61,11 @@ public class OpcUaExceedTask extends TimerTask {
                            ItemGroup itemGroup,
                            DataSource dataSource,
                            Timer timer,
-                           String timeFormat) {
-        this.redisUtil = redisUtil;
+                           String timeFormat,
+                           Long endTime) {
         this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
         this.itemGroupDao = itemGroupDao;
         this.messageNoticeDao = messageNoticeDao;
         this.opcUaClient = opcUaClient;
@@ -63,11 +75,15 @@ public class OpcUaExceedTask extends TimerTask {
         this.dataSource = dataSource;
         this.timer = timer;
         this.timeFormat = timeFormat;
+        this.endTime = endTime;
     }
 
     @Override
     public void run() {
+        index++;
         Integer id = itemGroup.getId();
+        Integer eventMode = itemGroup.getEventMode();
+        Double modeValue = itemGroup.getModeValue();
         Integer dataSourceId = dataSource.getId();
         for (Item item : itemList) {
             String itemId = item.getItemReadName();
@@ -75,7 +91,6 @@ public class OpcUaExceedTask extends TimerTask {
             NodeId n = new NodeId(item.getNodeIndex(), itemId);
             DataModel dm = map.get(itemId);
             BigDecimal bigModeValue = new BigDecimal(itemGroup.getModeValue());
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
             try {
                 DataValue dataValue = opcUaClient.readValue(0.0, TimestampsToReturn.Both, n).get();
                 if (!dataValue.getStatusCode().isGood()) {
@@ -86,112 +101,100 @@ public class OpcUaExceedTask extends TimerTask {
                 Date time = dataValue.getServerTime().getJavaDate();
 
                 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.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                        if ( Blank.isNotEmpty(tableReportId)) {
-                            opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                        }
-                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                         sqlCurrentYmdh = currentYmdh;
                     }
                 }
-                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                if (!javaType.toLowerCase().equals("boolean")) {
+                if (javaType.toLowerCase().equals("boolean")) {
+                    Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
+                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                    opcAsyncTask.addCursorRawData(cursorRawData);
+                } else {
                     try {
                         BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                         BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                 MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                 bigDecimal;
-                        if (dmData.compareTo(bigModeValue) == 1) {
-//                            RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                    currentYmdhmss, currentYmdh, new Date());
-//                            opcAsyncTask.addTempRawData(rawData);
-
-                            if ( Blank.isNotEmpty(tableReportId)) {
-//                                BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                    if (dmData.compareTo(bigEventValue) == 1) {
-//                                        eventFlage = true;
-//                                        opcAsyncTask.addEventRawData(rawData);
-//                                    } else {
-//                                        eventFlage = false;
-//                                    }
-//                                } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                    if (dmData.compareTo(bigEventValue) == -1) {
-//                                        eventFlage = true;
-//                                        opcAsyncTask.addEventRawData(rawData);
-//                                    } else {
-//                                        eventFlage = false;
-//                                    }
-//                                }
-                            } else {
-                                if (eventFlage) {
-//                                    opcAsyncTask.addEventRawData(rawData);
+                        if (Blank.isNotEmpty(tableReportId)) {
+                            BigDecimal bigDecimal1 = new BigDecimal(modeValue);
+                            if (eventMode == ConstantStr.EVENT_MODEL_EXCEED) {
+                                if (dmData.compareTo(bigDecimal1) == 1) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                }
+                            } else if (eventMode == ConstantStr.EVENT_MODEL_LOWER) {
+                                if (dmData.compareTo(bigDecimal1) == -1) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                }
+                            } else if (eventMode == ConstantStr.EVENT_MODEL_EQUAL) {
+                                if (dmData.compareTo(bigDecimal1) == 0) {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
+                                } else {
+                                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                            currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                                    opcAsyncTask.addCursorRawData(cursorRawData);
                                 }
                             }
+                        } else {
+                            CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                    currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                            opcAsyncTask.addCursorRawData(cursorRawData);
                         }
                     } catch (Exception e) {
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-//
-//                        if (Blank.isEmpty(eventMode, eventValue, tableReportId)) {
-//                            if (eventFlage) {
-//                                opcAsyncTask.addEventRawData(rawData);
-//                            }
-//                        }
+                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                currentYmdhmss, index, currentYmdh, ConstantStr.IS_MEET_CHANGE, new Date());
+                        opcAsyncTask.addCursorRawData(cursorRawData);
                     }
                 }
             } catch (Exception e) {
                 //执行组装数据库的数据,以及生成驱动报表
                 opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                if (  Blank.isNotEmpty(tableReportId)) {
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                }
-                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
                 messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
                         itemGroup.getGroupName() + "-" + itemId + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
                         e.getMessage(),
                         ConstantStr.NO_READ));
 
+                itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                 if (Blank.isNotEmpty(opcUaClient)) {
                     opcUaClient.disconnect();
                 }
-
-                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-                timer.cancel();
+                cronTaskRegister.removeCronTask(cronId);
+                if (Blank.isNotEmpty(timer)) {
+                    timer.cancel();
+                }
             }
         }
-        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-        if (Blank.isEmpty(flage)) {
-            flage = false;
-        }
-        if (!flage) {
+        if (System.currentTimeMillis() >= endTime) {
             //执行组装数据库的数据,以及生成驱动报表
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-            opcAsyncTask.eventTable(dataSourceId, itemList, 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(opcUaClient)) {
                 opcUaClient.disconnect();
             }
-
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-            timer.cancel();
+            if (Blank.isNotEmpty(timer)) {
+                timer.cancel();
+            }
         }
     }
 }

+ 56 - 107
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaFrequencyTask.java

@@ -2,11 +2,14 @@ package com.example.opc_ua.task;
 
 import com.alibaba.fastjson.JSON;
 import com.example.opc_common.entity.*;
-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.MathUtil;
 import com.example.opc_ua.dao.ItemGroupDao;
 import com.example.opc_ua.dao.MessageNoticeDao;
+import com.example.opc_ua.dynamicSchedule.CronTaskRegister;
 import com.example.opc_ua.util.OpcUaUtil;
-import com.example.opc_ua.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
 import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
@@ -19,10 +22,12 @@ import java.util.*;
 @Slf4j
 public class OpcUaFrequencyTask 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;
@@ -41,21 +46,29 @@ public class OpcUaFrequencyTask extends TimerTask {
 
     private final String timeFormat;
 
-    private Boolean eventFlage = false;
-
-    public OpcUaFrequencyTask(RedisUtil redisUtil,
-                              OpcAsyncTask opcAsyncTask,
-                              ItemGroupDao itemGroupDao,
-                              MessageNoticeDao messageNoticeDao,
-                              OpcUaClient opcUaClient,
-                              List<Item> itemList,
-                              Map<String, DataModel> map,
-                              ItemGroup itemGroup,
-                              DataSource dataSource,
-                              Timer timer,
-                              String timeFormat) {
-        this.redisUtil = redisUtil;
+    private final Long endTime;
+
+    private String sqlCurrentYmdh;
+
+    private Long index = 0L;
+
+    public OpcUaFrequencyTask(
+            OpcAsyncTask opcAsyncTask,
+            String cronId,
+            CronTaskRegister cronTaskRegister,
+            ItemGroupDao itemGroupDao,
+            MessageNoticeDao messageNoticeDao,
+            OpcUaClient opcUaClient,
+            List<Item> itemList,
+            Map<String, DataModel> map,
+            ItemGroup itemGroup,
+            DataSource dataSource,
+            Timer timer,
+            String timeFormat,
+            Long endTime) {
         this.opcAsyncTask = opcAsyncTask;
+        this.cronId = cronId;
+        this.cronTaskRegister = cronTaskRegister;
         this.itemGroupDao = itemGroupDao;
         this.messageNoticeDao = messageNoticeDao;
         this.opcUaClient = opcUaClient;
@@ -65,18 +78,18 @@ public class OpcUaFrequencyTask extends TimerTask {
         this.dataSource = dataSource;
         this.timer = timer;
         this.timeFormat = timeFormat;
+        this.endTime = endTime;
     }
 
     @Override
     public void run() {
+        index++;
         Integer id = itemGroup.getId();
         Integer dataSourceId = dataSource.getId();
         for (Item item : itemList) {
             String itemId = item.getItemReadName();
-            Integer tableReportId = item.getTableReportId();
             NodeId n = new NodeId(item.getNodeIndex(), itemId);
             DataModel dm = map.get(itemId);
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
             try {
                 DataValue dataValue = opcUaClient.readValue(0.0, TimestampsToReturn.Both, n).get();
                 if (!dataValue.getStatusCode().isGood()) {
@@ -87,131 +100,67 @@ public class OpcUaFrequencyTask extends TimerTask {
                 Date time = dataValue.getServerTime().getJavaDate();
 
                 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.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                        if ( Blank.isNotEmpty(tableReportId)) {
-                            opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                        }
-                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
+                        opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                         sqlCurrentYmdh = currentYmdh;
                     }
                 }
-                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
+
                 if (javaType.toLowerCase().equals("boolean")) {
                     //存数据
                     Boolean dmData = JSON.parseObject(value.toString(), Boolean.class);
-//                    RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                            currentYmdhmss, currentYmdh, new Date());
-//                    opcAsyncTask.addTempRawData(rawData);
-
-                    if ( Blank.isNotEmpty(tableReportId)) {
-//                        if (eventMode.equals(ConstantStr.EVENT_MODEL_BOOLEAN)) {
-//                            if ((dmData ? ConstantStr.BOOLEAN_TRUE : ConstantStr.BOOLEAN_FALSE).equals(eventValue.intValue())) {
-//                                eventFlage = true;
-//                                opcAsyncTask.addEventRawData(rawData);
-//                            } else {
-//                                eventFlage = false;
-//                            }
-//                        }
-                    } else {
-                        if (eventFlage) {
-//                            opcAsyncTask.addEventRawData(rawData);
-                        }
-                    }
+                    CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                            currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                    opcAsyncTask.addCursorRawData(cursorRawData);
                 } else {
                     try {
                         BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
                         BigDecimal dmData = Blank.isNotEmpty(dm) ?
                                 MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
                                 bigDecimal;
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-
-                        if ( Blank.isNotEmpty(tableReportId)) {
-//                            BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                            if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                if (dmData.compareTo(bigEventValue) == 1) {
-//                                    eventFlage = true;
-//                                    opcAsyncTask.addEventRawData(rawData);
-//                                } else {
-//                                    eventFlage = false;
-//                                }
-//                            } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                if (dmData.compareTo(bigEventValue) == -1) {
-//                                    eventFlage = true;
-//                                    opcAsyncTask.addEventRawData(rawData);
-//                                } else {
-//                                    eventFlage = false;
-//                                }
-//                            }
-                        } else {
-                            if (eventFlage) {
-//                                opcAsyncTask.addEventRawData(rawData);
-                            }
-                        }
+                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
+                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                        opcAsyncTask.addCursorRawData(cursorRawData);
                     } catch (Exception e) {
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-//
-//                        if (Blank.isEmpty( tableReportId)) {
-//                            if (eventFlage) {
-//                                opcAsyncTask.addEventRawData(rawData);
-//                            }
-//                        }
+                        CursorRawData cursorRawData = new CursorRawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
+                                currentYmdhmss, index, currentYmdh, ConstantStr.NOT_MEET_CHANGE, new Date());
+                        opcAsyncTask.addCursorRawData(cursorRawData);
                     }
                 }
             } catch (Exception e) {
                 //执行组装数据库的数据,以及生成驱动报表
                 opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                if ( Blank.isNotEmpty(tableReportId)) {
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                }
-                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
 
                 messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                        itemGroup.getGroupName() + "-" + itemId + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                        e.getMessage(),
+                        itemGroup.getGroupName() + "-" + itemId + DateUtil.dateChangeStrYmdhms(new Date()) + "运行停止",
+                        OpcUaUtil.genException(e.getMessage()),
                         ConstantStr.NO_READ));
 
+                itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
                 if (Blank.isNotEmpty(opcUaClient)) {
                     opcUaClient.disconnect();
                 }
-
-                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-                timer.cancel();
+                cronTaskRegister.removeCronTask(cronId);
+                if (Blank.isNotEmpty(timer)) {
+                    timer.cancel();
+                }
             }
         }
-        Boolean flage = (Boolean) redisUtil.get(ConstantStr.ITEM_GROUP + id);
-        if (Blank.isEmpty(flage)) {
-            flage = false;
-        }
-        if (!flage) {
+        if (System.currentTimeMillis() >= endTime) {
             //执行组装数据库的数据,以及生成驱动报表
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id));
             opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-            opcAsyncTask.eventTable(dataSourceId, itemList, 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(opcUaClient)) {
                 opcUaClient.disconnect();
             }
-
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-            timer.cancel();
+            if (Blank.isNotEmpty(timer)) {
+                timer.cancel();
+            }
         }
     }
 }

+ 0 - 196
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaLowerTask.java

@@ -1,196 +0,0 @@
-package com.example.opc_ua.task;
-
-import com.alibaba.fastjson.JSON;
-import com.example.opc_common.entity.*;
-import com.example.opc_common.util.*;
-import com.example.opc_ua.dao.ItemGroupDao;
-import com.example.opc_ua.dao.MessageNoticeDao;
-import com.example.opc_ua.util.OpcUaUtil;
-import com.example.opc_ua.util.RedisUtil;
-import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.stack.core.types.builtin.DataValue;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
-import org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn;
-
-import java.math.BigDecimal;
-import java.util.*;
-
-public class OpcUaLowerTask extends TimerTask {
-    private final RedisUtil redisUtil;
-
-    private final OpcAsyncTask opcAsyncTask;
-
-    private final ItemGroupDao itemGroupDao;
-
-    private final MessageNoticeDao messageNoticeDao;
-
-    private final OpcUaClient opcUaClient;
-
-    private final List<Item> itemList;
-
-    private final Map<String, DataModel> map;
-
-    private final ItemGroup itemGroup;
-
-    private final DataSource dataSource;
-
-    private final Timer timer;
-
-    private final String timeFormat;
-
-    private Boolean eventFlage = false;
-
-    public OpcUaLowerTask(RedisUtil redisUtil,
-                          OpcAsyncTask opcAsyncTask,
-                          ItemGroupDao itemGroupDao,
-                          MessageNoticeDao messageNoticeDao,
-                          OpcUaClient opcUaClient,
-                          List<Item> itemList,
-                          Map<String, DataModel> map,
-                          ItemGroup itemGroup,
-                          DataSource dataSource,
-                          Timer timer,
-                          String timeFormat) {
-        this.redisUtil = redisUtil;
-        this.opcAsyncTask = opcAsyncTask;
-        this.itemGroupDao = itemGroupDao;
-        this.messageNoticeDao = messageNoticeDao;
-        this.opcUaClient = opcUaClient;
-        this.itemList = itemList;
-        this.map = map;
-        this.itemGroup = itemGroup;
-        this.dataSource = dataSource;
-        this.timer = timer;
-        this.timeFormat = timeFormat;
-    }
-
-    @Override
-    public void run() {
-        Integer id = itemGroup.getId();
-        Integer dataSourceId = dataSource.getId();
-        for (Item item : itemList) {
-            String itemId = item.getItemReadName();
-            Integer tableReportId = item.getTableReportId();
-            NodeId n = new NodeId(item.getNodeIndex(), itemId);
-            DataModel dm = map.get(itemId);
-            BigDecimal bigModeValue = new BigDecimal(itemGroup.getModeValue());
-            String sqlCurrentYmdh = String.valueOf(redisUtil.get(ConstantStr.VALUE_BELONG_TIME + id + itemId));
-            try {
-                DataValue dataValue = opcUaClient.readValue(0.0, TimestampsToReturn.Both, n).get();
-                if (!dataValue.getStatusCode().isGood()) {
-                    continue;
-                }
-                Object value = dataValue.getValue().getValue();
-                String javaType = OpcUaUtil.getValType(dataValue);
-                Date time = dataValue.getServerTime().getJavaDate();
-
-                String currentYmdh = DateUtil.dateChangeStr(time, timeFormat);
-                if (Blank.isEmpty(sqlCurrentYmdh)) {
-                    sqlCurrentYmdh = currentYmdh;
-                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                } else {
-                    if (!sqlCurrentYmdh.equals(currentYmdh)) {
-                        //组装相应的数据
-                        opcAsyncTask.packageRawData(item, dataSourceId, sqlCurrentYmdh);
-                        if ( Blank.isNotEmpty(tableReportId)) {
-                            opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                        }
-                        redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
-                        sqlCurrentYmdh = currentYmdh;
-                    }
-                }
-                String currentYmdhmss = DateUtil.dateChangeStrYmdhmss(time);
-                if (!javaType.toLowerCase().equals("boolean")) {
-                    try {
-                        BigDecimal bigDecimal = JSON.parseObject(value.toString(), BigDecimal.class);
-                        BigDecimal dmData = Blank.isNotEmpty(dm) ?
-                                MathUtil.quadricOperation(dm.getMathParameter(), dm.getOperationRule(), bigDecimal) :
-                                bigDecimal;
-                        if (dmData.compareTo(bigModeValue) == -1) {
-//                            RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(dmData),
-//                                    currentYmdhmss, currentYmdh, new Date());
-//                            opcAsyncTask.addTempRawData(rawData);
-
-                            if ( Blank.isNotEmpty(tableReportId)) {
-//                                BigDecimal bigEventValue = new BigDecimal(eventValue);
-//                                if (eventMode.equals(ConstantStr.EVENT_MODEL_EXCEED)) {
-//                                    if (dmData.compareTo(bigEventValue) == 1) {
-//                                        eventFlage = true;
-//                                        opcAsyncTask.addEventRawData(rawData);
-//                                    } else {
-//                                        eventFlage = false;
-//                                    }
-//                                } else if (eventMode.equals(ConstantStr.EVENT_MODEL_LOWER)) {
-//                                    if (dmData.compareTo(bigEventValue) == -1) {
-//                                        eventFlage = true;
-//                                        opcAsyncTask.addEventRawData(rawData);
-//                                    } else {
-//                                        eventFlage = false;
-//                                    }
-//                                }
-                            } else {
-//                                if (eventFlage) {
-//                                    opcAsyncTask.addEventRawData(rawData);
-//                                }
-                            }
-                        }
-                    } catch (Exception e) {
-//                        RawData rawData = new RawData(id, dataSourceId, itemId, javaType, JSON.toJSONString(value.toString()),
-//                                currentYmdhmss, currentYmdh, new Date());
-//                        opcAsyncTask.addTempRawData(rawData);
-//
-//                        if (Blank.isEmpty(eventMode, eventValue, tableReportId)) {
-//                            if (eventFlage) {
-//                                opcAsyncTask.addEventRawData(rawData);
-//                            }
-//                        }
-                    }
-                }
-            } catch (Exception e) {
-                //执行组装数据库的数据,以及生成驱动报表
-                opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
-                if ( Blank.isNotEmpty(tableReportId)) {
-                    opcAsyncTask.eventTable(dataSourceId, itemList, sqlCurrentYmdh);
-                }
-                redisUtil.del(ConstantStr.VALUE_BELONG_TIME + id);
-
-                messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                        itemGroup.getGroupName() + "-" + itemId + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                        e.getMessage(),
-                        ConstantStr.NO_READ));
-
-                if (Blank.isNotEmpty(opcUaClient)) {
-                    opcUaClient.disconnect();
-                }
-
-                redisUtil.del(ConstantStr.ITEM_GROUP + id);
-                itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-                timer.cancel();
-            }
-        }
-        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);
-            opcAsyncTask.eventTable(dataSourceId, itemList, 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(opcUaClient)) {
-                opcUaClient.disconnect();
-            }
-
-            redisUtil.del(ConstantStr.ITEM_GROUP + id);
-            itemGroupDao.runItemGroupById(id, ConstantStr.STOP_IT);
-            timer.cancel();
-        }
-    }
-}

+ 128 - 111
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaTask.java

@@ -1,138 +1,155 @@
 package com.example.opc_ua.task;
 
-import com.example.opc_common.entity.*;
+import com.example.opc_common.entity.DataModel;
+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.exception.CustomException;
 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.Result;
+import com.example.opc_ua.dao.DataModelDao;
 import com.example.opc_ua.dao.ItemGroupDao;
 import com.example.opc_ua.dao.MessageNoticeDao;
+import com.example.opc_ua.dynamicSchedule.CronTaskRegister;
 import com.example.opc_ua.util.OpcUaUtil;
 import com.example.opc_ua.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
-import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
 
 import java.util.*;
 
 @Slf4j
-public class OpcUaTask extends TimerTask {
-
-    private final RedisUtil redisUtil;
-
-    private final OpcAsyncTask opcAsyncTask;
-
-    private final ItemGroupDao itemGroupDao;
-
-    private final MessageNoticeDao messageNoticeDao;
-
-    private final Timer pTimer;
-
-    private final ItemGroup itemGroup;
-
-    private final DataSource dataSource;
-
-    private final Map<String, DataModel> map;
-
-    private final List<Item> itemList;
-
-    private final String timeFormat;
-
-    public OpcUaTask(RedisUtil redisUtil,
-                     OpcAsyncTask opcAsyncTask,
-                     ItemGroupDao itemGroupDao,
-                     MessageNoticeDao messageNoticeDao,
-                     Timer pTimer,
-                     ItemGroup itemGroup,
-                     DataSource dataSource,
-                     Map<String, DataModel> map,
-                     List<Item> itemList,
-                     String timeFormat) {
-        this.redisUtil = redisUtil;
-        this.opcAsyncTask = opcAsyncTask;
-        this.itemGroupDao = itemGroupDao;
-        this.messageNoticeDao = messageNoticeDao;
-        this.pTimer = pTimer;
-        this.itemGroup = itemGroup;
-        this.dataSource = dataSource;
-        this.map = map;
-        this.itemList = itemList;
-        this.timeFormat = timeFormat;
-    }
+@Component
+public class OpcUaTask {
+
+    @Autowired
+    private DataModelDao dataModelDao;
+
+    @Autowired
+    private ItemGroupDao itemGroupDao;
+
+    @Autowired
+    private OpcAsyncTask opcAsyncTask;
+
+    @Autowired
+    private CronTaskRegister cronTaskRegister;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Autowired
+    private MessageNoticeDao messageNoticeDao;
+
+    @Value("${opc_storage.time_format}")
+    private String timeFormat;
+
+    public void opcUaTask(ItemGroup itemGroup, DataSource dataSource, String cronId) {
+        Integer id = itemGroup.getId();
+        Integer readMode = itemGroup.getReadMode();
+        String startTime = DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime();
+        String endTime = DateUtil.getCurrentYmd() + " " + itemGroup.getEndReadTime();
+        Date startDate = DateUtil.strYmdhmsChangeDate(startTime);
+        Date endDate = DateUtil.strYmdhmsChangeDate(endTime);
+
+        Boolean flage = false;
+        //获取组中所有标签的数据模型,并转换为map<itemName,DataModel>
+        List<Item> allItemList = itemGroupDao.getItemListByGroupId(id);
+        itemGroup.setItemList(allItemList);
+        if (Blank.isNotEmpty(allItemList)) {
+            for (Item item : allItemList) {
+                if (Blank.isNotEmpty(item.getDataModelId())) {
+                    flage = true;
+                    break;
+                }
+            }
+        }
+        Map<String, DataModel> map = new HashMap<>();
+        if (flage) {
+            List<DataModel> dmListByItemList = dataModelDao.getDmListByItemList(allItemList);
+            if (Blank.isNotEmpty(dmListByItemList)) {
+                for (int i = 0; i < allItemList.size(); i++) {
+                    for (DataModel dm : dmListByItemList) {
+                        if (dm.getId().equals(allItemList.get(i).getDataModelId())) {
+                            map.put(allItemList.get(i).getItemReadName(), dm);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
 
-    @Override
-    public void run() {
+        List<Item> itemList = itemGroupDao.getItemListByGroupId(id);
         OpcUaClient opcUaClient = null;
+        Timer timer = new Timer();
         try {
             opcUaClient = OpcUaUtil.createClient(dataSource);
-            Timer timer = new Timer();
-            if (itemGroup.getReadMode() == ConstantStr.ON_FREQUENCY) {
-                opcUaClient.connect().get();
-                timer.schedule(new OpcUaFrequencyTask(redisUtil,
-                                opcAsyncTask,
-                                itemGroupDao,
-                                messageNoticeDao,
-                                opcUaClient,
-                                itemList,
-                                map,
-                                itemGroup,
-                                dataSource,
-                                timer,
-                                timeFormat),
-                        0, (int) (Math.round(itemGroup.getModeValue() * 1000)));
-            } else if (itemGroup.getReadMode() == ConstantStr.ON_CHANGE) {
-                timer.schedule(new OpcUaChangeTask(redisUtil,
-                                opcAsyncTask,
-                                itemGroupDao,
-                                messageNoticeDao,
-                                opcUaClient,
-                                itemList,
-                                map,
-                                itemGroup,
-                                dataSource,
-                                timer,
-                                timeFormat),
-                        0, 1000);
-            } else if (itemGroup.getReadMode() == ConstantStr.EXCEED_SET_VALUE) {
-                timer.schedule(new OpcUaExceedTask(redisUtil,
-                                opcAsyncTask,
-                                itemGroupDao,
-                                messageNoticeDao,
-                                opcUaClient,
-                                itemList,
-                                map,
-                                itemGroup,
-                                dataSource,
-                                timer,
-                                timeFormat),
-                        0, 1000);
-            } else if (itemGroup.getReadMode() == ConstantStr.LOWER_SET_VALUE) {
-                timer.schedule(new OpcUaLowerTask(redisUtil,
-                                opcAsyncTask,
-                                itemGroupDao,
-                                messageNoticeDao,
-                                opcUaClient,
-                                itemList,
-                                map,
-                                itemGroup,
-                                dataSource,
-                                timer,
-                                timeFormat),
-                        0, 1000);
-            }
         } catch (Exception e) {
-            String message = OpcUaUtil.genException(e.getMessage());
-            messageNoticeDao.addMessageNotice(new MessageNotice(itemGroup.getUserId(),
-                    itemGroup.getGroupName() + DateUtil.dateChangeStrYmdhms(new Date()) + "运行失败",
-                    message,
-                    ConstantStr.NO_READ));
+            itemGroupDao.stopItemGroupById(id, ConstantStr.EXCEPT_STOP_UP);
             if (Blank.isNotEmpty(opcUaClient)) {
                 opcUaClient.disconnect();
             }
-            redisUtil.del(ConstantStr.ITEM_GROUP + itemGroup.getId());
-            itemGroupDao.runItemGroupById(itemGroup.getId(), ConstantStr.STOP_IT);
-            pTimer.cancel();
+            if (Blank.isNotEmpty(timer)) {
+                timer.cancel();
+            }
+            cronTaskRegister.removeCronTask(cronId);
+        }
+        if (readMode == ConstantStr.ON_FREQUENCY) {
+            timer.schedule(new OpcUaFrequencyTask(
+                            opcAsyncTask,
+                            cronId,
+                            cronTaskRegister,
+                            itemGroupDao,
+                            messageNoticeDao,
+                            opcUaClient,
+                            itemList,
+                            map,
+                            itemGroup,
+                            dataSource,
+                            timer,
+                            timeFormat,
+                            endDate.getTime()),
+                    startDate, (int) (Math.round(itemGroup.getModeValue() * 1000)));
+        } else if (readMode == ConstantStr.ON_CHANGE) {
+            timer.schedule(new OpcUaChangeTask(
+                            redisUtil,
+                            opcAsyncTask,
+                            cronId,
+                            cronTaskRegister,
+                            itemGroupDao,
+                            messageNoticeDao,
+                            opcUaClient,
+                            itemList,
+                            map,
+                            itemGroup,
+                            dataSource,
+                            timer,
+                            timeFormat,
+                            endDate.getTime()),
+                    startDate, (int) (Math.round(itemGroup.getModeValue() * 1000)));
+        } else if (readMode == ConstantStr.EXCEED_SET_VALUE) {
+            timer.schedule(new OpcUaExceedTask(
+                            opcAsyncTask,
+                            cronId,
+                            cronTaskRegister,
+                            itemGroupDao,
+                            messageNoticeDao,
+                            opcUaClient,
+                            itemList,
+                            map,
+                            itemGroup,
+                            dataSource,
+                            timer,
+                            timeFormat,
+                            endDate.getTime()),
+                    startDate, (int) (Math.round(itemGroup.getModeValue() * 1000)));
+        } else {
+            cronTaskRegister.removeCronTask(cronId);
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "目前未适配此种采样模式");
         }
 
     }

+ 0 - 91
chaunyi_opc/opc_ua/src/main/java/com/example/opc_ua/task/OpcUaWeekTask.java

@@ -1,91 +0,0 @@
-package com.example.opc_ua.task;
-
-import com.example.opc_common.entity.DataModel;
-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.util.Blank;
-import com.example.opc_common.util.ConstantStr;
-import com.example.opc_common.util.DateUtil;
-import com.example.opc_ua.dao.DataModelDao;
-import com.example.opc_ua.dao.ItemGroupDao;
-import com.example.opc_ua.dao.MessageNoticeDao;
-import com.example.opc_ua.util.RedisUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Timer;
-
-@Slf4j
-@Component
-public class OpcUaWeekTask {
-
-    @Autowired
-    private DataModelDao dataModelDao;
-
-    @Autowired
-    private ItemGroupDao itemGroupDao;
-
-    @Autowired
-    private OpcAsyncTask opcAsyncTask;
-
-    @Autowired
-    private RedisUtil redisUtil;
-
-    @Autowired
-    private MessageNoticeDao messageNoticeDao;
-
-    @Value("${opc_storage.time_format}")
-    private String timeFormat;
-
-    public void opcUaTask(ItemGroup itemGroup, DataSource dataSource) {
-        Integer id = itemGroup.getId();
-        Boolean flage = false;
-        //获取组中所有标签的数据模型,并转换为map<itemName,DataModel>
-        List<Item> allItemList = itemGroupDao.getItemListByGroupId(id);
-        itemGroup.setItemList(allItemList);
-        if (Blank.isNotEmpty(allItemList)) {
-            for (Item item : allItemList) {
-                if (Blank.isNotEmpty(item.getDataModelId())) {
-                    flage = true;
-                    break;
-                }
-            }
-        }
-        Map<String, DataModel> map = new HashMap<>();
-        if (flage) {
-            List<DataModel> dmListByItemList = dataModelDao.getDmListByItemList(allItemList);
-            if (Blank.isNotEmpty(dmListByItemList)) {
-                for (int i = 0; i < allItemList.size(); i++) {
-                    for (DataModel dm : dmListByItemList) {
-                        if (dm.getId().equals(allItemList.get(i).getDataModelId())) {
-                            map.put(allItemList.get(i).getItemReadName(), dm);
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-
-        Timer timer = new Timer();
-        List<Item> itemList = itemGroupDao.getItemListByGroupId(id);
-        //异步读取opcUA数据并保存
-        timer.schedule(new OpcUaTask(redisUtil,
-                        opcAsyncTask,
-                        itemGroupDao,
-                        messageNoticeDao,
-                        timer,
-                        itemGroup,
-                        dataSource,
-                        map,
-                        itemList,
-                        timeFormat),
-                DateUtil.strYmdhmsChangeDate(DateUtil.getCurrentYmd() + " " + itemGroup.getStartReadTime()), ConstantStr.PERIOD_DAY);
-
-    }
-}

+ 10 - 1
chaunyi_opc/opc_ua/src/main/resources/mapper/ItemGroupDao.xml

@@ -33,11 +33,20 @@
         select
         <include refid="itemGroup"/>
         from t_item_group
-        where user_id = #{userId}
+        <if test="userId != null and userId != ''">
+            where user_id = #{userId}
+        </if>
     </select>
 
     <update id="runItemGroupById">
         update t_item_group
+        set run_state=#{runState},
+            cron_id=#{cronId}
+        where id = #{id}
+    </update>
+
+    <update id="stopItemGroupById">
+        update t_item_group
         set run_state=#{runState}
         where id = #{id}
     </update>

+ 51 - 1
chaunyi_opc/opc_ua/src/main/resources/mapper/RawDataDao.xml

@@ -2,6 +2,11 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.example.opc_ua.dao.RawDataDao">
 
+    <sql id="cursorRawData">
+        id
+        , item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, data_index, value_belong_time, is_meet_change, create_time
+    </sql>
+
     <sql id="rawData">
         id
         , item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time, create_time
@@ -27,7 +32,7 @@
         </foreach>
     </insert>
 
-    <insert id="addTempRawData">
+    <insert id="addCursorRawData">
         insert into t_raw_data
         (item_group_id, data_source_id, item_name, data_type, data_value, data_value_time, value_belong_time,
          create_time)
@@ -73,6 +78,14 @@
           and value_belong_time = #{valueBelongTime}
     </delete>
 
+    <delete id="delCursorRawDataList">
+        delete
+        from t_raw_data
+        where item_group_id = #{itemGroupId}
+          and data_source_id = #{dataSourceId}
+          and value_belong_time = #{valueBelongTime}
+    </delete>
+
     <select id="getRawDataList" resultType="com.example.opc_common.entity.RawData">
         select
         <include refid="rawData"/>
@@ -104,4 +117,41 @@
         and value_belong_time = #{valueBelongTime}
     </select>
 
+    <select id="getMeetIndexList" resultType="java.lang.Long">
+        SELECT
+        data_index
+        FROM
+        t_raw_data
+        WHERE
+        item_group_id = #{itemGroupId}
+        AND data_source_id = #{dataSourceId}
+        <if test="itemList!= null and itemList.size() >0">
+            AND item_name IN
+            <foreach collection="itemList" item="item" separator="," open="(" close=")">
+                #{item.itemReadName}
+            </foreach>
+        </if>
+        AND value_belong_time = #{valueBelongTime}
+        AND is_meet_change = #{notMeetChange}
+        GROUP BY
+        data_index;
+    </select>
+
+    <select id="getCursorRawDataList" resultType="com.example.opc_common.entity.CursorRawData">
+        <if test="itemList!= null and itemList.size() >0">
+            select
+            <include refid="cursorRawData"/>
+            from t_raw_data
+            where item_group_id = #{item.itemGroupId}
+            and data_source_id = #{dataSourceId}
+            and item_name = #{item.itemReadName}
+            and value_belong_time = #{valueBelongTime}
+            and data_index in
+            <foreach collection="indexList" item="index" separator="," open="(" close=")">
+                #{index}
+            </foreach>
+            order by data_index desc
+        </if>
+    </select>
+
 </mapper>

+ 21 - 18
reado-app/.hbuilderx/launch.json

@@ -1,20 +1,23 @@
-{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
-  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
-    "version": "0.0",
-    "configurations": [{
-     	"app-plus" : 
-     	{
-     		"launchtype" : "local"
-     	},
-     	"default" : 
-     	{
-     		"launchtype" : "local"
-     	},
-     	"mp-weixin" : 
-     	{
-     		"launchtype" : "local"
-     	},
-     	"type" : "uniCloud"
-     }
+{
+    // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+    // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version" : "0.0",
+    "configurations" : [
+        {
+            "app-plus" : {
+                "launchtype" : "local"
+            },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "mp-weixin" : {
+                "launchtype" : "local"
+            },
+            "type" : "uniCloud"
+        },
+        {
+            "playground" : "standard",
+            "type" : "uni-app:app-android"
+        }
     ]
 }

+ 2 - 2
reado-app/pages/login/index.vue

@@ -24,9 +24,9 @@
 						</u-col>
 					</u-row>
 					<!-- #ifdef APP-PLUS -->
-					<u-form-item label="自动登录" style="position:relative;" class="form-item">
+					<!-- <u-form-item label="自动登录" style="position:relative;" class="form-item">
 						<u-switch v-model="loginBtn" class="login-btn"></u-switch>
-					</u-form-item>
+					</u-form-item> -->
 					<!-- #endif -->
 					<view class="form-btn">
 						<u-button type="primary" text="登录" @click="getHttpPublicKey"></u-button>

+ 8 - 6
reado-app/pages/message/index.vue

@@ -2,7 +2,7 @@
 	<view class="content">
 		<Nav title="消息" :isBack="false" />
 		<view class="section">
-			<u-list finished-text="没有更多了" @scrolltolower="scrolltolower" height="85vh">
+			<u-list finished-text="没有更多了" @scrolltolower="scrolltolower" height="85vh" :key="key">
 				<view v-for="item in msgList" :key="item.id" @click="handelDetail(item)">
 					<u-list-item>
 						<u-cell-group class="cell">
@@ -33,15 +33,17 @@
 				// 查询参数
 				queryParams: {
 					page: 1,
-					limit: 10
+					limit: 20
 				},
 				// 列表数据
-				msgList: []
+				msgList: [],
+				key: 0
 			};
 		},
 		onShow() {
-			this.queryParams.limit=10
+			this.queryParams.limit = 20
 			this.getMsgList()
+			this.key++
 		},
 		onPullDownRefresh() {
 			this.queryParams.limit += 10
@@ -89,10 +91,10 @@
 		width: 400rpx;
 		height: 400rpx;
 		position: absolute;
-		top: 30%;
+		top: 50%;
 		left: 50%;
 		margin-top: -200rpx;
-		margin-left: -200rpx
+		margin-left: -200rpx;
 	}
 
 	.cell {

+ 7 - 5
reado-app/pages/reportForm/index.vue

@@ -2,8 +2,8 @@
 	<view class="content">
 		<Nav title="报表" :isBack="false" />
 		<view class="section">
-			<u-list finished-text="没有更多了" @scrolltolower="scrolltolower" height="85vh">
-				<view v-for="item in reportList" :key="item.id" @click="handelDetail(item.id)">
+			<u-list finished-text="没有更多了" @scrolltolower="scrolltolower" height="85vh" :key="key">
+				<view v-for="item in reportList" :key="item.id" @click="handelDetail(item.id)" class="item">
 					<u-list-item>
 						<u-cell-group>
 							<u-cell :title="item.reportTableName" :label="item.createTime" isLink></u-cell>
@@ -26,15 +26,17 @@
 				// 查询参数
 				queryParams: {
 					page: 1,
-					limit: 10
+					limit: 20
 				},
 				// 列表数据
-				reportList: []
+				reportList: [],
+				key: 0
 			};
 		},
 		onShow() {
-			this.queryParams.limit=10
+			this.queryParams.limit = 20
 			this.getAllReport()
+			this.key++
 		},
 		onPullDownRefresh() {
 			this.queryParams.limit += 10

+ 22 - 14
reado-app/pages/reportForm/report-detail/index.vue

@@ -1,12 +1,12 @@
 <template>
 	<view class="content">
-		<Nav :title="title" isBack isRight @goBack="handelBack" @change="change" />
+		<Nav :title="title" isBack isRight @goBack="handelBack" />
 		<view id="luckysheet"
-			style="margin:0px;padding:0px;position:absolute;width:100%;height:95%;left: 0px;top: 80rpx;">
+			style="margin:0px;padding:0px;position:absolute;width:100%;height:87%;left: 0px;top: 80rpx;">
 		</view>
 		<view class="btn">
-			<u-button size="mini" type="primary" text="运行记录" @click="openRecord" hoverStayTime="0"></u-button>
-		</view>
+			<u-button type="primary" size="middle" text="运行记录" @click="openRecord" hoverStayTime="0"></u-button>
+		</view> -->
 		<!-- 运行记录弹框 -->
 		<u-popup :show="show" mode="center" :customStyle="{'padding':'10rpx','width':'80%'}">
 			<uni-table stripe emptyText="暂无更多数据">
@@ -21,7 +21,8 @@
 					</uni-tr>
 				</view>
 			</uni-table>
-			<u-button size="mini" type="primary" text="关闭" @click="show=false" style="width:30rpx;margin-top:10rpx" hoverStayTime="0">
+			<u-button size="middle" type="primary" text="关闭" @click="show=false" style="margin-top:10rpx"
+				hoverStayTime="0">
 			</u-button>
 		</u-popup>
 		<u-empty mode="data" icon="../../../static/data.png" v-if="!option">
@@ -36,11 +37,11 @@
 			return {
 				id: null,
 				title: null,
-				option: null,
+				option: {},
 				show: false,
 				page: 1,
 				limit: 10,
-				recordList: null,
+				recordList: [],
 			}
 		},
 		onLoad(options) {
@@ -68,14 +69,16 @@
 						this.option = tableData.option
 						if (this.option) {
 							tableData.option.allowEdit = false
-							luckysheet.create(this.option)
 							this.showToolbar(tableData)
+							luckysheet.create(this.option)
 						}
 					}
 				})
 			},
 			showToolbar(tableData) {
 				tableData.showtoolbar = false
+				this.option.enableAddRow = false
+				this.option.enableAddBackTop = false
 				let data = tableData.option.showtoolbarConfig
 				for (let item in data) {
 					data[item] = false
@@ -115,15 +118,20 @@
 		display: none !important;
 	}
 
+	::v-deep .u-button {
+		width: 160rpx;
+		height: 60rpx
+	}
+
 	.btn {
-		z-index: 999;
 		position: absolute;
-		bottom: 30rpx;
-		right: 0;
+		left: 50%;
+		bottom: 2%;
+		margin-left: -80rpx;
 	}
-	
-	.uni-td{
-		width:600rpx;
+
+	.uni-td {
+		width: 600rpx;
 		overflow: hidden;
 		text-overflow: ellipsis;
 	}

+ 4 - 2
reado-app/pages/reportForm/report-detail/recordDetail.vue

@@ -1,6 +1,6 @@
 <template>
 	<view>
-		<Nav :title="title" isBack isRight @goBack="handelBack" @change="change" />
+		<Nav :title="title" isBack isRight @goBack="handelBack" />
 		<view id="luckysheet"
 			style="margin:0px;padding:0px;position:absolute;width:100%;height:95%;left: 0px;top: 80rpx;">
 		</view>
@@ -40,14 +40,16 @@
 						this.option = tableData.option
 						if (this.option) {
 							tableData.option.allowEdit = false
-							luckysheet.create(this.option)
 							this.showToolbar(tableData)
+							luckysheet.create(this.option)
 						}
 					}
 				})
 			},
 			showToolbar(tableData) {
 				tableData.showtoolbar = false
+				this.option.enableAddRow=false
+				this.option.enableAddBackTop=false
 				let data = tableData.option.showtoolbarConfig
 				for (let item in data) {
 					data[item] = false