Bläddra i källkod

管网和综合调度概览

yuejiaying 4 år sedan
förälder
incheckning
609953cebf

+ 1 - 9
sms_water/src/main/java/com/huaxu/common/converter/Double3Serializer.java

@@ -8,9 +8,6 @@ import java.io.IOException;
 import java.text.DecimalFormat;
 
 public class Double3Serializer extends JsonSerializer<Double> {
-
-    private DecimalFormat df = new DecimalFormat("0.###");
-
     /**
      * 小数保留3位返回给前端序列化器
      * @param data
@@ -22,12 +19,7 @@ public class Double3Serializer extends JsonSerializer<Double> {
     public void serialize(Double data, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
             throws IOException {
         if (data != null) {
-            if (data == 0) {
-                jsonGenerator.writeString("0");
-            } else {
-                jsonGenerator.writeString(df.format(data));
-            }
-
+            jsonGenerator.writeNumber((double)data*1000/1000);
         }
     }
 

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

@@ -147,8 +147,8 @@ public class OnlineMonitorController {
 
     @RequestMapping(value="statsDeviceQualified" , method = RequestMethod.GET)
     @ApiOperation(value = "统计设备合格数据",notes = "sceneTypeName 为压力、水质")
-    public AjaxMessage<DeviceCountStatsDto> statsDeviceQualified(
-            @ApiParam(value = "场景类型名称", required = true) @RequestParam String sceneTypeName,
+    public AjaxMessage<List<DeviceCountStatsDto>> statsDeviceQualified(
+            @ApiParam(value = "场景类型名称", required = false) @RequestParam(required = false) String sceneTypeName,
             @ApiParam(value = "场景id", required = false) @RequestParam(required = false) Long sceneId,
             @ApiParam(value = "设备名称", required = false) @RequestParam(required = false) String deviceName){
         OnlineDataDto onlineDataDto=new OnlineDataDto();
@@ -156,7 +156,7 @@ public class OnlineMonitorController {
         onlineDataDto.setSceneId(sceneId);
         onlineDataDto.setDeviceName(deviceName);
         onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
-        DeviceCountStatsDto result=onlineMonitorService.statsDeviceQualified(onlineDataDto);
+        List<DeviceCountStatsDto> result=onlineMonitorService.statsDeviceQualified(onlineDataDto);
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
 
@@ -220,6 +220,7 @@ public class OnlineMonitorController {
         Pagination<OnlineDataDto> pages = new Pagination<>(iPage);
         return new AjaxMessage<>(ResultStatus.OK, pages);
     }
+
     @RequestMapping(value="selectPipeNetLayer" , method = RequestMethod.GET)
     @ApiOperation(value = "查询管网地图图层及设备")
     public AjaxMessage<List<PipeNetLayerDto>> selectPipeNetLayer(
@@ -230,4 +231,14 @@ public class OnlineMonitorController {
         List<PipeNetLayerDto> result=onlineMonitorService.selectPipeNetLayer(onlineDataDto);
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
+
+    @RequestMapping(value="statsDispatchSummary" , method = RequestMethod.GET)
+    @ApiOperation(value = "统计从水源地到水龙头汇总数据")
+    public AjaxMessage<DispatchSummaryDto> statsDispatchSummary(){
+        MonitorDataCollectDto monitorDataCollectDto=new MonitorDataCollectDto();
+        monitorDataCollectDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        DispatchSummaryDto result=onlineMonitorService.statsDispatchSummary(monitorDataCollectDto);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
 }

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

@@ -66,10 +66,10 @@ public interface OnlineMonitorMapper {
      */
     List<MonitorDataCollectDto> selectDeviceMapParam(MonitorDataCollectDto monitorDataCollectDto);
     /**
-     * 设备属性合格率
+     * 设备合格率
      * @return
      */
-    DeviceCountStatsDto statsDeviceQualified(OnlineDataDto onlineDataDto);
+    List<DeviceCountStatsDto> statsDeviceQualified(OnlineDataDto onlineDataDto);
     /**
      * 设备属性合格率
      * @return
@@ -91,4 +91,9 @@ public interface OnlineMonitorMapper {
      */
     List<PipeNetLayerDto> selectPipeNetLayer(OnlineDataDto onlineDataDto);
 
+    /**
+     * 查询昨日水厂制水总量
+     * @return
+     */
+    Double selectTotalYieldWater(MonitorDataCollectDto monitorDataCollectDto);
 }

+ 49 - 0
sms_water/src/main/java/com/huaxu/dto/DispatchSummaryDto.java

