Browse Source

提交初步scada功能业务模块

haiqiu 2 years ago
parent
commit
9f641d2c5e
26 changed files with 1884 additions and 0 deletions
  1. 9 0
      .gitignore
  2. 61 0
      hnls-scada/pom.xml
  3. 25 0
      hnls-scada/src/main/java/com/tofly/scada/ScadaApplication.java
  4. 27 0
      hnls-scada/src/main/java/com/tofly/scada/common/BaseController.java
  5. 135 0
      hnls-scada/src/main/java/com/tofly/scada/common/FlowConstant.java
  6. 41 0
      hnls-scada/src/main/java/com/tofly/scada/common/GlobalExceptionHandler.java
  7. 84 0
      hnls-scada/src/main/java/com/tofly/scada/controller/ScadaController.java
  8. 35 0
      hnls-scada/src/main/java/com/tofly/scada/entity/Scada.java
  9. 142 0
      hnls-scada/src/main/java/com/tofly/scada/entity/StatisticsScada.java
  10. 50 0
      hnls-scada/src/main/java/com/tofly/scada/entity/dto/ScadaQuery.java
  11. 55 0
      hnls-scada/src/main/java/com/tofly/scada/entity/vo/ScadaVo.java
  12. 102 0
      hnls-scada/src/main/java/com/tofly/scada/entity/vo/StatisticsScadaVo.java
  13. 109 0
      hnls-scada/src/main/java/com/tofly/scada/mapper/ScadaMapper.java
  14. 37 0
      hnls-scada/src/main/java/com/tofly/scada/mapper/StatisticsScadaMapper.java
  15. 55 0
      hnls-scada/src/main/java/com/tofly/scada/service/ScadaService.java
  16. 18 0
      hnls-scada/src/main/java/com/tofly/scada/service/StatisticsScadaService.java
  17. 642 0
      hnls-scada/src/main/java/com/tofly/scada/service/impl/ScadaServiceImpl.java
  18. 43 0
      hnls-scada/src/main/java/com/tofly/scada/service/impl/StatisticsScadaServiceImpl.java
  19. 34 0
      hnls-scada/src/main/resources/bootstrap-loc.yml
  20. 31 0
      hnls-scada/src/main/resources/bootstrap-pro.yml
  21. 31 0
      hnls-scada/src/main/resources/bootstrap-test.yml
  22. 3 0
      hnls-scada/src/main/resources/bootstrap.yml
  23. 29 0
      hnls-scada/src/main/resources/logback.xml
  24. 58 0
      hnls-scada/src/main/resources/mapper/ScadaMapper.xml
  25. 27 0
      hnls-scada/src/main/resources/mapper/StatisticsScadaMapper.xml
  26. 1 0
      pom.xml

+ 9 - 0
.gitignore

@@ -0,0 +1,9 @@
+/logs
+/temp
+/**/target
+**/*.iml
+/.idea
+*.log
+*.zip
+.DS_Store
+**/*.class

+ 61 - 0
hnls-scada/pom.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tofly-hnls</artifactId>
+        <groupId>com.tofly</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hnls-scada</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tofly</groupId>
+            <artifactId>mabian-base-api</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tofly</groupId>
+            <artifactId>common-redis</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 25 - 0
hnls-scada/src/main/java/com/tofly/scada/ScadaApplication.java

@@ -0,0 +1,25 @@
+package com.tofly.scada;
+
+import com.tofly.baseapi.config.ToflyWebColudApplication;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * @author HaiQiu
+ * @date 2022/5/9
+ */
+@ToflyWebColudApplication
+@EnableScheduling
+@EnableAsync
+public class ScadaApplication {
+
+
+    public static void main(String[] args) {
+        SpringApplication.run(ScadaApplication.class,args);
+    }
+
+}

+ 27 - 0
hnls-scada/src/main/java/com/tofly/scada/common/BaseController.java

@@ -0,0 +1,27 @@
+package com.tofly.scada.common;
+
+import com.tofly.common.core.entity.ResultRespone;
+
+/**
+ * @author HaiQiu
+ * @date 2022-04-15
+ */
+public class BaseController {
+
+    public ResultRespone decide(String msg){
+        return ResultRespone.success(msg);
+    }
+
+    public ResultRespone decide(Boolean b){
+        return b ? ResultRespone.success("操作成功") : ResultRespone.failed("操作失败");
+    }
+
+
+    public ResultRespone decide(Object o){
+        return ResultRespone.success(o);
+    }
+
+    public ResultRespone decide(int i){
+        return i!=0 ? ResultRespone.success("操作成功")  : ResultRespone.failed("操作失败");
+    }
+}

+ 135 - 0
hnls-scada/src/main/java/com/tofly/scada/common/FlowConstant.java

