浏览代码

管网在线监测

yuejiaying 4 年之前
父节点
当前提交
fe0b328f34

+ 86 - 4
sms_water/src/main/java/com/huaxu/controller/OnlineMonitorController.java

@@ -3,10 +3,7 @@ package com.huaxu.controller;
 
 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.dto.MonitorDataDto;
-import com.huaxu.dto.OnlineDataDto;
+import com.huaxu.dto.*;
 import com.huaxu.entity.MonitorDataEntity;
 import com.huaxu.entity.MonitorDataValueEntity;
 import com.huaxu.model.AjaxMessage;
@@ -136,6 +133,7 @@ public class OnlineMonitorController {
         onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
         return new AjaxMessage<>(ResultStatus.OK, onlineMonitorService.selectDeviceCount(onlineDataDto));
     }
+
     @RequestMapping(value="selectDeviceMapParam" , method = RequestMethod.GET)
     @ApiOperation(value = "查询设备地图参数数据")
     public AjaxMessage<List<MonitorDataCollectDto>> selectDeviceMapParam(
@@ -146,4 +144,88 @@ public class OnlineMonitorController {
         List<MonitorDataCollectDto> result=onlineMonitorService.selectDeviceMapParam(monitorDataCollectDto);
         return new AjaxMessage<>(ResultStatus.OK, result);
     }
+
+    @RequestMapping(value="statsDeviceQualified" , method = RequestMethod.GET)
+    @ApiOperation(value = "统计设备合格数据",notes = "sceneTypeName 为压力、水质")
+    public AjaxMessage<DeviceCountStatsDto> statsDeviceQualified(
+            @ApiParam(value = "场景类型名称", required = true) @RequestParam 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();
+        onlineDataDto.setSceneTypeName(sceneTypeName);
+        onlineDataDto.setSceneId(sceneId);
+        onlineDataDto.setDeviceName(deviceName);
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        DeviceCountStatsDto result=onlineMonitorService.statsDeviceQualified(onlineDataDto);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
+    @RequestMapping(value="statsDeviceFlow" , method = RequestMethod.GET)
+    @ApiOperation(value = "统计今日累计流量")
+    public AjaxMessage<List<MonitorDataCollectDto>> statsDeviceFlow(
+            @ApiParam(value = "场景id", required = false) @RequestParam(required = false) Long sceneId,
+            @ApiParam(value = "设备名称", required = false) @RequestParam(required = false) String deviceName){
+        OnlineDataDto onlineDataDto=new OnlineDataDto();
+        onlineDataDto.setSceneTypeName("流量");
+        onlineDataDto.setType(4);
+        onlineDataDto.setSceneId(sceneId);
+        onlineDataDto.setDeviceName(deviceName);
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        List<MonitorDataCollectDto> result=onlineMonitorService.statsDeviceFlow(onlineDataDto);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
+    @RequestMapping(value="statsDeviceParmCount" , method = RequestMethod.GET)
+    @ApiOperation(value = "统计压力、瞬时流量的分布区间")
+    public AjaxMessage<int[]> statsDeviceParmCount(
+            @ApiParam(value = "场景类型名称", required = true) @RequestParam 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();
+        onlineDataDto.setSceneTypeName(sceneTypeName);
+        if(sceneTypeName.equals("压力")){
+            onlineDataDto.setType(1);
+        }else if(sceneTypeName.equals("流量")){
+            onlineDataDto.setType(5);
+        }
+        onlineDataDto.setSceneId(sceneId);
+        onlineDataDto.setDeviceName(deviceName);
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        int[] result=onlineMonitorService.statsDeviceParmCount(onlineDataDto);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
+
+    @RequestMapping(value="selectPipeNetPage" , method = RequestMethod.GET)
+    @ApiOperation(value = "查询管网实时数据列表")
+    public AjaxMessage<Pagination<OnlineDataDto>> selectPipeNetPage(
+            @ApiParam(value = "页数", required = true)@RequestParam Integer pageNum,
+            @ApiParam(value = "条数", required = true)@RequestParam Integer pageSize,
+            @ApiParam(value = "场景类型名称(压力、流量、水质)", required = true) @RequestParam 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();
+        onlineDataDto.setSceneTypeName(sceneTypeName);
+        if(sceneTypeName.equals("压力")){
+            onlineDataDto.setType(1);
+        }else if(sceneTypeName.equals("流量")){
+            onlineDataDto.setType(2);
+        }else if(sceneTypeName.equals("水质")){
+            onlineDataDto.setType(3);
+        }
+        onlineDataDto.setSceneId(sceneId);
+        onlineDataDto.setDeviceName(deviceName);
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        IPage<OnlineDataDto> iPage = new Page<>(pageNum, pageSize);
+        iPage = onlineMonitorService.selectPipeNetPage(iPage, onlineDataDto);
+        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(){
+        OnlineDataDto onlineDataDto=new OnlineDataDto();
+        onlineDataDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        List<PipeNetLayerDto> result=onlineMonitorService.selectPipeNetLayer(onlineDataDto);
+        return new AjaxMessage<>(ResultStatus.OK, result);
+    }
 }

+ 27 - 3
sms_water/src/main/java/com/huaxu/dao/OnlineMonitorMapper.java

@@ -1,9 +1,7 @@
 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 com.huaxu.dto.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -67,4 +65,30 @@ public interface OnlineMonitorMapper {
      * @return
      */
     List<MonitorDataCollectDto> selectDeviceMapParam(MonitorDataCollectDto monitorDataCollectDto);
+    /**
+     * 设备属性合格率
+     * @return
+     */
+    DeviceCountStatsDto statsDeviceQualified(OnlineDataDto onlineDataDto);
+    /**
+     * 设备属性合格率
+     * @return
+     */
+    List<DeviceCountStatsDto> statsParmQualified(OnlineDataDto onlineDataDto);
+    /**
+     * 查询设备参数
+     * @return
+     */
+    List<MonitorDataCollectDto> statsDeviceParm(OnlineDataDto onlineDataDto);
+    /**
+     * 管网分页查询
+     * @return
+     */
+    IPage<OnlineDataDto> selectPipeNetPage(@Param("page") IPage<OnlineDataDto> page, @Param("onlineDataDto") OnlineDataDto onlineDataDto);
+    /**
+     * 查询管网地图图层
+     * @return
+     */
+    List<PipeNetLayerDto> selectPipeNetLayer(OnlineDataDto onlineDataDto);
+
 }

+ 38 - 0
sms_water/src/main/java/com/huaxu/dto/DeviceCountStatsDto.java

@@ -0,0 +1,38 @@
+package com.huaxu.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("设备合格统计")
+public class DeviceCountStatsDto {
+    private static final long serialVersionUID = 460807634914426955L;
+    /**
+     * 数据统计属性
+     */
+    @ApiModelProperty(value = "类型")
+    private String type;
+    /**
+     * 设备总数
+     */
+    @ApiModelProperty(value = "设备总数")
+    private Integer totalCount;
+    /**
+     * 报警设备数
+     */
+    @ApiModelProperty(value = "报警设备数量")
+    private Integer alarmCount;
+    /**
+     * 正常设备数
+     */
+    @ApiModelProperty(value = "正常设备数量")
+    private Integer normalCount;
+    /**
+     * 设备属性合格数据
+     */
+    @ApiModelProperty("设备属性合格数据")
+    private List<DeviceCountStatsDto> parmQualified;
+}

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

@@ -104,4 +104,7 @@ public class MonitorDataCollectDto {
 
     @ApiModelProperty("设备名称")
     private String deviceName;
+
+    @ApiModelProperty("设备状态 1报警 0正常")
+    private Integer deviceState;
 }

+ 25 - 1
sms_water/src/main/java/com/huaxu/dto/OnlineDataDto.java

@@ -104,6 +104,30 @@ public class OnlineDataDto {
     @ApiModelProperty(value ="一级场景类型名称",hidden = true)
     @JsonIgnore
     private String sceneTypeName;
-    @ApiModelProperty(value ="设备名称")
+
+    @ApiModelProperty("累计流量")
+    private MonitorDataDto totalFlow;
+
+    @ApiModelProperty("电导率")
+    private MonitorDataDto conductivity;
+
+    @ApiModelProperty(value = "设备ids" ,hidden = true )
+    @JsonIgnore
+    private List<Long> deviceIds;
+
+    @ApiModelProperty(value = "管网标记查询 1压力列表 2流量列表 3水质列表 4今日累计流量 5瞬时流量",hidden = true)
+    @JsonIgnore
+    private Integer type;
+
+    @ApiModelProperty("设备id")
+    private Long deviceId;
+
+    @ApiModelProperty("设备编号")
+    private String deviceCode;
+
+    @ApiModelProperty("设备名称")
     private String deviceName;
+
+    @ApiModelProperty("设备状态 1报警 0正常")
+    private Integer deviceState;
 }

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

@@ -0,0 +1,28 @@
+package com.huaxu.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("管网图层")
+public class PipeNetLayerDto {
+    private static final long serialVersionUID = 460807634914426955L;
+    /**
+     * 场景id
+     */
+    @ApiModelProperty("场景id")
+    private Long sceneId;
+    /**
+     * 场景名称
+     */
+    @ApiModelProperty("场景名称")
+    private String sceneName;
+    /**
+     * 设备数据
+     */
+    @ApiModelProperty("设备数据")
+    private List<MonitorDataCollectDto> deviceDataList;
+}

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

@@ -58,4 +58,29 @@ public interface OnlineMonitorService {
      * @return
      */
     List<MonitorDataCollectDto> selectDeviceMapParam(MonitorDataCollectDto monitorDataCollectDto);
+    /**
+     * 统计设备合格数据
+     * @return
+     */
+    DeviceCountStatsDto statsDeviceQualified(OnlineDataDto onlineDataDto);
+    /**
+     * 统计今日累计流量
+     * @return
+     */
+    List<MonitorDataCollectDto> statsDeviceFlow(OnlineDataDto onlineDataDto);
+    /**
+     * 统计压力、瞬时流量的分布区间
+     * @return
+     */
+    int[] statsDeviceParmCount(OnlineDataDto onlineDataDto);
+    /**
+     * 管网分页查询
+     * @return
+     */
+    IPage<OnlineDataDto> selectPipeNetPage(IPage<OnlineDataDto> page,  OnlineDataDto onlineDataDto);
+    /**
+     * 查询管网地图图层
+     * @return
+     */
+    List<PipeNetLayerDto> selectPipeNetLayer(OnlineDataDto onlineDataDto);
 }

+ 285 - 66
sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java

@@ -1,16 +1,13 @@
 package com.huaxu.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.huaxu.dao.DeviceMapper;
 import com.huaxu.dao.OnlineMonitorMapper;
 import com.huaxu.dto.*;
-import com.huaxu.entity.DeviceEntity;
 import com.huaxu.entity.MonitorDataEntity;
 import com.huaxu.entity.MonitorDataValueEntity;
 import com.huaxu.model.LoginUser;
 import com.huaxu.model.Pagination;
 import com.huaxu.service.DeviceAttributeSpecsService;
-import com.huaxu.service.DeviceService;
 import com.huaxu.service.OnlineMonitorService;
 import com.huaxu.util.ByteArrayUtils;
 import com.huaxu.util.RedisUtil;
@@ -205,11 +202,217 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         monitorDataCollectDto.setUserType(loginUser.getType());
         //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
         monitorDataCollectDto.setPermissonType(loginUser.getPermissonType());
-        monitorDataCollectDto.setType(4);
         List<MonitorDataCollectDto> result=onlineMonitorMapper.selectDeviceMapParam(monitorDataCollectDto);
+        for(MonitorDataCollectDto monDataCol :result) {
+            //取缓存里的数据
+            byte[] bytes = redisUtil.get(("sms_water_" + monDataCol.getDeviceCode()).getBytes());
+            MonitorDataEntity monitorDataEntity = null;
+            if (bytes != null && bytes.length > 0) {
+                monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
+                SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                monDataCol.setCollectDate(monitorDataEntity.getCollectDate());
+            }
+            for (MonitorDataDto monData : monDataCol.getMonitorDataEntities()) {
+                if (monitorDataEntity != null) {
+                    //筛选该设备相同属性的值
+                    List<MonitorDataValueEntity> attributeEntities = monitorDataEntity.getDataValues().stream().filter((MonitorDataValueEntity m)
+                            -> m.getAttributeId().equals(monData.getAttributeId())).collect(Collectors.toList());
+                    MonitorDataValueEntity attributeEntity = attributeEntities.size() > 0 ? attributeEntities.get(0) : null;
+                    if (attributeEntity != null) {
+                        //赋值
+                        monData.setDataValue(attributeEntity.getDataValue());
+                        monData.setUnit(attributeEntity.getUnit());
+                        if (monData.getAttributeType() != null && (monData.getAttributeType().equals("1") || monData.getAttributeType().equals("2"))) {//如果是状态值 需转换
+                            DecimalFormat decimalFormat = new DecimalFormat("###################.###########");//去掉末尾小数点
+                            String specsValue = attributeEntity.getDataValue() == null ? null : decimalFormat.format(attributeEntity.getDataValue());
+                            monData.setSpecsName(specsValue == null ? null : deviceAttributeSpecsService.selectSpecsName(attributeEntity.getAttributeId(), specsValue));
+                        }
+                    }
 
+                }
+            }
+        }
         return result;
     }
+    /**
+     * 统计设备合格数据
+     * @return
+     */
+    @Override
+    public DeviceCountStatsDto statsDeviceQualified(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());
+        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());
+        }
+        return result;
+    }
+    /**
+     * 统计今日累计流量
+     * @return
+     */
+    @Override
+    public List<MonitorDataCollectDto> statsDeviceFlow(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());
+
+        List<MonitorDataCollectDto> result=onlineMonitorMapper.statsDeviceParm(onlineDataDto);
+        for(MonitorDataCollectDto monDataCol :result) {
+            //取缓存里的数据
+            byte[] bytes = redisUtil.get(("sms_water_" + monDataCol.getDeviceCode()).getBytes());
+            MonitorDataEntity monitorDataEntity = null;
+            if (bytes != null && bytes.length > 0) {
+                monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
+                SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                monDataCol.setCollectDate(monitorDataEntity.getCollectDate());
+            }
+            for (MonitorDataDto monitorData : monDataCol.getMonitorDataEntities()) {
+                if (monitorDataEntity != null) {
+                    SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                    //计算今日数据
+                    if (formatdate.format(new Date()).equals(formatdate.format(monitorDataEntity.getCollectDate()))) {
+                        //筛选该设备相同属性的值
+                        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) {
+                            Double attributeValue = 0d;
+                            if (attributeEntity.getDataValue() != null && monitorData.getLatestValue() != null) {
+                                attributeValue = attributeEntity.getDataValue() - monitorData.getLatestValue();
+                            }
+                            monDataCol.setYieldWaterUsage(monDataCol.getYieldWaterUsage() != null ? monDataCol.getYieldWaterUsage() + attributeValue : attributeValue);
+                        }
+                    }
+                }
+            }
+        }
+        return result;
+    }
+    /**
+     * 统计压力、瞬时流量的分布区间
+     * @return
+     */
+    @Override
+    public int[] statsDeviceParmCount(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());
+
+        int[] deviceCount=new int[6];
+        if(onlineDataDto.getSceneTypeName().equals("压力")){
+            deviceCount=new int[5];
+        }
+        List<MonitorDataCollectDto> result=onlineMonitorMapper.statsDeviceParm(onlineDataDto);
+        for(MonitorDataCollectDto monDataCol :result) {
+            //取缓存里的数据
+            byte[] bytes = redisUtil.get(("sms_water_" + monDataCol.getDeviceCode()).getBytes());
+            MonitorDataEntity monitorDataEntity = null;
+            if (bytes != null && bytes.length > 0) {
+                monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
+                SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                monDataCol.setCollectDate(monitorDataEntity.getCollectDate());
+            }
+            for (MonitorDataDto monitorData : monDataCol.getMonitorDataEntities()) {
+                if (monitorDataEntity != null) {
+                    SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");//日期算换格式
+                    //筛选该设备相同属性的值
+                    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) {
+                       Double dataValue= attributeEntity.getDataValue();
+                       if(dataValue!=null){
+                           if(onlineDataDto.getSceneTypeName().equals("压力")){
+                               if(dataValue<=0.2){
+                                   deviceCount[0]++;
+                               }else if(dataValue<=0.25) {
+                                   deviceCount[1]++;
+                               }else if(dataValue<=0.3) {
+                                   deviceCount[2]++;
+                               }else if(dataValue<=0.35) {
+                                   deviceCount[3]++;
+                               }else if(dataValue>0.35) {
+                                   deviceCount[4]++;
+                               }
+                           }else if(onlineDataDto.getSceneTypeName().equals("流量")){
+                               if(dataValue>=0&&dataValue<=100){
+                                   deviceCount[0]++;
+                               }else if(dataValue<=200) {
+                                   deviceCount[1]++;
+                               }else if(dataValue<=300) {
+                                   deviceCount[2]++;
+                               }else if(dataValue<=400) {
+                                   deviceCount[3]++;
+                               }else if(dataValue<=500) {
+                                   deviceCount[4]++;
+                               }else if(dataValue>500) {
+                                   deviceCount[5]++;
+                               }
+                           }
+                       }
+                    }
+                }
+            }
+        }
+        return deviceCount;
+    }
+    /**
+     * 管网分页查询
+     * @return
+     */
+    @Override
+    public IPage<OnlineDataDto> selectPipeNetPage(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());
+
+        IPage<OnlineDataDto> iPage =onlineMonitorMapper.selectPipeNetPage(page,onlineDataDto);
+        Pagination<OnlineDataDto> pages = new Pagination<>(iPage);
+
+        List<Long> deviceIds = pages.getList().stream().map(OnlineDataDto::getDeviceId).collect(Collectors.toList());
+        onlineDataDto.setDeviceIds(deviceIds);
+        onlineDataDto.setTenantId(loginUser.getTenantId());
+        List<MonitorDataCollectDto> calculateRes=onlineMonitorMapper.statsDeviceParm(onlineDataDto);
+
+        GetCalOnlineData(pages.getList(),calculateRes);//获取在线数据及计算数据
+        return iPage;
+    }
+    /**
+     * 查询管网地图图层
+     * @return
+     */
+    @Override
+    public  List<PipeNetLayerDto> selectPipeNetLayer(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.selectPipeNetLayer(onlineDataDto);
+    }
     /**
      * 获取在线数据及计算数据
      */