@@ -0,0 +1,49 @@
+package com.huaxu.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.huaxu.common.converter.Double3Serializer;
+import com.huaxu.model.ProgramItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description
+ * @auto yjy
+ * @data 2021-1-4
+ */
+@ApiModel("从水源地到水龙头汇总数据")
+@Data
+public class DispatchSummaryDto {
+    private static final long serialVersionUID = -3866226693931624972L;
+
+    @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("总制水量")
+    private Double yieldWaterUsage;
+
+    @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("总取水量")
+    private Double intakeWaterUsage;
+
+    @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("总能耗")
+    private Double powerUsage;
+
+    @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("压力合格率")
+    private Double presQualifiedRate;
+
+   @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("水质合格率")
+    private Double waterQualifiedRate;
+
+    @JsonSerialize(using = Double3Serializer.class)
+    @ApiModelProperty("已完成计划量")
+    private Double invNameRate;
+
+}

+ 5 - 0
sms_water/src/main/java/com/huaxu/dto/PipeNetLayerDto.java

@@ -20,6 +20,11 @@ public class PipeNetLayerDto {
      */
     @ApiModelProperty("场景名称")
     private String sceneName;
+    /**
+     * 场景类型名称
+     */
+    @ApiModelProperty("场景类型名称")
+    private String sceneTypeName;
     /**
      * 设备数据
      */

+ 6 - 1
sms_water/src/main/java/com/huaxu/service/OnlineMonitorService.java

@@ -62,7 +62,7 @@ public interface OnlineMonitorService {
      * 统计设备合格数据
      * @return
      */
-    DeviceCountStatsDto statsDeviceQualified(OnlineDataDto onlineDataDto);
+    List<DeviceCountStatsDto> statsDeviceQualified(OnlineDataDto onlineDataDto);
     /**
      * 统计今日累计流量
      * @return
@@ -83,4 +83,9 @@ public interface OnlineMonitorService {
      * @return
      */
     List<PipeNetLayerDto> selectPipeNetLayer(OnlineDataDto onlineDataDto);
+    /**
+     * 统计从水源地到水龙头汇总数据
+     * @return
+     */
+    DispatchSummaryDto statsDispatchSummary(MonitorDataCollectDto monitorDataCollectDto);
 }

+ 97 - 7
sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java

@@ -1,6 +1,7 @@
 package com.huaxu.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.huaxu.common.StringUtils;
 import com.huaxu.dao.OnlineMonitorMapper;
 import com.huaxu.dto.*;
 import com.huaxu.entity.MonitorDataEntity;
@@ -212,7 +213,7 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
      * @return
      */
     @Override
-    public DeviceCountStatsDto statsDeviceQualified(OnlineDataDto onlineDataDto)
+    public List<DeviceCountStatsDto> statsDeviceQualified(OnlineDataDto onlineDataDto)
     {
         LoginUser loginUser = UserUtil.getCurrentUser();
         onlineDataDto.setTenantId(loginUser.getTenantId());
@@ -220,12 +221,14 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         onlineDataDto.setUserType(loginUser.getType());
         //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
         onlineDataDto.setPermissonType(loginUser.getPermissonType());
-        DeviceCountStatsDto result=onlineMonitorMapper.statsDeviceQualified(onlineDataDto);
-        List<DeviceCountStatsDto> parmResult=onlineMonitorMapper.statsParmQualified(onlineDataDto);
-        result.setParmQualified(parmResult);
-        for(DeviceCountStatsDto parm : result.getParmQualified()){
-            parm.setTotalCount(result.getTotalCount());
-            parm.setNormalCount(result.getTotalCount()-parm.getAlarmCount());
+        List<DeviceCountStatsDto> result=onlineMonitorMapper.statsDeviceQualified(onlineDataDto);
+        if(!StringUtils.isEmpty(onlineDataDto.getSceneTypeName())) {
+            List<DeviceCountStatsDto> parmResult=onlineMonitorMapper.statsParmQualified(onlineDataDto);
+            result.get(0).setParmQualified(parmResult);
+            for(DeviceCountStatsDto parm : result.get(0).getParmQualified()){
+                parm.setTotalCount(result.get(0).getTotalCount());
+                parm.setNormalCount(result.get(0).getTotalCount()-parm.getAlarmCount());
+            }
         }
         return result;
     }
@@ -385,6 +388,50 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         onlineDataDto.setPermissonType(loginUser.getPermissonType());
         return onlineMonitorMapper.selectPipeNetLayer(onlineDataDto);
     }
+
+    /**
+     * 统计从水源地到水龙头汇总数据
+     * @return
+     */
+    @Override
+    public DispatchSummaryDto statsDispatchSummary(MonitorDataCollectDto monitorDataCollectDto)
+    {
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        monitorDataCollectDto.setTenantId(loginUser.getTenantId());
+        monitorDataCollectDto.setProgramItems(loginUser.getProgramItemList());
+        monitorDataCollectDto.setUserType(loginUser.getType());
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        monitorDataCollectDto.setPermissonType(loginUser.getPermissonType());
+        monitorDataCollectDto.setType(1);
+        DispatchSummaryDto result=new DispatchSummaryDto();
+
+        monitorDataCollectDto.setSceneTypeName("水源");
+        List<MonitorDataCollectDto> waterHead=onlineMonitorMapper.selectSceneParam(monitorDataCollectDto);
+        MonitorDataCollectDto waterHeadRes=GetCalTotalData(waterHead);
+        result.setIntakeWaterUsage(waterHeadRes.getIntakeWaterUsage());
+
+        monitorDataCollectDto.setSceneTypeName("水厂");
+        List<MonitorDataCollectDto> waterWorks=onlineMonitorMapper.selectSceneParam(monitorDataCollectDto);
+        MonitorDataCollectDto waterWorksRes=GetCalTotalData(waterWorks);
+        result.setYieldWaterUsage(waterWorksRes.getYieldWaterUsage());
+        result.setPowerUsage(waterWorksRes.getPowerUsage());
+
+        Double invName=onlineMonitorMapper.selectTotalYieldWater(monitorDataCollectDto);
+        result.setInvNameRate(invName!=null&&waterWorksRes.getYieldWaterUsage()!=null?waterWorksRes.getYieldWaterUsage()/invName:null);
+
+        OnlineDataDto onlineDataDto=new OnlineDataDto();
+        onlineDataDto.setSceneTypeName("压力");
+        onlineDataDto.setSceneIds(monitorDataCollectDto.getSceneIds());
+        List<DeviceCountStatsDto> pres=statsDeviceQualified(onlineDataDto);
+        result.setPresQualifiedRate(pres.size()>0&&pres.get(0).getTotalCount()!=0&&pres.get(0).getParmQualified().size()>0?
+                (double)pres.get(0).getParmQualified().get(0).getNormalCount()/pres.get(0).getTotalCount()*100:null);
+
+        onlineDataDto.setSceneTypeName("水质");
+        List<DeviceCountStatsDto> water=statsDeviceQualified(onlineDataDto);
+        result.setWaterQualifiedRate(water.size()>0&&water.get(0).getTotalCount()!=0?(double)water.get(0).getNormalCount()/water.get(0).getTotalCount()*100:null);
+
+        return result;
+    }
     /**
      * 获取在线数据及计算数据
      */
@@ -571,4 +618,47 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
             }
         }
     }
