Browse Source

修复已知bug

lihui007 3 years ago
parent
commit
95fb409302

+ 13 - 0
common/src/main/java/com/huaxu/util/DatesUtil.java

@@ -3,9 +3,12 @@ package com.huaxu.util;
 import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 /*
  * 由于为了以后使用方便,所有方法的返回类型都设为了 java.utils.Date 请在使用时根据自己的需要进行日期格式化处理,如:
@@ -590,6 +593,16 @@ public class DatesUtil {
 		return newDate;
 	}
 
+	public static LocalDate parseLocalDate(Date date){
+		Instant instant =  date.toInstant();
+		ZoneId zoneId = ZoneId.systemDefault();
+		return  instant.atZone(zoneId).toLocalDate();
+	}
+
+	public static long minutesBetween(Date startTime, Date endTime){
+		return ChronoUnit.MINUTES.between(Instant.ofEpochMilli(startTime.getTime()), Instant.ofEpochMilli(endTime.getTime()));
+	}
+
 
 	public static void main(String[] args) {
 		//String d = "2019-11-14 13:10:16";

+ 9 - 6
sms_water/src/main/java/com/huaxu/controller/OnlineMonitorController.java

@@ -17,6 +17,7 @@ import com.huaxu.util.ByteArrayUtils;
 import com.huaxu.util.DatesUtil;
 import com.huaxu.util.RedisUtil;
 import com.huaxu.util.UserUtil;
+import com.huaxu.vo.AlarmDetailsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -119,14 +120,16 @@ public class OnlineMonitorController {
 
     @RequestMapping(value="selectAlarmStats" , method = RequestMethod.GET)
     @ApiOperation(value = "查询设备报警分析")
-    public AjaxMessage<List<Map<String, Object>>> selectAlarmStats(
+    public AjaxMessage<List<AlarmDetailsVo>> selectAlarmStats(
             @ApiParam(value = "一级场景id", required = true) @RequestParam Long sceneId,
             @ApiParam(value = "查询天数 1、3、7", required = true) @RequestParam Integer days){
-        AlarmDetailsDto alarmDetailsDto=new AlarmDetailsDto();
-        alarmDetailsDto.setId(sceneId);
-        alarmDetailsDto.setDays(days);
-        alarmDetailsDto.setSceneIds(sceneService.findByParentIdsLike(null));
-        return new AjaxMessage<>(ResultStatus.OK, onlineMonitorService.selectAlarmStats(alarmDetailsDto));
+        Date nowDate = new Date();
+        AlarmDetailsQueryDto queryDto = new AlarmDetailsQueryDto();
+        queryDto.setId(sceneId);
+        queryDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        queryDto.setStartTime(DatesUtil.formatDate(DatesUtil.addDayOfDate(nowDate, -days), "yyyy-MM-dd HH:mm:ss"));
+        queryDto.setEndTime(DatesUtil.formatDate(nowDate, "yyyy-MM-dd HH:mm:ss"));
+        return new AjaxMessage<>(ResultStatus.OK, onlineMonitorService.selectAlarmStatsInfo(queryDto));
     }
 
     @RequestMapping(value="selectDeviceCount" , method = RequestMethod.GET)

+ 11 - 0
sms_water/src/main/java/com/huaxu/dao/OnlineMonitorMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.huaxu.dto.*;
 import com.huaxu.dto.ranking.SceneDeviceDto;
 import com.huaxu.dto.ranking.SceneDeviceQueryDto;
+import com.huaxu.vo.AlarmDetailsVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -124,4 +125,14 @@ public interface OnlineMonitorMapper {
      * @return
      */
     List<Map<String, Object>> selectStateCount(OnlineDataDto onlineDataDto);
+
+
+    /**
+    * @Author lihui
+    * @Description 查询设备报警分析
+    * @Date 17:19 2021/5/6
+    * @Param [dto]
+    * @return java.util.List<com.huaxu.vo.AlarmDetailsVo>
+    **/
+    List<AlarmDetailsVo> selectAlarmStatsInfo(AlarmDetailsQueryDto dto);
 }

+ 26 - 0
sms_water/src/main/java/com/huaxu/dto/AlarmDetailsQueryDto.java

@@ -0,0 +1,26 @@
+package com.huaxu.dto;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Api("报警信息入参")
+@Data
+public class AlarmDetailsQueryDto implements Serializable {
+
+    @ApiModelProperty("一级场景id")
+    private Long id;
+
+    @ApiModelProperty("所属场景")
+    private List<Long> sceneIds;
+
+    @ApiModelProperty("开始时间")
+    private String startTime;
+
+    @ApiModelProperty("结束时间")
+    private String endTime;
+
+}

+ 1 - 0
sms_water/src/main/java/com/huaxu/service/DayReportService.java

@@ -140,6 +140,7 @@ public class DayReportService extends AbstractReportService<DayReportMapper, Day
         if (index == -1) {
             return;
         }
+        //System.out.println(reportDtos.get(-1));
         Double power = reportDtos!=null&&reportDtos.get(index)!=null?reportDtos.get(index).getPowerUsage():0;
         Double water = reportDtos!=null&&reportDtos.get(index)!=null?reportDtos.get(index).getIntakeWaterUsage():0;
         Double yieldWaterUsage = reportDtos!=null&&reportDtos.get(index)!=null? reportDtos.get(index).getYieldWaterUsage():0;

+ 7 - 0
sms_water/src/main/java/com/huaxu/service/OnlineMonitorService.java