@@ -289,82 +492,98 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         for(MonitorDataCollectDto calculate :calculateRes ) {
             for(OnlineDataDto monDataCol : result) {
                 //相同场景 则取值计算
-                if(monDataCol.getSceneId().equals(calculate.getSceneId())) {
-                    List<MonitorDataDto> pumpStatus=new ArrayList<>(0);//水泵状态
-                    for(MonitorDataDto monitorData : calculate.getMonitorDataEntities()){
+                if((monDataCol.getDeviceId()==null&&monDataCol.getSceneId().equals(calculate.getSceneId()))||
+                   (monDataCol.getDeviceId()!=null&&monDataCol.getDeviceId().equals(calculate.getDeviceId()))) {
+                    MonitorDataEntity monitorDataEntity =null;
+                    if(monDataCol.getDeviceId()!=null) {
                         //取缓存里的数据
-                        byte[] bytes = redisUtil.get(("sms_water_"+monitorData.getDeviceCode()).getBytes());
+                        byte[] bytes = redisUtil.get(("sms_water_"+monDataCol.getDeviceCode()).getBytes());
                         if(bytes != null && bytes.length>0) {
-                            MonitorDataEntity monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
-                                monDataCol.setCollectDate(monitorDataEntity.getCollectDate());
-                                //筛选该设备相同属性的值
-                                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) {
-                                    //实时数据
-                                    monitorData.setDataValue(attributeEntity.getDataValue());
-                                    monitorData.setUnit(attributeEntity.getUnit());
-                                    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出水量
-                                                monDataCol.setYieldWaterUsage(monDataCol.getYieldWaterUsage() != null ? monDataCol.getYieldWaterUsage() + attributeValue : attributeValue);
-                                                break;
-                                            case "4"://取水量or进水量
-                                                monDataCol.setIntakeWaterUsage(monDataCol.getIntakeWaterUsage() != null ? monDataCol.getIntakeWaterUsage() + attributeValue : attributeValue);
-                                                break;
-                                            case "5"://耗电量
-                                                monDataCol.setPowerUsage(monDataCol.getPowerUsage() != null ? monDataCol.getPowerUsage() + attributeValue : attributeValue);
-                                                break;
-                                            case "6"://耗药量
-                                                monDataCol.setDrugUsage(monDataCol.getDrugUsage() != null ? monDataCol.getDrugUsage() + attributeValue : attributeValue);
-                                                break;
-                                        }
+                            monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();}
+                    }
+                    List<MonitorDataDto> pumpStatus=new ArrayList<>(0);//水泵状态
+                    for(MonitorDataDto monitorData : calculate.getMonitorDataEntities()){
+                        if(monDataCol.getDeviceId()==null) {
+                            byte[] bytes = redisUtil.get(("sms_water_"+monDataCol.getDeviceCode()).getBytes());
+                            if(bytes != null && bytes.length>0) {
+                                monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();}
+                        }
+                        if(monitorDataEntity != null) {
+                            monDataCol.setCollectDate(monitorDataEntity.getCollectDate());
+                            //筛选该设备相同属性的值
+                            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) {
+                                //实时数据
+                                monitorData.setDataValue(attributeEntity.getDataValue());
+                                monitorData.setUnit(attributeEntity.getUnit());
+                                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 "7"://取水PHor进水PH
-                                            monDataCol.setIntakePh(monitorData);
-                                            break;
-                                        case "8"://供水PHor出水PH
-                                            monDataCol.setYieldPh(monitorData);
-                                            break;
-                                        case "9"://取水浊度or进水浊度
-                                            monDataCol.setIntakeTurbidity(monitorData);
-                                            break;
-                                        case "10"://供水浊度or出水浊度
-                                            monDataCol.setYieldTurbidity(monitorData);
-                                            break;
-                                        case "11"://余氯
-                                            monDataCol.setResidualChlorine(monitorData);
-                                            break;
-                                        case "12"://水位
-                                            monDataCol.setWaterLevel(monitorData);
+                                        case "3"://供水量or出水量
+                                            monDataCol.setYieldWaterUsage(monDataCol.getYieldWaterUsage() != null ? monDataCol.getYieldWaterUsage() + attributeValue : attributeValue);
                                             break;
-                                        case "13"://压力
-                                            monDataCol.setPressure(monitorData);
+                                        case "4"://取水量or进水量
+                                            monDataCol.setIntakeWaterUsage(monDataCol.getIntakeWaterUsage() != null ? monDataCol.getIntakeWaterUsage() + attributeValue : attributeValue);
                                             break;
-                                        case "14"://瞬时流
-                                            monDataCol.setInstantFlow(monitorData);
+                                        case "5"://耗电量
+                                            monDataCol.setPowerUsage(monDataCol.getPowerUsage() != null ? monDataCol.getPowerUsage() + attributeValue : attributeValue);
                                             break;
-                                        case "2"://水泵状态
-                                            DecimalFormat decimalFormat = new DecimalFormat("###################.###########");//去掉末尾小数点
-                                            String specsValue = attributeEntity.getDataValue() == null ? null : decimalFormat.format(attributeEntity.getDataValue());
-                                            monitorData.setSpecsName(specsValue == null ? null : deviceAttributeSpecsService.selectSpecsName(attributeEntity.getAttributeId(), specsValue));
-                                            pumpStatus.add(monitorData);
-                                            monDataCol.setPumpStatus(pumpStatus);
+                                        case "6"://耗药量
+                                            monDataCol.setDrugUsage(monDataCol.getDrugUsage() != null ? monDataCol.getDrugUsage() + attributeValue : attributeValue);
                                             break;
                                     }
                                 }
+                                switch (monitorData.getAttributeType()) {
+                                    case "7"://取水PHor进水PH
+                                        monDataCol.setIntakePh(monitorData);
+                                        break;
+                                    case "8"://供水PHor出水PH
+                                        monDataCol.setYieldPh(monitorData);
+                                        break;
+                                    case "9"://取水浊度or进水浊度
+                                        monDataCol.setIntakeTurbidity(monitorData);
+                                        break;
+                                    case "10"://供水浊度or出水浊度
+                                        monDataCol.setYieldTurbidity(monitorData);
+                                        break;
+                                    case "11"://余氯
+                                        monDataCol.setResidualChlorine(monitorData);
+                                        break;
+                                    case "12"://水位
+                                        monDataCol.setWaterLevel(monitorData);
+                                        break;
+                                    case "13"://压力
+                                        monDataCol.setPressure(monitorData);
+                                        break;
+                                    case "14"://瞬时流量
+                                        monDataCol.setInstantFlow(monitorData);
+                                        break;
+                                    case "2"://水泵状态
+                                        DecimalFormat decimalFormat = new DecimalFormat("###################.###########");//去掉末尾小数点
+                                        String specsValue = attributeEntity.getDataValue() == null ? null : decimalFormat.format(attributeEntity.getDataValue());
+                                        monitorData.setSpecsName(specsValue == null ? null : deviceAttributeSpecsService.selectSpecsName(attributeEntity.getAttributeId(), specsValue));
+                                        pumpStatus.add(monitorData);
+                                        monDataCol.setPumpStatus(pumpStatus);
+                                        break;
+                                    case "16"://累计流量
+                                        monDataCol.setTotalFlow(monitorData);
+                                        break;
+                                    case "18"://电导率
+                                        monDataCol.setConductivity(monitorData);
+                                        break;
+                                }
                             }
                         }
                     }
                 }
             }
         }
