Selaa lähdekoodia

水泵状态报表

lihui007 3 vuotta sitten
vanhempi
commit
bcdcf8b8a4

+ 9 - 3
common/src/main/java/com/huaxu/util/DatesUtil.java

@@ -582,6 +582,14 @@ public class DatesUtil {
 		return false;
 	}
 
+	public static Date addDayOfDate(Date date,int i){
+		Calendar c = Calendar.getInstance();
+		c.setTime(date);
+		c.add(Calendar.DATE, i);
+		Date newDate = c.getTime();
+		return newDate;
+	}
+
 
 	public static void main(String[] args) {
 		//String d = "2019-11-14 13:10:16";
@@ -593,8 +601,6 @@ public class DatesUtil {
 //		Set<String> iter1 = DatesUtil.betweenMonth(DatesUtil.beforeYear(1),new Date());
 //		System.out.println(JSON.toJSONString(iter));
 //		System.out.println(JSON.toJSONString(iter1));
-		String startTime = "10:00:30";
-		String endTime   = "13:30:30";
-		System.out.println(DatesUtil.isInTime(startTime, endTime, new Date(), "HH:mm:ss"));
+		System.out.println(DatesUtil.formatDate(DatesUtil.addDayOfDate(new Date(), -(3-1)),"yyyy-MM-dd") + " 00:00:00");
 	}
 }

+ 18 - 8
sms_water/src/main/java/com/huaxu/controller/OnlineMonitorController.java

@@ -3,18 +3,20 @@ package com.huaxu.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huaxu.dao.ReportWaterPumpStateMapper;
 import com.huaxu.dto.*;
+import com.huaxu.dto.watePump.ReprotWaterPumpDto;
+import com.huaxu.dto.watePump.ReprotWaterPumpQueryDto;
 import com.huaxu.entity.MonitorDataEntity;
 import com.huaxu.entity.MonitorDataValueEntity;
 import com.huaxu.model.AjaxMessage;
 import com.huaxu.model.Pagination;
 import com.huaxu.model.ResultStatus;
-import com.huaxu.service.DeviceAttributeSpecsService;
-import com.huaxu.service.OnlineMonitorService;
-import com.huaxu.service.RevenueService;
-import com.huaxu.service.SceneService;
+import com.huaxu.service.*;
 import com.huaxu.util.ByteArrayUtils;
+import com.huaxu.util.DatesUtil;
 import com.huaxu.util.RedisUtil;
