Browse Source

保存上传数据
自动生成报表数据

wangli 4 years ago
parent
commit
e5b8b2e50e

+ 85 - 0
sms_water/src/main/java/com/huaxu/async/MonitorDataReportTaskAsync.java

@@ -0,0 +1,85 @@
+package com.huaxu.async;
+
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.service.MonitorDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @description 异步执行定时任务
+ * @auto wangli
+ * @data 2020-12-03 14:15
+ */
+@Component
+@EnableScheduling   // 1.开启定时任务
+@EnableAsync        // 2.开启多线程
+@Slf4j
+public class MonitorDataReportTaskAsync {
+
+    @Autowired
+    private MonitorDataService monitorDataService;
+    /**
+     * 每个小时零分零秒执行一次
+     */
+    @Async
+//    @Scheduled(cron = "0 0 0/1 * * ? ")
+    @Scheduled(cron = "0 * * * * ? ")
+    public void monitorDataReportForHour() {
+        try{
+            log.info("日报报任务开始执行");
+            monitorDataService.getMonitorDataByHour();
+            log.info("日报任务执行结束");
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("日报任务执行异常,{}", e.getMessage());
+        }
+
+    }
+
+    /**
+     * 月报
+     * 每天零点执行一次
+     * 统计昨天每小时的数据
+     */
+    @Async
+//    @Scheduled(cron = "0 0 0 * * ? ")  //每天零点执行一次
+    @Scheduled(cron = "0 0 * * * ? ")
+    public void monitorDataReportForDay()   {
+        try{
+            log.info("月报报任务开始执行");
+            monitorDataService.getMonitorDataByDay();
+            log.info("月报任务执行结束");
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("月报任务执行异常,{}", e.getMessage());
+        }
+    }
+
+    /**
+     * 年报
+     * 每月执行一次
+     * 统计上月每天的数据
+     */
+    @Async
+//    @Scheduled(cron = "0 0 0 1 * ? ")
+    @Scheduled(cron = "0 0 0 * * ? ")
+    public void monitorDataReportForMonth() {
+        try{
+            log.info("年报报任务开始执行");
+            monitorDataService.getMonitorDataByMonth();
+            log.info("年报任务执行结束");
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("年报任务执行异常,{}", e.getMessage());
+        }
+    }
+
+}

+ 49 - 0
sms_water/src/main/java/com/huaxu/controller/MonitorDataController.java

@@ -0,0 +1,49 @@
+package com.huaxu.controller;
+
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.MonitorDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @description
+ * @auto wangli
+ * @data 2020-12-02 8:19
+ */
+@RestController
+@RequestMapping("/MonitorData")
+@Api(tags = "mogodb数据测试")
+public class MonitorDataController {
+    @Autowired
+    private MonitorDataService monitorDataService;
+
+    @RequestMapping(value = "save",method = RequestMethod.POST)
+    @ApiOperation(value = "保存测试")
+    public AjaxMessage<MonitorDataEntity> save( @RequestBody MonitorDataEntity monitorDataEntity){
+
+        return new AjaxMessage<>(ResultStatus.OK,monitorDataService.save(monitorDataEntity));
+    }
+
+    @RequestMapping(value = "findList",method = RequestMethod.GET)
+    @ApiOperation(value = "列表查询测试")
+    public AjaxMessage<List<MonitorDataEntity>> findList(){
+
+        return new AjaxMessage<>(ResultStatus.OK,monitorDataService.findList());
+    }
+
+    @RequestMapping(value = "testGroupBy",method = RequestMethod.GET)
+    @ApiOperation(value = "聚合查询测试")
+    public AjaxMessage<List<MonitorDataEntity>> testGroupBy(){
+
+        return new AjaxMessage<>(ResultStatus.OK,monitorDataService.groupBy());
+    }
+}

+ 7 - 7
sms_water/src/main/java/com/huaxu/dao/AlarmDetailMapper.java