+    }
 }

+ 191 - 6
sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml

@@ -36,6 +36,22 @@
             <result property="attributeName" column="attribute_name" jdbcType="VARCHAR"/>
             <result property="unit" column="unit" jdbcType="VARCHAR"/>
             <result property="isAlarm" column="is_Alarm" jdbcType="VARCHAR"/>
+            <result property="attributeType" column="attribute_type" jdbcType="VARCHAR"/>
+            <result property="latestValue" column="latest_value" jdbcType="VARCHAR"/>
+        </collection>
+    </resultMap>
+    <!-- 管网图层设备结果集 -->
+    <resultMap type="com.huaxu.dto.PipeNetLayerDto" id="layerMap">
+        <result property="sceneId" column="scene_id" jdbcType="INTEGER"/>
+        <result property="sceneName" column="scene_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"/>
+            <result property="deviceName" column="device_name" jdbcType="VARCHAR"/>
+            <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="deviceState" column="device_state" jdbcType="INTEGER"/>
         </collection>
     </resultMap>
 
@@ -85,6 +101,22 @@
         )t7 on t7.parent_scene_id=t1.id
     </sql>
 
+    <sql id="deviceInnerJoins">
+        inner join sms_scene_type t3 on t1.scene_type_id=t3.id
+        inner join sms_device_scene t2 on t2.parent_scene_id=t1.id and t2. status = 1
+        inner join sms_device t6 on t2.device_id=t6.id and t6. status = 1
+        inner join sms_scene t4 on t2.scene_id=t4.id
+        inner join sms_scene_type t5 on t4.scene_type_id=t5.id and t5. status = 1
+    </sql>
+
+    <sql id="deviceLeftJoins">
+        inner join sms_scene_type t3 on t1.scene_type_id=t3.id and t3. status = 1
+        left join sms_device_scene t2 on t2.parent_scene_id=t1.id and t2. status = 1
+        left join sms_device t6 on t2.device_id=t6.id and t6. status = 1
+        left join sms_scene t4 on t2.scene_id=t4.id and t4. status = 1
+        left join sms_scene_type t5 on t4.scene_type_id=t5.id and t5. status = 1 and t5.scene_type_name = #{sceneTypeName}
+    </sql>
+
     <!--查询实时报警信息-->
     <select id="selectAlarmDetails" resultType="com.huaxu.dto.AlarmDetailsDto">
         select
