From cdbb4fe4287e969507770dd73529c3027305f80a Mon Sep 17 00:00:00 2001 From: wr <1754607820@qq.com> Date: Thu, 1 Aug 2024 11:41:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=A7=A3=E5=86=B3pq=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=9F=A5=E8=AF=A2=E7=9B=91=E6=B5=8B=E7=82=B9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=8C=E6=AF=8D=E7=BA=BF=EF=BC=8C=E7=BB=88?= =?UTF-8?q?=E7=AB=AF=E7=AD=89=E4=BF=A1=E6=81=AF=202.=E8=A7=A3=E5=86=B3devi?= =?UTF-8?q?ce=E6=A8=A1=E5=9D=97swagger=E9=A1=B5=E9=9D=A2=E5=87=BA=E4=B8=8D?= =?UTF-8?q?=E6=9D=A5=E9=97=AE=E9=A2=98=203.=E6=8A=80=E6=9C=AF=E7=9B=91?= =?UTF-8?q?=E7=9D=A3=E5=8F=98=E7=94=B5=E7=AB=99=E5=8F=B0=E8=B4=A6=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0=204.=E7=9B=91=E6=B5=8B=E7=82=B9?= =?UTF-8?q?=E8=AF=95=E8=BF=90=E8=A1=8C=E6=8A=A5=E5=91=8A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=EF=BC=8C=E9=97=B4=E8=B0=90=E6=B3=A2=E7=94=B5=E5=8E=8B=E5=92=8C?= =?UTF-8?q?=E6=9A=82=E6=80=81=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/pq/controller/LineController.java | 1 - .../pq/mapper/mapping/DeptLineMapper.xml | 2 +- .../pq/service/impl/GeneralDeviceService.java | 36 +- .../event/api/EventDetailFeignClient.java | 7 + ...EventDetailFeignClientFallbackFactory.java | 6 + .../event/pojo/param/EventCountParam.java | 4 + .../majornetwork/EventDetailController.java | 18 + .../njcn/harmonic/api/ReportFeignClient.java | 22 +- .../fallback/ReportClientFallbackFactory.java | 2 +- .../com/njcn/harmonic/utils/WordUtil2.java | 40 +- .../controller/ExportModelController.java | 91 +- .../controller/ExportModelJBController.java | 1962 +++++++++++++++++ .../PollutionSubstationController.java | 5 +- .../mapper/RStatDataInharmVDMapper.java | 13 + .../njcn/harmonic/mapper/ReportMapper.java | 9 +- .../mapping/RStatDataInharmVDMapper.xml | 7 + .../mapper/mapping/RStatLimitRateDMapper.xml | 2 +- .../harmonic/mapper/mapping/ReportMapper.xml | 54 + .../njcn/harmonic/service/ReportService.java | 16 +- .../impl/PollutionSubstationServiceImpl.java | 600 ++--- .../service/impl/ReportServiceImpl.java | 178 +- .../main/resources/file/reportModelJB.docx | Bin 0 -> 83069 bytes ...SupervisionTempLineDebugPOServiceImpl.java | 174 +- .../SupervisionTempLineReportServiceImpl.java | 3 +- ...SupervisionTempLineRunTestServiceImpl.java | 2 +- 25 files changed, 2753 insertions(+), 501 deletions(-) create mode 100644 pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelJBController.java create mode 100644 pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/RStatDataInharmVDMapper.java create mode 100644 pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/mapper/mapping/RStatDataInharmVDMapper.xml create mode 100644 pqs-harmonic/harmonic-boot/src/main/resources/file/reportModelJB.docx diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineController.java index 57bacf498..e19fca334 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/LineController.java @@ -509,7 +509,6 @@ public class LineController extends BaseController { @OperateInfo(info = LogEnum.BUSINESS_COMMON) @ApiOperation("根据装置部门和模糊搜索获取装置详情") - @ApiImplicitParam(name = "id", value = "装置id", required = true) @PostMapping("/getDeptDeviceDetailData") HttpResult> getDeptDeviceDetailData(@RequestBody DataParam param){ String methodDescribe = getMethodDescribe("getDeptDeviceDetailData"); diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml index ffc9f5692..ca7e3341d 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/DeptLineMapper.xml @@ -98,11 +98,11 @@ + diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/ReportService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/ReportService.java index 67795d509..e5d442ea9 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/ReportService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/ReportService.java @@ -12,7 +12,7 @@ import java.util.List; public interface ReportService { /** - * + * 限值 * @param param * @return */ @@ -80,4 +80,18 @@ public interface ReportService { * @return */ List getVoltageRate(ReportQueryParam param); + + /** + * 间谐波 + * @param param + * @return + */ + List getInharmVeRate(ReportQueryParam param); + + /** + * 负序电流 + * @param param + * @return + */ + List getINegDataRate(ReportQueryParam param); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java index 77d9e83c4..5e2993012 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/PollutionSubstationServiceImpl.java @@ -3,6 +3,7 @@ package com.njcn.harmonic.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -51,12 +52,6 @@ import com.njcn.system.enums.DicDataEnum; import com.njcn.user.api.DeptFeignClient; import com.njcn.user.pojo.po.Dept; import com.njcn.web.utils.RequestUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; @@ -66,8 +61,15 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + + /** - * * Description: * 接口文档访问地址:http://serverIP:port/swagger-ui.html * Date: 2022/10/13 8:56【需求编号】 @@ -123,66 +125,66 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getPollutionSubstationData(PollutionSubstationQuryParam pollutionSubstationQuryParam) { - List pollutionSubstationVOList = new ArrayList<> (); + List pollutionSubstationVOList = new ArrayList<>(); /*根据部门获取变电站详情*/ HarmonicPublicParam harmonicPublicParam = new HarmonicPublicParam(); - BeanUtils.copyProperties (pollutionSubstationQuryParam, harmonicPublicParam); + BeanUtils.copyProperties(pollutionSubstationQuryParam, harmonicPublicParam); harmonicPublicParam.setServerName(generalInfo.getMicroServiceName()); List pollutionSubstationDTOList = new ArrayList<>(); List sub = generalDeviceInfoClient.getPracticalRunDeviceInfoAsSubstation(harmonicPublicParam).getData(); - sub.forEach(item->{ + sub.forEach(item -> { PollutionSubstationDTO pollutionSubstationDTO = lineFeignClient.getSubstationInfo(item.getIndex()).getData(); pollutionSubstationDTOList.add(pollutionSubstationDTO); }); - List collect = pollutionSubstationDTOList.stream ( ).map (PollutionSubstationDTO::getId).collect (Collectors.toList ( )); - List locationData = substationFeignClient.getSubstationById (collect).getData ( ); + List collect = pollutionSubstationDTOList.stream().map(PollutionSubstationDTO::getId).collect(Collectors.toList()); + List locationData = substationFeignClient.getSubstationById(collect).getData(); /*todo 后期可以把locationData存入redis*/ /*把所有的变电站的污染指数查出来*/ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.in ("substation_id",collect). - eq ("pollution_type", pollutionSubstationQuryParam.getPollutionStatis ().getId ()). - eq("DATE_FORMAT( data_date ,'%Y-%m')",pollutionSubstationQuryParam.getLocalDate ()); - List rStatPollutionSubstationMList = pollutionSubstationMMapper.selectList (wrapper); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in("substation_id", collect). + eq("pollution_type", pollutionSubstationQuryParam.getPollutionStatis().getId()). + eq("DATE_FORMAT( data_date ,'%Y-%m')", pollutionSubstationQuryParam.getLocalDate()); + List rStatPollutionSubstationMList = pollutionSubstationMMapper.selectList(wrapper); - pollutionSubstationDTOList.forEach (substationInfo ->{ + pollutionSubstationDTOList.forEach(substationInfo -> { - Integer lineCount = lineFeignClient.getLineCountBySubstation (substationInfo.getId ( )).getData ( ); - Integer deviceCount = lineFeignClient.getDeviceCountBySubstation (substationInfo.getId ()).getData (); - PollutionSubstationVO pollutionSubstationVO =new PollutionSubstationVO (); - pollutionSubstationVO.setSubstationId (substationInfo.getId ()); - pollutionSubstationVO.setSubstationName (substationInfo.getName ()); - pollutionSubstationVO.setDeviceCount (deviceCount); - pollutionSubstationVO.setLineCount (lineCount); + Integer lineCount = lineFeignClient.getLineCountBySubstation(substationInfo.getId()).getData(); + Integer deviceCount = lineFeignClient.getDeviceCountBySubstation(substationInfo.getId()).getData(); + PollutionSubstationVO pollutionSubstationVO = new PollutionSubstationVO(); + pollutionSubstationVO.setSubstationId(substationInfo.getId()); + pollutionSubstationVO.setSubstationName(substationInfo.getName()); + pollutionSubstationVO.setDeviceCount(deviceCount); + pollutionSubstationVO.setLineCount(lineCount); /*todo 添加经纬度接口返回数据暂时没有*/ - List substationDTOList = locationData.stream ( ) - .filter (temp -> Objects.equals (substationInfo.getId ( ), temp.getId ( ))) - .collect (Collectors.toList ( )); + List substationDTOList = locationData.stream() + .filter(temp -> Objects.equals(substationInfo.getId(), temp.getId())) + .collect(Collectors.toList()); - SubstationDTO substationDTO = new SubstationDTO (); - if(CollectionUtils.isEmpty (substationDTOList)){ - throw new BusinessException (CommonResponseEnum.INTERNAL_ERROR); - }else{ - substationDTO = substationDTOList.get (0); + SubstationDTO substationDTO = new SubstationDTO(); + if (CollectionUtils.isEmpty(substationDTOList)) { + throw new BusinessException(CommonResponseEnum.INTERNAL_ERROR); + } else { + substationDTO = substationDTOList.get(0); } - pollutionSubstationVO.setLatitude (substationDTO.getLat ()); - pollutionSubstationVO.setLongitude (substationDTO.getLng ()); + pollutionSubstationVO.setLatitude(substationDTO.getLat()); + pollutionSubstationVO.setLongitude(substationDTO.getLng()); - List rStatPollutionSubstationMS = rStatPollutionSubstationMList.stream ( ). - filter (temp -> Objects.equals (substationInfo.getId ( ), temp.getSubstationId ( ))) - .collect (Collectors.toList ( )); + List rStatPollutionSubstationMS = rStatPollutionSubstationMList.stream(). + filter(temp -> Objects.equals(substationInfo.getId(), temp.getSubstationId())) + .collect(Collectors.toList()); Double value = 3.14159; - if(!CollectionUtils.isEmpty (rStatPollutionSubstationMS)){ - value = rStatPollutionSubstationMS.get (0).getValue (); + if (!CollectionUtils.isEmpty(rStatPollutionSubstationMS)) { + value = rStatPollutionSubstationMS.get(0).getValue(); } - pollutionSubstationVO.setPollutionData (value); - pollutionSubstationVO.setPollutionStatis ( pollutionSubstationQuryParam.getStatisticalType ().getName ()); - pollutionSubstationVOList.add (pollutionSubstationVO); + pollutionSubstationVO.setPollutionData(value); + pollutionSubstationVO.setPollutionStatis(pollutionSubstationQuryParam.getStatisticalType().getName()); + pollutionSubstationVOList.add(pollutionSubstationVO); }); - List result = pollutionSubstationVOList.stream ( ).sorted (Comparator.comparing (PollutionSubstationVO::getPollutionData).reversed ( )).collect (Collectors.toList ( )); + List result = pollutionSubstationVOList.stream().sorted(Comparator.comparing(PollutionSubstationVO::getPollutionData).reversed()).collect(Collectors.toList()); return result; } @@ -197,8 +199,8 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getDeptSubstationRelations(HarmonicPublicParam harmonicPublicParam) { List list = new ArrayList<>(); - String pollutionType = harmonicPublicParam.getStatisticalType ().getId (); - String searchBeginTime = harmonicPublicParam.getSearchBeginTime ().substring (0,10); + String pollutionType = harmonicPublicParam.getStatisticalType().getId(); + String searchBeginTime = harmonicPublicParam.getSearchBeginTime().substring(0, 10); if (StringUtils.isBlank(RequestUtil.getDeptIndex())) { return list; } @@ -210,18 +212,18 @@ public class PollutionSubstationServiceImpl extends ServiceImpl orgList = pmsGeneralDeviceInfoClient.getPmsDeviceInfoWithInOrg(pmsDeviceInfoParam).getData(); orgList.forEach(temp -> { - PollutionVO pollutionVO = new PollutionVO (); - String detpid = temp.getIndex (); - String name =temp.getName (); - List powers = temp.getPowerrIdList ( ); - pollutionVO.setId (detpid); - pollutionVO.setName (name+"\n("+temp.getMonitorIdList().size()+")"); - pollutionVO.setData (3.14159); - setData(harmonicPublicParam, pollutionType, searchBeginTime,harmonicPublicParam.getSearchEndTime(), pollutionVO, detpid); - if(CollectionUtil.isNotEmpty(powers)) { + PollutionVO pollutionVO = new PollutionVO(); + String detpid = temp.getIndex(); + String name = temp.getName(); + List powers = temp.getPowerrIdList(); + pollutionVO.setId(detpid); + pollutionVO.setName(name + "\n(" + temp.getMonitorIdList().size() + ")"); + pollutionVO.setData(3.14159); + setData(harmonicPublicParam, pollutionType, searchBeginTime, harmonicPublicParam.getSearchEndTime(), pollutionVO, detpid); + if (CollectionUtil.isNotEmpty(powers)) { //子集变电站 List powersVO = new ArrayList<>(); - PmsStatationStatInfoParam param=new PmsStatationStatInfoParam(); + PmsStatationStatInfoParam param = new PmsStatationStatInfoParam(); param.setPowerIds(powers); List data = statationStatClient.getStatationStatInfo(param).getData(); //去重解决重复数据 @@ -229,24 +231,24 @@ public class PollutionSubstationServiceImpl extends ServiceImpl new TreeSet<>(Comparator.comparing(o -> o.getPowerId()))), ArrayList::new)); Map stringDoubleMap = setPmsSubData(harmonicPublicParam, pollutionType, searchBeginTime, powers); - if(CollectionUtil.isNotEmpty(data)) { - dsData.forEach(power->{ - PollutionVO pollutionsubVO = new PollutionVO (); - pollutionsubVO.setId (power.getPowerId()); - pollutionsubVO.setName ( power.getPowerName ()); - pollutionsubVO.setPid (temp.getIndex ()); - if(CollectionUtil.isNotEmpty(stringDoubleMap)){ - if(stringDoubleMap.containsKey(power.getPowerId())){ + if (CollectionUtil.isNotEmpty(data)) { + dsData.forEach(power -> { + PollutionVO pollutionsubVO = new PollutionVO(); + pollutionsubVO.setId(power.getPowerId()); + pollutionsubVO.setName(power.getPowerName()); + pollutionsubVO.setPid(temp.getIndex()); + if (CollectionUtil.isNotEmpty(stringDoubleMap)) { + if (stringDoubleMap.containsKey(power.getPowerId())) { pollutionsubVO.setData(stringDoubleMap.get(power.getPowerId())); } } - powersVO.add (pollutionsubVO) ; + powersVO.add(pollutionsubVO); }); } powersVO.sort((item1, item2) -> item2.getData().compareTo(item1.getData())); - pollutionVO.setChildren (powersVO); + pollutionVO.setChildren(powersVO); } - list.add (pollutionVO); + list.add(pollutionVO); }); } else { @@ -254,7 +256,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl sub = generalDeviceInfoClient.getPracticalRunDeviceInfo(harmonicPublicParam).getData(); for (GeneralDeviceDTO temp : sub) { List subIndexes = temp.getSubIndexes(); - if(CollectionUtil.isEmpty(subIndexes)){ + if (CollectionUtil.isEmpty(subIndexes)) { continue; } PollutionVO pollutionVO = new PollutionVO(); @@ -262,9 +264,9 @@ public class PollutionSubstationServiceImpl extends ServiceImpl subPollutionVO = new ArrayList<>(); subIndexes.forEach(subIndex -> { PollutionVO pollutionsubVO = new PollutionVO(); @@ -274,14 +276,14 @@ public class PollutionSubstationServiceImpl extends ServiceImpl listSort = list.stream().filter(x -> x.getData() != 3.14159).sorted(Comparator.comparing(PollutionVO::getData).reversed().thenComparing(PollutionVO::getName)).collect(Collectors.toList()); listSort.addAll(list.stream().filter(x -> x.getData() == 3.14159).collect(Collectors.toList())); return listSort; @@ -289,125 +291,125 @@ public class PollutionSubstationServiceImpl extends ServiceImpl setPmsSubData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime, List id) { - if(Objects.equals (harmonicPublicParam.getReportFlag (), BizParamConstant.STAT_BIZ_YEAR) ){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.in ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); + private Map setPmsSubData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime, List id) { + if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_YEAR)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); List s = pollutionSubstationYPOMapper.selectList(wrapper); - return s.stream().collect(Collectors.toMap(RStatPollutionSubstationYPO::getSubstationId, RStatPollutionSubstationYPO::getValue)); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_QUARTER)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.in ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); + return s.stream().collect(Collectors.toMap(RStatPollutionSubstationYPO::getSubstationId, RStatPollutionSubstationYPO::getValue)); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_QUARTER)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); List s = pollutionSubstationQPOMapper.selectList(wrapper); return s.stream().collect(Collectors.toMap(RStatPollutionSubstationQPO::getSubstationId, RStatPollutionSubstationQPO::getValue)); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_MONTH)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.in ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_MONTH)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); List s = pollutionSubstationMMapper.selectList(wrapper); return s.stream().collect(Collectors.toMap(RStatPollutionSubstationM::getSubstationId, RStatPollutionSubstationM::getValue)); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_DAY)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.in ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_DAY)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.in("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); List s = pollutionSubstationDPOMapper.selectList(wrapper); return s.stream().collect(Collectors.toMap(RStatPollutionSubstationDPO::getSubstationId, RStatPollutionSubstationDPO::getValue)); } return null; } - private void setSubData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime,String searchEndTime, PollutionVO pollutionsubVO, String id) { - if(Objects.equals (harmonicPublicParam.getReportFlag (), BizParamConstant.STAT_BIZ_YEAR) ){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationYPO rStatPollutionSubstationYPO = pollutionSubstationYPOMapper.selectOne (wrapper); + private void setSubData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime, String searchEndTime, PollutionVO pollutionsubVO, String id) { + if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_YEAR)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationYPO rStatPollutionSubstationYPO = pollutionSubstationYPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationYPO).ifPresent (t->pollutionsubVO.setData (t.getValue ())); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_QUARTER)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationQPO rStatPollutionSubstationQPO = pollutionSubstationQPOMapper.selectOne (wrapper); + Optional.ofNullable(rStatPollutionSubstationYPO).ifPresent(t -> pollutionsubVO.setData(t.getValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_QUARTER)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationQPO rStatPollutionSubstationQPO = pollutionSubstationQPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationQPO).ifPresent (t->pollutionsubVO.setData (t.getValue ())); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_MONTH)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationM rStatPollutionSubstationM = pollutionSubstationMMapper.selectOne (wrapper); + Optional.ofNullable(rStatPollutionSubstationQPO).ifPresent(t -> pollutionsubVO.setData(t.getValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_MONTH)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationM rStatPollutionSubstationM = pollutionSubstationMMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationM).ifPresent (t->pollutionsubVO.setData (t.getValue ())); + Optional.ofNullable(rStatPollutionSubstationM).ifPresent(t -> pollutionsubVO.setData(t.getValue())); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_DAY)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne (wrapper); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_DAY)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationDPO).ifPresent (t->pollutionsubVO.setData (t.getValue ())); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_WEEK)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - between("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime,searchEndTime) - .orderByDesc("value").last(" limit 1"); - RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne (wrapper); - Optional.ofNullable (rStatPollutionSubstationDPO).ifPresent (t->pollutionsubVO.setData (t.getValue ())); + Optional.ofNullable(rStatPollutionSubstationDPO).ifPresent(t -> pollutionsubVO.setData(t.getValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_WEEK)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + between("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime, searchEndTime) + .orderByDesc("value").last(" limit 1"); + RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne(wrapper); + Optional.ofNullable(rStatPollutionSubstationDPO).ifPresent(t -> pollutionsubVO.setData(t.getValue())); } } - private void setData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime,String searchEndTime, PollutionVO pollutionVO, String detpid) { + private void setData(HarmonicPublicParam harmonicPublicParam, String pollutionType, String searchBeginTime, String searchEndTime, PollutionVO pollutionVO, String detpid) { - if(Objects.equals (harmonicPublicParam.getReportFlag (), BizParamConstant.STAT_BIZ_YEAR) ) { - QueryWrapper rStatPollutionOrgYPOQueryWrapper = new QueryWrapper<> (); - rStatPollutionOrgYPOQueryWrapper.eq ("org_id", detpid). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionOrgYPO rStatPollutionOrgYPO = rStatPollutionOrgYPOMapper.selectOne (rStatPollutionOrgYPOQueryWrapper); - Optional.ofNullable (rStatPollutionOrgYPO).ifPresent (a->pollutionVO.setData (BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); - } else if (Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_QUARTER)) { - QueryWrapper rStatPollutionOrgQPOQueryWrapper = new QueryWrapper<> (); - rStatPollutionOrgQPOQueryWrapper.eq ("org_id", detpid). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionOrgQPO rStatPollutionOrgQPO = rStatPollutionOrgQPOMapper.selectOne (rStatPollutionOrgQPOQueryWrapper); - Optional.ofNullable (rStatPollutionOrgQPO).ifPresent (a->pollutionVO.setData (BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); - } else if (Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_MONTH)) { - QueryWrapper rStatPollutionOrgMPOQueryWrapper = new QueryWrapper<> (); - rStatPollutionOrgMPOQueryWrapper.eq ("org_id", detpid). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionOrgMPO rStatPollutionOrgMPO = rStatPollutionOrgMPOMapper.selectOne (rStatPollutionOrgMPOQueryWrapper); - Optional.ofNullable (rStatPollutionOrgMPO).ifPresent (a->pollutionVO.setData (BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); - } else if (Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_DAY)) { - QueryWrapper rStatPollutionOrgDPOQueryWrapper = new QueryWrapper<> (); - rStatPollutionOrgDPOQueryWrapper.eq ("org_id", detpid). - eq ("pollution_type", pollutionType). - between("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime,searchEndTime) + if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_YEAR)) { + QueryWrapper rStatPollutionOrgYPOQueryWrapper = new QueryWrapper<>(); + rStatPollutionOrgYPOQueryWrapper.eq("org_id", detpid). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionOrgYPO rStatPollutionOrgYPO = rStatPollutionOrgYPOMapper.selectOne(rStatPollutionOrgYPOQueryWrapper); + Optional.ofNullable(rStatPollutionOrgYPO).ifPresent(a -> pollutionVO.setData(BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_QUARTER)) { + QueryWrapper rStatPollutionOrgQPOQueryWrapper = new QueryWrapper<>(); + rStatPollutionOrgQPOQueryWrapper.eq("org_id", detpid). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionOrgQPO rStatPollutionOrgQPO = rStatPollutionOrgQPOMapper.selectOne(rStatPollutionOrgQPOQueryWrapper); + Optional.ofNullable(rStatPollutionOrgQPO).ifPresent(a -> pollutionVO.setData(BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_MONTH)) { + QueryWrapper rStatPollutionOrgMPOQueryWrapper = new QueryWrapper<>(); + rStatPollutionOrgMPOQueryWrapper.eq("org_id", detpid). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionOrgMPO rStatPollutionOrgMPO = rStatPollutionOrgMPOMapper.selectOne(rStatPollutionOrgMPOQueryWrapper); + Optional.ofNullable(rStatPollutionOrgMPO).ifPresent(a -> pollutionVO.setData(BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_DAY)) { + QueryWrapper rStatPollutionOrgDPOQueryWrapper = new QueryWrapper<>(); + rStatPollutionOrgDPOQueryWrapper.eq("org_id", detpid). + eq("pollution_type", pollutionType). + between("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime, searchEndTime) .orderByDesc("value").last(" limit 1"); - RStatPollutionOrgDPO rStatPollutionOrgDPO = rStatPollutionOrgDPOMapper.selectOne (rStatPollutionOrgDPOQueryWrapper); - Optional.ofNullable (rStatPollutionOrgDPO).ifPresent (a->pollutionVO.setData (BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); - }else if(Objects.equals (harmonicPublicParam.getReportFlag (),BizParamConstant.STAT_BIZ_WEEK)){ - QueryWrapper rStatPollutionOrgDPOQueryWrapper = new QueryWrapper<> (); - rStatPollutionOrgDPOQueryWrapper.eq ("org_id", detpid). - eq ("pollution_type", pollutionType). - between("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime,searchEndTime) + RStatPollutionOrgDPO rStatPollutionOrgDPO = rStatPollutionOrgDPOMapper.selectOne(rStatPollutionOrgDPOQueryWrapper); + Optional.ofNullable(rStatPollutionOrgDPO).ifPresent(a -> pollutionVO.setData(BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); + } else if (Objects.equals(harmonicPublicParam.getReportFlag(), BizParamConstant.STAT_BIZ_WEEK)) { + QueryWrapper rStatPollutionOrgDPOQueryWrapper = new QueryWrapper<>(); + rStatPollutionOrgDPOQueryWrapper.eq("org_id", detpid). + eq("pollution_type", pollutionType). + between("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime, searchEndTime) .orderByDesc("value").last(" limit 1"); - RStatPollutionOrgDPO rStatPollutionOrgDPO = rStatPollutionOrgDPOMapper.selectOne (rStatPollutionOrgDPOQueryWrapper); - Optional.ofNullable (rStatPollutionOrgDPO).ifPresent (a->pollutionVO.setData (BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); + RStatPollutionOrgDPO rStatPollutionOrgDPO = rStatPollutionOrgDPOMapper.selectOne(rStatPollutionOrgDPOQueryWrapper); + Optional.ofNullable(rStatPollutionOrgDPO).ifPresent(a -> pollutionVO.setData(BigDecimal.valueOf(a.getValue()).setScale(2, RoundingMode.UP).doubleValue())); } } @@ -422,15 +424,15 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getSubstationInfoById(HarmonicPublicParam deptParam) { - String pollutionType = deptParam.getStatisticalType ( ).getId (); - String searchBeginTime = deptParam.getSearchBeginTime ( ).substring (0,10); + String pollutionType = deptParam.getStatisticalType().getId(); + String searchBeginTime = deptParam.getSearchBeginTime().substring(0, 10); List list = new ArrayList<>(); if (deptParam.getType() != 0) { PmsDeviceInfoParam pmsDeviceInfoParam = new PmsDeviceInfoParam(); //根据部门code获取部门id Dept dept = deptFeignClient.getDeptByCode(deptParam.getDeptIndex()).getData(); - if(ObjectUtil.isNull(dept)){ + if (ObjectUtil.isNull(dept)) { return list; } pmsDeviceInfoParam.setDeptIndex(dept.getId()); @@ -438,11 +440,11 @@ public class PollutionSubstationServiceImpl extends ServiceImpl deviceList = pmsGeneralDeviceInfoClient.getPmsDeviceInfoWithInOrg(pmsDeviceInfoParam).getData(); - deviceList.forEach(temp->{ - List powers = temp.getPowerrIdList ( ); + deviceList.forEach(temp -> { + List powers = temp.getPowerrIdList(); //变电站不为空 - if(CollectionUtil.isNotEmpty(powers)){ - PmsStatationStatInfoParam param=new PmsStatationStatInfoParam(); + if (CollectionUtil.isNotEmpty(powers)) { + PmsStatationStatInfoParam param = new PmsStatationStatInfoParam(); param.setPowerIds(powers); List data = statationStatClient.getStatationStatInfo(param).getData(); //去重解决重复数据 @@ -450,68 +452,68 @@ public class PollutionSubstationServiceImpl extends ServiceImpl new TreeSet<>(Comparator.comparing(o -> o.getPowerId()))), ArrayList::new)); Map stringDoubleMap = setPmsSubData(deptParam, pollutionType, searchBeginTime, powers); - if(CollectionUtil.isNotEmpty(data)){ - dsData.forEach(power->{ - PollutionSubstationDTO dto=new PollutionSubstationDTO(); + if (CollectionUtil.isNotEmpty(data)) { + dsData.forEach(power -> { + PollutionSubstationDTO dto = new PollutionSubstationDTO(); dto.setId(power.getPowerId()); dto.setName(power.getPowerName()); dto.setVoltageLevel(power.getPowerVoltageLevel()); - if(CollectionUtil.isNotEmpty(stringDoubleMap)){ - if(stringDoubleMap.containsKey(power.getPowerId())){ + if (CollectionUtil.isNotEmpty(stringDoubleMap)) { + if (stringDoubleMap.containsKey(power.getPowerId())) { dto.setData(stringDoubleMap.get(power.getPowerId())); } } - list.add (dto) ; + list.add(dto); }); } } }); - }else{ + } else { deptParam.setServerName(generalInfo.getMicroServiceName()); List sub = generalDeviceInfoClient.getPracticalRunDeviceInfoAsSubstation(deptParam).getData(); - sub.forEach(item->{ + sub.forEach(item -> { PollutionSubstationDTO pollutionSubstationDTO = lineFeignClient.getSubstationInfo(item.getIndex()).getData(); - String id = pollutionSubstationDTO.getId (); - if(Objects.equals (deptParam.getReportFlag (),BizParamConstant.STAT_BIZ_YEAR) ){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationYPO rStatPollutionSubstationYPO = pollutionSubstationYPOMapper.selectOne (wrapper); + String id = pollutionSubstationDTO.getId(); + if (Objects.equals(deptParam.getReportFlag(), BizParamConstant.STAT_BIZ_YEAR)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationYPO rStatPollutionSubstationYPO = pollutionSubstationYPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationYPO).ifPresent (t->pollutionSubstationDTO.setData (t.getValue ())); - }else if(Objects.equals (deptParam.getReportFlag (),BizParamConstant.STAT_BIZ_QUARTER)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationQPO rStatPollutionSubstationQPO = pollutionSubstationQPOMapper.selectOne (wrapper); + Optional.ofNullable(rStatPollutionSubstationYPO).ifPresent(t -> pollutionSubstationDTO.setData(t.getValue())); + } else if (Objects.equals(deptParam.getReportFlag(), BizParamConstant.STAT_BIZ_QUARTER)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationQPO rStatPollutionSubstationQPO = pollutionSubstationQPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationQPO).ifPresent (t->pollutionSubstationDTO.setData (t.getValue ())); - }else if(Objects.equals (deptParam.getReportFlag (),BizParamConstant.STAT_BIZ_MONTH)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationM rStatPollutionSubstationM = pollutionSubstationMMapper.selectOne (wrapper); + Optional.ofNullable(rStatPollutionSubstationQPO).ifPresent(t -> pollutionSubstationDTO.setData(t.getValue())); + } else if (Objects.equals(deptParam.getReportFlag(), BizParamConstant.STAT_BIZ_MONTH)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationM rStatPollutionSubstationM = pollutionSubstationMMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationM).ifPresent (t->pollutionSubstationDTO.setData (t.getValue ())); + Optional.ofNullable(rStatPollutionSubstationM).ifPresent(t -> pollutionSubstationDTO.setData(t.getValue())); - }else if(Objects.equals (deptParam.getReportFlag (),BizParamConstant.STAT_BIZ_DAY)){ - QueryWrapper wrapper = new QueryWrapper<> (); - wrapper.eq ("substation_id",id). - eq ("pollution_type", pollutionType). - eq("DATE_FORMAT( data_date ,'%Y-%m-%d')",searchBeginTime); - RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne (wrapper); + } else if (Objects.equals(deptParam.getReportFlag(), BizParamConstant.STAT_BIZ_DAY)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("substation_id", id). + eq("pollution_type", pollutionType). + eq("DATE_FORMAT( data_date ,'%Y-%m-%d')", searchBeginTime); + RStatPollutionSubstationDPO rStatPollutionSubstationDPO = pollutionSubstationDPOMapper.selectOne(wrapper); - Optional.ofNullable (rStatPollutionSubstationDPO).ifPresent (t->pollutionSubstationDTO.setData (t.getValue ())); + Optional.ofNullable(rStatPollutionSubstationDPO).ifPresent(t -> pollutionSubstationDTO.setData(t.getValue())); } list.add(pollutionSubstationDTO); }); } - if (!CollectionUtils.isEmpty(list)){ + if (!CollectionUtils.isEmpty(list)) { return list.stream().sorted(Comparator.comparing(PollutionSubstationDTO::getData).reversed().thenComparing(PollutionSubstationDTO::getName)).collect(Collectors.toList()); } return list; @@ -529,54 +531,54 @@ public class PollutionSubstationServiceImpl extends ServiceImpl list = new ArrayList<>(); - String pollutionType = harmonicPublicParam.getStatisticalType ( ).getId (); + String pollutionType = harmonicPublicParam.getStatisticalType().getId(); PollutionParamDTO paramDTO = new PollutionParamDTO(); - if (StringUtils.isBlank(RequestUtil.getDeptIndex())){ + if (StringUtils.isBlank(RequestUtil.getDeptIndex())) { return list; } if (harmonicPublicParam.getType() != 0) { - PmsStatationStatInfoParam param=new PmsStatationStatInfoParam(); + PmsStatationStatInfoParam param = new PmsStatationStatInfoParam(); param.setPowerIds(Arrays.asList(harmonicPublicParam.getId())); //获取变电站详情 List data = statationStatClient.getStatationStatInfo(param).getData(); - if(CollectionUtil.isNotEmpty(data)){ + if (CollectionUtil.isNotEmpty(data)) { List monitorId = data.stream().map(PmsStatationStatInfoDTO::getMonitorId).collect(Collectors.toList()); - List lineData = rMpPollutionDPOMapper.selectMaxList ( monitorId,pollutionType,harmonicPublicParam.getSearchBeginTime(),harmonicPublicParam.getSearchEndTime()); + List lineData = rMpPollutionDPOMapper.selectMaxList(monitorId, pollutionType, harmonicPublicParam.getSearchBeginTime(), harmonicPublicParam.getSearchEndTime()); Map lineMap = lineData.stream().collect(Collectors.toMap(RMpPollutionDPO::getLineId, RMpPollutionDPO::getValue)); PollutionLineDTO dto; for (PmsStatationStatInfoDTO power : data) { - dto=new PollutionLineDTO(); + dto = new PollutionLineDTO(); dto.setId(power.getMonitorId()); dto.setName(power.getMonitorName()); dto.setPowerCompany(power.getOrgName()); dto.setSubstation(power.getPowerName()); dto.setBusBar(power.getBusBarName()); dto.setSubstationId(power.getPowerId()); - if(CollectionUtil.isNotEmpty(lineMap)){ - if(lineMap.containsKey(power.getMonitorId())){ + if (CollectionUtil.isNotEmpty(lineMap)) { + if (lineMap.containsKey(power.getMonitorId())) { dto.setData(lineMap.get(power.getMonitorId())); } } - list.add (dto) ; + list.add(dto); } } - }else{ + } else { List line = new ArrayList<>(); List sub = generalDeviceInfoClient.getPracticalRunDeviceInfoAsSubstation(harmonicPublicParam).getData(); - sub.forEach(item->{ - if (Objects.equals(harmonicPublicParam.getId(),item.getIndex())){ - if (!CollectionUtils.isEmpty(item.getLineIndexes())){ + sub.forEach(item -> { + if (Objects.equals(harmonicPublicParam.getId(), item.getIndex())) { + if (!CollectionUtils.isEmpty(item.getLineIndexes())) { line.addAll(item.getLineIndexes()); } } }); - if (!CollectionUtils.isEmpty(line)){ + if (!CollectionUtils.isEmpty(line)) { paramDTO.setLineList(line); list = lineFeignClient.getLineInfo(paramDTO).getData(); - List lineData = rMpPollutionDPOMapper.selectMaxList ( line,pollutionType,harmonicPublicParam.getSearchBeginTime(),harmonicPublicParam.getSearchEndTime()); - if (!CollectionUtils.isEmpty(lineData)){ - list.stream().map(list1->lineData.stream().filter(list2-> Objects.equals(list1.getId(),list2.getLineId ())).findAny().map(m->{ - list1.setData (m.getValue ()); + List lineData = rMpPollutionDPOMapper.selectMaxList(line, pollutionType, harmonicPublicParam.getSearchBeginTime(), harmonicPublicParam.getSearchEndTime()); + if (!CollectionUtils.isEmpty(lineData)) { + list.stream().map(list1 -> lineData.stream().filter(list2 -> Objects.equals(list1.getId(), list2.getLineId())).findAny().map(m -> { + list1.setData(m.getValue()); return list1; })).collect(Collectors.toList()); } @@ -589,9 +591,9 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getLineRankTop10 (HarmonicPublicParam param) { - List list= new ArrayList<>(); - if(param.getType()==0) { + public List getLineRankTop10(HarmonicPublicParam param) { + List list = new ArrayList<>(); + if (param.getType() == 0) { param.setServerName(generalInfo.getMicroServiceName()); List lineList = new ArrayList<>(); PollutionParamDTO paramDTO = new PollutionParamDTO(); @@ -607,7 +609,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl result =rMpPollutionDPOMapper.getTop10Line(lineList,DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())),DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())), param.getStatisticalType().getId()); + List result = rMpPollutionDPOMapper.getTop10Line(lineList, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())), param.getStatisticalType().getId()); if (!CollectionUtils.isEmpty(result)) { list.stream().map(list1 -> result.stream().filter(list2 -> Objects.equals(list1.getId(), list2.getId())).findAny().map(m -> { list1.setData(m.getData()); @@ -628,14 +630,15 @@ public class PollutionSubstationServiceImpl extends ServiceImpl deviceList = pmsGeneralDeviceInfoClient.getPmsDeviceInfoWithInOrg(pmsDeviceInfoParam).getData(); - List monitorIdList=new ArrayList<>(); + List monitorIdList = new ArrayList<>(); deviceList.forEach(dept -> { monitorIdList.addAll(dept.getMonitorIdList()); }); - if(CollectionUtil.isNotEmpty(monitorIdList)){ + if (CollectionUtil.isNotEmpty(monitorIdList)) { //获取监测点数据 - List lineData =rMpPollutionDPOMapper.getTop10Line(monitorIdList,DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())),DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())), param.getStatisticalType().getId()); if(CollectionUtil.isEmpty(lineData)){ + List lineData = rMpPollutionDPOMapper.getTop10Line(monitorIdList, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())), param.getStatisticalType().getId()); + if (CollectionUtil.isEmpty(lineData)) { return list; } //获取主网监测点信息 @@ -643,9 +646,9 @@ public class PollutionSubstationServiceImpl extends ServiceImpl monitorMap = data.stream().collect(Collectors.toMap(Monitor::getId, Function.identity(), (key1, kye2) -> key1)); PollutionLineDTO dto; for (PublicDTO lineDatum : lineData) { - if(monitorMap.containsKey(lineDatum.getId())){ + if (monitorMap.containsKey(lineDatum.getId())) { Monitor monitor = monitorMap.get(lineDatum.getId()); - dto=new PollutionLineDTO(); + dto = new PollutionLineDTO(); dto.setId(monitor.getId()); dto.setName(monitor.getName()); dto.setPowerCompany(monitor.getOrgName()); @@ -672,16 +675,16 @@ public class PollutionSubstationServiceImpl extends ServiceImpl subAll = collect.stream().map(SubGetBase::getId).distinct().collect(Collectors.toList()); //国网变电站 - List subGw = collect.stream().filter(x -> 1==x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList()); + List subGw = collect.stream().filter(x -> 1 == x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList()); - GridDiagramVO vo=new GridDiagramVO(); + GridDiagramVO vo = new GridDiagramVO(); List info = new ArrayList<>(); List gwInfo = new ArrayList<>(); - if(CollUtil.isNotEmpty(subAll)){ - switch (param.getType()){ + if (CollUtil.isNotEmpty(subAll)) { + switch (param.getType()) { case 1: List substationYlist = pollutionSubstationYPOMapper.selectList(new LambdaQueryWrapper() - .select(RStatPollutionSubstationYPO::getSubstationId,RStatPollutionSubstationYPO::getValue) + .select(RStatPollutionSubstationYPO::getSubstationId, RStatPollutionSubstationYPO::getValue) .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationYPO::getSubstationId, subAll) .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationYPO::getPollutionType, param.getIds()) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationYPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) @@ -689,12 +692,12 @@ public class PollutionSubstationServiceImpl extends ServiceImplsubGw.contains(x.getSubstationId())) - .map(RStatPollutionSubstationYPO::getValue).collect(Collectors.toList())); + .filter(x -> subGw.contains(x.getSubstationId())) + .map(RStatPollutionSubstationYPO::getValue).collect(Collectors.toList())); break; case 2: List substationQlist = pollutionSubstationQPOMapper.selectList(new LambdaQueryWrapper() - .select(RStatPollutionSubstationQPO::getSubstationId,RStatPollutionSubstationQPO::getValue) + .select(RStatPollutionSubstationQPO::getSubstationId, RStatPollutionSubstationQPO::getValue) .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationQPO::getSubstationId, subAll) .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationQPO::getPollutionType, param.getIds()) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationQPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) @@ -702,12 +705,12 @@ public class PollutionSubstationServiceImpl extends ServiceImplsubGw.contains(x.getSubstationId())) + .filter(x -> subGw.contains(x.getSubstationId())) .map(RStatPollutionSubstationQPO::getValue).collect(Collectors.toList())); break; case 3: List substationMlist = pollutionSubstationMMapper.selectList(new LambdaQueryWrapper() - .select(RStatPollutionSubstationM::getSubstationId,RStatPollutionSubstationM::getValue) + .select(RStatPollutionSubstationM::getSubstationId, RStatPollutionSubstationM::getValue) .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationM::getSubstationId, subAll) .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationM::getPollutionType, param.getIds()) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationM::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) @@ -715,12 +718,12 @@ public class PollutionSubstationServiceImpl extends ServiceImplsubGw.contains(x.getSubstationId())) + .filter(x -> subGw.contains(x.getSubstationId())) .map(RStatPollutionSubstationM::getValue).collect(Collectors.toList())); break; case 4: List substationDlist = pollutionSubstationDPOMapper.selectList(new LambdaQueryWrapper() - .select(RStatPollutionSubstationDPO::getSubstationId,RStatPollutionSubstationDPO::getValue) + .select(RStatPollutionSubstationDPO::getSubstationId, RStatPollutionSubstationDPO::getValue) .in(CollUtil.isNotEmpty(subAll), RStatPollutionSubstationDPO::getSubstationId, subAll) .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationDPO::getPollutionType, param.getIds()) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatPollutionSubstationDPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) @@ -728,7 +731,7 @@ public class PollutionSubstationServiceImpl extends ServiceImplsubGw.contains(x.getSubstationId())) + .filter(x -> subGw.contains(x.getSubstationId())) .map(RStatPollutionSubstationDPO::getValue).collect(Collectors.toList())); break; @@ -741,9 +744,9 @@ public class PollutionSubstationServiceImpl extends ServiceImpl getPollutionAlarmPageData(StatSubstationBizBaseParam param) { - Map map=new HashMap<>(); - map.put("V",dicDataFeignClient.getDicDataByCode(DicDataEnum.V_HARMONIC.getCode()).getData().getId()); - map.put("I",dicDataFeignClient.getDicDataByCode(DicDataEnum.I_ALL.getCode()).getData().getId()); + Map map = new HashMap<>(); + map.put("V", dicDataFeignClient.getDicDataByCode(DicDataEnum.V_HARMONIC.getCode()).getData().getId()); + map.put("I", dicDataFeignClient.getDicDataByCode(DicDataEnum.I_ALL.getCode()).getData().getId()); DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); deptGetLineParam.setDeptId(param.getId()); deptGetLineParam.setPowerFlag(0); @@ -758,21 +761,21 @@ public class PollutionSubstationServiceImpl extends ServiceImpl substationMap = substationList.stream().collect(Collectors.toMap(SubGetBase::getId, Function.identity())); - List subIDS=new ArrayList<>(); - if(0==param.getType()){ + List subIDS = new ArrayList<>(); + if (0 == param.getType()) { //全部变电站 subIDS.addAll(collect.stream().map(SubGetBase::getId).distinct().collect(Collectors.toList())); - }else{ + } else { //国网变电站 - subIDS.addAll(collect.stream().filter(x -> 1==x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList())); + subIDS.addAll(collect.stream().filter(x -> 1 == x.getIsUpToGrid()).map(SubGetBase::getId).distinct().collect(Collectors.toList())); } Page pollutionPage = pollutionSubstationMMapper.selectBySubstationPage(new Page<>(param.getPageNum(), param.getPageSize()) , subIDS, map, param.getStartTime(), param.getEndTime()); List records = pollutionPage.getRecords(); - if(CollUtil.isNotEmpty(records)){ - records.forEach(x->{ - if(substationMap.containsKey(x.getId())){ + if (CollUtil.isNotEmpty(records)) { + records.forEach(x -> { + if (substationMap.containsKey(x.getId())) { SubGetBase subGetBase = substationMap.get(x.getId()); x.setName(subGetBase.getName()); x.setPowerCompany(subGetBase.getOrgName()); @@ -791,7 +794,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl data = generalDeviceInfoClient.getPracticalRunDeviceInfo(param.getDeviceInfoParam()).getData(); List subIds = data.stream().flatMap(x -> x.getSubIndexes().stream()).collect(Collectors.toList()); List substationMlist = pollutionSubstationMMapper.selectList(new LambdaQueryWrapper() - .select(RStatPollutionSubstationM::getSubstationId,RStatPollutionSubstationM::getValue) + .select(RStatPollutionSubstationM::getSubstationId, RStatPollutionSubstationM::getValue) .in(CollUtil.isNotEmpty(subIds), RStatPollutionSubstationM::getSubstationId, subIds) .in(CollUtil.isNotEmpty(param.getIds()), RStatPollutionSubstationM::getPollutionType, param.getIds()) .ge(StrUtil.isNotBlank(param.getSearchBeginTime()), RStatPollutionSubstationM::getDataDate, DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime()))) @@ -800,7 +803,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl dept; for (GeneralDeviceDTO datum : data) { List collect = substationMlist.stream().filter(x -> datum.getSubIndexes().contains(x.getSubstationId())).collect(Collectors.toList()); - dept=new ArrayList<>(); + dept = new ArrayList<>(); dept.add(datum.getName()); dept.add(String.valueOf(datum.getSubIndexes().size())); dept.addAll(addList(collect)); @@ -817,47 +820,80 @@ public class PollutionSubstationServiceImpl extends ServiceImpl list = commTerminalGeneralClient.deptGetLine(deptGetLineParam).getData(); + //获取所有监测信息 + List lineNameList = list.stream().flatMap(x -> x.getLineBaseList().stream()).distinct().collect(Collectors.toList()); + Map lineOrgName = lineNameList.stream().collect(Collectors.toMap(LineDevGetDTO::getPointId, LineDevGetDTO::getUnitName)); + //获取监测点集合 - Map> lineMap = this.getLineMap(list, searchValue); + Map> lineMap = this.getLineMap(list, searchValue); List lineList = lineMap.values().stream() .flatMap(List::stream) .distinct() .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(lineList)){ + if (CollUtil.isNotEmpty(lineList)) { //获取监测点的超标数据 - List limitRateList = rStatLimitRateDMapper.getAllOverTimes(lineList,startTime,endTime); + List limitRateList = rStatLimitRateDMapper.getAllOverTimes(lineList, startTime, endTime); Map monitorMap = limitRateList.stream().collect(Collectors.toMap(RStatLimitRateDPO::getLineId, Function.identity())); //todo 获取监测点污染数据 + List lineData = rMpPollutionDPOMapper.selectList(new LambdaQueryWrapper() + .in(CollUtil.isNotEmpty(lineList), RMpPollutionDPO::getLineId, lineList) + .ge(StrUtil.isNotBlank(startTime), RMpPollutionDPO::getDataDate, DateUtil.beginOfDay(DateUtil.parse(startTime))) + .le(StrUtil.isNotBlank(endTime), RMpPollutionDPO::getDataDate, DateUtil.endOfDay(DateUtil.parse(endTime))) + ); + //谐波电压 + String v = dicDataFeignClient.getDicDataByCode(DicDataEnum.V_HARMONIC.getCode()).getData().getId(); + List harmonicV = lineData.stream().filter(x -> v.equals(x.getPollutionType())).collect(Collectors.toList()); + + //谐波电流 + String i = dicDataFeignClient.getDicDataByCode(DicDataEnum.I_ALL.getCode()).getData().getId(); + List harmonicI = lineData.stream().filter(x -> i.equals(x.getPollutionType())).collect(Collectors.toList()); //获取监测点详细信息 List lineDetailList = lineFeignClient.getLineDetail(lineList).getData(); - Map> lineDetailMap = lineDetailList.stream().collect(Collectors.groupingBy(LineDetail::getPowerSubstationName)); - lineDetailMap.forEach((k,v)->{ + if(StrUtil.isNotBlank(searchValue)){ + lineDetailList= lineDetailList.stream().filter(item -> item.getPowerSubstationName().contains(searchValue)).collect(Collectors.toList()); + } + Map> lineDetailMap = lineDetailList.stream().filter(x -> StrUtil.isNotBlank(x.getPowerSubstationName())).collect(Collectors.groupingBy(LineDetail::getPowerSubstationName)); + lineDetailMap.forEach((key, value) -> { AtomicInteger alarmTime = new AtomicInteger(); SubstationVo vo = new SubstationVo(); - vo.setDeptName(""); - vo.setSubstationName(k); - vo.setDwLineList(v.stream().filter(t->Objects.equals(t.getPowerFlag(),0)).map(LineDetail::getId).collect(Collectors.toList())); - vo.setYhLineList(v.stream().filter(t->Objects.equals(t.getPowerFlag(),1)).map(LineDetail::getId).collect(Collectors.toList())); - v.forEach(item->{ - alarmTime.set(alarmTime.get() + monitorMap.get(item.getId()).getAllTime()); + vo.setDeptName(lineOrgName.get(value.get(0).getId())); + vo.setSubstationName(key); + List gridSide = value.stream().filter(t -> Objects.equals(t.getPowerFlag(), 0)).map(LineDetail::getId).collect(Collectors.toList()); + List notGridSide = value.stream().filter(t -> Objects.equals(t.getPowerFlag(), 1)).map(LineDetail::getId).collect(Collectors.toList()); + vo.setDwLineList(lineNameList.stream().filter(x->gridSide.contains(x.getPointId())).map(LineDevGetDTO::getPointName).sorted().collect(Collectors.toList())); + vo.setYhLineList(lineNameList.stream().filter(x->notGridSide.contains(x.getPointId())).map(LineDevGetDTO::getPointName).sorted().collect(Collectors.toList())); + value.forEach(item -> { + if(monitorMap.containsKey(item.getId())){ + alarmTime.set(alarmTime.get() + monitorMap.get(item.getId()).getAllTime()); + } }); - vo.setAlarmFreq(alarmTime.get() * 1.0 / v.size()); + vo.setAlarmFreq(NumberUtil.round(alarmTime.get() * 1.0 / value.size(), 2).doubleValue()); + OptionalDouble maxV = harmonicV.stream().filter(x -> value.contains(x.getLineId())).mapToDouble(RMpPollutionDPO::getValue).max(); + vo.setVPollutionData(maxV.isPresent() ? maxV.getAsDouble() : 0.0D); + OptionalDouble maxI = harmonicI.stream().filter(x -> value.contains(x.getLineId())).mapToDouble(RMpPollutionDPO::getValue).max(); + vo.setIPollutionData(maxI.isPresent() ? maxV.getAsDouble() : 0.0D); result.add(vo); }); } return result; } - public Map> getLineMap(List list, String searchValue) { - Map> map = new HashMap<>(); - list.forEach(it->{ + /** + * 监测点名称筛选 + * @param list + * @param searchValue + * @return + */ + public Map> getLineMap(List list, String searchValue) { + Map> map = new HashMap<>(); + list.forEach(it -> { Predicate voltageFilter = item -> true; - if (!Objects.isNull(searchValue) && !Objects.equals(searchValue,"")) { + if (!Objects.isNull(searchValue) && !Objects.equals(searchValue, "")) { voltageFilter = item -> item.getPointName().contains(searchValue); } Predicate combinedFilter = voltageFilter; - map.put(it.getUnitName(),it.getLineBaseList().stream() + map.put(it.getUnitName(), it.getLineBaseList().stream() .filter(combinedFilter) .map(LineDevGetDTO::getPointId) .distinct() @@ -868,7 +904,7 @@ public class PollutionSubstationServiceImpl extends ServiceImpl addList(List substationMlist) { - List info=new ArrayList<>(); + List info = new ArrayList<>(); Integer num1 = 0; Integer num2 = 0; Integer num3 = 0; diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/ReportServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/ReportServiceImpl.java index b7e64433a..e7aefcc99 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/ReportServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/ReportServiceImpl.java @@ -5,10 +5,12 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.harmonic.mapper.RStatDataIDMapper; +import com.njcn.harmonic.mapper.RStatDataInharmVDMapper; import com.njcn.harmonic.mapper.ReportMapper; import com.njcn.harmonic.pojo.po.RStatDataVD; import com.njcn.harmonic.pojo.po.day.RStatDataIDPO; import com.njcn.harmonic.pojo.param.ReportQueryParam; +import com.njcn.harmonic.pojo.po.day.RStatDataInharmVDPO; import com.njcn.harmonic.pojo.po.report.OverLimitInfo; import com.njcn.harmonic.pojo.vo.ReportValue; import com.njcn.harmonic.service.IRStatDataVDService; @@ -28,6 +30,7 @@ public class ReportServiceImpl implements ReportService { private final ReportMapper reportMapper; private final IRStatDataVDService statDataVDService; private final RStatDataIDMapper rStatDataIDMapper; + private final RStatDataInharmVDMapper rStatDataInharmVDMapper; @Override public OverLimitInfo getOverLimitData(ReportQueryParam param) { @@ -166,9 +169,9 @@ public class ReportServiceImpl implements ReportService { public List getThreephase(ReportQueryParam param) { List list = new ArrayList<>(); //电压三相不平衡度 - List listV = dataV(param, Arrays.asList("T"),1, 5,true,0); + List listV = dataV(param, Arrays.asList("T"), 1, 5, true, 0); //电流三相不平衡度 - List listI = dataI(param, Arrays.asList("T"),1, 5,true,0); + List listI = dataI(param, Arrays.asList("T"), 1, 5, true, 0); if (CollUtil.isNotEmpty(listV)) { list.addAll(listV); @@ -189,7 +192,7 @@ public class ReportServiceImpl implements ReportService { List list = new ArrayList<>(); //获取电流幅值,包含基波 - List listI = dataI(param, Arrays.asList("A","B","C"),1, 51,false,0); + List listI = dataI(param, Arrays.asList("A", "B", "C"), 1, 51, false, 0); if (CollUtil.isEmpty(listI)) { for (int i = 0; i < 50; i++) { RegroupData.regroupData(list, true, true); @@ -205,7 +208,7 @@ public class ReportServiceImpl implements ReportService { List list = new ArrayList<>(); //获取基波电压幅值,单位kV - List listV = dataV(param, Arrays.asList("A","B","C"),0, 1,true,5); + List listV = dataV(param, Arrays.asList("A", "B", "C"), 0, 1, true, 5); if (CollUtil.isEmpty(listV)) { RegroupData.regroupData(list, true, true); @@ -214,7 +217,7 @@ public class ReportServiceImpl implements ReportService { } //获取电压含有率,不包含基波 - List listRate = dataV(param, Arrays.asList("A","B","C"),2, 51,false,1); + List listRate = dataV(param, Arrays.asList("A", "B", "C"), 2, 51, false, 1); if (CollUtil.isEmpty(listRate)) { for (int i = 0; i < 49; i++) { @@ -231,6 +234,73 @@ public class ReportServiceImpl implements ReportService { return list; } + @Override + public List getInharmVeRate(ReportQueryParam param) { + List inharm = rStatDataInharmVDMapper.selectList(new LambdaQueryWrapper() + .eq(RStatDataInharmVDPO::getLineId, param.getLineId()) + .in(RStatDataInharmVDPO::getPhaseType, Arrays.asList("A", "B", "C")) + .ge(StrUtil.isNotBlank(param.getStartTime()), RStatDataInharmVDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) + .le(StrUtil.isNotBlank(param.getEndTime()), RStatDataInharmVDPO::getTime, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) + ); + String max = "MAX"; + String avg = "AVG"; + String min = "MIN"; + String cp95 = "CP95"; + List a = new ArrayList<>(); + Map> collect = inharm.stream().collect(Collectors.groupingBy(RStatDataInharmVDPO::getPhaseType)); + collect.forEach((key, value) -> { + Map> valueTypeMap = value.stream().collect(Collectors.groupingBy(RStatDataInharmVDPO::getValueType)); + + for (int i = 1; i < 17; i++) { + ReportValue reportValue = new ReportValue(); + String attribute = "v" + i; + + if (valueTypeMap.containsKey(max)) { + List aa = reflectDataInV(valueTypeMap.get(max), max, attribute); + reportValue.setPhaseType(key); + Float maxNum = aa.stream().distinct().max(Float::compareTo).get(); + reportValue.setFmaxValue(maxNum); + } + if (valueTypeMap.containsKey(avg)) { + List aa = reflectDataInV(valueTypeMap.get(avg), avg, attribute); + reportValue.setPhaseType(key); + Double avgNum = aa.stream().distinct().collect(Collectors.averagingDouble(Float::doubleValue)); + reportValue.setMeanValue(avgNum.floatValue()); + } + if (valueTypeMap.containsKey(min)) { + List aa = reflectDataInV(valueTypeMap.get(min), min, attribute); + reportValue.setPhaseType(key); + double minNum = aa.stream().distinct().min(Float::compareTo).get(); + reportValue.setMinValue((float) minNum); + } + if (valueTypeMap.containsKey(cp95)) { + List aa = reflectDataInV(valueTypeMap.get(cp95), cp95, attribute); + reportValue.setPhaseType(key); + List cp95Num = aa.stream().distinct().sorted(Comparator.comparing(Float::doubleValue).reversed()).collect(Collectors.toList()); + reportValue.setCp95Value(cp95Num.get(0).floatValue()); + } + a.add(reportValue); + } + }); + if (CollUtil.isEmpty(a)) { + for (int i = 1; i < 17; i++) { + RegroupData.regroupData(a, true, true); + } + } + return a; + } + + @Override + public List getINegDataRate(ReportQueryParam param) { + List list = new ArrayList<>(); + //负序电流 + List iNegData = reportMapper.getINegData(param); + RegroupData.regroupData(iNegData, true); + list.addAll(iNegData); + return list; + } + + //赋值默认值 private void regroupData(List list) { for (int i = 0; i < 4; i++) { List list1 = new ArrayList<>(); @@ -241,18 +311,19 @@ public class ReportServiceImpl implements ReportService { /** * 电压信息 - * @param param 查询条件 + * + * @param param 查询条件 * @param valueTypes 区分类别 例如"A","B","C" - * @param num 循环开始 - * @param size 循环结束 - * @param fly 否是启用获取属性电压 - * @param index 获取属性位置名称 + * @param num 循环开始 + * @param size 循环结束 + * @param fly 否是启用获取属性电压 + * @param index 获取属性位置名称 * @return */ - private List dataV(ReportQueryParam param,List valueTypes,Integer num,Integer size,Boolean fly,Integer index){ + private List dataV(ReportQueryParam param, List valueTypes, Integer num, Integer size, Boolean fly, Integer index) { List rStatDataVDS = statDataVDService.list(new LambdaQueryWrapper() .eq(RStatDataVD::getLineId, param.getLineId()) - .in(CollUtil.isNotEmpty(valueTypes),RStatDataVD::getPhasicType,valueTypes) + .in(CollUtil.isNotEmpty(valueTypes), RStatDataVD::getPhasicType, valueTypes) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatDataVD::getTime, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) .le(StrUtil.isNotBlank(param.getEndTime()), RStatDataVD::getTime, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) ); @@ -267,37 +338,37 @@ public class ReportServiceImpl implements ReportService { for (int i = num; i < size; i++) { ReportValue reportValue = new ReportValue(); - String attribute=""; - if(fly){ - if (index==0){ + String attribute = ""; + if (fly) { + if (index == 0) { attribute = attributeV(i); - }else{ + } else { attribute = attributeV(index); } - }else{ - attribute = "v"+i; + } else { + attribute = "v" + i; } if (valueTypeMap.containsKey(max)) { - List aa = reflectDataV(valueTypeMap.get(max), max,attribute); + List aa = reflectDataV(valueTypeMap.get(max), max, attribute); reportValue.setPhaseType(key); Float maxNum = aa.stream().distinct().max(Float::compareTo).get(); reportValue.setFmaxValue(maxNum); } if (valueTypeMap.containsKey(avg)) { - List aa = reflectDataV(valueTypeMap.get(avg), avg,attribute); + List aa = reflectDataV(valueTypeMap.get(avg), avg, attribute); reportValue.setPhaseType(key); Double avgNum = aa.stream().distinct().collect(Collectors.averagingDouble(Float::doubleValue)); reportValue.setMeanValue(avgNum.floatValue()); } if (valueTypeMap.containsKey(min)) { - List aa = reflectDataV(valueTypeMap.get(min), min,attribute); + List aa = reflectDataV(valueTypeMap.get(min), min, attribute); reportValue.setPhaseType(key); double minNum = aa.stream().distinct().min(Float::compareTo).get(); reportValue.setMinValue((float) minNum); } if (valueTypeMap.containsKey(cp95)) { - List aa = reflectDataV(valueTypeMap.get(cp95), cp95,attribute); + List aa = reflectDataV(valueTypeMap.get(cp95), cp95, attribute); reportValue.setPhaseType(key); List cp95Num = aa.stream().distinct().sorted(Comparator.comparing(Float::doubleValue).reversed()).collect(Collectors.toList()); reportValue.setCp95Value(cp95Num.get(0).floatValue()); @@ -315,7 +386,36 @@ public class ReportServiceImpl implements ReportService { * @param name * @return */ - private List reflectDataV(List value, String name,String attribute) { + private List reflectDataV(List value, String name, String attribute) { + Field field = null; + try { + field = RStatDataVD.class.getDeclaredField(attribute); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + field.setAccessible(true); + + Field finalField = field; + return value.stream().filter(x -> x.getValueType().equals(name)).map(temp -> { + BigDecimal o = null; + try { + o = (BigDecimal) finalField.get(temp); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + + return o.floatValue(); + }).collect(Collectors.toList()); + } + + /** + * 电压反射取属性值 + * + * @param value + * @param name + * @return + */ + private List reflectDataInV(List value, String name, String attribute) { Field field = null; try { field = RStatDataVD.class.getDeclaredField(attribute); @@ -339,13 +439,14 @@ public class ReportServiceImpl implements ReportService { /** * 电流信息 + * * @param param * @return */ - private List dataI(ReportQueryParam param,List valueTypes,Integer num,Integer size,Boolean fly,Integer index){ + private List dataI(ReportQueryParam param, List valueTypes, Integer num, Integer size, Boolean fly, Integer index) { List rStatDataVDS = rStatDataIDMapper.selectList(new LambdaQueryWrapper() .eq(RStatDataIDPO::getLineId, param.getLineId()) - .in(CollUtil.isNotEmpty(valueTypes),RStatDataIDPO::getPhaseType,valueTypes) + .in(CollUtil.isNotEmpty(valueTypes), RStatDataIDPO::getPhaseType, valueTypes) .ge(StrUtil.isNotBlank(param.getStartTime()), RStatDataIDPO::getTime, DateUtil.beginOfDay(DateUtil.parse(param.getStartTime()))) .le(StrUtil.isNotBlank(param.getEndTime()), RStatDataIDPO::getTime, DateUtil.endOfDay(DateUtil.parse(param.getEndTime()))) ); @@ -360,36 +461,36 @@ public class ReportServiceImpl implements ReportService { for (int i = num; i < size; i++) { ReportValue reportValue = new ReportValue(); - String attribute=""; - if(fly){ - if (index==0){ + String attribute = ""; + if (fly) { + if (index == 0) { attribute = attributeI(i); - }else{ + } else { attribute = attributeI(index); } - }else{ - attribute = "i"+i; + } else { + attribute = "i" + i; } if (valueTypeMap.containsKey(max)) { - List aa = reflectDataI(valueTypeMap.get(max), max,attribute); + List aa = reflectDataI(valueTypeMap.get(max), max, attribute); reportValue.setPhaseType(key); Float maxNum = aa.stream().distinct().max(Float::compareTo).get(); reportValue.setFmaxValue(maxNum); } if (valueTypeMap.containsKey(avg)) { - List aa = reflectDataI(valueTypeMap.get(avg), avg,attribute); + List aa = reflectDataI(valueTypeMap.get(avg), avg, attribute); reportValue.setPhaseType(key); Double avgNum = aa.stream().distinct().collect(Collectors.averagingDouble(Float::doubleValue)); reportValue.setMeanValue(avgNum.floatValue()); } if (valueTypeMap.containsKey(min)) { - List aa = reflectDataI(valueTypeMap.get(min), min,attribute); + List aa = reflectDataI(valueTypeMap.get(min), min, attribute); reportValue.setPhaseType(key); double minNum = aa.stream().distinct().min(Float::compareTo).get(); reportValue.setMinValue((float) minNum); } if (valueTypeMap.containsKey(cp95)) { - List aa = reflectDataI(valueTypeMap.get(cp95), cp95,attribute); + List aa = reflectDataI(valueTypeMap.get(cp95), cp95, attribute); reportValue.setPhaseType(key); List cp95Num = aa.stream().distinct().sorted(Comparator.comparing(Float::doubleValue).reversed()).collect(Collectors.toList()); reportValue.setCp95Value(cp95Num.get(0).floatValue()); @@ -430,11 +531,12 @@ public class ReportServiceImpl implements ReportService { /** * 获取属性电压 + * * @param i * @return */ private String attributeV(Integer i) { - String str=null; + String str = null; switch (i) { case 1: str = "vUnbalance"; @@ -456,13 +558,15 @@ public class ReportServiceImpl implements ReportService { } return str; } + /** * 获取属性电流 + * * @param i * @return */ private String attributeI(Integer i) { - String str=null; + String str = null; switch (i) { case 1: str = "iUnbalance"; diff --git a/pqs-harmonic/harmonic-boot/src/main/resources/file/reportModelJB.docx b/pqs-harmonic/harmonic-boot/src/main/resources/file/reportModelJB.docx new file mode 100644 index 0000000000000000000000000000000000000000..d96b3aac4636ae587d9b216e4e04b427ce29b99d GIT binary patch literal 83069 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%0DC3?U{?nK z;7$Mla4n;>yF|gX7_VOmzHyq>f>2kR?>821HSFY&9>LY*3QQ%GsgS~Ax;U|yAh@PTBhyv zK-U@(_`=0U_$X)P6+ZjWM%Q&9>^e(~E8!Pv20q&D#BZrFY8UHFDr8ZNsqD}EHTx&~ z0$jq0`joVmd%sUWB}L}V5Wtw2mI&_4l$+hpzpN~tvLpH47P%FOZBs-&oWQLIQ%Z(! z!Uz6d4w6lhkv-qgVZ4M`2rPasN+1q%YzoGF)INutt~1@pl@{}pN*%!yjJ+{lsy{w+^>}Vzvi?wgf2i4aq%8=N83}f!VdZ7aLh7&+TI7zC8ct(i?Mjs$%Zn}(#U$$Ma~xS( zx_xH&tNWZq{`R7Sgjq$_(Kl?=Az>~gVo>~Bhf_FM!J$p5G+7_0SoRw>vUpd`a_NrO zF$=R^u`>ncq)zWsBE`{4;0+jLJS~c03FlUGtRmmF*Rr&`Hy60j{VZ%rN^%W5d6g(} z^1zPl<9I1@fWy>Jf{ z2nwuf*uh!8r>(4%nIW>Kq^RvC`5}U3V(7v=r^ozn)A>)2M}$u}Nc$(Q{bw{DI?k?| z&X)bx(+^r4?~TZ=^6oB9jLEKuNXH$lV@?k_cu1SkrF>lE@Iwj9&1D_h;GC79?S(Gh zBgQpysxu3{#Wv~nz-kiC<}B()%!T+V3D8n36j2;5^Anwy+He^)hKBxfC5}g5v*C8j7I*GgK4ulNNf)I8 z@s?XpkHdN&sDZ7EursHraK@R-2!?Yf*5NdWcgQ2OL@iQ|lOn`Xt{nTB!^=Bs_QYby z9Pdd6C9@BB7M!v+5Xw2@PprOwIv+#GndjUR>{VfY;=xR;ZM{R}-GOd|%AUF)Odkgu z?Cbf@4TiA}v z_~mYGFFC3mPxHo_hcjcU?H1ez=sS{LN68z=$m+vm6#>&GM+^*7g^zZ(NQ7H==vIa+ zSP%ruO-?!A;Ey)BZ?z|9%pw}OP^9_6zZ3%A;eWNiRRcD>KcL|F;CD@^6(yUSfUSZ%I70ZF_@^eQz+L!D#fqSpGyegU|j4t#4`bBb)vw97-@Sf(A^84u(J0z#rRBI1@N4 z{|o-3g#L^Fzb{pAA@#5JIF2CbzZ}p1($k|G``I2LPFxWG^i_Wf`=?ub1pX8@^LHRv z?%$o@N_$wj)=ZyV%o58Ox z`hkD({_UoNKk+TY0k?HvlOhX_c7NaGJm9xKWVbc6vjg9A#{9jwT@O6v%HZ5P z>LYJ(`?+t5|K6jvcFtyo{{a90=xrW+k@bVO-8(~b!~e2ti&X?C2w?Bk08a8hmJS}< gPp;6czX5;1|61uVKinNLIIMpSUL(Z3VABNne-{%$$N&HU literal 0 HcmV?d00001 diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineDebugPOServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineDebugPOServiceImpl.java index 5dab009fc..deb8fdbbc 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineDebugPOServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineDebugPOServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -83,7 +84,6 @@ public class SupervisionTempLineDebugPOServiceImpl extends ServiceImpl list = userReportNormalMapper.selectList(new LambdaQueryWrapper() + .eq(UserReportNormalPO::getUserReportId, temp.getId()) + .eq(UserReportNormalPO::getState, DataStateEnum.ENABLE.getCode()) + .ne(UserReportNormalPO::getStatus, BpmTaskStatusEnum.CANCEL.getStatus()) + .orderByDesc(UserReportNormalPO::getCreateTime) + ); + if (CollUtil.isNotEmpty(list)) { + Optional netInReport = list.stream().filter(x -> 0 == x.getType()).findFirst(); + if(netInReport.isPresent()){ + if(netInReport.get().getStatus()!=2){ + throw new BusinessException("最新入网验收方案流程,暂未审核通过!"); + } + }else{ + throw new BusinessException("请填写入网验收方案流程,审核通过后方可操作!"); + } + if (needGovernance == 1) { + Optional governReport = list.stream().filter(x -> 1 == x.getType()).findFirst(); + if(governReport.isPresent()){ + if(governReport.get().getStatus()!=2){ + throw new BusinessException("最新治理工程验收方案流程,暂未审核通过!"); + } + }else{ + throw new BusinessException("请填写治理工程验收方案流程,审核通过后方可操作!"); + } + } + } else { + throw new BusinessException("请上传,入网设计方案或者治理工程验收方案"); + } -// SupervisionTempLineDebugPO byId = this.getById(supervisionTempLineReportParam.getId()); -// if(Objects.nonNull(byId)){ -// if(byId.getState() == 1) { -// throw new BusinessException("该监测点已申请联调"); -// } -// } SupervisionTempLineDebugPO supervisionTempLineDebugPO = new SupervisionTempLineDebugPO(); BeanUtils.copyProperties(supervisionTempLineReportParam,supervisionTempLineDebugPO); //设置状态 @@ -128,9 +178,6 @@ public class SupervisionTempLineDebugPOServiceImpl extends ServiceImpl list = userReportNormalMapper.selectList(new LambdaQueryWrapper() - .eq(UserReportNormalPO::getUserReportId, temp.getId()) - .eq(UserReportNormalPO::getState, DataStateEnum.ENABLE.getCode()) - .ne(UserReportNormalPO::getStatus, BpmTaskStatusEnum.CANCEL.getStatus()) - .orderByDesc(UserReportNormalPO::getCreateTime) - ); - if (CollUtil.isNotEmpty(list)) { - Optional netInReport = list.stream().filter(x -> 0 == x.getType()).findFirst(); - if(netInReport.isPresent()){ - if(netInReport.get().getStatus()!=2){ - throw new BusinessException("最新入网验收方案流程,暂未审核通过!"); - } - }else{ - throw new BusinessException("请填写入网验收方案流程,审核通过后方可操作!"); - } - if (needGovernance == 1) { - Optional governReport = list.stream().filter(x -> 1 == x.getType()).findFirst(); - if(governReport.isPresent()){ - if(governReport.get().getStatus()!=2){ - throw new BusinessException("最新治理工程验收方案流程,暂未审核通过!"); - } - }else{ - throw new BusinessException("请填写治理工程验收方案流程,审核通过后方可操作!"); - } - } - } else { - throw new BusinessException("请上传,入网设计方案或者治理工程验收方案"); - } - //获取关联的设备信息 SupervisionTempDeviceReport tempDevice = supervisionTempDeviceReportService.getById(tempLine.getMonitoringTerminalCode()); SyncTerminalParam syncTerminalParam = new SyncTerminalParam(); @@ -379,10 +379,10 @@ public class SupervisionTempLineDebugPOServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper .eq(SupervisionTempLineReport::getMonitoringTerminalCode, supervisionTempLineReportParam.getMonitoringTerminalCode()) - .and(wrapper -> wrapper.eq(SupervisionTempLineReport::getNum, supervisionTempLineReportParam.getNum()).or() + .and(wrapper -> wrapper.eq(SupervisionTempLineReport::getNum, supervisionTempLineReportParam.getNum()) + .or() .eq(SupervisionTempLineReport::getLineName, supervisionTempLineReportParam.getLineName()) ) .eq(SupervisionTempLineReport::getState, DataStateEnum.ENABLE.getCode()); diff --git a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineRunTestServiceImpl.java b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineRunTestServiceImpl.java index 73446249e..04d74778f 100644 --- a/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineRunTestServiceImpl.java +++ b/pqs-supervision/supervision-boot/src/main/java/com/njcn/supervision/service/device/impl/SupervisionTempLineRunTestServiceImpl.java @@ -294,7 +294,7 @@ public class SupervisionTempLineRunTestServiceImpl extends ServiceImpl