@@ -0,0 +1,135 @@
+package com.tofly.scada.common;
+
+public interface FlowConstant {
+    String SUCCESS = "成功";
+    String FAILED = "失败";
+    String POINT = ".";
+    String KB = "kb";
+    String CSV = ",";
+    String FLAG = "0";
+    String ISNOTNUL = "参数值不能为空";
+    String TF_YWPN_PORTAL_MODULE_W="TF_YWPN_PORTAL_MODULE_W";
+
+    String SCADA_HISTORY = "SCADA_HISTORY";
+    String TF_YWPN_DOCUMENT_W = "TF_YWPN_DOCUMENT_W";
+    String TF_YWPN_PROCESS_NODE_W = "TF_YWPN_PROCESS_NODE_W";
+    String TF_YWPN_PROJECT_CONTRACT_W = "TF_YWPN_PROJECT_CONTRACT_W";
+    String PROCESS_TABLE_NAMEU = "TF_YWPN_PROCESS_W";
+    Short SHORT_TWO = 2;
+    Short SHORT_ONE = 1;
+    Short SHORT_ZERO = 0;
+    Short SHORT_THREE = 3;
+    Short SHORT_FOUR = 4;
+    Short SHORT_FIVE = 5;
+    Short SHORT_SIX = 6;
+    Long LONG_TWO = 2l;
+    Long LONG_ONE = 1l;
+    Long LONG_ZERO=0l;
+    Long LONG_TWENTY_TWO=22l;
+    Long LONG_NEGATIVE_ONE = -1l;
+    Long INTEGER_TWENTY_FOUR = 24l;
+    Integer INTEGER_ONE_HUNDRED = 100;
+    Integer INTEGER_THREE = 3;
+    Integer INTEGER_FOUR = 4;
+    Integer INTEGER_FIVE = 5;
+    Integer INTEGER_TWO = 2;
+    Integer INTEGER_ONE = 1;
+    Integer INTEGER_ZERO = 0;
+    String JCLX = "LX";
+    String WDBM = "WD";
+    String WZ = "WZ";
+    String ZC = "ZC";
+    String STRING_ONE = "1";
+    String STRING_FOUR = "4";
+    String STRING_ELEVEN="11";
+
+    String NOT_LESS_THAN="不能小于";
+    String NOT_GREATER_THAN="不能大于";
+
+
+
+    String DATA_NOTHINGNESS = "数据不存在!";
+    String NAME_EXISTS = "名称已存在!";
+    String TYPE_ERROR = "类型错误!";
+    String CHILD_LEVEL_NO_ADD = "子级不能添加子级";
+    String DISPATCH_ERROR = "方案选择错误";
+    String NUMBER_EXISTS = "编码重复!";
+    String NAME_ISNULL = "名称为空!";
+    String FILE_ISNULL = "文件为空!";
+    String FILE_ERROR = "文件异常!";
+    String DISPATCH_TIME_FILE = "调度方案时序数据";
+    String DISPATCH_TIME = "时序数据";
+    String PARAMETER_ERROR = "参数错误,不符合要求!";
+    String REDIS_FLOW="flow:";
+    String PROCESS_CONFIG_REDIS_KEY = REDIS_FLOW+"processconfig:number";
+    String PROCESS_WZ_REDIS_KEY = REDIS_FLOW+"wz:";
+    String PROCESS_ZC_REDIS_KEY = REDIS_FLOW+"zc:";
+    String REDIS_KEY_LC=REDIS_FLOW+"processconfig:lc";
+    String REDIS_KEY_WD=REDIS_FLOW+"processconfig:wd";
+    String REDIS_KEY_DEVICE=REDIS_FLOW+"processconfig:device";
+    String REDIS_QUERY_KEY = REDIS_FLOW+"query:";
+    String REDIS_KEY_STUFF_NUMBER = REDIS_FLOW+"stuffNumber:";
+    String DBRY_ISNULL = "允许催办,督办人员不能为空!";
+    String NODE_LEVEL_ERROR = "层级数或强制层级数错误!";
+    String STAFF_ISNULL = "处理人员不能为空!";
+    String UNANIMOUS_ERROR = "处理一致步骤设置错误!";
+    String LEVEL_NUMBER_NULL = "层级编号为空!";
+    String STAFF_DEPT_ERROR = "人员部门设置错误!";
+    String LEVE_STAFF_ERROR = "层级信息与节点人员配置异常!";
+    String STEP_ORDER_ERROR = "步骤序号配置错误,从1开始不能跳号!";
+    String PROCESS_TYPE_NULL = "流程类型为空!";
+    String BUSINESS_TYPE_NULL = "业务类型为空!";
+    String REPEAT_ERROR = "允许重复,处理层级必须为1!";
+    String PARALLEL_ERROR = "并行处理,处理层级必须为1";
+    String UNANIMOUS_ORDER_NOT_EXISTS = "关联步骤序号不存在!";
+    String LEVEL_NOT_UNANIMOUS = "与关联一致层级或强制层级不一致!";
+    Object DATATYPE_ERROR = "类别赋值错误!";
+    Object STAFF_LEVEL_ERROR = "处理人员层级与步骤层级不一致";
+    Object PROCESS_STEP_ERROR = "流程步骤错误!";
+    String NEXT_STEP_ERROR = "下一步序号错误!";
+    Object DATA_EXISTS = "数据已经存在!";
+    String RELATION_ERROR = "有关联信息不能删除!";
+    String COMPANY_DOCUMENT = "公司文档";
+    String DEPARTMENT_DOCUMENT = "部门文档";
+    String MY_DOCUMENT = "我的文档";
+    String MATTER_NOT_EXISTS = "物料未找到不存!";
+    String BASETYPE_NOT_EXISTS = "类型不存在";
+    String DEVICE_ERROR = "选择设备信息错误";
+    String BASE_TYPE_LIKE_PROCESS_CONFIG = "类型已解决关联配置不能添加!";
+    String PROCESS_CONFIG_NULL = "流程配置不存在!";
+    String NO_RIGHT_TO_MODIFY = "无权操作!";
+    String TYPE_NOT_UPEATE = "类型不允许更改!";
+    String CONFIG_STEP_NULL = "配置步骤不存在!";
+    String HANDLE_STEP_WRONG = "处理步骤错误!";
+    String NEXT_STEP_NODE_ERROR = "下步骤层级节点错误!";
+    String STEP_NODE_NOT_FINISHED = "步骤节点未完成!";
+    String NEXT_SELECT_ERROR = "下一步骤选择错误!";
+    String PROCESS_ID_NULL = "非上报流程ID不能为空";
+	
+	String ADD_SUCCESS = "新增成功";
+    String UPDATE_SUCCESS = "修改成功";
+    String DELETE_SUCCESS = "删除成功";
+    String HEADLE_AUTHORITY_NO = "没有处理权限";
+    String NEXT_DATA_NULL = "下一步信息为空!";
+    String REASSIGNMENT_NULL = "转派人员信息不能为空!";
+    String NEXT_STAFF_NULL = "下一步处理人员为空!";
+    String UNANIMOUS_STEP_NULL = "已处理一致步骤节点不存在!";
+    String PROCESS_NULL = "流程终止或不存在!";
+    String CONTRACT_FILE_ERROR = "合同文件名与文件不对应!";
+    String CONTRACT_DATA_NULL = "合同ID未找到数据!";
+    String MATTER_REPEAT = "物资重复!";
+    String DATA_NOTNULL = "不能为空";
+    String CODE_EXISTS = "CODE重复!";
+    String TIDINGS_ERROR = "发送消息失败!";
+    String ADD_HANDLE = "新增";
+    String FACTORY_NULL = "厂家不存在!";
+    String DEVICE_NUMBER_ERROR = "关联设备数与数量不一致!";
+    String DEVICE_EXISTS = "设备重复!";
+    String DEVICE_NULL = "设备不存在";
+
+
+    String RELATION_PROCESS_TYPE_NULL = "关联表单类型为空";
+    String REPAIRORDER_NULL = "抢维修工单未找到!";
+    String DEVICE_INFO_NULL = "设备、车辆详情为空!";
+    Object STEP_OR_NODE_NULL = "流程步骤或环节ID为空!";
+}

+ 41 - 0
hnls-scada/src/main/java/com/tofly/scada/common/GlobalExceptionHandler.java

@@ -0,0 +1,41 @@
+package com.tofly.scada.common;
+
+import com.tofly.common.core.entity.ResultRespone;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.validation.BindException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * @author HaiQiu
+ * @date 2021/11/19
+ * 全局异常处理器
+ */
+@ControllerAdvice
+@Order(1)
+public class GlobalExceptionHandler {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionHandler.class);
+
+    @ResponseBody
+    @ExceptionHandler(Exception.class)
+    public ResultRespone exception(Exception e) {
+//        e.printStackTrace();
+        LOGGER.debug(e.getMessage());
+        if (e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
+            String errMsg = ex.getBindingResult().getFieldError().getDefaultMessage();
+            return ResultRespone.failed(errMsg);
+        }
+        if (e instanceof BindException){
+            BindException ex = (BindException) e;
+            String errMsg = ex.getBindingResult().getFieldError().getDefaultMessage();
+            return ResultRespone.failed(errMsg);
+        }
+        return ResultRespone.failed(e.getMessage());
+    }
+}

+ 84 - 0
hnls-scada/src/main/java/com/tofly/scada/controller/ScadaController.java