+    /**
+     * 获取计算数据总值
+     */
+    public MonitorDataCollectDto GetCalTotalData(List<MonitorDataCollectDto> calculateRes){
+        MonitorDataCollectDto result=new MonitorDataCollectDto();
+        for(MonitorDataCollectDto calculate :calculateRes){
+            for(MonitorDataDto monitorData : calculate.getMonitorDataEntities()){
+                byte[] bytes = redisUtil.get(("sms_water_"+monitorData.getDeviceCode()).getBytes());
+                if(bytes != null && bytes.length>0) {
+                    MonitorDataEntity monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
+                    //筛选该设备相同属性的值
+                    List<MonitorDataValueEntity> attributeEntities = monitorDataEntity.getDataValues().stream().filter((MonitorDataValueEntity m)
+                            -> m.getAttributeId().equals(monitorData.getAttributeId())).collect(Collectors.toList());
+                    MonitorDataValueEntity  attributeEntity=attributeEntities.size()>0?attributeEntities.get(0):null;
+                    if (attributeEntity != null) {
+                        SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                        //计算今日数据
+                        if(formatdate.format(new Date()).equals(formatdate.format(monitorDataEntity.getCollectDate()))) {
+                            Double attributeValue =0d;
+                            if(attributeEntity.getDataValue() != null && monitorData.getLatestValue() != null){
+                                attributeValue=attributeEntity.getDataValue() - monitorData.getLatestValue();
+                            }
+                            switch (monitorData.getAttributeType()) {
+                                case "3"://供水量or出水量
+                                    result.setYieldWaterUsage(result.getYieldWaterUsage() != null ? result.getYieldWaterUsage() + attributeValue : attributeValue);
+                                    break;
+                                case "4"://取水量or进水量
+                                    result.setIntakeWaterUsage(result.getIntakeWaterUsage() != null ? result.getIntakeWaterUsage() + attributeValue : attributeValue);
+                                    break;
+                                case "5"://耗电量
+                                    result.setPowerUsage(result.getPowerUsage() != null ? result.getPowerUsage() + attributeValue : attributeValue);
+                                    break;
+                                case "6"://耗药量
+                                    result.setDrugUsage(result.getDrugUsage() != null ? result.getDrugUsage() + attributeValue : attributeValue);
+                                    break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return result;
+    }
 }

+ 32 - 4
sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml

@@ -44,6 +44,7 @@
     <resultMap type="com.huaxu.dto.PipeNetLayerDto" id="layerMap">
         <result property="sceneId" column="scene_id" jdbcType="INTEGER"/>
         <result property="sceneName" column="scene_name" jdbcType="VARCHAR"/>
+        <result property="sceneTypeName" column="scene_type_name" jdbcType="VARCHAR"/>
         <collection property="deviceDataList" ofType="com.huaxu.dto.MonitorDataCollectDto" javaType="list">
             <result property="deviceId" column="device_id" jdbcType="INTEGER"/>
             <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
@@ -332,13 +333,21 @@
     </select>
     <!--统计设备合格数据-->
     <select id="statsDeviceQualified" resultType="com.huaxu.dto.DeviceCountStatsDto">
-        select count(1) totalCount,sum(if(t7.device_id is null,0,1)) alarmCount,count(1)-sum(if(t7.device_id is null,0,1)) normalCount
+        select t5.scene_type_name type,count(1) totalCount,sum(if(t7.device_id is null,0,1)) alarmCount,count(1)-sum(if(t7.device_id is null,0,1)) normalCount
         from sms_scene t1
         <include refid="deviceInnerJoins"/>
         left join(
          select a1.scene_id, a1.device_id from sms_alarm_details a1 where a1.`status` = 1 and a1.state = 1 group by a1.scene_id, a1.device_id
         )t7 on t7.scene_id=t2.scene_id and t7.device_id=t2.device_id
-        where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t3.scene_type_name = '管网' and t5.scene_type_name = #{sceneTypeName}
+        where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t3.scene_type_name = '管网'
+        <choose>
+            <when test="sceneTypeName != null and sceneTypeName !=''">
+                and t5.scene_type_name = #{sceneTypeName}
+            </when>
+            <otherwise>
+                and t5.scene_type_name in('压力','流量','水质')
+            </otherwise>
+        </choose>
         <if test="sceneIds != null and sceneIds.size() > 0">
             and t1.id  in
             <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
@@ -354,6 +363,7 @@
         <if test="deviceName != null and deviceName != ''">
             and t6.device_name like concat('%', #{deviceName},'%')
         </if>
+        group by t5.scene_type_name
     </select>
     <!--统计设备属性合格数据-->
     <select id="statsParmQualified" resultType="com.huaxu.dto.DeviceCountStatsDto">
@@ -368,7 +378,7 @@
         <if test="sceneTypeName == '水质'">
             and t7.parm_type in(7,9,11)
         </if>
-        inner join sms_alarm_details t8 on t8.attribute_id=t7.attribute_id and t8.device_id=t7.device_id and t8.scene_id=t7.scene_id and t8.`status` = 1 and t8.state = 1
+        left join sms_alarm_details t8 on t8.attribute_id=t7.attribute_id and t8.device_id=t7.device_id and t8.scene_id=t7.scene_id and t8.`status` = 1 and t8.state = 1
         where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t3.scene_type_name = '管网' and t5.scene_type_name = #{sceneTypeName}
         <if test="sceneIds != null and sceneIds.size() > 0">
             and t1.id  in
@@ -471,7 +481,7 @@
     </select>
     <!--查询管网地图图层及设备-->
     <select id="selectPipeNetLayer" resultMap="layerMap">
-        select t4.id scene_id,t4.scene_name,t6.id device_id,t6.device_code,t6.device_name,t6.point_x,t6.point_y,t6.address,if (t7.alarm_count>0, 1, 0) device_state
+        select t4.id scene_id,t4.scene_name,t5.scene_type_name,t6.id device_id,t6.device_code,t6.device_name,t6.point_x,t6.point_y,t6.address,if (t7.alarm_count>0, 1, 0) device_state
         from sms_scene t1
         <include refid="deviceInnerJoins"/>
         left join(
@@ -497,4 +507,22 @@
         </if>
         order by t4.scene_name,t6.date_create
     </select>
+    <!--查询昨日水厂制水总量-->
+    <select id="selectTotalYieldWater" resultType="java.lang.Double">
+        select sum(sum_value) yieldWater
+        from sms_scene t1
+        <include refid="sceneDeviceJoins"/>
+        inner join sms_month_report t8 on t8.device_id=t2.device_id and t8.attribute_id =t5.attribute_id
+        and t8.year = year(now() + interval-1 day) and t8.month = month(now() + interval-1 day) and t8.day = day(now() + interval-1 day)
+        where t1.parent_scene_id = 0 and t1. status = 1 and t5.parm_type in(3) and t3.scene_type_name = '水厂'
+        <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="tenantId != null and tenantId != ''">
+            and t1.tenant_id = #{tenantId}
+        </if>
+    </select>
 </mapper>