@@ -261,13 +293,9 @@
     </select>
     <!--按管网名称分类查询设备数量-->
     <select id="selectDeviceCount" resultType="java.util.Map">
-        select  t1.id,t1.scene_name sceneName,sum(if(t5.id is null,0,1)) deviceCount
+        select  t1.id sceneId,t1.scene_name sceneName,sum(if(t5.id is null,0,1)) deviceCount
         from sms_scene t1
-        inner join sms_scene_type t3 on t1.scene_type_id=t3.id and t3. status = 1
-        left join sms_device_scene t2 on t2.parent_scene_id=t1.id and t2. status = 1
-        left join sms_device t6 on t2.device_id=t6.id and t6. status = 1
-        left join sms_scene t4 on t2.scene_id=t4.id and t4. status = 1
-        left join sms_scene_type t5 on t4.scene_type_id=t5.id and t5. status = 1 and t5.scene_type_name = #{sceneTypeName}
+        <include refid="deviceLeftJoins"/>
         where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t3.scene_type_name = '管网'
         <if test="sceneIds != null and sceneIds.size() > 0">
             and t1.id  in
@@ -299,4 +327,161 @@
         left join sms_alarm_details t6 on t6.device_id=t1.id and t6.attribute_id=t2.attribute_id and t6.status = 1 and t6.state=1
         where t1. status = 1 and t1. enable_state = 1 and t1.id= #{deviceId}
     </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