+import com.huaxu.util.UserUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -22,10 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -48,6 +47,9 @@ public class OnlineMonitorController {
     @Autowired
     private RevenueService revenueService;
 
+    @Autowired
+    private ReportWaterPumpStateService reportWaterPumpStateService;
+
     @RequestMapping(value="selectAlarmDetails" , method = RequestMethod.GET)
     @ApiOperation(value = "查询实时报警信息")
     public AjaxMessage<List<AlarmDetailsDto>> selectAlarmDetails(
@@ -323,4 +325,12 @@ public class OnlineMonitorController {
         onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
         return new AjaxMessage<>(ResultStatus.OK, onlineMonitorService.selectStateCount(onlineDataDto));
     }
+
+    @RequestMapping(value="selectWaterPumpSate" , method = RequestMethod.GET)
+    @ApiOperation(value = "查询泵站状态数据")
+    public AjaxMessage selectWaterPumpSate(
+            @ApiParam(value = "一级场景id", required = true) @RequestParam Long sceneId,
+            @ApiParam(value = "查询天数 1、3、7", required = true) @RequestParam Integer days){
+        return new AjaxMessage<>(ResultStatus.OK, reportWaterPumpStateService.findReportWaterPumpStateList(sceneService.findByParentIdsLike(sceneId),days));
+    }
 }

+ 66 - 0
sms_water/src/main/java/com/huaxu/dao/ReportWaterPumpStateMapper.java

@@ -0,0 +1,66 @@
+package com.huaxu.dao;
+
+import com.huaxu.dto.watePump.ReprotWaterPumpDto;
+import com.huaxu.dto.watePump.ReprotWaterPumpQueryDto;
+import com.huaxu.entity.ReportWaterPumpStateEntity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName ReportWaterPumpStateMapper
+ * @Description: 水泵运行状态报表Mapper
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Mapper
+public interface ReportWaterPumpStateMapper {
+
+    /**
+    * @Author lihui
+    * @Description 更新泵站运行状态的结束时间
+    * @Date 18:05 2021/4/21
+    * @Param [id, endTime, updateTime]
+    * @return int
+    **/
+    int updateReportWaterPumpState(Long id, Date endTime, Date updateTime);
+
+    /**
+    * @Author lihui
+    * @Description 批量插入
+    * @Date 18:05 2021/4/21
+    * @Param [reportWaterPumpStateEntity]
+    * @return int
+    **/
+    int batchInsertReportWaterPumpState(@Param("waterPumpList") List<ReportWaterPumpStateEntity> reportWaterPumpStateEntity);
+
+    /**
+    * @Author lihui
+    * @Description 单个插入
+    * @Date 18:06 2021/4/21
+    * @Param [reportWaterPumpStateEntity]
+    * @return int
+    **/
+    int insertReportWaterPumpState(@Param("waterPump")ReportWaterPumpStateEntity reportWaterPumpStateEntity);
+
+    /**
+    * @Author lihui
+    * @Description 查询泵站的ID和状态
+    * @Date 18:06 2021/4/21
+    * @Param [md5Query : md5签名的查询条件]
+    * @return com.huaxu.entity.ReportWaterPumpStateEntity
+    **/
+    ReportWaterPumpStateEntity findReportWaterPumpState(String md5Query);
+
+    /**
+    * @Author lihui
+    * @Description 查询场景下设备的泵站状态数据
+    * @Date 18:08 2021/4/21
+    * @Param [queryDto]
+    * @return java.util.List<com.huaxu.dto.watePump.ReprotWaterPumpDto>
+    **/
+    List<ReprotWaterPumpDto> findReportWaterPumpStateList(@Param("waterPump")ReprotWaterPumpQueryDto queryDto);
+}

+ 31 - 0
sms_water/src/main/java/com/huaxu/dto/watePump/ReprotWaterPumpDto.java

@@ -0,0 +1,31 @@
+package com.huaxu.dto.watePump;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @ClassName ReprotWaterPumpQueryDto
+ * @Description: 泵站状态数据记录
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Data
+public class ReprotWaterPumpDto implements Serializable  {
+
+    @ApiModelProperty(value = "年")
+    private Integer year;
+
+    @ApiModelProperty(value = "月")
+    private Integer month;
+
+    @ApiModelProperty(value = "日")
+    private Integer day;
+
+    @ApiModelProperty(value = "设备信息")
+    private List<WaterPumpDataDto> deviceList;
+
+}

+ 60 - 0
sms_water/src/main/java/com/huaxu/dto/watePump/ReprotWaterPumpQueryDto.java

@@ -0,0 +1,60 @@
+package com.huaxu.dto.watePump;
+
+import com.huaxu.common.Md5Util;
+import com.huaxu.dto.DeviceDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @ClassName ReprotWaterPumpQueryDto
+ * @Description: 泵站查询条件
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Data
+@Slf4j
+public class ReprotWaterPumpQueryDto {
+
+    @ApiModelProperty(value = "租户标识")
+    private String tenantId;
+
+    @ApiModelProperty(value = "设备信息")
+    private Integer deviceId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备属性")
+    private Long attributeId;
+
+    @ApiModelProperty(value = "年")
+    private Integer year;
+
+    @ApiModelProperty(value = "月")
+    private Integer month;
+
+    @ApiModelProperty(value = "日")
+    private Integer day;
+
+    @ApiModelProperty(value = "状态")
+    private Integer state;
+
+    @ApiModelProperty(value = "md5查询")
+    private String md5Query;
+
+    @ApiModelProperty(value = "开始时间")
+    private String beginTime;
+
+    @ApiModelProperty(value = "设备IDS")
+    private List<DeviceDto> deviceIds;
+
+    public String getMd5Query () {
+        return Md5Util.hash(this.tenantId + this.deviceId + this.deviceCode + this.attributeId + this.year + this.month);
+    }
+
+}

+ 36 - 0
sms_water/src/main/java/com/huaxu/dto/watePump/WaterPumpDataDto.java

@@ -0,0 +1,36 @@
+package com.huaxu.dto.watePump;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName WaterPumpStateDto
+ * @Description: 泵站设备信息
+ * @Author lihui
+ * @Date 2021/4/21
+ * @Version V1.0
+ **/
+@Data
+public class WaterPumpDataDto {
+
+    @ApiModelProperty(value = "租户标识")
+    private String tenantId;
+
+    @ApiModelProperty(value = "设备信息")
+    private Integer deviceId;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备属性")
+    private Long attributeId;
+
+    @ApiModelProperty(value = "设备名字")
+    private String attributeName;
+
+    @ApiModelProperty(value = "状态信息")
+    private List<WaterPumpStateDto> stateList;
+}

+ 31 - 0
sms_water/src/main/java/com/huaxu/dto/watePump/WaterPumpStateDto.java

@@ -0,0 +1,31 @@
+package com.huaxu.dto.watePump;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @ClassName WaterPumpStateDto
+ * @Description: 泵站状态记录
+ * @Author lihui
+ * @Date 2021/4/21
+ * @Version V1.0
+ **/
+@Data
+public class WaterPumpStateDto {
+
+
+    @ApiModelProperty("设备状态标识")
+    private Integer state;
+
+    @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date beginTime;
+
+    @ApiModelProperty("结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date endTime;
+}

+ 84 - 0
sms_water/src/main/java/com/huaxu/entity/ReportWaterPumpStateEntity.java

@@ -0,0 +1,84 @@
+package com.huaxu.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.huaxu.common.Md5Util;
+import com.huaxu.dto.DeviceDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName ReportWaterPumpStateEntity
+ * @Description: 水泵运行状态报表
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Data
+@TableName("sms_report_water_pump_state")
+public class ReportWaterPumpStateEntity {
+
+    private static final long serialVersionUID = 1L;
+
+	@TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "运行状态 :1-停止,0-运行")
+	private Integer state;
+
+    @ApiModelProperty(value = "运行状态开始时间")
+    private Date stateBeginTime;
+
+    @ApiModelProperty(value = "运行状态结束时间")
+    private Date stateEndTime;
+
+    @ApiModelProperty(value = "租户标识")
+    private String tenantId;
+
+    @ApiModelProperty(value = "设备信息")
+    private Integer deviceId;
+
+    @ApiModelProperty(value = "设备名称")
+    private String deviceName;
+
+    @ApiModelProperty(value = "设备编号")
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备属性")
+    private Long attributeId;
+
+    @ApiModelProperty(value = "设备属性名称")
+    private String attributeName;
+
+    @ApiModelProperty(value = "年")
+    private Integer year;
+
+    @ApiModelProperty(value = "月")
+    private Integer month;
+
+    @ApiModelProperty(value = "日")
+    private Integer day;
+
+    @ApiModelProperty(value = "md5查询")
+    private String md5Query;
+
+    @ApiModelProperty(value = "创建日期")
+    private Date dateCreate;
+
+    @ApiModelProperty(value = "更新日期")
+    private Date dateUpdate;
+
+    public String getMd5(){
+        return Md5Util.hash(this.tenantId + this.deviceId + this.deviceCode + this.attributeId + this.year + this.month);
+    }
+
+}

+ 5 - 0
sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveClearData.java

@@ -40,6 +40,9 @@ public class ReceiveClearData {
     @Autowired
     private AlarmDataHandler alarmDataHandler;
 
+    @Autowired
+    private  ReportWaterPumpStateHandler reportWaterPumpStateHandler;
+
     @Resource
     private AlarmDetailMapper alarmDetailMapper;
 
@@ -124,6 +127,8 @@ public class ReceiveClearData {
         saveToCacheAndMongodb(monitorDataEntity, receiveDateTime);
         // 修改设备上报时间
         alarmDetailMapper.udpateLastUpdateTime(monitorDataEntity.getDeviceId(),receiveDateTime);
+        // 水泵运行状态报表业务处理
+        reportWaterPumpStateHandler.handler(monitorDataEntity, receiveData, receiveDateTime);
         // 异步处理报警信息
         alarmDataHandler.hanlder(monitorDataEntity, receiveData, receiveDateTime);
         long end = System.currentTimeMillis();

+ 151 - 0
sms_water/src/main/java/com/huaxu/rabbitmq/ReportWaterPumpStateHandler.java

@@ -0,0 +1,151 @@
+package com.huaxu.rabbitmq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.dao.ReportWaterPumpStateMapper;
+import com.huaxu.dto.watePump.ReprotWaterPumpQueryDto;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonitorDataValueEntity;
+import com.huaxu.entity.ReportWaterPumpStateEntity;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName ReportWaterPumpStateHandler
+ * @Description: 水泵运行状态报表业务处理
+ *               清洗数据上报,条件:属性参数类型为水泵状态(2)
+ *               清洗规则:以分钟为单位计算水泵是否运行,如水泵从00:23:22开始运行, 到01:32:22是停止,
+ *                       则认为00:23-01:32分为水泵运行状态;
+ *               如果数据存在跨天,需要重新新增一条新的数据
+ * @Author lihui
+ * @Date 2021/4/20
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class ReportWaterPumpStateHandler {
+
+    @Autowired
+    private ReportWaterPumpStateMapper reportWaterPumpStateMapper;
+
+    @Async
+    public void handler(MonitorDataEntity monitorDataEntity, JSONObject receiveData, Date receiveDateTime){
+        log.info("【水泵运行状态报表:{}】开始处理", monitorDataEntity.getDeviceCode());
+        BigDecimal stateValue = null;
+        // 执行批量插入操作
+        List<ReportWaterPumpStateEntity> insertList = new ArrayList<>();
+        ReprotWaterPumpQueryDto queryDto = getReprotWaterPumpQueryDto(monitorDataEntity);
+        // 转换常量,保证获取是同一个对象
+        // 避免同一时间内同一个code上报多条数据,保证数据更新和插入一致性
+        synchronized (monitorDataEntity.getDeviceCode().intern()) {
+            for (MonitorDataValueEntity valueEntity : monitorDataEntity.getDataValues()) {
+                if (!receiveData.containsKey(valueEntity.getIdentifier())){
+                    continue;
+                }
+                stateValue  = new BigDecimal(receiveData.getDouble(valueEntity.getIdentifier()));
+                // 目前不知道哪些Identifier属性的值来表示state,所以统一用0或者1表示
+                if (stateValue == null || (stateValue.compareTo(new BigDecimal("0")) != 0 &&
+                        stateValue.compareTo(new BigDecimal("1")) != 0)) {
+                    continue;
+                }
+                queryDto.setAttributeId(valueEntity.getAttributeId());
+                addOrUpdate(queryDto.getMd5Query(), monitorDataEntity, valueEntity, insertList, stateValue.intValue(), receiveDateTime);
+            }
+            // 最后一次全部插入
+            if (insertList.size() > 0 ){
+                reportWaterPumpStateMapper.batchInsertReportWaterPumpState(insertList);
+            }
+        }
+        log.info("【水泵运行状态报表:{}】结束处理,新增:{}", monitorDataEntity.getDeviceCode(),insertList.size());
+    }
+
+    /**
+    * @Author lihui
+    * @Description 如果查询到数据,根据返回的state来判断数据
+     * 如果返回的state和上报的state同一个状态,说明该状态一直在持续,我们不需要做任何的操作
+     * 如果返回的state和上报的state不是同一个状态,说明state已经改变,我们需要更新上一次state所持续的最后时间,并新增一条目前的state的开始时间
+     * 公式:同一id-> 00:23-00:28  运行时间
+     *           -> 00:28-00:30  停止时间
+     *           -> 00:30-null   运行时间
+    * @Date 14:08 2021/4/21
+    * @Param [md5Query :查询条件, monitorDataEntity, valueEntity, inserList :需要插入的数据集合, stateValue:泵站状态,receiveDateTime:上报数据的时间]
+    * @return boolean
+    **/
+    private void addOrUpdate(String md5Query , MonitorDataEntity monitorDataEntity,
+                                  MonitorDataValueEntity valueEntity ,List<ReportWaterPumpStateEntity> inserList,
+                                  int stateValue, Date receiveDateTime){
+        ReportWaterPumpStateEntity stateEntity = reportWaterPumpStateMapper.findReportWaterPumpState(md5Query);
+        if (stateEntity == null) {
+            inserList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, receiveDateTime, stateValue));
+            return;
+        }
+        Date beginTime  = null;
+        // 计算出时间差 等于0表示同一天的数据,大于0表示跨天
+        int day  = timeDifference(stateEntity.getStateBeginTime(), receiveDateTime);
+        boolean theSameSate = stateEntity.getState().intValue() == stateValue;
+        // 跨天需要新增一条数据,如果是跨一天的数据起始时间为 receiveDateTime + 00:00:00, 跨多天就按当前上报的时间
+        if (day != 0) {
+            beginTime  = day == 1 ? parseDate(receiveDateTime, "00:00:00") : receiveDateTime;
+            reportWaterPumpStateMapper.updateReportWaterPumpState(stateEntity.getId(), parseDate(stateEntity.getStateBeginTime(), "23:59:59"), new Date());
+            inserList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, beginTime, stateValue));
+            return;
+        }
+        // 同一个状态的数据
+        if (theSameSate) {
+            return;
+        }
+        reportWaterPumpStateMapper.updateReportWaterPumpState(stateEntity.getId(), receiveDateTime, new Date());
+        inserList.add(getReportWaterPumpStateEntity(monitorDataEntity, valueEntity, receiveDateTime, stateValue));
+    }
+
+
+
+    private ReprotWaterPumpQueryDto getReprotWaterPumpQueryDto(MonitorDataEntity monitorDataEntity){
+        ReprotWaterPumpQueryDto queryDto = new ReprotWaterPumpQueryDto();
+        queryDto.setYear(monitorDataEntity.getYear());
+        queryDto.setMonth(monitorDataEntity.getMonth());
+        queryDto.setDay(monitorDataEntity.getDay());
+        queryDto.setTenantId(monitorDataEntity.getTenantId());
+        queryDto.setDeviceId(monitorDataEntity.getDeviceId());
+        queryDto.setDeviceCode(monitorDataEntity.getDeviceCode());
+        return queryDto;
+    }
+
+    private ReportWaterPumpStateEntity getReportWaterPumpStateEntity(MonitorDataEntity monitorDataEntity, MonitorDataValueEntity monitorDataValueEntity,
+                                                                     Date receiveDateTime, Integer state){
+        Date nowTime = new Date();
+        ReportWaterPumpStateEntity entity = new ReportWaterPumpStateEntity();
+        entity.setState(state);
+        entity.setTenantId(monitorDataEntity.getTenantId());
+        entity.setDeviceId(monitorDataEntity.getDeviceId());
+        entity.setDeviceCode(monitorDataEntity.getDeviceCode());
+        entity.setDeviceName(monitorDataEntity.getDeviceName());
+        entity.setYear(monitorDataEntity.getYear());
+        entity.setMonth(monitorDataEntity.getMonth());
+        entity.setDay(monitorDataEntity.getDay());
+        entity.setAttributeId(monitorDataValueEntity.getAttributeId());
+        entity.setAttributeName(monitorDataValueEntity.getAttributeName());
+        entity.setStateBeginTime(receiveDateTime);
+        entity.setDateCreate(nowTime);
+        entity.setDateUpdate(nowTime);
+        entity.setMd5Query(entity.getMd5());
+        return entity;
+    }
+
+    private int timeDifference(Date beginTime, Date endTime){
+        return Integer.parseInt(DatesUtil.formatDate(endTime, "yyyyMMdd")) - Integer.parseInt(DatesUtil.formatDate(beginTime, "yyyyMMdd"));
+    }
+
+    private Date parseDate(Date date, String appendTo){
+        return DatesUtil.parseDate(DatesUtil.formatDate(date, "yyyy-MM-dd") + " " + appendTo,
+                "yyyy-MM-dd HH:mm:ss");
+    }
+}

