Browse Source

在线监测列表、报警统计

yuejiaying 4 years ago
parent
commit
bc0ed1f817

+ 34 - 3
sms_water/src/main/java/com/huaxu/controller/OnlineMonitorController.java

@@ -1,12 +1,14 @@
 package com.huaxu.controller;
 
 
-import com.huaxu.common.StringUtils;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huaxu.dto.AlarmDetailsDto;
 import com.huaxu.dto.MonitorDataCollectDto;
-import com.huaxu.entity.AlarmDetailsEntity;
+import com.huaxu.dto.OnlineDataDto;
 import com.huaxu.entity.SceneEntity;
 import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.Pagination;
 import com.huaxu.model.ResultStatus;
 import com.huaxu.service.OnlineMonitorService;
 import com.huaxu.service.SceneService;
@@ -17,7 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -102,4 +103,34 @@ public class OnlineMonitorController {
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
 
+    @RequestMapping(value="selectPage" , method = RequestMethod.GET)
+    @ApiOperation(value = "查询实时数据列表")
+    public AjaxMessage<Pagination<OnlineDataDto>> selectPage(
+            @ApiParam(value = "页数", required = true)@RequestParam Integer pageNum,
+            @ApiParam(value = "条数", required = true)@RequestParam Integer pageSize,
+            @ApiParam(value = "一级场景类型名称", required = true) @RequestParam String sceneTypeName,
+            @ApiParam(value = "场景名称", required = false) @RequestParam(required = false) String sceneName){
+        OnlineDataDto onlineDataDto=new OnlineDataDto();
+        onlineDataDto.setSceneTypeName(sceneTypeName);
+        onlineDataDto.setSceneName(sceneName);
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+
+        IPage<OnlineDataDto> iPage = new Page<>(pageNum, pageSize);
+        iPage = onlineMonitorService.selectPage(iPage, onlineDataDto);
+        Pagination<OnlineDataDto> pages = new Pagination<>(iPage);
+        return new AjaxMessage<>(ResultStatus.OK, pages);
+    }
+
+    @RequestMapping(value="selectAlarmStats" , method = RequestMethod.GET)
+    @ApiOperation(value = "查询设备报警分析")
+    public AjaxMessage<List<Map<String, Object>>> selectAlarmStats(
+            @ApiParam(value = "一级场景类型名称", required = true) @RequestParam String sceneTypeName,
+            @ApiParam(value = "查询天数 1、3、7", required = true) @RequestParam Integer days){
+        AlarmDetailsDto alarmDetailsDto=new AlarmDetailsDto();
+        alarmDetailsDto.setSceneTypeName(sceneTypeName);
+        alarmDetailsDto.setDays(days);
+        alarmDetailsDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        return new AjaxMessage<>(ResultStatus.OK, onlineMonitorService.selectAlarmStats(alarmDetailsDto));
+    }
+
 }

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

@@ -1,8 +1,11 @@
 package com.huaxu.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.huaxu.dto.AlarmDetailsDto;
 import com.huaxu.dto.MonitorDataCollectDto;
+import com.huaxu.dto.OnlineDataDto;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 
 import java.util.List;
@@ -39,4 +42,14 @@ public interface OnlineMonitorMapper {
      * @return
      */
     List<MonitorDataCollectDto> selectMapParam(MonitorDataCollectDto monitorDataCollectDto);
+    /**
+     * 分页查询
+     * @return
+     */
+    IPage<OnlineDataDto> selectPage(@Param("page") IPage<OnlineDataDto> page, @Param("onlineDataDto") OnlineDataDto onlineDataDto);
+    /**
+     * 查询设备报警分析
+     * @return
+     */
+    List<Map<String, Object>> selectAlarmStats(AlarmDetailsDto alarmDetailsDto);
 }

+ 3 - 0
sms_water/src/main/java/com/huaxu/dto/AlarmDetailsDto.java

@@ -74,6 +74,9 @@ public class AlarmDetailsDto extends AlarmDetailsEntity {
     @ApiModelProperty(value ="一级场景类型名称",hidden = true)
     @JsonIgnore
     private String sceneTypeName;
+    @ApiModelProperty(value ="查询天数",hidden = true)
+    @JsonIgnore
+    private Integer days;
 
 
 }