+        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}
+        <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="sceneIds == null or sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        <if test="sceneId != null">
+            and t1.id = #{sceneId}
+        </if>
+        <if test="deviceName != null and deviceName != ''">
+            and t6.device_name like concat('%', #{deviceName},'%')
+        </if>
+    </select>
+    <!--统计设备属性合格数据-->
+    <select id="statsParmQualified" resultType="com.huaxu.dto.DeviceCountStatsDto">
+        select case t7.parm_type when '13' then '压力' when '7' then 'PH' when '9' then '浊度' when '11' then '余氯' end type,
+        count(t8.device_id) alarmCount
+        from sms_scene t1
+        <include refid="deviceInnerJoins"/>
+        inner join sms_device_parm t7 on  t7.scene_id=t2.scene_id and  t7.device_id=t2.device_id
+        <if test="sceneTypeName == '压力'">
+            and t7.parm_type in(13)
+        </if>
+        <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
+        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
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="sceneIds == null or sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        <if test="sceneId != null">
+            and t1.id = #{sceneId}
+        </if>
+        <if test="deviceName != null and deviceName != ''">
+            and t6.device_name like concat('%', #{deviceName},'%')
+        </if>
+        group by t7.parm_type
+    </select>
+    <!-- 查询设备参数-->
+    <select id="statsDeviceParm" resultMap="deviceDataMap">
+        SELECT t6.id device_id,t6.device_code,t6.device_name,t7.attribute_id,t7.parm_type attribute_type,
+         case when t7.attribute_id is  null then null when t8.id is null then 0 else 1 end is_alarm
+        <if test="type == 4 ">,t8.latest_value</if>
+        from sms_scene t1
+        <include refid="deviceInnerJoins"/>
+        left join sms_device_parm t7 on  t7.scene_id=t2.scene_id and  t7.device_id=t2.device_id
+        <if test="type == 1 ">
+            and t7.parm_type in(13)
+        </if>
+        <if test="type == 2 ">
+            and t7.parm_type in(14,16)
+        </if>
+        <if test="type == 3">
+            and t7.parm_type in(7,9,11,18)
+        </if>
+        <if test="type == 4 ">
+            and t7.parm_type in(16)
+            left join (
+            select b1.device_id,b1.attribute_id,max(latest_value) latest_value
+            from sms_day_report b1
+            where b1.year = year(now() + interval-1 day) and b1.month = month(now() + interval-1 day) and b1.day = day(now() + interval-1 day)
+            group by b1.device_id,b1.attribute_id
+            )t8 on t8.device_id=t2.device_id and t8.attribute_id =t7.attribute_id
+        </if>
+        <if test="type == 5 ">
+            and t7.parm_type in(14)
+        </if>
+        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
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="sceneIds == null or sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        <if test="sceneId != null">
+            and t1.id = #{sceneId}
+        </if>
+        <if test="deviceIds != null and deviceIds.size() > 0">
+            and t6.id  in
+            <foreach collection="deviceIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="deviceName != null and deviceName != ''">
+            and t6.device_name like concat('%', #{deviceName},'%')
+        </if>
+    </select>
+    <!--查询管网实时数据列表-->
+    <select id="selectPipeNetPage" resultType="com.huaxu.dto.OnlineDataDto">
+        select t1.id scene_id,t1.scene_name,t6.id device_id,t6.device_code,t6.device_name,t6.address,if (t7.alarm_count>0, 1, 0) deviceState
+        from sms_scene t1
+        <include refid="deviceInnerJoins"/>
+        left join(
+        select a1.scene_id, a1.device_id ,count(1) alarm_count 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 = #{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>
+        <if test="onlineDataDto.sceneIds == null or onlineDataDto.sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        <if test="onlineDataDto.sceneId != null">
+            and t1.id = #{onlineDataDto.sceneId}
+        </if>
+        <if test="onlineDataDto.deviceName != null and onlineDataDto.deviceName != ''">
+            and t6.device_name like concat('%', #{onlineDataDto.deviceName},'%')
+        </if>
+        order by  t6.date_create
+    </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
+        from sms_scene t1
+        <include refid="deviceInnerJoins"/>
+        left join(
+            select a1.scene_id, a1.device_id ,count(1) alarm_count 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 in('压力','流量','水质')
+        <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="sceneIds == null or sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        order by t4.scene_name,t6.date_create
+    </select>
 </mapper>