@@ -2,6 +2,7 @@ package com.huaxu.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.huaxu.dto.*;
+import com.huaxu.vo.AlarmDetailsVo;
 
 import java.util.List;
 import java.util.Map;
@@ -116,4 +117,10 @@ public interface OnlineMonitorService {
      * @return
      */
     List<Map<String, Object>> selectStateCount(OnlineDataDto onlineDataDto);
+
+    /**
+     * 查询设备报警分析
+     * @return
+     */
+    List<AlarmDetailsVo> selectAlarmStatsInfo(AlarmDetailsQueryDto dto);
 }

+ 44 - 4
sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java

@@ -1,5 +1,6 @@
 package com.huaxu.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.huaxu.common.StringUtils;
 import com.huaxu.dao.OnlineMonitorMapper;
@@ -10,10 +11,8 @@ import com.huaxu.model.LoginUser;
 import com.huaxu.model.Pagination;
 import com.huaxu.service.DeviceAttributeSpecsService;
 import com.huaxu.service.OnlineMonitorService;
-import com.huaxu.util.ByteArrayUtils;
-import com.huaxu.util.OrgInfoUtil;
-import com.huaxu.util.RedisUtil;
-import com.huaxu.util.UserUtil;
+import com.huaxu.util.*;
+import com.huaxu.vo.AlarmDetailsVo;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -22,6 +21,11 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -871,4 +875,40 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         onlineDataDto.setPermissonType(loginUser.getPermissonType());
         return onlineMonitorMapper.selectStateCount(onlineDataDto);
     }
+
+    /**
+     * 查询场景实时状态数量
+     * @return
+     */
+    @Override
+    public List<AlarmDetailsVo> selectAlarmStatsInfo(AlarmDetailsQueryDto dto)
+    {
+        List<AlarmDetailsVo> alarmDetailsVos =  onlineMonitorMapper.selectAlarmStatsInfo(dto);
+        if (CollectionUtil.isEmpty(alarmDetailsVos)) {
+            return null;
+        }
+        Map<Long, AlarmDetailsVo> dataMap = new HashMap<>();
+        Long sendId  = null;
+        long minutes = 0;
+        Date startTime = null;
+        for (AlarmDetailsVo alarmDetails : alarmDetailsVos) {
+            sendId = alarmDetails.getId();
+            AlarmDetailsVo alarmDetailsVo = dataMap.get(sendId);
+            if (alarmDetailsVo == null) {
+                alarmDetailsVo = new AlarmDetailsVo();
+            }
+            if (alarmDetails.getAlarmEndTime() != null){
+                startTime = DatesUtil.parseDate(dto.getStartTime(), "yyyy-MM-dd HH:mm:ss");
+                minutes   = DatesUtil.minutesBetween(startTime.after(alarmDetails.getAlarmStartTime()) ? startTime : alarmDetails.getAlarmStartTime(),
+                        alarmDetails.getAlarmEndTime());
+            }
+            alarmDetailsVo.setDeviceName(alarmDetails.getDeviceName());
+            alarmDetailsVo.setId(sendId);
+            alarmDetailsVo.setAlarmCount( alarmDetailsVo.getAlarmCount() + 1 );
+            alarmDetailsVo.setAlarmDuration(alarmDetailsVo.getAlarmDuration()  + minutes);
+            dataMap.put(sendId, alarmDetailsVo);
+        }
+        return dataMap.values().stream().collect(Collectors.toList());
+    }
+
 }

+ 39 - 0
sms_water/src/main/java/com/huaxu/vo/AlarmDetailsVo.java

@@ -0,0 +1,39 @@
+package com.huaxu.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName AlarmDetailsVo
+ * @Description: 报警信息
+ * @Author lihui
+ * @Date 2021/5/6
+ * @Version V1.0
+ **/
+@Data
+public class AlarmDetailsVo implements Serializable {
+
+    @ApiModelProperty("设备ID")
+    private Long id;
+
+    @ApiModelProperty("设备名字")
+    private String deviceName;
+
+    @ApiModelProperty("报警次数")
+    private int alarmCount;
+
+    @ApiModelProperty("报警时长:分钟")
+    private long alarmDuration;
+
+    @JsonIgnore
+    @ApiModelProperty("报警开始时间")
+    private Date alarmStartTime;
+
+    @JsonIgnore
+    @ApiModelProperty("报警开始时间")
+    private Date alarmEndTime;
+}

+ 25 - 0
sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml

@@ -841,4 +841,29 @@
         )tab1
         group by sceneState
     </select>
+    <!--查询设备报警分析-->
+    <select id="selectAlarmStatsInfo" resultType="com.huaxu.vo.AlarmDetailsVo">
+        select
+        t4.id,
+        t4.device_name as "deviceName",
+        t6.ALARM_START_TIME,
+        t6.ALARM_END_TIME
+        from sms_scene t1
+        inner join sms_scene_type t3 on t3.id = t1.scene_type_id and t3. status = 1
+        inner join sms_alarm_details t6 on t1.id=t6.parent_scene_id and t6.`status`=1
+        inner join sms_device t4 on t4.id=t6.device_id and t4.`status`=1 and t4. enable_state = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t1.id = #{id}
+        <if test="sceneIds != null and sceneIds.size() > 0">
+            and t1.id  in
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        and
+        (
+         (t6.ALARM_START_TIME  >  #{startTime} and #{endTime} > t6.ALARM_START_TIME )
+         or
+         (t6.ALARM_END_TIME    >  #{startTime} and #{endTime} > t6.ALARM_END_TIME  )
+        )
+    </select>
 </mapper>