+ 9 - 3
sms_water/src/main/java/com/huaxu/dto/MonitorDataCollectDto.java

@@ -42,15 +42,21 @@ public class MonitorDataCollectDto {
     @ApiModelProperty(value = "采集时间")
     private Date collectDate;
 
-    @ApiModelProperty("今日供水量")
-    private Double supplyWaterUsage;
+    @ApiModelProperty("今日供水量or今日出水量")
+    private Double yieldWaterUsage;
 
-    @ApiModelProperty("今日取水量")
+    @ApiModelProperty("今日取水量or今日进水量")
     private Double intakeWaterUsage;
 
     @ApiModelProperty("今日耗电量")
     private Double powerUsage;
 
+    @ApiModelProperty("今日耗药量")
+    private Double drugUsage;
+
+    @ApiModelProperty("场景状态 1报警 0正常")
+    private Integer sceneState;
+
     @ApiModelProperty("实时数据")
     private List<MonitorDataDto> MonitorDataEntities;
 

+ 5 - 1
sms_water/src/main/java/com/huaxu/dto/MonitorDataDto.java

@@ -20,6 +20,10 @@ public class MonitorDataDto implements Serializable {
 
     private static final long serialVersionUID = 6916916266193290481L;
 
+    @ApiModelProperty(value = "设备编号")
+    private Integer deviceId;
+    @ApiModelProperty(value = "设备名称")
+    private Integer deviceName;
     @ApiModelProperty(value = "设备属性编号")
     private Integer attributeId;
     @ApiModelProperty(value = "设备属性名称")
@@ -30,6 +34,6 @@ public class MonitorDataDto implements Serializable {
     private String unit;
     @ApiModelProperty(value = "规格值")
     private String specsName;
-    @ApiModelProperty(value = "是否报警")
+    @ApiModelProperty(value = "是否报警 1报警 0正常")
     private Integer isAlarm;
 }

+ 94 - 0
sms_water/src/main/java/com/huaxu/dto/OnlineDataDto.java

@@ -0,0 +1,94 @@
+package com.huaxu.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.huaxu.model.ProgramItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description
+ * @auto yjy
+ * @data 2020-12-3
+ */
+@ApiModel("在线监测列表数据")
+@Data
+public class OnlineDataDto {
+
+    private static final long serialVersionUID = -3866939316262264972L;
+
+    @ApiModelProperty("所属场景id")
+    private Long sceneId;
+
+    @ApiModelProperty("所属场景")
+    private String sceneName;
+
+    @ApiModelProperty("今日供水量、今日出水量")
+    private Double yieldWaterUsage;
+
+    @ApiModelProperty("今日取水量、今日进水量")
+    private Double intakeWaterUsage;
+
+    @ApiModelProperty("今日耗电量")
+    private Double powerUsage;
+
+    @ApiModelProperty("今日耗药量")
+    private Double drugUsage;
+
+    @ApiModelProperty("瞬时流量")
+    private Integer sceneState;
+
+    @ApiModelProperty("供水PH、出水PH")
+    private MonitorDataDto yieldPh;
+
+    @ApiModelProperty("供水浊度、出水浊度")
+    private MonitorDataDto yieldTurbidity;
+
+    @ApiModelProperty("取水PH、取水PH")
+    private MonitorDataDto intakePh;
+
+    @ApiModelProperty("取水浊度、进水浊度")
+    private MonitorDataDto intakeTurbidity;
+
+    @ApiModelProperty("水位")
+    private MonitorDataDto waterLevel;
+
+    @ApiModelProperty("压力")
+    private MonitorDataDto pressure;
+
+    @ApiModelProperty("余氯")
+    private MonitorDataDto residualChlorine;
+
+    @ApiModelProperty("水泵状态")
+    private List<MonitorDataDto> pumpStatus;
+
+    @ApiModelProperty(value = "场景ids" ,hidden = true )
+    @JsonIgnore
+    private List<Long> sceneIds;
+
+    @ApiModelProperty(value = "租户标识",hidden = true)
+    @JsonIgnore
+    private String tenantId;
+
+    @ApiModelProperty(value ="权限",hidden = true)
+    @JsonIgnore
+    private List<ProgramItem> programItems;
+
+    @ApiModelProperty(value="用户权限类型",hidden = true)
+    @JsonIgnore
+    private Integer permissonType;
+
+    /** 用户类型 */
+    @ApiModelProperty(value = "用户类型(-9999 超管 -999普通用户 2普通用户)",hidden = true)
+    @JsonIgnore
+    private String userType;
+
+    @ApiModelProperty(value ="一级场景类型名称",hidden = true)
+    @JsonIgnore
+    private String sceneTypeName;
+}

+ 11 - 5
sms_water/src/main/java/com/huaxu/service/OnlineMonitorService.java

@@ -1,11 +1,7 @@
 package com.huaxu.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.huaxu.dto.AlarmDetailsDto;
-import com.huaxu.dto.AlarmDetailsHistoryDto;
-import com.huaxu.dto.AlarmDetailsRealTimeDto;
-import com.huaxu.dto.MonitorDataCollectDto;
-import com.huaxu.entity.AlarmDetailsEntity;
+import com.huaxu.dto.*;
 
 import java.util.List;
 import java.util.Map;
@@ -37,4 +33,14 @@ public interface OnlineMonitorService {
      * @return
      */
     List<MonitorDataCollectDto> selectMapParam(MonitorDataCollectDto monitorDataCollectDto);
+    /**
+     * 分页查询
+     * @return
+     */
+    IPage<OnlineDataDto> selectPage(IPage<OnlineDataDto> page,  OnlineDataDto onlineDataDto);
+    /**
+     * 查询设备报警分析
+     * @return
+     */
+    List<Map<String, Object>> selectAlarmStats(AlarmDetailsDto alarmDetailsDto);
 }

+ 30 - 1
sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java

@@ -6,6 +6,7 @@ import com.huaxu.dao.OnlineMonitorMapper;
 import com.huaxu.dto.AlarmDetailsDto;
 import com.huaxu.dto.DeviceDto;
 import com.huaxu.dto.MonitorDataCollectDto;
+import com.huaxu.dto.OnlineDataDto;
 import com.huaxu.entity.DeviceEntity;
 import com.huaxu.model.LoginUser;
 import com.huaxu.service.DeviceService;
@@ -89,5 +90,33 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         monitorDataCollectDto.setPermissonType(loginUser.getPermissonType());
         return onlineMonitorMapper.selectMapParam(monitorDataCollectDto);
     }
-
+    /**
+     * 分页查询
+     * @return
+     */
+    @Override
+    public IPage<OnlineDataDto> selectPage(IPage<OnlineDataDto> page, OnlineDataDto onlineDataDto) {
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        onlineDataDto.setTenantId(loginUser.getTenantId());
+        onlineDataDto.setProgramItems(loginUser.getProgramItemList());
+        onlineDataDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        onlineDataDto.setPermissonType(loginUser.getPermissonType());
+        return onlineMonitorMapper.selectPage(page,onlineDataDto);
+    }
+    /**
+     * 查询设备报警分析
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> selectAlarmStats(AlarmDetailsDto alarmDetailsDto)
+    {
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        alarmDetailsDto.setTenantId(loginUser.getTenantId());
+        alarmDetailsDto.setProgramItems(loginUser.getProgramItemList());
+        alarmDetailsDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        alarmDetailsDto.setPermissonType(loginUser.getPermissonType());
+        return onlineMonitorMapper.selectAlarmStats(alarmDetailsDto);
+    }
 }

+ 93 - 51
sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml

@@ -8,14 +8,41 @@
         <result property="pointX" column="point_x" jdbcType="VARCHAR"/>
         <result property="pointY" column="point_y" jdbcType="VARCHAR"/>
         <result property="address" column="address" jdbcType="VARCHAR"/>
+        <result property="sceneState" column="scene_state" jdbcType="INTEGER"/>
         <collection property="MonitorDataEntities" ofType="com.huaxu.dto.MonitorDataDto" javaType="list">
+            <result property="deviceId" column="device_id" jdbcType="INTEGER"/>
             <result property="attributeId" column="attribute_id" jdbcType="INTEGER"/>
             <result property="attributeName" column="attribute_name" jdbcType="VARCHAR"/>
             <result property="unit" column="unit" jdbcType="VARCHAR"/>
             <result property="isAlarm" column="is_Alarm" jdbcType="VARCHAR"/>
         </collection>
     </resultMap>
+    <sql id="Base_Column_List">
+        t1.id scene_Id,
+        t1.scene_name ,
+        t1.point_x ,
+        t1.point_y,
+        t1.address ,
+        if (t7.alarm_count>0, 1, 0) scene_state,
+        t5.device_id,
+        t5.attribute_id ,
+        ifnull(t5.remark, t5.`name`) attribute_name,
+        t5.unit ,
+        if (t6.id is null, 0, 1) is_alarm
+    </sql>
 
+    <sql id="monitorDataJoins">
+        inner join sms_scene t2 on find_in_set(t1.id, t2.parent_scene_ids) and t2. status = 1
+        inner join sms_scene_type t3 on t3.id = t1.scene_type_id and t3. status = 1
+        left join sms_device t4 on t4.scene_id=t2.id
+        left join (
+            select substring_index(substring_index(a3.parent_scene_ids, ',', 2), ',', -1) one_scene_id,count(1) alarm_count
+            from sms_device a1
+            inner join sms_alarm_details a2 on a1.id=a2.device_id and a2.`status` = 1 and  a2.state = 1
+            inner join sms_scene a3 on a3.id=a1.scene_id and a3.`status` = 1
+            where a1.`status` = 1 group by one_scene_id
+        )t7 on t7.one_scene_id=t1.id
+    </sql>
     <!--查询实时报警信息-->
     <select id="selectAlarmDetails" resultType="com.huaxu.dto.AlarmDetailsDto">
         select
@@ -73,66 +100,81 @@
     <!--查询地图悬浮数据-->
     <select id="selectMapSuspension" resultMap="monitorDataMap">
         select
-        t4.id scene_Id,
-        t4.scene_name ,
-        t4.point_x ,
-        t4.point_y,
-        t4.address ,
-        t3.attribute_id ,
-        ifnull(t3.remark, t2.`name`) attribute_Name,
-        t2.unit ,
-        if (t5.id is null, 0, 1) is_Alarm
-        from sms_device t1
-        inner join sms_device_attribute t2 on t1.device_type_id = t2.device_type_id and t2.`status` = 1
-        inner join sms_device_parm t3 on t1.id = t3.device_id and t3.attribute_id = t2.id and t3.`status` = 1
-        inner join (
-            select a.id,a.scene_name,a.point_x,a.point_y,a.address,b.id c_id,b.scene_name c_scene_name
-            from sms_scene a
-            inner join sms_scene b on find_in_set(a.id, b.parent_scene_ids) and b. status = 1
-            inner join sms_scene_type s on s.id = a.scene_type_id and s. status = 1
-            where a.parent_scene_id = 0 and a. status = 1 and s.scene_type_name = #{sceneTypeName}
-            <if test="sceneIds != null and sceneIds.size() > 0">
-                and b.id  in
-                <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
-                    #{item}
-                </foreach>
-            </if>
-        ) t4 on t1.scene_id = t4.c_id
-        left join sms_alarm_details t5 on t5.device_id = t1.id and t5.attribute_id = t3.attribute_id and t5.state = 1
-        where t1.`status` = 1 and t3.is_suspension = 1
-        order by t4.scene_name,t3.seq
+        <include refid="Base_Column_List"/>
+        from sms_scene t1
+        <include refid="monitorDataJoins"/>
+        left join(
+            select a1.device_id,a1.attribute_id,a1.remark,a1.seq,a2.name,a2.unit from sms_device_parm a1
+            inner join sms_device_attribute a2 on a1.attribute_id=a2.id
+            where a1. status = 1 and a1.device_id is not null and a1.attribute_id is not null and a2.status = 1 and a1.is_suspension = 1
+        )t5 on t5.device_id=t4.id
+        left join sms_alarm_details t6 on t6.device_id = t4.id and t6.attribute_id = t5.attribute_id and t6.state = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t3.scene_type_name = #{sceneTypeName}
+        <if test="sceneIds != null and sceneIds.size() > 0">
+            and t1.id  in
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        order by t1.scene_name,t5.seq
     </select>
     <!--查询地图参数数据-->
     <select id="selectMapParam" resultMap="monitorDataMap">
         select
-        t4.id scene_Id,
-        t4.scene_name ,
-        t4.point_x ,
-        t4.point_y,
-        t4.address ,
-        t3.attribute_id ,
-        ifnull(t3.remark, t2.`name`) attribute_Name,
-        t2.unit ,
-        if (t5.id is null, 0, 1) is_Alarm
-        from sms_device t1
-        inner join sms_device_attribute t2 on t1.device_type_id = t2.device_type_id and t2.`status` = 1
-        inner join sms_device_parm t3 on t1.id = t3.device_id and t3.attribute_id = t2.id and t3.`status` = 1
-        inner join (
-        select a.id,a.scene_name,a.point_x,a.point_y,a.address,b.id c_id,b.scene_name c_scene_name
-        from sms_scene a
-        inner join sms_scene b on find_in_set(a.id, b.parent_scene_ids) and b. status = 1
-        inner join sms_scene_type s on s.id = a.scene_type_id and s. status = 1
-        where a.parent_scene_id = 0 and a. status = 1 and a.id = #{sceneId}
+        <include refid="Base_Column_List"/>
+        from sms_scene t1
+        <include refid="monitorDataJoins"/>
+        left join(
+            select a1.device_id,a1.attribute_id,a1.remark,a1.seq,a2.name,a2.unit from sms_device_parm a1
+            inner join sms_device_attribute a2 on a1.attribute_id=a2.id
+            where a1. status = 1 and a1.device_id is not null and a1.attribute_id is not null and a2.status = 1 and a1.is_map = 1
+        )t5 on t5.device_id=t4.id
+        left join sms_alarm_details t6 on t6.device_id = t4.id and t6.attribute_id = t5.attribute_id and t6.state = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t1.id = #{sceneId}
         <if test="sceneIds != null and sceneIds.size() > 0">
-            and b.id  in
+            and t1.id  in
             <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
                 #{item}
             </foreach>
         </if>
-        ) t4 on t1.scene_id = t4.c_id
-        left join sms_alarm_details t5 on t5.device_id = t1.id and t5.attribute_id = t3.attribute_id and t5.state = 1
-        where t1.`status` = 1 and t3.is_map = 1
-        order by t4.scene_name,t3.seq
+        order by t1.scene_name,t5.seq
     </select>
+    <select id="selectPage" resultType="com.huaxu.dto.OnlineDataDto">
+        select t1.id scene_id,t1.scene_name
+        from sms_scene t1
+        inner join sms_scene t2 on find_in_set(t1.id, t2.parent_scene_ids) and t2. status = 1
+        inner join sms_scene_type t3 on t3.id = t1.scene_type_id and t3. status = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t3.scene_type_name = #{onlineDataDto.sceneTypeName}
+        <if test="onlineDataDto.sceneIds != null and onlineDataDto.sceneIds.size() > 0">
+            and t1.id  in
+            <foreach collection="onlineDataDto.sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
 
+    </select>
+    <!--查询实时报警数量-->
+    <select id="selectAlarmStats" resultType="java.util.Map">
+        select
+        t4.id,
+        t4.device_name as "deviceName",
+        count(1) as "alarmCount",
+        sum(timestampdiff(minute,t5.alarm_start_time,ifnull(t5.alarm_end_time,now()))) as "alarmduration"
+        from sms_scene t1
+        inner join sms_scene t2 on find_in_set(t1.id, t2.parent_scene_ids) and t2. status = 1
+        inner join sms_scene_type t3 on t3.id = t1.scene_type_id and t3. status = 1
+        inner join sms_device t4 on t4.scene_id=t2.id and t4.`status`=1
+        inner join sms_alarm_details t5 on t5.device_id=t4.id and t5. status = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t3.scene_type_name = #{sceneTypeName}
+        <if test="sceneIds != null and sceneIds.size() > 0">
+            and t1.id  in
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="days != null">
+            and t5.alarm_start_time>DATE(NOW() + INTERVAL-#{days}+1 DAY)
+        </if>
+        group by t4.id,t4.device_name
+    </select>
 </mapper>