+ 24 - 0
sms_water/src/main/java/com/huaxu/service/ReportWaterPumpStateService.java

@@ -0,0 +1,24 @@
+package com.huaxu.service;
+
+import com.huaxu.dto.watePump.ReprotWaterPumpDto;
+
+import java.util.List;
+
+/**
+ * @ClassName ReportWaterPumpStateService
+ * @Description: 水泵状态业务处理
+ * @Author lihui
+ * @Date 2021/4/21
+ * @Version V1.0
+ **/
+public interface ReportWaterPumpStateService {
+
+    /**
+    * @Author lihui
+    * @Description 查询场景下设备的泵站状态数据
+    * @Date 18:04 2021/4/21
+    * @Param [sceneId : 场景ID, days : 查询的时间范围]
+    * @return java.util.List<com.huaxu.dto.watePump.ReprotWaterPumpDto>
+    **/
+    List<ReprotWaterPumpDto> findReportWaterPumpStateList(List<Long> sceneId, Integer days);
+}

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

@@ -29,7 +29,9 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.Duration;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -157,6 +159,9 @@ public class MonitorDataServiceImpl implements MonitorDataService , Initializing
 
     @Override
     public void getMonitorDataReportByHour(){
+    /*    LocalDateTime dateTime =
+                LocalDateTime.parse("2021-04-19 14:59:58", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+*/
         //取前一个小时的时间
         LocalDateTime dateTime = LocalDateTime.now().plusHours(-1);
 

+ 46 - 0
sms_water/src/main/java/com/huaxu/service/impl/ReportWaterPumpStateServiceImpl.java

@@ -0,0 +1,46 @@
+package com.huaxu.service.impl;
+
+import com.huaxu.dao.ReportWaterPumpStateMapper;
+import com.huaxu.dto.DeviceDto;
+import com.huaxu.dto.watePump.ReprotWaterPumpDto;
+import com.huaxu.dto.watePump.ReprotWaterPumpQueryDto;
+import com.huaxu.service.DeviceService;
+import com.huaxu.service.ReportWaterPumpStateService;
+import com.huaxu.service.SceneService;
+import com.huaxu.util.DatesUtil;
+import com.huaxu.util.UserUtil;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Service
+@Log4j2
+public class ReportWaterPumpStateServiceImpl implements ReportWaterPumpStateService {
+
+    @Autowired
+    private ReportWaterPumpStateMapper reportWaterPumpStateMapper;
+
+    @Autowired
+    private DeviceService deviceService;
+
+    @Override
+    public List<ReprotWaterPumpDto> findReportWaterPumpStateList(List<Long> sceneId, Integer days) {
+        // 查询场景下的所有设备信息
+        List<DeviceDto> devices = new ArrayList<>();
+        DeviceDto deviceDto = new DeviceDto();
+        deviceDto.setSceneIds(sceneId);
+        if (deviceDto.getSceneIds().size() > 0){
+            devices.addAll(deviceService.selectList(deviceDto));
+        }
+        ReprotWaterPumpQueryDto queryDto = new ReprotWaterPumpQueryDto();
+        queryDto.setDeviceIds(devices);
+        queryDto.setTenantId(UserUtil.getCurrentUser().getTenantId());
+        // queryDto.setDay(days);
+        queryDto.setBeginTime(DatesUtil.formatDate(DatesUtil.addDayOfDate(new Date(), -(days-1)),"yyyy-MM-dd") + " 00:00:00");
+        return reportWaterPumpStateMapper.findReportWaterPumpStateList(queryDto);
+    }
+}

+ 10 - 4
sms_water/src/main/resources/application-dev.properties

@@ -117,11 +117,17 @@ ribbon.ReadTimeout=5000
 # 指的是建立连接后从服务器读取到可用资源所用的时间
 ribbon.ConnectionTimeout=5000
 
+#localhost
+message.spring.rabbitmq.host=127.0.0.1
+message.spring.rabbitmq.port=5672
+message.spring.rabbitmq.username=andy
+message.spring.rabbitmq.password=andy
+
 ##rabbitmq
-message.spring.rabbitmq.host=114.135.61.188
-message.spring.rabbitmq.port=55672
-message.spring.rabbitmq.username=zoniot
-message.spring.rabbitmq.password=zcxk100
+#message.spring.rabbitmq.host=114.135.61.188
+#message.spring.rabbitmq.port=55672
+#message.spring.rabbitmq.username=zoniot
+#message.spring.rabbitmq.password=zcxk100
 message.spring.rabbitmq.virtual-host= /
 message.spring.rabbitmq.requested-heartbeat = 10
 message.spring.rabbitmq.listener.simple.acknowledge-mode = NONE

+ 97 - 0
sms_water/src/main/resources/mapper/ReportWaterPumpStateMapper.xml

@@ -0,0 +1,97 @@
+<?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.ReportWaterPumpStateMapper">
+
+
+    <resultMap id="DeviceMonitorInfo" type="com.huaxu.dto.watePump.ReprotWaterPumpDto">
+        <result property="year" column="year" jdbcType="INTEGER"/>
+        <result property="month" column="month" jdbcType="INTEGER"/>
+        <result property="day" column="day" jdbcType="INTEGER"/>
+        <collection property="deviceList"  resultMap="deviceListMap"></collection>
+    </resultMap>
+
+    <resultMap id="deviceListMap" type="com.huaxu.dto.watePump.WaterPumpDataDto">
+        <result property="tenantId" column="tenantId" jdbcType="INTEGER"/>
+        <result property="deviceId" column="deviceId" jdbcType="INTEGER"/>
+        <result property="deviceCode" column="deviceCode" jdbcType="INTEGER"/>
+        <result property="attributeId" column="attributeId" jdbcType="INTEGER"/>
+        <result property="attributeName" column="attributeName" jdbcType="INTEGER"/>
+        <collection property="stateList" resultMap="stateListMap"></collection>
+    </resultMap>
+
+    <resultMap id="stateListMap" type="com.huaxu.dto.watePump.WaterPumpStateDto">
+        <result property="state" column="state" jdbcType="INTEGER"/>
+        <result property="beginTime" column="beginTime" jdbcType="INTEGER"/>
+        <result property="endTime" column="endTime" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <select id="findReportWaterPumpStateList" resultMap="DeviceMonitorInfo">
+        SELECT
+            a.year  as "year",
+            a.month as "month",
+            a.day   as "day",
+            a.state as "state",
+            a.tenant_id    as  "tenantId",
+            a.DEVICE_CODE  as  "deviceCode",
+            a.DEVICE_NAME  as  "deviceName",
+            a.DEVICE_ID as  "deviceId",
+            a.attribute_id as  "attributeId",
+            IFNULL(b.REMARK,a.`attribute_name`) AS "attributeName",
+            a.state_begin_time as "beginTime",
+            a.state_end_time   as "endTime"
+        FROM sms_report_water_pump_state a
+        inner join sms_device d on d.id = a.DEVICE_ID
+        inner join sms_device_parm b
+                   on a.DEVICE_ID = b.DEVICE_ID and a.ATTRIBUTE_ID=b.ATTRIBUTE_ID and b.`STATUS`=1 and b.PARM_TYPE = 2
+        <where>
+            <if test="waterPump.tenantId != null  and waterPump.tenantId != ''">
+               and a.tenant_id = #{waterPump.tenantId}
+            </if>
+            <if test="waterPump.deviceIds !=null and waterPump.deviceIds.size > 0">
+                and a.DEVICE_ID in
+                <foreach collection="waterPump.deviceIds" item="dramaId" open="(" close=")" separator=",">
+                    #{dramaId.id}
+                </foreach>
+            </if>
+            and a.state_begin_time > #{waterPump.beginTime}
+        </where>
+        <!--order by a.DEVICE_ID,a.state_begin_time -->
+    </select>
+
+    <insert id="insertReportWaterPumpState">
+        INSERT INTO sms_report_water_pump_state
+        (`state`,state_begin_time,state_end_time,tenant_id,device_id,device_name,
+        device_code,attribute_id,attribute_name,`year`,`month`,
+        `day`,date_create,date_update,md5_query)
+        VALUES
+            (#{waterPump.state},#{waterPump.stateBeginTime},#{waterPump.stateEndTime},#{waterPump.tenantId},#{waterPump.deviceId},#{waterPump.deviceName},
+            #{waterPump.deviceCode},#{waterPump.attributeId},#{waterPump.attributeName},#{waterPump.year},#{waterPump.month},
+            #{waterPump.day},#{waterPump.dateCreate},#{waterPump.dateUpdate},#{waterPump.md5Query})
+    </insert>
+
+    <insert id="batchInsertReportWaterPumpState">
+        INSERT INTO sms_report_water_pump_state
+            (`state`,state_begin_time,state_end_time,tenant_id,device_id,device_name,
+             device_code,attribute_id,attribute_name,`year`,`month`,
+            `day`,date_create,date_update,md5_query)
+        VALUES
+        <foreach collection="waterPumpList" item="waterPump" index="index" separator=",">
+        (#{waterPump.state},#{waterPump.stateBeginTime},#{waterPump.stateEndTime},#{waterPump.tenantId},#{waterPump.deviceId},#{waterPump.deviceName},
+         #{waterPump.deviceCode},#{waterPump.attributeId},#{waterPump.attributeName},#{waterPump.year},#{waterPump.month},
+         #{waterPump.day},#{waterPump.dateCreate},#{waterPump.dateUpdate},#{waterPump.md5Query})
+        </foreach>
+    </insert>
+
+    <select id="findReportWaterPumpState" resultType="com.huaxu.entity.ReportWaterPumpStateEntity">
+        select id,`state`,state_begin_time as "stateBeginTime" from sms_report_water_pump_state s
+        where md5_query = #{md5Query}
+        order by s.state_begin_time desc limit 1
+    </select>
+
+    <update id="updateReportWaterPumpState">
+        update sms_report_water_pump_state
+        set    state_end_time = #{endTime},
+               date_update = #{updateTime}
+        where id = #{id}
+    </update>
+</mapper>