@@ -0,0 +1,84 @@
+package com.tofly.scada.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tofly.common.core.entity.ResultRespone;
+import com.tofly.common.log.annotation.ToFlyAppLog;
+import com.tofly.scada.common.BaseController;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.mapper.ScadaMapper;
+import com.tofly.scada.service.ScadaService;
+import com.tofly.scada.service.StatisticsScadaService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author HaiQiu
+ * @date 2022/4/25
+ * //TODO 临时接口
+ */
+@Api(tags = "SCADA数据操作")
+@RequestMapping("/scada")
+@RestController
+public class ScadaController extends BaseController {
+
+    @Autowired
+    private ScadaService scadaService;
+
+    @Autowired
+    private StatisticsScadaService statisticsScadaService;
+
+    @ToFlyAppLog(title = "查询最新SCADA所有数据")
+    @ApiOperation(value = "查询最新SCADA所有数据")
+    @PostMapping("/all")
+    public ResultRespone getData(){
+        return decide(scadaService.getListData());
+    }
+
+
+//    @ToFlyAppLog(title = "分页查询24小时平均SCADA数据")
+//    @ApiOperation(value = "分页查询24小时平均SCADA数据")
+//    @GetMapping("/hours")
+//    public ResultRespone get24HoursData(Page page,ScadaQuery scadaQuery){
+//        return decide(scadaService.get24HoursData(page,scadaQuery));
+//    }
+
+    @ToFlyAppLog(title = "分页查询统计SCADA数据")
+    @ApiOperation(value = "分页查询统计SCADA数据")
+    @GetMapping("/page")
+    public ResultRespone getMonthsData(Page page,ScadaQuery scadaQuery){
+        return decide(statisticsScadaService.getPageData(page,scadaQuery));
+    }
+
+    @ToFlyAppLog(title = "手动更新小时数据")
+    @ApiOperation(value = "手动更新小时数据")
+    @PutMapping("/hours/fetch")
+    public ResultRespone fetch24HoursData(@ApiParam("需要更新的时间数据:2022-05-05 11:00:00,不传默认更新当前时间往后的一个小时," +
+            "时间不允许更新当前及其未来时间数据") @RequestParam(required = false) String syncTime){
+        return decide(scadaService.fetch24HoursData(syncTime));
+    }
+
+    @ToFlyAppLog(title = "手动更新月份数据数据")
+    @ApiOperation(value = "手动更新月份数据数据")
+    @PutMapping("/months/fetch")
+    public ResultRespone fetchMonthsData(@ApiParam("需要更新的时间数据:2022-05-05,不传默认更新当前时间往后的一个月," +
+            "时间不允许更新未来时间数据,默认更新上个月数据") @RequestParam(required = false) String syncTime){
+        scadaService.fetchMonthsData(syncTime);
+        return decide("更新成功");
+    }
+
+
+    @ToFlyAppLog(title = "手动更新天数数据数据")
+    @ApiOperation(value = "手动更新天数数据数据")
+    @PutMapping("/days/fetch")
+    public ResultRespone fetchDaysData(@ApiParam("需要更新的时间数据:2022-05-05,不传默认更新当前时间往后的一天," +
+            "时间不允许更新未来时间数据,默认更新昨天数据") @RequestParam(required = false) String syncTime){
+        scadaService.fetchDaysData(syncTime);
+        return decide("更新成功");
+    }
+
+
+
+}

+ 35 - 0
hnls-scada/src/main/java/com/tofly/scada/entity/Scada.java

@@ -0,0 +1,35 @@
+package com.tofly.scada.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author haiqiu
+ */
+@Data
+@TableName(value = "SCADA_HOURS")
+@KeySequence("SCADA_HOURS")
+public class Scada {
+
+    @TableId(value = "ID", type = IdType.INPUT)
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty(value = "指标编码")
+    private String code;
+
+    @ApiModelProperty(value = "指标值")
+    private String value;
+
+    @ApiModelProperty(value = "指标采集时间")
+    private Date scadaTime;
+
+    @ApiModelProperty(value = "指标更新时间")
+    private Date updateTime;
+}

+ 142 - 0
hnls-scada/src/main/java/com/tofly/scada/entity/StatisticsScada.java