@@ -29,8 +29,8 @@ public interface AlarmDetailMapper {
      * 查询设备报警
      * @return
      */
-    List<AlarmDetailsRealTimeDto> selectRealTimeByIds( @Param("ids") List<Integer> ids);
-    List<AlarmDetailsHistoryDto> selectHistoryByIds( @Param("ids") List<Integer> ids);
+    List<AlarmDetailsRealTimeDto> selectRealTimeByIds(@Param("ids") List<Integer> ids);
+    List<AlarmDetailsHistoryDto> selectHistoryByIds(@Param("ids") List<Integer> ids);
     /**
      * 添加设备报警
      * @return
@@ -59,7 +59,7 @@ public interface AlarmDetailMapper {
      * 挂起、恢复设备报警
      * @return
      */
-    Integer suspendedById(@Param("id") Integer id, @Param("opState") Integer opState,@Param("dateUpdate")  Date dateUpdate ,@Param("updateBy") String updateBy);
+    Integer suspendedById(@Param("id") Integer id, @Param("opState") Integer opState, @Param("dateUpdate") Date dateUpdate, @Param("updateBy") String updateBy);
 
     /**
      * 修改设备报警信息
@@ -98,21 +98,21 @@ public interface AlarmDetailMapper {
      * 分页查询实时数据
      * @return
      */
-    IPage<AlarmDetailsRealTimeDto> selectRealTimePage(@Param("page")IPage<AlarmDetailsRealTimeDto> page, @Param("alarmDetailsDto")AlarmDetailsDto alarmDetailsDto);
+    IPage<AlarmDetailsRealTimeDto> selectRealTimePage(@Param("page") IPage<AlarmDetailsRealTimeDto> page, @Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
      * 分页查询历史数据
      * @return
      */
-    IPage<AlarmDetailsHistoryDto> selectHistoryPage(@Param("page")IPage<AlarmDetailsHistoryDto> page, @Param("alarmDetailsDto")AlarmDetailsDto alarmDetailsDto);
+    IPage<AlarmDetailsHistoryDto> selectHistoryPage(@Param("page") IPage<AlarmDetailsHistoryDto> page, @Param("alarmDetailsDto") AlarmDetailsDto alarmDetailsDto);
 
 
     /**
      * 查询报警规则数据
      * @return
      */
-    List<DeviceCheckAlarmDto> selectDeviceForCheckAlarm(@Param("deviceCode") String deviceCode, @Param("alarmType") String alarmType);
+    List<DeviceCheckAlarmDto> selectDeviceForCheckAlarm(@Param("deviceId") Integer deviceId, @Param("alarmType") String alarmType);
 
     /**
      * 查询设备报警信息
@@ -121,6 +121,6 @@ public interface AlarmDetailMapper {
     List<AlarmDetailsDto> selectStateAlarm(@Param("deviceId") Integer deviceId, @Param("alarmType") String alarmType);
 
 
-    Integer udpateLastUpdateTime(@Param("deviceCode") String deviceCode, @Param("lastUpdateTime") Date lastUpdateTime);
+    Integer udpateLastUpdateTime(@Param("deviceId") Integer deviceId, @Param("lastUpdateTime") Date lastUpdateTime);
 
 }

+ 24 - 0
sms_water/src/main/java/com/huaxu/dao/MonitorDataMapper.java

@@ -0,0 +1,24 @@
+package com.huaxu.dao;
+
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonthReportEntity;
+import com.huaxu.entity.YearReportEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @description 设备数据
+ * @auto wangli
+ * @data 2020-12-01 10:12
+ */
+@Mapper
+public interface MonitorDataMapper {
+
+    MonitorDataEntity getDeviceMonitorInfoByDeviceCode(String deviceCode);
+    void batchInsertYearReport(@Param("year") Integer year, @Param("month")Integer month);
+    void batchInsertMonthReport(@Param("year") Integer year, @Param("month")Integer month, @Param("day")Integer day);
+    void batchInsertDayReport( @Param("dayReportEntities") List<DayReportEntity> dayReportEntities);
+}

+ 1 - 1
sms_water/src/main/java/com/huaxu/entity/AlarmDetailsEntity.java

@@ -21,7 +21,7 @@ public class AlarmDetailsEntity implements Serializable {
     private static final long serialVersionUID = 6916916266193290481L;
 
     @ApiModelProperty(value = "主键id")
-    private Integer id;
+    private Long id;
     @ApiModelProperty(value = "租户标识")
     private String tenantId;
 

+ 1 - 1
sms_water/src/main/java/com/huaxu/entity/DeviceEntity.java

@@ -24,7 +24,7 @@ public class DeviceEntity implements Serializable {
     private static final long serialVersionUID = 6722509154948828769L;
 
     @ApiModelProperty(value = "主键id")
-    private Integer id;
+    private Long id;
     @ApiModelProperty(value = "租户标识")
     private String tenantId;
 

+ 9 - 1
sms_water/src/main/java/com/huaxu/entity/MonitorDataEntity.java

@@ -21,7 +21,15 @@ public class MonitorDataEntity implements Serializable {
     private static final long serialVersionUID = 1631901801203895285L;
 
     @ApiModelProperty("主键")
-    private BigInteger id;
+    private Long id;
+    @ApiModelProperty("年")
+    private Integer year;
+    @ApiModelProperty("月")
+    private Integer month;
+    @ApiModelProperty("日")
+    private Integer day;
+    @ApiModelProperty("时")
+    private Integer hour;
     @ApiModelProperty("租户标识")
     private String tenantId;
     @ApiModelProperty("一级场景信息")

+ 8 - 3
sms_water/src/main/java/com/huaxu/entity/MonitorDataValueEntity.java

@@ -2,7 +2,8 @@ package com.huaxu.entity;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
 
 /**
  * @description
@@ -10,14 +11,18 @@ import org.springframework.data.mongodb.core.mapping.Document;
  * @data 2020-12-01 10:50
  */
 @Data
-public class MonitorDataValueEntity {
+public class MonitorDataValueEntity implements Serializable {
+
+    private static final long serialVersionUID = 4074399088580570408L;
 
     @ApiModelProperty("设备属性")
-    private Integer attributeId;
+    private Long attributeId;
     @ApiModelProperty("设备属性名称")
     private String attributeName;
     @ApiModelProperty("属性标识符")
     private String identifier;
     @ApiModelProperty("采集数据")
     private Double dataValue;
+    @ApiModelProperty("采集数据单位")
+    private Double unit;
 }

+ 4 - 0
sms_water/src/main/java/com/huaxu/entity/MonthReportEntity.java

@@ -103,6 +103,10 @@ public class MonthReportEntity {
     @ApiModelProperty(value = "最新值")
     private Double latestValue;
 
+    /** 统计条数 */
+    @ApiModelProperty(value = "统计条数")
+    private Integer countNum;
+
     /** 采集时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     @NotNull(message = "参数值不能为空")

+ 110 - 72
sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveData.java

@@ -6,6 +6,7 @@ package com.huaxu.rabbitmq;
  * @data 2020-11-18 21:23
  */
 
+import ch.qos.logback.core.net.SyslogOutputStream;
 import com.alibaba.fastjson.JSONObject;
 import com.huaxu.common.CalcUtil;
 import com.huaxu.common.StringUtils;
@@ -13,6 +14,12 @@ import com.huaxu.dao.AlarmDetailMapper;
 import com.huaxu.dto.AlarmDetailsDto;
 import com.huaxu.dto.DeviceCheckAlarmDto;
 import com.huaxu.entity.AlarmDetailsEntity;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonitorDataValueEntity;
+import com.huaxu.service.MonitorDataService;
+import com.huaxu.util.ByteArrayUtils;
+import com.huaxu.util.RedisUtil;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.springframework.amqp.core.AmqpTemplate;
@@ -26,10 +33,7 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Component
@@ -46,6 +50,8 @@ public class ReceiveData {
     @Value("${spring.rabbitmq.listener.queue}")
     private   String rabbitmqQueue;
 
+    @Autowired
+    private MonitorDataService monitorDataService;
     /**
      * 先注入,然后再通过SPEL取值
      * @return
@@ -72,6 +78,12 @@ public class ReceiveData {
 
     public void receivedDataHandle(byte[] receivedData){
 
+    //{"agentIdentifier":"balikun_lvyuantest_tcp_agent",
+    //"eventTime":"2020-11-25 19:05:56","id":781234302422745088,"manufacturer":"lvyuantest","mode":"TCP-JSON",
+    //"originalData":"{\"temp\":0,\"currentPress\":30,\"positiveFlow\":50,\"meterElectricity\":70,\"reverseFlow\":60,\"PH\":8.474,\"currentFlow\":20,\"VOL_STATUS\":1,\"EC\":0,\"currentFlowRate\":40}",
+    //"originalDataFormat":"application/json",
+    //"parsedData":"{\"temp\":0,\"currentPress\":30,\"positiveFlow\":50,\"meterElectricity\":70,\"reverseFlow\":60,\"PH\":8.474,\"currentFlow\":20,\"VOL_STATUS\":1,\"EC\":0,\"currentFlowRate\":40}",
+    //"type":"水质监测仪","unitIdentifier":"HX_DH-001"}
 
         JSONObject jsonObject = JSONObject.parseObject(new String(receivedData));
         //对象有时间、有设备编码、有数据则解析
@@ -87,81 +99,107 @@ public class ReceiveData {
 
             String devcieCode =jsonObject .getString("unitIdentifier");
             JSONObject receiveData =JSONObject.parseObject(jsonObject .getString("parsedData"));
+
+            //保存报警数据
+            if(StringUtils.isBlank(devcieCode)){
+                return ;
+            }
+            MonitorDataEntity monitorDataEntity =  monitorDataService.getDeviceMonitorInfoByDeviceCode(devcieCode);
+            //查询不到设备或者设备属性为空
+            if(monitorDataEntity == null
+                    || monitorDataEntity.getDataValues() == null
+                    || monitorDataEntity.getDataValues().size() == 0){
+                return ;
+            }
+            List<MonitorDataValueEntity> monitorDataValueEntities= monitorDataEntity.getDataValues();
+            for(MonitorDataValueEntity monitorDataValueEntity :monitorDataValueEntities){
+                monitorDataValueEntity.setDataValue(receiveData.getDouble(monitorDataValueEntity.getIdentifier()));
+                //单位问题处理
+            }
+            monitorDataEntity.setCollectDate(receiveDateTime);
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(receiveDateTime);
+            monitorDataEntity.setYear(cal.get(Calendar.YEAR));
+            monitorDataEntity.setMonth(cal.get(Calendar.MONTH)+1);
+            monitorDataEntity.setDay(cal.get(Calendar.DAY_OF_MONTH));
+            monitorDataEntity.setHour(cal.get(Calendar.HOUR_OF_DAY));
+            monitorDataService.save(monitorDataEntity);
+
             //修改设备上报时间
-            alarmDetailMapper.udpateLastUpdateTime(devcieCode,receiveDateTime);
-
-            if(StringUtils.isNotBlank(devcieCode)){
-               //获取需要验证的报警条件
-                List<DeviceCheckAlarmDto> deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(devcieCode,"参数报警");
-               //有设置报警参数
-               if(deviceCheckAlarmDtos.size()>0 && StringUtils.isNotBlank(deviceCheckAlarmDtos.get(0).getIdentifiter())){
-                   Integer deviceId= deviceCheckAlarmDtos.get(0).getDeviceId();
-                   //系统中已存在的报警信息
-                   List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(deviceId,"参数报警");
-                   //已存在的报警信息转为map方便匹配alarmSettingId
-                   Map<Integer,AlarmDetailsDto> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1));
-
-                   List<AlarmDetailsEntity> insert =new ArrayList<>();
-                   List<AlarmDetailsDto> update =new ArrayList<>();
-                   List<AlarmDetailsDto> delete =new ArrayList<>();
-
-                   //校验各参数异常情况
-                   for(DeviceCheckAlarmDto deviceCheckAlarmDto:deviceCheckAlarmDtos){
-                       //获取参数接收值
-                       Double receivedValue = receiveData.getDouble(deviceCheckAlarmDto.getIdentifiter());
-
-                       if(deviceCheckAlarmDto.checkdeviceAttributeAlarm(receivedValue)){
-                          //判断报警是否已存在
-                           if(alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())){
-                               AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(deviceCheckAlarmDto.getAlarmSettingId());
-                               alarmDetailsDto.setAlarmValue(receivedValue);
-                               alarmDetailsDto.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
-                               alarmDetailsDto.setMinValue(CalcUtil.compareBySign(alarmDetailsDto.getMinValue(),receivedValue, "<")?alarmDetailsDto.getMinValue():receivedValue);
-                               alarmDetailsDto.setMaxValue(CalcUtil.compareBySign(alarmDetailsDto.getMaxValue(),receivedValue,">")?alarmDetailsDto.getMaxValue():receivedValue);
+            alarmDetailMapper.udpateLastUpdateTime(monitorDataEntity.getDeviceId(),receiveDateTime);
+
+           //获取需要验证的报警条件
+            List<DeviceCheckAlarmDto> deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(monitorDataEntity.getDeviceId(),"参数报警");
+           //有设置报警参数
+           if(deviceCheckAlarmDtos.size()>0 && StringUtils.isNotBlank(deviceCheckAlarmDtos.get(0).getIdentifiter())){
+               Integer deviceId= deviceCheckAlarmDtos.get(0).getDeviceId();
+               //系统中已存在的报警信息
+               List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(deviceId,"参数报警");
+               //已存在的报警信息转为map方便匹配alarmSettingId
+               Map<Integer,AlarmDetailsDto> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1));
+
+               List<AlarmDetailsEntity> insert =new ArrayList<>();
+               List<AlarmDetailsDto> update =new ArrayList<>();
+               List<AlarmDetailsDto> delete =new ArrayList<>();
+
+               //校验各参数异常情况
+               for(DeviceCheckAlarmDto deviceCheckAlarmDto:deviceCheckAlarmDtos){
+                   //获取参数接收值
+                   Double receivedValue = receiveData.getDouble(deviceCheckAlarmDto.getIdentifiter());
+
+                   if(deviceCheckAlarmDto.checkdeviceAttributeAlarm(receivedValue)){
+                      //判断报警是否已存在
+                       if(alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())){
+                           AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(deviceCheckAlarmDto.getAlarmSettingId());
+                           alarmDetailsDto.setAlarmValue(receivedValue);
+                           alarmDetailsDto.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
+                           alarmDetailsDto.setMinValue(CalcUtil.compareBySign(alarmDetailsDto.getMinValue(),receivedValue, "<")?alarmDetailsDto.getMinValue():receivedValue);
+                           alarmDetailsDto.setMaxValue(CalcUtil.compareBySign(alarmDetailsDto.getMaxValue(),receivedValue,">")?alarmDetailsDto.getMaxValue():receivedValue);
 //                                   update.add(alarmDetailsDto);
-                               alarmDetailsDto.setDateUpdate( new Date());
-                               alarmDetailMapper.update(alarmDetailsDto);
-                               //已存在的修改后从集合移除
-                               alarmDetailsDtoMap.remove(deviceCheckAlarmDto.getAlarmSettingId());
-                           }else{
-                               AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsDto();
-                               alarmDetailsEntity.setTenantId(deviceCheckAlarmDto.getTenantId());
-                               alarmDetailsEntity.setDeviceId(deviceCheckAlarmDto.getDeviceId());
-                               alarmDetailsEntity.setCompanyOrgId(deviceCheckAlarmDto.getCompanyOrgId());
-                               alarmDetailsEntity.setDeptOrgId(deviceCheckAlarmDto.getDeptOrgId());
-                               alarmDetailsEntity.setAlarmType(deviceCheckAlarmDto.getAlarmType());
-                               alarmDetailsEntity.setAttributeId(deviceCheckAlarmDto.getAttributeId());
-                               alarmDetailsEntity.setAlarmValue(receivedValue);
-                               alarmDetailsEntity.setAlarmStartTime(receiveDateTime);
-                               alarmDetailsEntity.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
-                               alarmDetailsEntity.setAlarmSettingId(deviceCheckAlarmDto.getAlarmSettingId());
-                               alarmDetailsEntity.setState(1);
-                               alarmDetailsEntity.setOpState(1);
-                               alarmDetailsEntity.setMinValue(receivedValue);
-                               alarmDetailsEntity.setMaxValue(receivedValue);
-                               alarmDetailsEntity.setStatus(1);
-                               alarmDetailsEntity.setDateCreate(new Date());
-                               alarmDetailsEntity.setDateUpdate(new Date());
-                               alarmDetailsEntity.setCreateBy("system");
-                               alarmDetailsEntity.setUpdateBy("system");
-                               insert.add(alarmDetailsEntity);
-                           }
+                           alarmDetailsDto.setDateUpdate( new Date());
+                           alarmDetailMapper.update(alarmDetailsDto);
+                           //已存在的修改后从集合移除
+                           alarmDetailsDtoMap.remove(deviceCheckAlarmDto.getAlarmSettingId());
+                       }else{
+                           AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsDto();
+                           alarmDetailsEntity.setTenantId(deviceCheckAlarmDto.getTenantId());
+                           alarmDetailsEntity.setDeviceId(deviceCheckAlarmDto.getDeviceId());
+                           alarmDetailsEntity.setCompanyOrgId(deviceCheckAlarmDto.getCompanyOrgId());
+                           alarmDetailsEntity.setDeptOrgId(deviceCheckAlarmDto.getDeptOrgId());
+                           alarmDetailsEntity.setAlarmType(deviceCheckAlarmDto.getAlarmType());
+                           alarmDetailsEntity.setAttributeId(deviceCheckAlarmDto.getAttributeId());
+                           alarmDetailsEntity.setAlarmValue(receivedValue);
+                           alarmDetailsEntity.setAlarmStartTime(receiveDateTime);
+                           alarmDetailsEntity.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
+                           alarmDetailsEntity.setAlarmSettingId(deviceCheckAlarmDto.getAlarmSettingId());
+                           alarmDetailsEntity.setState(1);
+                           alarmDetailsEntity.setOpState(1);
+                           alarmDetailsEntity.setMinValue(receivedValue);
+                           alarmDetailsEntity.setMaxValue(receivedValue);
+                           alarmDetailsEntity.setStatus(1);
+                           alarmDetailsEntity.setDateCreate(new Date());
+                           alarmDetailsEntity.setDateUpdate(new Date());
+                           alarmDetailsEntity.setCreateBy("system");
+                           alarmDetailsEntity.setUpdateBy("system");
+                           insert.add(alarmDetailsEntity);
                        }
-                    }
-                   //处理完成后,剩下的标记为历史数据
-                   for(AlarmDetailsDto alarmDetailsDto:alarmDetailsDtoMap.values()){
-                       alarmDetailsDto.setState(0);
-                       alarmDetailsDto.setAlarmEndTime(receiveDateTime);
-                       alarmDetailsDto.setDateUpdate(new Date());
-                       alarmDetailMapper.update(alarmDetailsDto);
-                   }
-                   //批量插入新增报警
-                   if(insert.size()>0){
-                    alarmDetailMapper.batchInsert(insert);
                    }
+                }
+               //处理完成后,剩下的标记为历史数据
+               for(AlarmDetailsDto alarmDetailsDto:alarmDetailsDtoMap.values()){
+                   alarmDetailsDto.setState(0);
+                   alarmDetailsDto.setAlarmEndTime(receiveDateTime);
+                   alarmDetailsDto.setDateUpdate(new Date());
+                   alarmDetailMapper.update(alarmDetailsDto);
+               }
+               //批量插入新增报警
+               if(insert.size()>0){
+                alarmDetailMapper.batchInsert(insert);
                }
            }
+
         }
 
     }
+
 }

+ 77 - 0
sms_water/src/main/java/com/huaxu/service/MonitorDataService.java

@@ -0,0 +1,77 @@
+package com.huaxu.service;
+
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonthReportEntity;
+import com.huaxu.entity.YearReportEntity;
+
+import java.util.List;
+
+/**
+ * @description
+ * @auto wangli
+ * @data 2020-12-01 10:14
+ */
+public interface MonitorDataService {
+
+    /**
+     * 保存
+     * @param monitorDataEntity
+     * @return
+     */
+    MonitorDataEntity save(MonitorDataEntity monitorDataEntity);
+
+    /**
+     * 删除
+     * @param id
+     */
+    void remove(Long id);
+
+    /**
+     * 修改
+     * @param monitorDataEntity
+     */
+    void update(MonitorDataEntity monitorDataEntity);
+
+    /**
+     * 通过id查询
+     * @param id
+     * @return
+     */
+    MonitorDataEntity findById(Long id);
+
+    /**
+     * 查询列表(另外再写,此处单纯测试)
+     * @return
+     */
+    List<MonitorDataEntity> findList();
+
+    /**
+     * 聚合(另外再写,此处单纯测试)
+     * @return
+     */
+    List<MonitorDataEntity> groupBy();
+
+    /**
+     * 查询基础设备信息
+     * @param deviceCode
+     * @return
+     */
+    MonitorDataEntity getDeviceMonitorInfoByDeviceCode(String deviceCode);
+
+    /**
+     * 生成每小时数据的日报
+     * @return
+     */
+    List<DayReportEntity> getMonitorDataByHour();
+    /**
+     * 生成每天数据的月报
+     * @return
+     */
+    void getMonitorDataByDay();
+    /**
+     * 生成每月数据的年报
+     * @return
+     */
+    void getMonitorDataByMonth();
+}

+ 174 - 0
sms_water/src/main/java/com/huaxu/service/impl/MonitorDataServiceImpl.java

@@ -0,0 +1,174 @@
+package com.huaxu.service.impl;
+
+import com.huaxu.dao.MonitorDataMapper;
+import com.huaxu.entity.DayReportEntity;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonthReportEntity;
+import com.huaxu.entity.YearReportEntity;
+import com.huaxu.service.MonitorDataService;
+import com.huaxu.util.ByteArrayUtils;
+import com.huaxu.util.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description
+ * @auto wangli
+ * @data 2020-12-01 11:09
+ */
+@Service
+public class MonitorDataServiceImpl implements MonitorDataService {
+
+    @Resource
+    private MongoTemplate mongoTemplate;
+
+    @Resource
+    private MonitorDataMapper monitorDataMapper;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    public MonitorDataEntity save(MonitorDataEntity monitorDataEntity) {
+        //缓存数据
+        redisUtil.setExpire(("sms_water_"+monitorDataEntity.getDeviceCode()).getBytes(), ByteArrayUtils.objectToBytes(monitorDataEntity).get());
+        //把没有数据的属性去掉再保存
+        monitorDataEntity.setDataValues(monitorDataEntity.getDataValues().stream().filter(m -> m.getDataValue()!=null).collect(Collectors.toList()));
+
+        return mongoTemplate.save(monitorDataEntity);
+    }
+
+    public MonitorDataEntity getDeviceMonitorInfoByDeviceCode(String deviceCode){
+        //先取缓存里的数据
+        byte[] bytes = redisUtil.get(("sms_water_"+deviceCode).getBytes());
+        if(bytes != null && bytes.length>0){
+            return (MonitorDataEntity)ByteArrayUtils.bytesToObject(bytes).get();
+        }
+        return monitorDataMapper.getDeviceMonitorInfoByDeviceCode(deviceCode);
+    }
+
+    @Override
+    public void remove(Long id) {
+        mongoTemplate.remove(id);
+    }
+
+    @Override
+    public void update(MonitorDataEntity monitorDataEntity) {
+        Query query = new Query(Criteria.where("id").is(monitorDataEntity.getId()));
+
+        Update update = new Update();
+        update.set("sceneName", monitorDataEntity.getSceneName());
+        update.set("deviceName", monitorDataEntity.getDeviceName());
+
+
+        mongoTemplate.updateFirst(query, update, MonitorDataEntity.class);
+    }
+
+    @Override
+    public MonitorDataEntity findById(Long id) {
+        Query query = new Query(Criteria.where("id").is(id));
+        MonitorDataEntity monitorDataEntity = mongoTemplate.findOne(query, MonitorDataEntity.class);
+        return monitorDataEntity;
+    }
+
+
+    @Override
+    public List<MonitorDataEntity> findList() {
+        Criteria criteria = new Criteria();
+        criteria.and("collectDate").lt(new Date());
+        Query query = new Query(criteria);
+        List<MonitorDataEntity> monitorDataEntitys = mongoTemplate.find(query, MonitorDataEntity.class,"SMS_MONITOR_DATA");
+        return monitorDataEntitys;
+    }
+
+    public List<MonitorDataEntity> groupBy(){
+        Criteria criteria = new Criteria();
+//        criteria.and("collectDate").lt(new Date());
+
+        Criteria elemMatchCriteria = new Criteria();
+        elemMatchCriteria.and("dataValue").gt(33);
+        criteria.and("dataValues").elemMatch(elemMatchCriteria);//查询数组里面的数据
+        Aggregation agg = Aggregation.newAggregation(
+                Aggregation.match(criteria),    //查询条件
+                Aggregation.unwind("dataValues"),//将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
+//                Aggregation.sort(Sort.Direction.DESC, "readDate"),//在聚合之前对数据进行排序
+                Aggregation.group("deviceId","dataValues.attributeId" )
+                        .sum("$dataValues.dataValue").as("sumDataValue")
+                        .max("$dataValues.dataValue").as("maxDataValue")
+                        .min("$dataValues.dataValue").as("minDataValue")
+                        .avg("$dataValues.dataValue").as("avgDataValue")
+                        .first("$dataValues.dataValue").as("firstDataValue")
+                        .count().as("countDataValue")
+        );
+//        AggregationResults<MonitorDataEntity> durationData =
+//                mongoTemplate.aggregate(agg, "SMS_MONITOR_DATA", MonitorDataEntity.class);
+//        List<MonitorDataEntity> monitorDataEntities = durationData.getMappedResults();
+//        return monitorDataEntities;
+        AggregationResults<Object> durationData =
+                mongoTemplate.aggregate(agg, "SMS_MONITOR_DATA", Object.class);
+        List<Object> monitorDataEntities = durationData.getMappedResults();
+        return null;
+    }
+
+    public List<DayReportEntity> getMonitorDataByHour(){
+        //取前一个小时的时间
+        LocalDateTime dateTime = LocalDateTime.now().plusHours(-1);
+
+        Criteria criteria = new Criteria();
+        criteria.and("year").lt(dateTime.getYear());
+        criteria.and("month").lt(dateTime.getMonthValue());
+        criteria.and("day").lt(dateTime.getDayOfMonth());
+        criteria.and("hour").lt(dateTime.getHour());
+        Aggregation agg = Aggregation.newAggregation(
+                Aggregation.match(criteria),    //查询条件
+                Aggregation.unwind("dataValues"),//将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
+                Aggregation.sort(Sort.Direction.DESC, "collectDate"),//在聚合之前对数据进行排序
+                Aggregation.group("tenantId","year","month","day","hour","parentSceneId","parentSceneName","sceneId",
+                        "sceneName","deviceId","deviceName","deviceCode","dataValues.attributeId","dataValues.attributeName" )
+                        .min("$dataValues.dataValue").as("minValue")
+                        .max("$dataValues.dataValue").as("maxValue")
+                        .avg("$dataValues.dataValue").as("avgValue")
+                        .sum("$dataValues.dataValue").as("sumValue")
+                        .last("$dataValues.dataValue").as("latestValue")
+                        .last("$collectDate").as("collectDate")
+                        .count().as("countNum")
+        );
+        AggregationResults<DayReportEntity> durationData =
+                mongoTemplate.aggregate(agg, "SMS_MONITOR_DATA", DayReportEntity.class);
+        //获取查询结果
+        List<DayReportEntity> monthReportEntities = durationData.getMappedResults();
+        //保存日报表数据
+        monitorDataMapper.batchInsertDayReport(monthReportEntities);
+        return monthReportEntities;
+    }
+
+    @Override
+    public void getMonitorDataByDay() {
+        //取前一天的时间
+        LocalDateTime dateTime = LocalDateTime.now().plusDays(-1);
+        //保存日报表数据
+        monitorDataMapper.batchInsertMonthReport(dateTime.getYear(),dateTime.getMonthValue(),dateTime.getDayOfMonth());
+    }
+
+    @Override
+    public void getMonitorDataByMonth() {
+        //取前一月的时间
+        LocalDateTime dateTime = LocalDateTime.now().plusMonths(-1);
+        //保存日报表数据
+        monitorDataMapper.batchInsertYearReport(dateTime.getYear(),dateTime.getMonthValue());
+    }
+}

+ 5 - 0
sms_water/src/main/resources/application-dev.properties

@@ -17,6 +17,11 @@ spring.jackson.time-zone=GMT+8
 #spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
 #spring.jackson.joda-date-time-format: yyyy-MM-dd HH:mm:ss
 
+
+#mongodb
+spring.data.mongodb.uri=mongodb://127.0.0.1:27017/sms
+logging.level.org.springframework.data.mongodb.core=DEBUG
+
 # redis
 spring.redis.host=114.135.61.188
 spring.redis.port=26379

+ 5 - 5
sms_water/src/main/resources/mapper/AlarmDetailMapper.xml

@@ -614,7 +614,7 @@
             ,a.ALARM_CONDITION as "alarmCondition"
             ,a.ALARM_VALUE as "alarmValue"
             ,a.id as "alarmSettingId"
-        <if test="deviceCode != null">
+        <if test="deviceId != null">
             ,da.id as "attributeId"
             ,da.IDENTIFIER as "identifiter"
 		    ,da.`NAME` as "attributeName"
@@ -622,12 +622,12 @@
         </if>
         from sms_device d
         left join sms_alarm_setting a on a.DEVICE_ID =d.ID and a.ALARM_TYPE =#{alarmType} and a.ALARM_VALUE is not null
-        <if test="deviceCode != null">
+        <if test="deviceId != null">
             left join sms_device_attribute da on da.id=a.ATTRIBUTE_ID
         </if>
         where  a.ALARM_VALUE is not null and a.ALARM_CONDITION is not null and d.status = 1 and a.status = 1
-        <if test="deviceCode != null">
-            and d.DEVICE_CODE=#{deviceCode}
+        <if test="deviceId != null">
+            and d.id=#{deviceId}
         </if>
     </select>
 
@@ -655,6 +655,6 @@
     </select>
 
     <update id="udpateLastUpdateTime">
-        update sms_device set LAST_UPDATE_TIME =#{lastUpdateTime} where DEVICE_CODE=#{deviceCode}
+        update sms_device set LAST_UPDATE_TIME =#{lastUpdateTime} where id=#{deviceId}
     </update>
 </mapper>

+ 85 - 0
sms_water/src/main/resources/mapper/MonitorDataMapper.xml

@@ -0,0 +1,85 @@
+<?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.huaxu.dao.MonitorDataMapper">
+
+    <resultMap id="DeviceMonitorInfo" type="com.huaxu.entity.MonitorDataEntity">
+        <result property="tenantId" column="tenantId" jdbcType="INTEGER"/>
+        <result property="parentSceneId" column="parentSceneId" jdbcType="INTEGER"/>
+        <result property="parentSceneName" column="parentSceneName" jdbcType="INTEGER"/>
+        <result property="sceneId" column="sceneId" jdbcType="INTEGER"/>
+        <result property="sceneName" column="sceneName" jdbcType="INTEGER"/>
+        <result property="deviceId" column="deviceId" jdbcType="INTEGER"/>
+        <result property="deviceName" column="deviceName" jdbcType="INTEGER"/>
+        <result property="deviceCode" column="deviceCode" jdbcType="INTEGER"/>
+        <collection property="dataValues" ofType="com.huaxu.entity.MonitorDataValueEntity" >
+            <result property="attributeId" column="attributeId" jdbcType="INTEGER"/>
+            <result property="attributeName" column="attributeName" jdbcType="INTEGER"/>
+            <result property="identifier" column="identifier" jdbcType="INTEGER"/>
+            <result property="unit" column="unit" jdbcType="INTEGER"/>
+        </collection>
+    </resultMap>
+    <select id="getDeviceMonitorInfoByDeviceCode" resultMap="DeviceMonitorInfo">
+
+        select
+            d.TENANT_ID as "tenantId"
+            ,ps.id as "parentSceneId"
+            ,ps.SCENE_NAME as "parentSceneName"
+            ,s.id as "sceneId"
+            ,s.SCENE_NAME as "sceneName"
+            ,d.id as "deviceId"
+            ,d.DEVICE_NAME as "deviceName"
+            ,d.DEVICE_CODE as "deviceCode"
+            ,da.id as "attributeId"
+            ,da.`NAME` as "attributeName"
+            ,da.IDENTIFIER as "identifier"
+            ,da.UNIT as "unit"
+        from sms_device d
+        left join sms_scene s on s.id = d.SCENE_ID and s.`STATUS` = 1
+        left join sms_scene ps on s.id LIKE concat('%,', ps.id ,',%') and ps.PARENT_SCENE_ID ='0' and ps.`STATUS` = 1
+        left join sms_device_type dt on dt.id=d.DEVICE_TYPE_ID and dt.`STATUS` = 1
+        left join sms_device_attribute da on dt.id=da.DEVICE_TYPE_ID and da.`STATUS` = 1
+        where d.`STATUS` =1 and d.DEVICE_CODE=''
+
+    </select>
+
+    <insert id="batchInsertDayReport">
+        INSERT INTO sms_day_report(
+        TENANT_ID, YEAR, MONTH, DAY, HOUR, PARENT_SCENE_ID, PARENT_SCENE_NAME, SCENE_ID, SCENE_NAME, DEVICE_ID, DEVICE_NAME, DEVICE_CODE, ATTRIBUTE_ID,
+        ATTRIBUTE_NAME, MIN_VALUE, MAX_VALUE, AVG_VALUE, SUM_VALUE, LATEST_VALUE, COLLECT_DATE)
+        VALUES
+        <foreach collection="dayReportEntities" item="item" index="index" separator=",">
+            (#{item.tenantId},#{item.year},#{item.month},#{item.day},#{item.hour},#{item.parentSceneId},#{item.parentSceneName},#{item.sceneId},#{item.sceneName},#{item.deviceId},#{item.deviceName},#{item.deviceCode},#{item.attributeId},
+            #{item.attributeName},#{item.minValue},#{item.maxValue},#{item.avgValue},#{item.sumValue},#{item.latestValue},#{item.collectDate})
+        </foreach>
+    </insert>
+
+    <insert id="batchInsertYearReport">
+        INSERT INTO `sms`.`sms_year_report`( `TENANT_ID`, `PARENT_SCENE_ID`, `PARENT_SCENE_NAME`, `SCENE_ID`, `SCENE_NAME`, `DEVICE_ID`, `DEVICE_NAME`, `DEVICE_CODE`, `ATTRIBUTE_ID`, `ATTRIBUTE_NAME`, `YEAR`, `MONTH`, `MIN_VALUE`, `MAX_VALUE`, `AVG_VALUE`, `SUM_VALUE`, `LATEST_VALUE`, `COLLECT_DATE`)
+        select TENANT_ID, PARENT_SCENE_ID, PARENT_SCENE_NAME, SCENE_ID, SCENE_NAME, DEVICE_ID, DEVICE_NAME, DEVICE_CODE, ATTRIBUTE_ID, ATTRIBUTE_NAME,  YEAR, MONTH
+            ,min(MIN_VALUE) MIN_VALUE
+            ,max(MAX_VALUE) MAX_VALUE
+            ,avg(AVG_VALUE) AVG_VALUE
+            ,sum(SUM_VALUE) SUM_VALUE
+            ,(select LATEST_VALUE from sms_day_report where DEVICE_ID =a.DEVICE_ID and ATTRIBUTE_ID = a.ATTRIBUTE_ID and COLLECT_DATE = max(a.COLLECT_DATE)) LATEST_VALUE
+            ,max(COLLECT_DATE) COLLECT_DATE
+        from sms_month_report a
+        where year =#{year} and month =#{month}
+        group by TENANT_ID, PARENT_SCENE_ID, PARENT_SCENE_NAME, SCENE_ID, SCENE_NAME, DEVICE_ID, DEVICE_NAME, DEVICE_CODE, ATTRIBUTE_ID, ATTRIBUTE_NAME,  YEAR, MONTH
+    </insert>
+
+    <insert id="batchInsertMonthReport">
+        INSERT INTO `sms`.`sms_month_report`( `TENANT_ID`, `PARENT_SCENE_ID`, `PARENT_SCENE_NAME`, `SCENE_ID`, `SCENE_NAME`, `DEVICE_ID`, `DEVICE_NAME`, `DEVICE_CODE`, `ATTRIBUTE_ID`, `ATTRIBUTE_NAME`, `YEAR`, `MONTH`, `DAY`, `MIN_VALUE`, `MAX_VALUE`, `AVG_VALUE`, `SUM_VALUE`, `LATEST_VALUE`, `COLLECT_DATE`)
+
+        select TENANT_ID, PARENT_SCENE_ID, PARENT_SCENE_NAME, SCENE_ID, SCENE_NAME, DEVICE_ID, DEVICE_NAME, DEVICE_CODE, ATTRIBUTE_ID, ATTRIBUTE_NAME,  YEAR, MONTH, DAY
+            ,min(MIN_VALUE) MIN_VALUE
+            ,max(MAX_VALUE) MAX_VALUE
+            ,avg(AVG_VALUE) AVG_VALUE
+            ,sum(SUM_VALUE) SUM_VALUE
+            ,(select LATEST_VALUE from sms_day_report where DEVICE_ID =a.DEVICE_ID and ATTRIBUTE_ID = a.ATTRIBUTE_ID and COLLECT_DATE = max(a.COLLECT_DATE)) LATEST_VALUE
+            ,max(COLLECT_DATE) COLLECT_DATE
+        from sms_day_report a
+        where year = #{year} and month =#{month} and day=#{day}
+        group by TENANT_ID, PARENT_SCENE_ID, PARENT_SCENE_NAME, SCENE_ID, SCENE_NAME, DEVICE_ID, DEVICE_NAME, DEVICE_CODE, ATTRIBUTE_ID, ATTRIBUTE_NAME,  YEAR, MONTH, DAY
+    </insert>
+
+</mapper>