@@ -0,0 +1,142 @@
+package com.tofly.scada.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 
+ * @TableName STATISTICS_SCADA
+ */
+@Data
+@TableName(value = "STATISTICS_SCADA")
+@KeySequence("STATISTICS_SCADA")
+public class StatisticsScada implements Serializable {
+    /**
+     * 主键ID
+     */
+    @TableId(value = "ID", type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 指标编码
+     */
+    private String code;
+
+    /**
+     * 指标值
+     */
+    private String value;
+
+    /**
+     * 统计类型:0小时统计 1天统计 2月统计 3年统计
+     */
+    private Integer statisticsType;
+
+    /**
+     * 统计开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 统计结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 最大值
+     */
+    private Double max;
+
+    /**
+     * 最小值
+     */
+    private Double min;
+
+    /**
+     * 平均值
+     */
+    private Double ave;
+
+    /**
+     * 叠加值
+     */
+    private Double fold;
+
+    /**
+     * 指标类型:与指标编码表里面的 绑定码表里面维护  转义
+     */
+    private Integer dataType;
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        StatisticsScada other = (StatisticsScada) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getCode() == null ? other.getCode() == null : this.getCode().equals(other.getCode()))
+            && (this.getValue() == null ? other.getValue() == null : this.getValue().equals(other.getValue()))
+            && (this.getStatisticsType() == null ? other.getStatisticsType() == null : this.getStatisticsType().equals(other.getStatisticsType()))
+            && (this.getStartTime() == null ? other.getStartTime() == null : this.getStartTime().equals(other.getStartTime()))
+            && (this.getEndTime() == null ? other.getEndTime() == null : this.getEndTime().equals(other.getEndTime()))
+            && (this.getMax() == null ? other.getMax() == null : this.getMax().equals(other.getMax()))
+            && (this.getMin() == null ? other.getMin() == null : this.getMin().equals(other.getMin()))
+            && (this.getAve() == null ? other.getAve() == null : this.getAve().equals(other.getAve()))
+            && (this.getFold() == null ? other.getFold() == null : this.getFold().equals(other.getFold()))
+            && (this.getDataType() == null ? other.getDataType() == null : this.getDataType().equals(other.getDataType()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getCode() == null) ? 0 : getCode().hashCode());
+        result = prime * result + ((getValue() == null) ? 0 : getValue().hashCode());
+        result = prime * result + ((getStatisticsType() == null) ? 0 : getStatisticsType().hashCode());
+        result = prime * result + ((getStartTime() == null) ? 0 : getStartTime().hashCode());
+        result = prime * result + ((getEndTime() == null) ? 0 : getEndTime().hashCode());
+        result = prime * result + ((getMax() == null) ? 0 : getMax().hashCode());
+        result = prime * result + ((getMin() == null) ? 0 : getMin().hashCode());
+        result = prime * result + ((getAve() == null) ? 0 : getAve().hashCode());
+        result = prime * result + ((getFold() == null) ? 0 : getFold().hashCode());
+        result = prime * result + ((getDataType() == null) ? 0 : getDataType().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", code=").append(code);
+        sb.append(", value=").append(value);
+        sb.append(", statisticsType=").append(statisticsType);
+        sb.append(", startTime=").append(startTime);
+        sb.append(", endTime=").append(endTime);
+        sb.append(", max=").append(max);
+        sb.append(", min=").append(min);
+        sb.append(", ave=").append(ave);
+        sb.append(", fold=").append(fold);
+        sb.append(", dataType=").append(dataType);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 50 - 0
hnls-scada/src/main/java/com/tofly/scada/entity/dto/ScadaQuery.java

@@ -0,0 +1,50 @@
+package com.tofly.scada.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author HaiQiu
+ * @date 2022/5/9
+ */
+@Data
+public class ScadaQuery {
+
+    @ApiModelProperty(value = "开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    Date start;
+
+    @ApiModelProperty(value = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    Date end;
+
+    @ApiModelProperty(value = "指标编码")
+    String code;
+
+    @ApiModelProperty(value = "指标值")
+    private String value;
+
+    @ApiModelProperty(value = "表名",hidden = true)
+    private String tableName;
+
+
+    /**
+     * 统计类型:0小时统计 1天统计 2月统计 3年统计
+     */
+    @ApiModelProperty(value = "统计类型:0小时统计 1天统计 2月统计 3年统计")
+    private Integer statisticsType;
+
+    /**
+     * 统计时间
+     */
+    @ApiModelProperty(value = "统计时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+}

+ 55 - 0
hnls-scada/src/main/java/com/tofly/scada/entity/vo/ScadaVo.java

@@ -0,0 +1,55 @@
+package com.tofly.scada.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author haiqiu
+ */
+@Data
+public class ScadaVo {
+
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty(value = "指标编码")
+    private String code;
+
+    @ApiModelProperty(value = "指标值")
+    private String value;
+
+    @ApiModelProperty(value = "指标采集时间")
+    private Date scadaTime;
+
+    @ApiModelProperty(value = "指标更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "设备名称")
+    private String name;
+
+    @ApiModelProperty(value = "制造日期")
+    private String makeDate;
+
+    @ApiModelProperty(value = "设备类型")
+    private String type;
+
+    @ApiModelProperty(value = "制造厂家")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "负责人")
+    private String leader;
+
+    @ApiModelProperty(value = "联系电话")
+    private String phone;
+
+    @ApiModelProperty(value = "所属测站ID,关联SCADA监测站基本信息表主键")
+    private String stationId;
+
+
+}

+ 102 - 0
hnls-scada/src/main/java/com/tofly/scada/entity/vo/StatisticsScadaVo.java

@@ -0,0 +1,102 @@
+package com.tofly.scada.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 
+ * @TableName STATISTICS_SCADA
+ */
+@Data
+@TableName(value = "STATISTICS_SCADA")
+@KeySequence("STATISTICS_SCADA")
+@EqualsAndHashCode
+public class StatisticsScadaVo implements Serializable {
+    /**
+     * 主键ID
+     */
+    @TableId(value = "ID", type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 指标编码
+     */
+    private String code;
+
+    /**
+     * 指标值
+     */
+    private String value;
+
+    /**
+     * 统计类型:0小时统计 1天统计 2月统计 3年统计
+     */
+    private Integer statisticsType;
+
+    /**
+     * 统计开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 统计结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 最大值
+     */
+    private Double max;
+
+    /**
+     * 最小值
+     */
+    private Double min;
+
+    /**
+     * 平均值
+     */
+    private Double ave;
+
+    /**
+     * 叠加值
+     */
+    private Double fold;
+
+    /**
+     * 指标类型:与指标编码表里面的 绑定码表里面维护  转义
+     */
+    private Integer dataType;
+
+    @ApiModelProperty(value = "设备名称")
+    private String name;
+
+    @ApiModelProperty(value = "制造日期")
+    private String makeDate;
+
+    @ApiModelProperty(value = "设备类型")
+    private String type;
+
+    @ApiModelProperty(value = "制造厂家")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "负责人")
+    private String leader;
+
+    @ApiModelProperty(value = "联系电话")
+    private String phone;
+
+    @ApiModelProperty(value = "所属测站ID,关联SCADA监测站基本信息表主键")
+    private String stationId;
+
+    private static final long serialVersionUID = 1L;
+
+}

+ 109 - 0
hnls-scada/src/main/java/com/tofly/scada/mapper/ScadaMapper.java

@@ -0,0 +1,109 @@
+package com.tofly.scada.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tofly.scada.entity.Scada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author HaiQiu
+ * @date 2022/4/25
+ */
+@Mapper
+public interface ScadaMapper extends BaseMapper<Scada> {
+
+    /**
+     * 临时接口,查询历史数据
+     * @return
+     */
+    @Select("select * " +
+            "  from (select t1.*, " +
+            "               row_number() over(partition by t1.CODE order by SCADA_TIME DESC) rn " +
+            "          from SCADA_HISTORY t1) t1 " +
+            " where t1.rn = 1")
+    List<Scada> getListData();
+
+
+    /**
+     * 创建表
+     * @param tableName 表名
+     */
+    void createTableMonths(String tableName);
+
+    /**
+     * 判断表是否存在
+     * @param tableName 表名
+     * @return 条数大于1为存在
+     */
+    int verifyTableMonthsIsExits(String tableName);
+
+    /**
+     * 根据时间段查询历史scada数据
+     * @param tableName 表名
+     * @param start 开始时间
+     * @param end 结束时间
+     * @return 历史数据列表
+     */
+    List<Scada> selectHistoryByTime(@Param("tableName") String tableName,
+                                 @Param("start") String start,@Param("end") String end);
+
+    /**
+     * 添加月份数据
+     * @param scadas 数据
+     * @param tableName 表名
+     * @return 影响条数
+     */
+    int insertMouth(@Param("scadas") List<Scada> scadas,@Param("tableName") String tableName);
+
+
+    /**
+     * 根据表名和时间段删除表数据
+     * @param tableName 表名
+     * @param start 开始时间
+     * @param end 结束时间
+     * @return 成功条数
+     */
+    int deleteFromTableName(@Param("tableName") String tableName,
+                            @Param("start") String start,@Param("end") String end);
+
+
+
+    /**
+     * 查询24小时平均SCADA数据
+     * @param queryWrapper 条件
+     * @return
+     */
+    @Select("SELECT hours.* FROM ${tableName} hours " +
+            "LEFT JOIN TF_DEVICE_ARCHIVE_MANAGE manage ON manage.CODE = hours.CODE " +
+            "LEFT JOIN TF_YWPN_SCADASTAITEM_W staitem ON staitem.ITCD =  hours.CODE " +
+            "${ew.customSqlSegment} ")
+    List<ScadaVo> list(@Param(Constants.WRAPPER) QueryWrapper<ScadaQuery> queryWrapper,
+                           @Param("tableName") String tableName);
+
+
+    /**
+     * 查询24小时平均SCADA数据
+     * @param page 分页
+     * @param queryWrapper 条件
+     * @return
+     */
+    @Select("SELECT hours.*,manage.NAME name,manage.MAKE_DATE makeDate,manage.TYPE type," +
+            "manage.MANUFACTURER manufacturer,manage.LEADER leader,manage.PHONE phone,staitem.STATION_ID stationId " +
+            " FROM ${tableName} hours " +
+            "LEFT JOIN TF_DEVICE_ARCHIVE_MANAGE manage ON manage.CODE = hours.CODE " +
+            "LEFT JOIN TF_YWPN_SCADASTAITEM_W staitem ON staitem.ITCD =  hours.CODE " +
+            "${ew.customSqlSegment} ")
+    Page<ScadaVo> pageList(Page page, @Param(Constants.WRAPPER) QueryWrapper<ScadaQuery> queryWrapper,
+                           @Param("tableName") String tableName);
+
+}

+ 37 - 0
hnls-scada/src/main/java/com/tofly/scada/mapper/StatisticsScadaMapper.java

@@ -0,0 +1,37 @@
+package com.tofly.scada.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tofly.scada.entity.StatisticsScada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+import com.tofly.scada.entity.vo.StatisticsScadaVo;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+* @author haiqiu
+* @description 针对表【STATISTICS_SCADA】的数据库操作Mapper
+* @createDate 2022-05-10 15:55:35
+* @Entity com.tofly.scada.entity.StatisticsScada
+*/
+public interface StatisticsScadaMapper extends BaseMapper<StatisticsScada> {
+
+
+    /**
+     * 查询统计SCADA数据
+     * @param page 分页
+     * @param queryWrapper 条件
+     * @return
+     */
+    @Select("SELECT scada.*,manage.NAME name,manage.MAKE_DATE makeDate,manage.TYPE type," +
+            "manage.MANUFACTURER manufacturer,manage.LEADER leader,manage.PHONE phone,staitem.STATION_ID stationId " +
+            " FROM ${tableName} scada " +
+            "LEFT JOIN TF_DEVICE_ARCHIVE_MANAGE manage ON manage.CODE = scada.CODE " +
+            "LEFT JOIN TF_YWPN_SCADASTAITEM_W staitem ON staitem.ITCD =  scada.CODE " +
+            "${ew.customSqlSegment} ")
+    Page<StatisticsScadaVo> pageList(Page page, @Param(Constants.WRAPPER) QueryWrapper<ScadaQuery> queryWrapper,
+                                     @Param("tableName") String tableName);
+}

+ 55 - 0
hnls-scada/src/main/java/com/tofly/scada/service/ScadaService.java

@@ -0,0 +1,55 @@
+package com.tofly.scada.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tofly.scada.entity.Scada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author HaiQiu
+ * @date 2022/5/9
+ */
+public interface ScadaService {
+    /**
+     * 查询最新所有数据
+     * @return 查询最新所有数据
+     */
+    List<Scada> getListData();
+
+    /**
+     * 手动更新24小时数据
+     * @param syncTime 时间参数
+     * @return 是否成功
+     */
+    boolean fetch24HoursData(String syncTime);
+
+    /**
+     * 手动更新月份数据数据
+     * @param syncTime 时间参数
+     */
+    void fetchMonthsData(String syncTime);
+
+    /**
+     * 手动更新月份数据数据
+     * @param syncTime 时间参数
+     */
+    void fetchDaysData(String syncTime);
+
+    /**
+     * 查询24小时平均SCADA数据
+     * @param scadaQuery 查询参数
+     * @return
+     */
+    Page<ScadaVo> get24HoursData(Page page,ScadaQuery scadaQuery);
+
+
+    /**
+     * 查询24小时平均SCADA数据
+     * @param scadaQuery 查询参数
+     * @return
+     */
+    Page getMonthsData(Page page,ScadaQuery scadaQuery);
+}

+ 18 - 0
hnls-scada/src/main/java/com/tofly/scada/service/StatisticsScadaService.java

@@ -0,0 +1,18 @@
+package com.tofly.scada.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.tofly.scada.entity.StatisticsScada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+import com.tofly.scada.entity.vo.StatisticsScadaVo;
+
+/**
+* @author haiqiu
+* @description 针对表【STATISTICS_SCADA】的数据库操作Service
+* @createDate 2022-05-10 15:55:35
+*/
+public interface StatisticsScadaService extends IService<StatisticsScada> {
+
+    Page<StatisticsScadaVo> getPageData(Page page, ScadaQuery scadaQuery);
+}

+ 642 - 0
hnls-scada/src/main/java/com/tofly/scada/service/impl/ScadaServiceImpl.java

@@ -0,0 +1,642 @@
+package com.tofly.scada.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.tofly.scada.common.FlowConstant;
+import com.tofly.scada.entity.Scada;
+import com.tofly.scada.entity.StatisticsScada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+import com.tofly.scada.mapper.ScadaMapper;
+import com.tofly.scada.service.ScadaService;
+import com.tofly.scada.service.StatisticsScadaService;
+import oracle.sql.DATE;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.sql.Wrapper;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author HaiQiu
+ * @date 2022/4/25
+ */
+@Configuration
+public class ScadaServiceImpl implements ScadaService {
+
+    private final Logger logger = LoggerFactory.getLogger(ScadaServiceImpl.class);
+
+    @Autowired
+    private ScadaMapper scadaMapper;
+
+    @Autowired
+    private StatisticsScadaService statisticsScadaService;
+
+
+    /**
+     * 根据当前时间动态自动创建月份表,创建完成之后返回表名
+     *
+     * 往后往前推迟月份,1即创建下一月的表,-1表示创建上个月表
+     * @return 月份表名
+     */
+    //每月最后28日凌晨2点执行创建下个月的数据表
+//    @Scheduled(cron = "0 0 2 28 * ? ")
+//    @Scheduled(cron = "0/5 * * * * ? ")
+//    public void createMonths() {
+//        Calendar cal = Calendar.getInstance();
+//        cal.setTime(new Date());
+//        cal.add(Calendar.MONTH, 1);
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy_MM");
+//        String date = format.format(cal.getTime());
+//        String tableName = "SCADA_MONTH_" + date;
+//        logger.info("开始检测Scada月份表状态");
+//        if (scadaMapper.verifyTableMonthsIsExits(tableName) <= 0) {
+//            logger.info("Scada月份表状态:不存在,开始创建");
+//            scadaMapper.createTableMonths(tableName);
+//            logger.info("Scada月份表状态:创建完成");
+//        }
+//        logger.info("结束检测Scada月份表状态");
+//    }
+//
+//    public String createMonths(Integer next) {
+//        Calendar cal = Calendar.getInstance();
+//        cal.setTime(new Date());
+//        cal.add(Calendar.MONTH, next == null ? 0 : next);
+//        SimpleDateFormat format = new SimpleDateFormat("yyyy_MM");
+//        String date = format.format(cal.getTime());
+//        String tableName = "SCADA_MONTH_" + date;
+//        logger.info("开始检测Scada月份表状态");
+//        if (scadaMapper.verifyTableMonthsIsExits(tableName) <= 0) {
+//            logger.info("Scada月份表状态:不存在,开始创建");
+//            scadaMapper.createTableMonths(tableName);
+//            logger.info("Scada月份表状态:创建完成");
+//        }
+//        logger.info("结束检测Scada月份表状态");
+//        return tableName;
+//    }
+
+
+    /**
+     * 同步24小时数据,支持自定义时间添加
+     *
+     */
+    //每小时执行一次(整点整分)
+    @Scheduled(cron = "0 0 * * *  ? ")
+//    @Scheduled(cron = "0/5 * * * * ? ")
+    public void insert24H() {
+        logger.info("同步scada历史数据到24小时表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        Date date = new Date();
+        calendar.setTime(date);
+        //延迟一个小时
+        calendar.add(Calendar.HOUR_OF_DAY, -1);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //拉长时间到59分59秒
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到24小时表:正在进行查询历史数据");
+        //查询历史数据
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到24小时表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            logger.info("同步scada历史数据到24小时表:正在进行分组循环计算");
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_ZERO);
+        }
+    }
+
+    public void insert24H(Date time) {
+        logger.info("同步scada历史数据到24小时表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        Date date = time == null ? new Date() : time;
+        calendar.setTime(date);
+        //延迟一个小时
+        calendar.add(Calendar.HOUR_OF_DAY, -1);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //拉长时间到59分59秒
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到24小时表:正在进行查询历史数据");
+        //查询历史数据
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到24小时表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            logger.info("同步scada历史数据到24小时表:正在进行分组循环计算");
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_ZERO);
+        }
+    }
+
+
+
+    /**
+     * 同步每天数据,每天凌晨一点半同步昨天的数据
+     *
+     */
+    @Scheduled(cron = "0 30 1 * * ? ")
+//    @Scheduled(cron = "0/5 * * * * ? ")
+    public void syncDaysData() {
+        logger.info("同步scada历史数据到表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        Date date = new Date();
+        calendar.setTime(date);
+        //延迟一天
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //拉长时间到59分59秒
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到24小时表:正在进行查询历史数据");
+        //查询历史数据
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            logger.info("同步scada历史数据到表:正在进行分组循环计算");
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_ONE);
+        }
+    }
+
+    public void syncDaysData(Date time) {
+        logger.info("同步scada历史数据到表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(time == null ? new Date() : time);
+        //延迟一天
+        calendar.add(Calendar.DAY_OF_MONTH, -1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //拉长时间到59分59秒
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到24小时表:正在进行查询历史数据");
+        //查询历史数据
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            logger.info("同步scada历史数据到表:正在进行分组循环计算");
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_ONE);
+        }
+    }
+
+
+
+
+    /**
+     * 每月1号凌晨1点同步更新历史数据与上个月表数据,支持自定义时间添加
+     *
+     */
+    @Scheduled(cron = "0 0 1 1 * ? ")
+//    @Scheduled(cron = "0/5 * * * * ? ")
+    public void syncDataIntoMonths() {
+        logger.info("同步scada历史数据到月份表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        //倒退一个月开始时间
+        calendar.add(Calendar.MONTH, -1);
+        calendar.set(Calendar.DATE, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //倒退一个月最后一天时间
+        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到月份表:正在进行历史数据查询....");
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        logger.info("同步scada历史数据到月份表:历史数据查询完成,数据存在" + !CollectionUtils.isEmpty(scadas));
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到24小时表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_TWO);
+        }
+        logger.info("同步scada历史数据到月份表:操作完成");
+    }
+
+    public void syncDataIntoMonths(Date time) {
+        logger.info("同步scada历史数据到月份表:正在进行时间调整");
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(time == null ? new Date() : time);
+        //倒退一个月开始时间
+        calendar.add(Calendar.MONTH, -1);
+        calendar.set(Calendar.DATE, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date startTime = calendar.getTime();
+        String start = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        //倒退一个月最后一天时间
+        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date endTime = calendar.getTime();
+        String end = DateUtil.format(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
+        logger.info("同步scada历史数据到月份表:正在进行历史数据查询....");
+        List<Scada> scadas = scadaMapper.selectHistoryByTime(FlowConstant.SCADA_HISTORY, start, end);
+        logger.info("同步scada历史数据到月份表:历史数据查询完成,数据存在" + !CollectionUtils.isEmpty(scadas));
+        if (!CollectionUtils.isEmpty(scadas)) {
+            logger.info("同步scada历史数据到24小时表:正在进行数据分组");
+            //有数据就分组
+            Map<String, List<Scada>> listMap = scadas.stream().filter(scada -> scada.getCode() != null && scada.getValue() != null)
+                    .collect(Collectors.groupingBy(Scada::getCode));
+            //分组循环计算添加
+            saveStatisticsData(startTime, endTime, listMap,FlowConstant.INTEGER_TWO);
+        }
+        logger.info("同步scada历史数据到月份表:操作完成");
+    }
+
+
+    /**
+     * 设置统计数据
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param listMap 数据集合分组
+     */
+    private void saveStatisticsData(Date startTime, Date endTime, Map<String, List<Scada>> listMap,Integer DateType) {
+        for (Map.Entry<String, List<Scada>> entity : listMap.entrySet()) {
+            logger.info("统计添加数据中。。。。");
+            List<Scada> scadaList = entity.getValue();
+            double average = scadaList.stream().map(scada -> Double.parseDouble(scada.getValue()))
+                    .mapToDouble(Double::shortValue).average().getAsDouble();
+            double max = scadaList.stream().map(scada -> Double.parseDouble(scada.getValue()))
+                    .mapToDouble(Double::shortValue).max().getAsDouble();
+            double min = scadaList.stream().map(scada -> Double.parseDouble(scada.getValue()))
+                    .mapToDouble(Double::shortValue).min().getAsDouble();
+            double sum = scadaList.stream().map(scada -> Double.parseDouble(scada.getValue()))
+                    .mapToDouble(Double::shortValue).sum();
+            //待设计类型插入
+            StatisticsScada statisticsScada = new StatisticsScada();
+            statisticsScada.setCode(scadaList.get(0).getCode());
+            statisticsScada.setValue(scadaList.get(0).getValue());
+            statisticsScada.setAve(average);
+            statisticsScada.setMax(max);
+            statisticsScada.setMin(min);
+            statisticsScada.setFold(sum);
+            statisticsScada.setStartTime(startTime);
+            statisticsScada.setEndTime(endTime);
+            statisticsScada.setStatisticsType(DateType);
+
+
+            //删除旧数据
+            Map<String, Object> map = new HashMap<>();
+            map.put("START_TIME", statisticsScada.getStartTime());
+            map.put("END_TIME", statisticsScada.getEndTime());
+            map.put("VALUE", statisticsScada.getValue());
+            map.put("CODE", statisticsScada.getCode());
+            statisticsScadaService.removeByMap(map);
+            //添加小时数据
+            statisticsScadaService.save(statisticsScada);
+            logger.info("统计添加数据完成");
+        }
+    }
+
+    @Async
+    public void insertMouth(List<Scada> scadas, String tableName) {
+        int size = scadas.size();
+        int i = 0;
+        while (size > 600) {
+            scadaMapper.insertMouth(scadas.subList(i, i + 600), tableName);
+            i = i + 600;
+            size = size - 600;
+        }
+        if (size > 0) {
+            scadaMapper.insertMouth(scadas.subList(i, i + size), tableName);
+        }
+    }
+
+
+    @Override
+    public List<Scada> getListData() {
+        return scadaMapper.getListData();
+    }
+
+    @Override
+    public boolean fetch24HoursData(String syncTime) {
+        Date date = null;
+        if (StringUtils.isEmpty(syncTime)) {
+            date = new Date();
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(date);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+        } else {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+            try {
+                Date parse = format.parse(syncTime);
+                Date now = new Date();
+                Calendar cal = Calendar.getInstance();
+                cal.setTime(now);
+                cal.set(Calendar.MINUTE, 0);
+                cal.set(Calendar.SECOND, 0);
+                if (parse.getTime() >= now.getTime()) {
+                    throw new RuntimeException("时间参数不允许大于等于当前时间:" + format.format(now));
+                }
+                date = parse;
+            } catch (ParseException e) {
+                throw new RuntimeException("时间参数格式传入错误:" + e);
+            }
+        }
+        insert24H(date);
+        return true;
+    }
+
+    @Override
+    public void fetchMonthsData(String syncTime) {
+        Date date = null;
+        if (StringUtils.isEmpty(syncTime)) {
+            date = new Date();
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(date);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+        } else {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            try {
+                Date parse = format.parse(syncTime);
+                Date now = new Date();
+                Calendar cal = Calendar.getInstance();
+                cal.setTime(now);
+                if (parse.getTime() > now.getTime()) {
+                    throw new RuntimeException("时间参数不允许大于当前时间:" + format.format(now));
+                }
+                date = parse;
+            } catch (ParseException e) {
+                throw new RuntimeException("时间参数格式传入错误:" + e);
+            }
+        }
+        syncDataIntoMonths(date);
+    }
+
+    @Override
+    public void fetchDaysData(String syncTime) {
+        Date date = null;
+        if (StringUtils.isEmpty(syncTime)) {
+            date = new Date();
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(date);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+        } else {
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            try {
+                Date parse = format.parse(syncTime);
+                Date now = new Date();
+                Calendar cal = Calendar.getInstance();
+                cal.setTime(now);
+                if (parse.getTime() > now.getTime()) {
+                    throw new RuntimeException("时间参数不允许大于当前时间:" + format.format(now));
+                }
+                date = parse;
+            } catch (ParseException e) {
+                throw new RuntimeException("时间参数格式传入错误:" + e);
+            }
+        }
+        syncDaysData(date);
+    }
+
+    @Override
+    public Page<ScadaVo> get24HoursData(Page page, ScadaQuery scadaQuery) {
+        QueryWrapper<ScadaQuery> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.hasText(scadaQuery.getCode())) {
+            queryWrapper.like("hours.CODE", scadaQuery.getCode());
+        }
+        if (StringUtils.hasText(scadaQuery.getValue())) {
+            queryWrapper.like("hours.VALUE", scadaQuery.getValue());
+        }
+        if (scadaQuery.getStart() != null && scadaQuery.getEnd() != null) {
+            queryWrapper.between("hours.SCADA_TIME", scadaQuery.getStart(), scadaQuery.getEnd());
+        }
+        queryWrapper.orderByDesc("hours.SCADA_TIME");
+        return scadaMapper.pageList(page, queryWrapper, "SCADA_HOURS");
+    }
+
+
+    @Override
+    public Page getMonthsData(Page page, ScadaQuery scadaQuery) {
+        QueryWrapper<ScadaQuery> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("hours.SCADA_TIME");
+        if (StringUtils.hasText(scadaQuery.getCode())) {
+            queryWrapper.like("hours.CODE", scadaQuery.getCode());
+        }
+        if (StringUtils.hasText(scadaQuery.getValue())) {
+            queryWrapper.like("hours.VALUE", scadaQuery.getValue());
+        }
+        if (scadaQuery.getStart() != null && scadaQuery.getEnd() != null) {
+
+            if (scadaQuery.getStart().getYear() == scadaQuery.getEnd().getYear() &&
+                    scadaQuery.getStart().getMonth() == scadaQuery.getEnd().getMonth()) {
+                List<Date> startAndEndByDate = getMonthsToStartAndEndByDate(scadaQuery.getStart());
+                queryWrapper.between("hours.SCADA_TIME", scadaQuery.getStart(), scadaQuery.getEnd());
+
+                Calendar cal = Calendar.getInstance();
+                cal.setTime(startAndEndByDate.get(0));
+                SimpleDateFormat format = new SimpleDateFormat("yyyy_MM");
+                String date = format.format(cal.getTime());
+                String tableName = "SCADA_MONTH_" + date;
+                return scadaMapper.pageList(page, queryWrapper, tableName);
+            }
+//            else {
+//                List<ScadaVo> scadaVos = new ArrayList<>();
+//
+//                queryWrapper.between("hours.SCADA_TIME", scadaQuery.getStart(), scadaQuery.getEnd());
+//                queryWrapper.orderByDesc("hours.SCADA_TIME");
+//                List<String> months = getMonths(scadaQuery.getStart(), scadaQuery.getEnd());
+//                for (int i = 0; i < months.size(); i++) {
+//                    List<ScadaVo> scadas = scadaMapper.list(queryWrapper, months.get(i));
+//                    scadaVos.addAll(scadas);
+//                }
+//                page.setRecords(scadaVos);
+//                page.setTotal(scadaVos.size());
+//                return page;
+//            }
+
+        }
+        return scadaMapper.pageList(page, queryWrapper, "SCADA_HISTORY");
+    }
+
+
+    /**
+     * 获取当前月份的开始时间和结束时间
+     *
+     * @param time 时间
+     * @return
+     */
+    public List<Date> getMonthsToStartAndEndByDate(Date time) {
+        //整个日历调整时间
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(time == null ? new Date() : time);
+        //倒退一个月开始时间
+        calendar.set(Calendar.DATE, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date start = calendar.getTime();
+        //倒退一个月最后一天时间
+        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+        calendar.set(Calendar.HOUR_OF_DAY, 23);
+        calendar.set(Calendar.MINUTE, 59);
+        calendar.set(Calendar.SECOND, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        Date end = calendar.getTime();
+        List<Date> list = new ArrayList<>();
+        list.add(start);
+        list.add(end);
+        return list;
+    }
+
+
+    /**
+     * @param startMonth @example: "2016-01"
+     * @param endMonth   @example: "2019-11"
+     * @return 两个时间之间的月份(含开始, 结束)
+     * @throws ParseException
+     */
+    private List<String> getMonths(String startMonth, String endMonth) throws ParseException {
+        LinkedList<String> months = new LinkedList<>();
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Calendar minCalender = Calendar.getInstance();
+        Calendar maxCalender = Calendar.getInstance();
+
+        // 设置开始月份
+        minCalender.setTime(sdf.parse(startMonth));
+        minCalender.set(minCalender.get(Calendar.YEAR), minCalender.get(Calendar.MONTH), 1);
+
+        maxCalender.setTime(sdf.parse(endMonth));
+        // 设置日期,保证最后一个日期参数 大于 开始时间日历
+        maxCalender.set(maxCalender.get(Calendar.YEAR), maxCalender.get(Calendar.MONTH), 2);
+
+        while (minCalender.before(maxCalender)) {
+            months.add(sdf.format(minCalender.getTime()));
+            minCalender.add(Calendar.MONTH, 1);
+        }
+        return months;
+    }
+
+    /**
+     * @return 两个时间之间的月份(含开始, 结束) + 表名
+     * @throws ParseException
+     */
+    private List<String> getMonths(Date start, Date end) {
+        LinkedList<String> tableNames = new LinkedList<>();
+
+        SimpleDateFormat format = new SimpleDateFormat("yyyy_MM");
+
+        Calendar minCalender = Calendar.getInstance();
+        Calendar maxCalender = Calendar.getInstance();
+
+        // 设置开始月份
+        minCalender.setTime(start);
+        minCalender.set(minCalender.get(Calendar.YEAR), minCalender.get(Calendar.MONTH), 1);
+
+        maxCalender.setTime(end);
+        // 设置日期,保证最后一个日期参数 大于 开始时间日历
+        maxCalender.set(maxCalender.get(Calendar.YEAR), maxCalender.get(Calendar.MONTH), 2);
+
+        while (minCalender.before(maxCalender)) {
+            String date = format.format(minCalender.getTime());
+            String tableName = "SCADA_MONTH_" + date;
+            tableNames.add(tableName);
+            minCalender.add(Calendar.MONTH, 1);
+        }
+        return tableNames;
+    }
+
+
+    public String getMonthsByEndDay(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
+        cal.set(Calendar.HOUR_OF_DAY, 23);
+        cal.set(Calendar.MINUTE, 59);
+        cal.set(Calendar.SECOND, 59);
+        cal.set(Calendar.MILLISECOND, 999);
+        String end = DateUtil.format(cal.getTime(), "yyyy-MM-dd HH:mm:ss");
+        return end;
+    }
+
+    public String getMonthsByStartDay(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        String start = DateUtil.format(cal.getTime(), "yyyy-MM-dd HH:mm:ss");
+        return start;
+    }
+}

+ 43 - 0
hnls-scada/src/main/java/com/tofly/scada/service/impl/StatisticsScadaServiceImpl.java

@@ -0,0 +1,43 @@
+package com.tofly.scada.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.tofly.scada.entity.StatisticsScada;
+import com.tofly.scada.entity.dto.ScadaQuery;
+import com.tofly.scada.entity.vo.ScadaVo;
+import com.tofly.scada.entity.vo.StatisticsScadaVo;
+import com.tofly.scada.service.StatisticsScadaService;
+import com.tofly.scada.mapper.StatisticsScadaMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+/**
+* @author haiqiu
+* @description 针对表【STATISTICS_SCADA】的数据库操作Service实现
+* @createDate 2022-05-10 15:55:35
+*/
+@Service
+public class StatisticsScadaServiceImpl extends ServiceImpl<StatisticsScadaMapper, StatisticsScada> implements StatisticsScadaService{
+
+
+
+    @Override
+    public Page<StatisticsScadaVo> getPageData(Page page, ScadaQuery scadaQuery) {
+        QueryWrapper<ScadaQuery> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.hasText(scadaQuery.getCode())) {
+            queryWrapper.like("scada.CODE", scadaQuery.getCode());
+        }
+        if (StringUtils.hasText(scadaQuery.getValue())) {
+            queryWrapper.like("scada.VALUE", scadaQuery.getValue());
+        }
+        if (scadaQuery.getStatisticsType()!=null) {
+            queryWrapper.like("scada.STATISTICS_TYPE", scadaQuery.getStatisticsType());
+        }
+        if (scadaQuery.getStart() != null && scadaQuery.getEnd() != null) {
+            queryWrapper.between("scada.START_TIME", scadaQuery.getStart(), scadaQuery.getEnd());
+        }
+        queryWrapper.orderByDesc("scada.END_TIME");
+        return baseMapper.pageList(page, queryWrapper, "STATISTICS_SCADA");
+    }
+}

+ 34 - 0
hnls-scada/src/main/resources/bootstrap-loc.yml

@@ -0,0 +1,34 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        # nacos配置中心指定空间
+        namespace: tofly-xrty-test
+        # nacos部署IP
+        server-addr: 192.168.2.235:8848
+        # 配置后缀
+        file-extension: yaml
+        #其他配置信息
+        shared-configs[0]:
+          dataId: public_config_public.yaml
+        shared-configs[1]:
+          dataId: tofly-gps-config-oracle.yaml
+        shared-configs[2]:
+          dataId: public_config_ftp.yaml
+        shared-configs[3]:
+          dataId: public_config_redis.yaml
+
+      discovery:
+        # nacos配置中心指定空间
+        namespace: tofly-xrty-test
+        # nacos部署IP
+        server-addr: 192.168.2.235:8848
+  application:
+    # 该应用在nacos配置中的名称
+    name: tofly-scada
+
+
+
+logging:
+  level:
+    com.alibaba.nacos.client.config.impl: WARN

+ 31 - 0
hnls-scada/src/main/resources/bootstrap-pro.yml

@@ -0,0 +1,31 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        # nacos配置中心指定空间
+        namespace: tofly-xrty-pro
+        # nacos部署IP
+        server-addr: tofly-nacos:8848
+        # 配置后缀
+        file-extension: yaml
+        # 分组
+        #其他配置信息
+        shared-configs[0]:
+          dataId: public_config_public.yaml
+        shared-configs[1]:
+          dataId: gps-config-oracle.yaml
+        shared-configs[2]:
+          dataId: public_config_ftp.yaml
+        shared-configs[3]:
+          dataId: public_config_redis.yaml
+
+      discovery:
+        namespace: tofly-xrty-pro
+        server-addr: tofly-nacos:8848
+  application:
+    # 该应用在nacos配置中的名称
+    name: tofly-scada
+logging:
+  level:
+    com.alibaba.nacos.client.config.impl: WARN
+

+ 31 - 0
hnls-scada/src/main/resources/bootstrap-test.yml

@@ -0,0 +1,31 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        # nacos配置中心指定空间
+        namespace: c885f4c3-97f6-4a71-b198-52e903c9f91c
+        # nacos部署IP
+        server-addr: localhost:8848
+        # 配置后缀
+        file-extension: yaml
+        # 分组
+        #其他配置信息
+        shared-configs[0]:
+          dataId: public_config_public.yaml
+        shared-configs[1]:
+          dataId: gps-config-oracle.yaml
+        shared-configs[2]:
+          dataId: public_config_ftp.yaml
+        shared-configs[3]:
+          dataId: public_config_redis.yaml
+
+      discovery:
+        namespace: c885f4c3-97f6-4a71-b198-52e903c9f91c
+        server-addr: localhost:8848
+  application:
+    # 该应用在nacos配置中的名称
+    name: tofly-scada
+logging:
+  level:
+    com.alibaba.nacos.client.config.impl: WARN
+

+ 3 - 0
hnls-scada/src/main/resources/bootstrap.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: loc

+ 29 - 0
hnls-scada/src/main/resources/logback.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="true" scanPeriod="1 seconds">
+
+    <contextName>logback</contextName>
+    <property name="log.path" value="./logs/reveal.log"/>
+
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
+            </pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
+    </root>
+
+</configuration>

+ 58 - 0
hnls-scada/src/main/resources/mapper/ScadaMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.tofly.scada.mapper.ScadaMapper">
+
+    <insert id="insertMouth">
+        insert into ${tableName}
+        (ID,CODE,VALUE,SCADA_TIME,UPDATE_TIME)
+        <foreach collection="scadas" item="item" separator="union all" open="(" close=")">
+            select
+            #{item.id,jdbcType=NUMERIC},#{item.code,jdbcType=VARCHAR},#{item.value,jdbcType=VARCHAR},
+             #{item.scadaTime,jdbcType=DATE},#{item.updateTime,jdbcType=DATE}
+            from dual
+        </foreach>
+    </insert>
+
+<!--    <resultMap id="map" type="com.tofly.scada.entity.Scada">-->
+<!--        <id column="ID" property="id"></id>-->
+<!--        <result column="CODE" property="code"></result>-->
+<!--        <result column="VALUE" property="value"></result>-->
+<!--        <result column="SCADA_TIME" property="scadaTime"></result>-->
+<!--        <result column="UPDATE_TIME" property="updateTime"></result>-->
+<!--    </resultMap>-->
+
+    <update id="createTableMonths">
+        CREATE TABLE "TF_XRTY"."${tableName}"
+        (	"ID" NUMBER NOT NULL ENABLE,
+             "CODE" VARCHAR2(500) NOT NULL ENABLE,
+             "VALUE" VARCHAR2(100),
+             "SCADA_TIME" DATE,
+             "UPDATE_TIME" DATE,
+             PRIMARY KEY ("ID")
+                 USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS NOCOMPRESS LOGGING
+                 TABLESPACE "TF_XRTY_DATA"  ENABLE
+        ) SEGMENT CREATION DEFERRED
+  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
+  TABLESPACE "TF_XRTY_DATA"
+    </update>
+
+    <select id="verifyTableMonthsIsExits" resultType="java.lang.Integer">
+        select count(*) from user_tables where table_name = upper('${tableName}')
+    </select>
+
+    <select id="selectHistoryByTime" resultType="com.tofly.scada.entity.Scada">
+        select  * from ${tableName}
+        <if test="start!=null and start!='' and end!=null and end!=''">
+            where SCADA_TIME between to_date(#{start},'yyyy-mm-dd hh24:mi:ss') and to_date(#{end},'yyyy-mm-dd hh24:mi:ss')
+        </if>
+    </select>
+
+    <delete id="deleteFromTableName">
+        delete from ${tableName}
+        <if test="start!=null and end!=null">
+            where SCADA_TIME between to_date(#{start},'yyyy-mm-dd hh24:mi:ss') and to_date(#{end},'yyyy-mm-dd hh24:mi:ss')
+        </if>
+    </delete>
+
+</mapper>

+ 27 - 0
hnls-scada/src/main/resources/mapper/StatisticsScadaMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tofly.scada.mapper.StatisticsScadaMapper">
+
+    <resultMap id="BaseResultMap" type="com.tofly.scada.entity.StatisticsScada">
+            <id property="id" column="ID" jdbcType="DECIMAL"/>
+            <result property="code" column="CODE" jdbcType="VARCHAR"/>
+            <result property="value" column="VALUE" jdbcType="VARCHAR"/>
+            <result property="statisticsType" column="STATISTICS_TYPE" jdbcType="DECIMAL"/>
+            <result property="startTime" column="START_TIME" jdbcType="TIMESTAMP"/>
+            <result property="endTime" column="END_TIME" jdbcType="TIMESTAMP"/>
+            <result property="max" column="MAX" jdbcType="FLOAT"/>
+            <result property="min" column="MIN" jdbcType="FLOAT"/>
+            <result property="ave" column="AVE" jdbcType="FLOAT"/>
+            <result property="fold" column="FOLD" jdbcType="FLOAT"/>
+            <result property="dataType" column="DATA_TYPE" jdbcType="DECIMAL"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        ID,CODE,VALUE,
+        STATISTICS_TYPE,START_TIME,END_TIME,
+        MAX,MIN,AVE,
+        FOLD,DATA_TYPE
+    </sql>
+</mapper>

+ 1 - 0
pom.xml

@@ -15,6 +15,7 @@
         <module>hnls-mis</module>
         <module>hnls-dc</module>
         <module>hnls-job</module>
+        <module>hnls-scada</module>
     </modules>
 
     <artifactId>tofly-hnls</artifactId>