From b3ab5d2587758ddbfe8975d2fd7c3a2e0a19aef8 Mon Sep 17 00:00:00 2001 From: chendaofei <857448963@qq.com> Date: Thu, 8 Jan 2026 13:52:09 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E7=A8=B3=E6=80=81?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E6=8A=A5=E5=91=8A=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commApi/CommTerminalGeneralClient.java | 4 + ...mTerminalGeneralClientFallbackFactory.java | 8 + .../pojo/dto/MonitorCommLedgerInfoDTO.java | 40 + .../pq/controller/CommTerminalController.java | 18 + .../pq/service/CommTerminalService.java | 5 +- .../service/impl/CommTerminalServiceImpl.java | 15 +- .../device/line/mapper/DeptLineMapper.java | 4 + .../line/mapper/mapping/DeptLineMapper.xml | 38 + .../pojo/dto/report/CommReportLedgerDto.java | 44 + .../pojo/dto/report/TableMergeRule.java | 34 + .../param/report/AreaHarmReportParam.java | 20 + .../harmonic/pojo/vo/OverAreaLimitVO.java | 100 +++ .../com/njcn/harmonic/pojo/vo/OverAreaVO.java | 3 + .../com/njcn/harmonic/utils/WordUtil2.java | 307 ++++++- .../report/AreaHarmonicReportController.java | 6 +- .../service/impl/AnalyzeServiceImpl.java | 382 +++++++-- .../service/report/AreaHarmonicService.java | 7 + .../report/impl/AreaHarmonicServiceImpl.java | 769 +++++++++++++++++- .../resources/file/areaReportTemplate.docx | Bin 0 -> 50149 bytes 19 files changed, 1715 insertions(+), 89 deletions(-) create mode 100644 pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/MonitorCommLedgerInfoDTO.java create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/dto/report/CommReportLedgerDto.java create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/dto/report/TableMergeRule.java create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/param/report/AreaHarmReportParam.java create mode 100644 pqs-harmonic/harmonic-boot/src/main/resources/file/areaReportTemplate.docx diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/CommTerminalGeneralClient.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/CommTerminalGeneralClient.java index b051c2ee4..0528311bf 100644 --- a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/CommTerminalGeneralClient.java +++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/CommTerminalGeneralClient.java @@ -51,6 +51,10 @@ public interface CommTerminalGeneralClient { @PostMapping("deptGetLine") HttpResult> deptGetLine(@RequestBody @Validated DeptGetLineParam deptGetLineParam); + @PostMapping("deptGetLineInfo") + HttpResult> deptGetLineInfo(@RequestBody @Validated DeptGetLineParam deptGetLineParam); + + @PostMapping("deptGetAllLine") HttpResult> deptGetAllLine(@RequestBody @Validated DeptGetLineParam deptGetLineParam); diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/fallback/CommTerminalGeneralClientFallbackFactory.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/fallback/CommTerminalGeneralClientFallbackFactory.java index 32cbf11b6..c25e4342e 100644 --- a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/fallback/CommTerminalGeneralClientFallbackFactory.java +++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/commApi/fallback/CommTerminalGeneralClientFallbackFactory.java @@ -15,6 +15,7 @@ import com.njcn.device.biz.utils.DeviceEnumUtil; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -50,6 +51,13 @@ public class CommTerminalGeneralClientFallbackFactory implements FallbackFactory throw new BusinessException(finalExceptionEnum); } + + @Override + public HttpResult> deptGetLineInfo(DeptGetLineParam deptGetLineParam) { + log.error("{}异常,降级处理,异常为:{}", "根据部门获取监测点信息", throwable.toString()); + throw new BusinessException(finalExceptionEnum); + } + @Override public HttpResult> deptGetAllLine(DeptGetLineParam deptGetLineParam) { log.error("{}异常,降级处理,异常为:{}", "根据单位获取all监测点信息", throwable.toString()); diff --git a/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/MonitorCommLedgerInfoDTO.java b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/MonitorCommLedgerInfoDTO.java new file mode 100644 index 000000000..b1eddca0a --- /dev/null +++ b/pqs-device/common-device-biz/src/main/java/com/njcn/device/biz/pojo/dto/MonitorCommLedgerInfoDTO.java @@ -0,0 +1,40 @@ +package com.njcn.device.biz.pojo.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: cdf + * @CreateTime: 2026-01-06 + * @Description: + */ +@Data +public class MonitorCommLedgerInfoDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + + private String monitorId; + + private String monitorName; + + private String gdName; + + private String bdName; + + private String busBarName; + + private String voltageLevel; + + private String shortCapacity; + + private String devCapacity; + + private String dealCapacity; + + private String standardCapacity; + + private Integer timeInterval; + +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java index 7ef8ce03e..9d8799810 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/CommTerminalController.java @@ -15,6 +15,7 @@ import com.njcn.device.biz.pojo.po.PqsDeviceUnit; import com.njcn.device.line.mapper.LineMapper; import com.njcn.device.line.service.LineService; import com.njcn.device.line.mapper.LineDetailMapper; +import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO; import com.njcn.device.pq.service.CommTerminalService; import com.njcn.device.pq.service.IPqsDeviceUnitService; import com.njcn.web.controller.BaseController; @@ -108,6 +109,23 @@ public class CommTerminalController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); } + + /** + * 根据部门id获取部门监测点台账信息 + * @param deptGetLineParam + * @return + */ + @PostMapping("deptGetLineInfo") + @ApiOperation("根据部门id获取部门监测点台账信息") + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @ApiImplicitParam(name = "deptGetLineParam", value = "请求体", required = true) + public HttpResult> deptGetLineInfo(@RequestBody @Validated DeptGetLineParam deptGetLineParam) { + String methodDescribe = getMethodDescribe("deptGetLineInfo"); + List result = commTerminalService.deptGetLineInfo(deptGetLineParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + + @PostMapping("deptGetAllLine") @ApiOperation("根据单位获取监测点信息(all line)") @OperateInfo(info = LogEnum.BUSINESS_COMMON) diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/CommTerminalService.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/CommTerminalService.java index dbd61c3a0..64e4b7935 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/CommTerminalService.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/CommTerminalService.java @@ -3,8 +3,8 @@ package com.njcn.device.pq.service; import com.njcn.device.biz.pojo.dto.*; import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.biz.pojo.param.SubstationParam; +import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO; import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam; -import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Map; @@ -40,6 +40,9 @@ public interface CommTerminalService { */ List deptGetLine(DeptGetLineParam deptGetLineParam); + + List deptGetLineInfo(DeptGetLineParam deptGetLineParam); + List deptGetAllLine(DeptGetLineParam deptGetLineParam); List deptGetLineByIdList(List monitorIds); diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java index 3781700f7..d1fa8c82e 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/CommTerminalServiceImpl.java @@ -11,9 +11,10 @@ import com.njcn.common.utils.EnumUtils; import com.njcn.device.biz.pojo.dto.*; import com.njcn.device.biz.pojo.param.DeptGetLineParam; import com.njcn.device.biz.pojo.param.SubstationParam; +import com.njcn.device.line.mapper.DeptLineMapper; import com.njcn.device.line.mapper.LineMapper; import com.njcn.device.line.service.DeptLineService; -import com.njcn.device.pq.enums.RunFlagEnum; +import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO; import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam; import com.njcn.device.pq.service.CommTerminalService; import com.njcn.redis.utils.RedisUtil; @@ -49,6 +50,7 @@ public class CommTerminalServiceImpl implements CommTerminalService { private final RedisUtil redisUtil; private final LineMapper lineMapper; + private final DeptLineMapper deptLineMapper; /** @@ -59,10 +61,6 @@ public class CommTerminalServiceImpl implements CommTerminalService { */ @Override public List getDeptChildrenByParent(DeptGetLineParam deptGetLineParam) { - /*List redisResult = (List) redisUtil.getObjectByKey(commTerminal + deptGetLineParam.getDeptId()); - if (CollectionUtil.isNotEmpty(redisResult)) { - return redisResult; - }*/ List result = new ArrayList<>(); List deptDTOList = deptFeignClient.getDeptDescendantIndexes(deptGetLineParam.getDeptId(), Stream.of(0, 1).collect(Collectors.toList())).getData(); deptDTOList.forEach(it -> { @@ -119,6 +117,13 @@ public class CommTerminalServiceImpl implements CommTerminalService { return result; } + @Override + public List deptGetLineInfo(DeptGetLineParam deptGetLineParam) { + List deptIds = deptFeignClient.getDepSonIdtByDeptId(deptGetLineParam.getDeptId()).getData(); + List ledgerList = deptLineMapper.getMonitorByDeptIds(Stream.of(2).collect(Collectors.toList()),deptIds); + return ledgerList; + } + @Override public List deptGetAllLine(DeptGetLineParam deptGetLineParam) { List result = new ArrayList<>(); diff --git a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/DeptLineMapper.java b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/DeptLineMapper.java index e600def5d..49ba95fd2 100644 --- a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/DeptLineMapper.java +++ b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/DeptLineMapper.java @@ -6,6 +6,7 @@ import com.njcn.device.biz.pojo.dto.LineDevGetDTO; import com.njcn.device.biz.pojo.dto.SubGetBase; import com.njcn.device.biz.pojo.dto.TerminalGetBase; import com.njcn.device.biz.pojo.param.SubstationParam; +import com.njcn.device.biz.pojo.dto.MonitorCommLedgerInfoDTO; import com.njcn.device.pq.pojo.po.DeptLine; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -74,6 +75,9 @@ public interface DeptLineMapper extends BaseMapper { List lineDevGet(@Param("list")List devType,@Param("type")Integer type,@Param("lineRunFlag") Integer lineRunFlag); + List getMonitorByDeptIds(@Param("list")List devType,@Param("deptIds")List deptIds); + + List lineDevAllGet(@Param("list")List devType,@Param("type")Integer type,@Param("lineRunFlag") Integer lineRunFlag, @Param("lineType") Integer lineType); List orgSubStationGet(@Param("list")List devType); diff --git a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/DeptLineMapper.xml b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/DeptLineMapper.xml index 9b7791ac4..87bc76f41 100644 --- a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/DeptLineMapper.xml +++ b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/DeptLineMapper.xml @@ -74,6 +74,44 @@ + + + + + diff --git a/pqs-gateway/src/main/java/com/njcn/gateway/utils/IpUtils.java b/pqs-gateway/src/main/java/com/njcn/gateway/utils/IpUtils.java index 45d3d882d..bfbdfdcb5 100644 --- a/pqs-gateway/src/main/java/com/njcn/gateway/utils/IpUtils.java +++ b/pqs-gateway/src/main/java/com/njcn/gateway/utils/IpUtils.java @@ -48,13 +48,6 @@ public class IpUtils { public static String getRealIpAddress(ServerHttpRequest request) { HttpHeaders headers = request.getHeaders(); String ipAddress = headers.getFirst(HEADER_X_FORWARDED_FOR); - log.info("X-Forwarded-For:"+ipAddress); - ipAddress = headers.getFirst("X-Real-IP"); - log.error("X-Real-IP:"+ipAddress); - ipAddress = headers.getFirst("Proxy-Client-IP"); - log.error("Proxy-Client-IP:"+ipAddress); - ipAddress = headers.getFirst("REMOTE-HOST"); - log.error("REMOTE-HOST:"+ipAddress); if (StrUtil.isBlankIfStr(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = headers.getFirst(HEADER_PROXY_CLIENT_IP); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/AnalyzeServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/AnalyzeServiceImpl.java index 659eea582..e9e7df18b 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/AnalyzeServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/AnalyzeServiceImpl.java @@ -511,10 +511,10 @@ public class AnalyzeServiceImpl implements IAnalyzeService { Set harmonicVoltageMonitorList = new HashSet<>(); Set harmonicCurrentMonitorList = new HashSet<>(); - int threeV = 0, fiveV = 0, sevenV = 0, elevenV = 0; - Set threeVList = new HashSet<>(), fiveVList = new HashSet<>(), sevenVList = new HashSet<>(), elevenVList = new HashSet<>(); - int threeI = 0, fiveI = 0, sevenI = 0, elevenI = 0; - Set threeIList = new HashSet<>(), fiveIList = new HashSet<>(), sevenIList = new HashSet<>(), elevenIList = new HashSet<>(); + int threeV = 0, fiveV = 0, sevenV = 0, elevenV = 0, otherV = 0; + Set threeVList = new HashSet<>(), fiveVList = new HashSet<>(), sevenVList = new HashSet<>(), elevenVList = new HashSet<>(), otherVList = new HashSet<>(); + int threeI = 0, fiveI = 0, sevenI = 0, elevenI = 0,otherI = 0; + Set threeIList = new HashSet<>(), fiveIList = new HashSet<>(), sevenIList = new HashSet<>(), elevenIList = new HashSet<>(), otherIList = new HashSet<>(); if (!CollectionUtils.isEmpty(list)) { @@ -595,6 +595,10 @@ public class AnalyzeServiceImpl implements IAnalyzeService { elevenV++; elevenVList.add(item.getLineId()); } + if (vOtherHarmFlag(item)) { + otherV++; + otherVList.add(item.getLineId()); + } if (item.getIharm3Overtime() > 0) { @@ -613,6 +617,10 @@ public class AnalyzeServiceImpl implements IAnalyzeService { elevenI++; elevenIList.add(item.getLineId()); } + if (iOtherHarmFlag(item)) { + otherI++; + otherIList.add(item.getLineId()); + } } } @@ -625,7 +633,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService { //频率偏差 overAreaLimitVO.setFrequencyMonitorNumber(freqCount); overAreaLimitVO.setFrequencyBiLi(BigDecimal.valueOf(freqCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); - overAreaLimitVO.setFreqMonitorList(new ArrayList<>(flickerMonitorList)); + overAreaLimitVO.setFreqMonitorList(new ArrayList<>(freqList)); //电压偏差 overAreaLimitVO.setVoltageMonitorNumber(voltageCount); overAreaLimitVO.setVoltageBiLi(BigDecimal.valueOf(voltageCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue()); @@ -658,8 +666,8 @@ public class AnalyzeServiceImpl implements IAnalyzeService { int freqOverDay = 0, voltageOverDay = 0, ubalanceOverDay = 0, flickerOverDay = 0, iNegOverDay = 0, uharmOverDay = 0, iharmOverDay = 0, inuharmOverDay = 0; - int threeOverV = 0, fiveOverV = 0, sevenOverV = 0, elevenOverV = 0; - int threeOverI = 0, fiveOverI = 0, sevenOverI = 0, elevenOverI = 0; + int threeOverV = 0, fiveOverV = 0, sevenOverV = 0, elevenOverV = 0, otherOverV = 0; + int threeOverI = 0, fiveOverI = 0, sevenOverI = 0, elevenOverI = 0, otherOverI = 0; Map> map = list.stream().collect(Collectors.groupingBy(RStatLimitTargetDPO::getTime)); @@ -669,15 +677,15 @@ public class AnalyzeServiceImpl implements IAnalyzeService { iharmOverOneDayList = new ArrayList<>(), inuharmOverOneDayList = new ArrayList<>(); - List threeOverOneDayList = new ArrayList<>(), fiveOverOneDayList = new ArrayList<>(), sevenOverOneDayList = new ArrayList<>(), elevenOverOneDayList = new ArrayList<>(); - List threeOverOneDayIList = new ArrayList<>(), fiveOverOneDayIList = new ArrayList<>(), sevenOverOneDayIList = new ArrayList<>(), elevenOverOneDayIList = new ArrayList<>(); + List threeOverOneDayList = new ArrayList<>(), fiveOverOneDayList = new ArrayList<>(), sevenOverOneDayList = new ArrayList<>(), elevenOverOneDayList = new ArrayList<>(), otherOverOneDayList = new ArrayList<>(); + List threeOverOneDayIList = new ArrayList<>(), fiveOverOneDayIList = new ArrayList<>(), sevenOverOneDayIList = new ArrayList<>(), elevenOverOneDayIList = new ArrayList<>(), otherOverOneDayIList = new ArrayList<>(); for (LocalDate key : map.keySet()) { int freqOverOneDay = 0, voltageOverOneDay = 0, ubalanceOverOneDay = 0, flickerOverOneDay = 0, iNegOverOneDay = 0, uharmOverOneDay = 0, iharmOverOneDay = 0, inuharmOverOneDay = 0; - int threeOneV = 0, fiveOneV = 0, sevenOneV = 0, elevenOneV = 0; - int threeOneI = 0, fiveOneI = 0, sevenOneI = 0, elevenOneI = 0; + int threeOneV = 0, fiveOneV = 0, sevenOneV = 0, elevenOneV = 0, otherOneV = 0; + int threeOneI = 0, fiveOneI = 0, sevenOneI = 0, elevenOneI = 0, otherOneI = 0; List l = map.get(key); @@ -735,6 +743,11 @@ public class AnalyzeServiceImpl implements IAnalyzeService { elevenOneV++; } + if (vOtherHarmFlag(pojo)) { + otherOverV++; + otherOneV++; + } + if (pojo.getIharm3Overtime() > 0) { @@ -753,6 +766,10 @@ public class AnalyzeServiceImpl implements IAnalyzeService { elevenOverI++; elevenOneI++; } + if (iOtherHarmFlag(pojo)) { + otherOverI++; + otherOneI++; + } } } @@ -771,12 +788,15 @@ public class AnalyzeServiceImpl implements IAnalyzeService { fiveOverOneDayList.add((double) fiveOneV / data.size() * 100); sevenOverOneDayList.add((double) sevenOneV / data.size() * 100); elevenOverOneDayList.add((double) elevenOneV / data.size() * 100); + elevenOverOneDayList.add((double) elevenOneV / data.size() * 100); + otherOverOneDayList.add((double) otherOneV / data.size() * 100); threeOverOneDayIList.add((double) threeOneI / data.size() * 100); fiveOverOneDayIList.add((double) fiveOneI / data.size() * 100); sevenOverOneDayIList.add((double) sevenOneI / data.size() * 100); elevenOverOneDayIList.add((double) elevenOneI / data.size() * 100); + otherOverOneDayIList.add((double) otherOneI / data.size() * 100); } @@ -809,6 +829,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService { innerHarmVList.add(assLimitVO("5",fiveVList,fiveV,data.size(),fiveOverV,fiveOverOneDayList)); innerHarmVList.add(assLimitVO("7",sevenVList,sevenV,data.size(),sevenOverV,sevenOverOneDayList)); innerHarmVList.add(assLimitVO("11",elevenVList,elevenV,data.size(),elevenOverV,elevenOverOneDayList)); + innerHarmVList.add(assLimitVO("其他",otherVList,otherV,data.size(),otherOverV,otherOverOneDayList)); overAreaLimitVO.setInnerHarmVList(innerHarmVList); @@ -818,6 +839,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService { innerHarmIList.add(assLimitVO("5",fiveIList,fiveI,data.size(),fiveOverI,fiveOverOneDayIList)); innerHarmIList.add(assLimitVO("7",sevenIList,sevenI,data.size(),sevenOverI,sevenOverOneDayIList)); innerHarmIList.add(assLimitVO("11",elevenIList,elevenI,data.size(),elevenOverI,elevenOverOneDayIList)); + innerHarmIList.add(assLimitVO("其他",otherIList,otherI,data.size(),otherOverI,otherOverOneDayIList)); overAreaLimitVO.setInnerHarmIList(innerHarmIList); } @@ -858,31 +880,36 @@ public class AnalyzeServiceImpl implements IAnalyzeService { return count > 0; } + private boolean vOtherHarmFlag(RStatLimitTargetDPO x) { + int count = x.getUharm2Overtime() + x.getUharm4Overtime() + + x.getUharm6Overtime() + x.getUharm8Overtime() + x.getUharm9Overtime() + + x.getUharm10Overtime() + x.getUharm12Overtime() + x.getUharm13Overtime() + x.getUharm14Overtime() + + x.getUharm15Overtime() + x.getUharm16Overtime() + x.getUharm17Overtime() + x.getUharm18Overtime() + x.getUharm19Overtime() + + x.getUharm20Overtime() + x.getUharm21Overtime() + x.getUharm22Overtime() + x.getUharm23Overtime() + x.getUharm24Overtime() + + x.getUharm25Overtime(); + return count > 0; + } + private boolean iHarmFlag(RStatLimitTargetDPO rStatLimitRateDPO) { - int count = rStatLimitRateDPO.getIharm2Overtime() + - rStatLimitRateDPO.getIharm3Overtime() + - rStatLimitRateDPO.getIharm4Overtime() + - rStatLimitRateDPO.getIharm5Overtime() + - rStatLimitRateDPO.getIharm6Overtime() + - rStatLimitRateDPO.getIharm7Overtime() + - rStatLimitRateDPO.getIharm8Overtime() + - rStatLimitRateDPO.getIharm9Overtime() + - rStatLimitRateDPO.getIharm10Overtime() + - rStatLimitRateDPO.getIharm11Overtime() + - rStatLimitRateDPO.getIharm12Overtime() + - rStatLimitRateDPO.getIharm13Overtime() + - rStatLimitRateDPO.getIharm14Overtime() + - rStatLimitRateDPO.getIharm15Overtime() + - rStatLimitRateDPO.getIharm16Overtime() + - rStatLimitRateDPO.getIharm17Overtime() + - rStatLimitRateDPO.getIharm18Overtime() + - rStatLimitRateDPO.getIharm19Overtime() + - rStatLimitRateDPO.getIharm20Overtime() + - rStatLimitRateDPO.getIharm21Overtime() + - rStatLimitRateDPO.getIharm22Overtime() + - rStatLimitRateDPO.getIharm23Overtime() + - rStatLimitRateDPO.getIharm24Overtime() + - rStatLimitRateDPO.getIharm25Overtime(); + int count = rStatLimitRateDPO.getIharm2Overtime() + rStatLimitRateDPO.getIharm3Overtime() + rStatLimitRateDPO.getIharm4Overtime() + + rStatLimitRateDPO.getIharm5Overtime() + rStatLimitRateDPO.getIharm6Overtime() + rStatLimitRateDPO.getIharm7Overtime() + + rStatLimitRateDPO.getIharm8Overtime() + rStatLimitRateDPO.getIharm9Overtime() + rStatLimitRateDPO.getIharm10Overtime() + + rStatLimitRateDPO.getIharm11Overtime() + rStatLimitRateDPO.getIharm12Overtime() + rStatLimitRateDPO.getIharm13Overtime() + + rStatLimitRateDPO.getIharm14Overtime() + rStatLimitRateDPO.getIharm15Overtime() + rStatLimitRateDPO.getIharm16Overtime() + + rStatLimitRateDPO.getIharm17Overtime() + rStatLimitRateDPO.getIharm18Overtime() + rStatLimitRateDPO.getIharm19Overtime() + + rStatLimitRateDPO.getIharm20Overtime() + rStatLimitRateDPO.getIharm21Overtime() + rStatLimitRateDPO.getIharm22Overtime() + + rStatLimitRateDPO.getIharm23Overtime() + rStatLimitRateDPO.getIharm24Overtime() + rStatLimitRateDPO.getIharm25Overtime(); + return count > 0; + } + + private boolean iOtherHarmFlag(RStatLimitTargetDPO rStatLimitRateDPO) { + int count = rStatLimitRateDPO.getIharm2Overtime() + rStatLimitRateDPO.getIharm4Overtime() + rStatLimitRateDPO.getIharm6Overtime() + + rStatLimitRateDPO.getIharm8Overtime() + rStatLimitRateDPO.getIharm9Overtime() + rStatLimitRateDPO.getIharm10Overtime() + + rStatLimitRateDPO.getIharm12Overtime() + rStatLimitRateDPO.getIharm13Overtime() + + rStatLimitRateDPO.getIharm14Overtime() + rStatLimitRateDPO.getIharm15Overtime() + rStatLimitRateDPO.getIharm16Overtime() + + rStatLimitRateDPO.getIharm17Overtime() + rStatLimitRateDPO.getIharm18Overtime() + rStatLimitRateDPO.getIharm19Overtime() + + rStatLimitRateDPO.getIharm20Overtime() + rStatLimitRateDPO.getIharm21Overtime() + rStatLimitRateDPO.getIharm22Overtime() + + rStatLimitRateDPO.getIharm23Overtime() + rStatLimitRateDPO.getIharm24Overtime() + rStatLimitRateDPO.getIharm25Overtime(); return count > 0; } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/report/impl/AreaHarmonicServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/report/impl/AreaHarmonicServiceImpl.java index 08521847e..417a70493 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/report/impl/AreaHarmonicServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/report/impl/AreaHarmonicServiceImpl.java @@ -59,7 +59,7 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService { private static final double MEDIUM_MAX_THRESHOLD = 30.0; // 谐波次数顺序(保持原有顺序) - private static final List HARMONIC_ORDERS = Arrays.asList("3", "5", "7", "11"); + private static final List HARMONIC_ORDERS = Arrays.asList("3", "5", "7", "11","other"); // 表格索引(保持原有顺序) private static final int LEDGER_TABLE_INDEX = 1; @@ -585,10 +585,10 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService { */ private List buildTableMergeRules() { List mergeRules = new ArrayList<>(); - // 表格7(谐波电压)的第0列,每5行合并一次(对应"单位"列) - mergeRules.add(TableMergeRule.build(VOLTAGE_HARMONIC_TABLE_INDEX, 0, 1, 5)); - // 表格8(谐波电流)的第0列,每5行合并一次(对应"单位"列) - mergeRules.add(TableMergeRule.build(CURRENT_HARMONIC_TABLE_INDEX, 0, 1, 5)); + // 表格7(谐波电压)的第0列,每6行合并一次(对应"单位"列) + mergeRules.add(TableMergeRule.build(VOLTAGE_HARMONIC_TABLE_INDEX, 0, 1, 6)); + // 表格8(谐波电流)的第0列,每6行合并一次(对应"单位"列) + mergeRules.add(TableMergeRule.build(CURRENT_HARMONIC_TABLE_INDEX, 0, 1, 6)); return mergeRules; } diff --git a/pqs-harmonic/harmonic-boot/src/main/resources/file/areaReportTemplate.docx b/pqs-harmonic/harmonic-boot/src/main/resources/file/areaReportTemplate.docx index 8dd9d6648f628b6af9dc8ac2790548b1ce8dd196..5f7dc09d1bcd9a4da753eefe7561442d1aa0d8fb 100644 GIT binary patch delta 26502 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 UG?k!ON<`3^0c_wz&p&7WA4X_Gvj6}9 delta 25915 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 Date: Thu, 8 Jan 2026 16:51:56 +0800 Subject: [PATCH 3/5] =?UTF-8?q?1.=E7=A8=B3=E6=80=81=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=8A=9F=E8=83=BD=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/AreaHarmonicReportController.java | 4 ++-- .../resources/file/areaReportTemplate.docx | Bin 50730 -> 50406 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/report/AreaHarmonicReportController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/report/AreaHarmonicReportController.java index 01e56f5ef..f89efd96d 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/report/AreaHarmonicReportController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/report/AreaHarmonicReportController.java @@ -50,13 +50,13 @@ public class AreaHarmonicReportController extends BaseController { @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/areaHarmonicReport") @ApiOperation("区域稳态报告") - public HttpResult> areaHarmonicReport(@RequestBody AreaHarmReportParam areaHarmReportParam, HttpServletResponse response) { + public void areaHarmonicReport(@RequestBody AreaHarmReportParam areaHarmReportParam, HttpServletResponse response) { TimeInterval timeInterval = new TimeInterval(); String methodDescribe = getMethodDescribe("areaHarmonicReport"); areaHarmonicService.areaHarmonicReport(areaHarmReportParam,response); log.info("区域稳态报告执行时长:"+timeInterval.interval()); - return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + //return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); } diff --git a/pqs-harmonic/harmonic-boot/src/main/resources/file/areaReportTemplate.docx b/pqs-harmonic/harmonic-boot/src/main/resources/file/areaReportTemplate.docx index 5f7dc09d1bcd9a4da753eefe7561442d1aa0d8fb..a174b8bdc900f39608e13b09ea126f6bd382e7e1 100644 GIT binary patch delta 22040 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 VKIqVhIJyz^ZiEXvuJ`X@{{_|>nrr|7 delta 22355 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 Date: Fri, 9 Jan 2026 09:37:14 +0800 Subject: [PATCH 4/5] =?UTF-8?q?1.=E5=BC=82=E5=B8=B8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=B8=9A=E5=8A=A1=E8=B0=83=E6=95=B4=202.?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=85=A8=E6=99=AF=E7=9B=91=E6=B5=8B=E7=82=B9?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E8=B7=B3=E8=BD=AC=E5=8F=B0=E8=B4=A6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=8D=E5=87=86=E7=A1=AE=E7=A8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PqDataVerifyBakServiceImpl.java | 3 + .../common/service/GeneralDeviceService.java | 16 +- .../device/line/mapper/mapping/LineMapper.xml | 10 +- .../controller/ExportModelJBController.java | 520 +++++++++++------- .../impl/RStatLimitServiceImpl.java | 1 + 5 files changed, 334 insertions(+), 216 deletions(-) diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/PqDataVerifyBakServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/PqDataVerifyBakServiceImpl.java index c72a7ce7e..41bb3c476 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/PqDataVerifyBakServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/PqDataVerifyBakServiceImpl.java @@ -471,6 +471,9 @@ public class PqDataVerifyBakServiceImpl extends ServiceImpl baseDataVerifyQuery(List monitorIds, MonitorBaseParam monitorBaseParam) { + if(Objects.isNull(monitorBaseParam.getErrorTimeCount())){ + monitorBaseParam.setErrorTimeCount(720); + } LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.between(PqDataVerifyBak::getTimeId, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime()))) .in(PqDataVerifyBak::getLineId, monitorIds) diff --git a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/common/service/GeneralDeviceService.java b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/common/service/GeneralDeviceService.java index 9406c84af..8fb04b8e3 100644 --- a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/common/service/GeneralDeviceService.java +++ b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/common/service/GeneralDeviceService.java @@ -369,7 +369,7 @@ public class GeneralDeviceService { StatisticsEnum statisticsEnum = StatisticsEnum.getStatisticsEnumByCode(deviceInfoParam.getStatisticalType().getCode()); switch (statisticsEnum) { case VOLTAGE_LEVEL: - return filterDataByScale(deviceInfos, deviceInfoParam.getScale()); + return filterDataByScale(deviceInfos, deviceInfoParam.getScale(),deviceInfoParam.getLineOrDevice()); case LOAD_TYPE: return filterDataByLoadType(deviceInfos, deviceInfoParam.getLoadType()); case MANUFACTURER: @@ -474,11 +474,12 @@ public class GeneralDeviceService { generalDeviceDTO.setLineIndexes(lineIndexes.stream().distinct().collect(Collectors.toList())); } - private List filterDataByScale(List deviceInfos, List scales) { + private List filterDataByScale(List deviceInfos, List scales,Integer type) { List generalDeviceDTOS = new ArrayList<>(); - List subIds = new ArrayList<>(), lineIds = new ArrayList<>(); + List subIds = new ArrayList<>(), subVIds = new ArrayList<>(),lineIds = new ArrayList<>(); for (GeneralDeviceDTO generalDeviceDTO : deviceInfos) { subIds.addAll(generalDeviceDTO.getSubIndexes()); + subVIds.addAll(generalDeviceDTO.getVoltageIndexes()); lineIds.addAll(generalDeviceDTO.getLineIndexes()); } //如果电压等级集合为空,则查询所有的电压等级 @@ -496,8 +497,13 @@ public class GeneralDeviceService { } List lines = terminalBaseService.getLineById(lineIds); for (SimpleDTO simpleDTO : scales) { - List voltageScaleIds = terminalBaseService.getSubIdByScale(subIds, simpleDTO.getId()); - generalDeviceDTOS.add(assembleDataByLine(simpleDTO, lines, voltageScaleIds, LineBaseEnum.SUB_LEVEL.getCode())); + if(ObjectUtil.isNull(type)){ + List voltageScaleIds = terminalBaseService.getSubIdByScale(subIds, simpleDTO.getId()); + generalDeviceDTOS.add(assembleDataByLine(simpleDTO, lines, voltageScaleIds, LineBaseEnum.SUB_LEVEL.getCode())); + }else{ + List voltageScaleIds = terminalBaseService.getVoltageIdByScale(subVIds, simpleDTO.getId()); + generalDeviceDTOS.add(assembleDataByLine(simpleDTO, lines, voltageScaleIds, LineBaseEnum.SUB_V_LEVEL.getCode())); + } } return generalDeviceDTOS; } diff --git a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/LineMapper.xml b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/LineMapper.xml index 5f97b9e0e..02a79adac 100644 --- a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/LineMapper.xml +++ b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/line/mapper/mapping/LineMapper.xml @@ -1565,7 +1565,6 @@ lineDetail.Power_Flag powerFlag, lineDetail.Run_Flag lineRunType FROM - pq_line line, pq_line voltage, pq_line device, pq_line substation, @@ -1574,12 +1573,11 @@ pq_device deviceDetail, pq_line_detail lineDetail, pq_voltage vg, - pq_dept_line deptLine, - sys_dept dept + pq_line line + LEFT JOIN pq_dept_line deptLine on line.id = deptLine.Line_Id + LEFT JOIN sys_dept dept on deptLine.Id = dept.Id - line.id = deptLine.Line_Id - AND deptLine.Id = dept.Id - AND line.pid = voltage.id + line.pid = voltage.id AND voltage.pid = device.id AND device.pid = substation.id AND substation.pid = gd.id diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelJBController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelJBController.java index a9fa28850..fa6dbb8b1 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelJBController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/ExportModelJBController.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.njcn.common.pojo.enums.response.CommonResponseEnum; @@ -25,7 +26,6 @@ import com.njcn.event.pojo.param.EventCountParam; import com.njcn.event.pojo.po.RmpEventDetailPO; import com.njcn.harmonic.pojo.param.ReportQueryParam; import com.njcn.harmonic.pojo.po.report.EnumPass; -import com.njcn.harmonic.pojo.po.report.OverLimitInfo; import com.njcn.harmonic.pojo.po.report.Pass; import com.njcn.harmonic.pojo.po.report.ReportTarget; import com.njcn.harmonic.pojo.vo.ReportValue; @@ -145,7 +145,7 @@ public class ExportModelJBController extends BaseController { } bdname = lineDto.getBdName(); areaName = lineDto.getAreaName(); - if(areaName.equals("冀北")){ + if("冀北".equals(areaName)){ areaName="国网"+areaName; } pttype = PubUtils.ptTypeName(lineDto.getPtType()); @@ -198,18 +198,14 @@ public class ExportModelJBController extends BaseController { param.setB(day == 0); //限值 - OverLimitInfo overLimitData = reportService.getOverLimitData(param); Overlimit overLimit; if (type == 0) { overLimit = lineFeignClient.getOverLimitData(param.getLineId()).getData(); } else { overLimit = monitorClient.getOverLimitData(param.getLineId()).getData(); } - param.setCount(overLimitData.getCount()); - overLimitData.setOverLimitRate(Arrays.asList(overLimit)); - - if (0 == overLimitData.getOverLimitRate().size()) { + if (ObjUtil.isNull(overLimit)) { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, "dataFail", methodDescribe); } @@ -237,7 +233,7 @@ public class ExportModelJBController extends BaseController { } - Map reportmap = new HashMap<>();// 报告Map + Map reportmap = new HashMap<>(200); //数据单位 PqsDeviceUnit deviceUnit = deviceUnitClient.lineUnitDetail(lineIndex).getData(); reportmap.putAll(unitMap(deviceUnit)); @@ -245,7 +241,7 @@ public class ExportModelJBController extends BaseController { reportmap.put("$btype$", btype); reportmap.put("$ctype$", ctype); - Map header = new HashMap(); + Map header = new HashMap(2); if (ObjectUtil.isNotEmpty(file)) { byte[] bytes = file.getBytes(); if(bytes.length>0){ @@ -302,16 +298,24 @@ public class ExportModelJBController extends BaseController { reportmap.put("$image$", header); getVirtualData(param); - ReportValue voltage1 = this.listVirtual.get(0).getList().get(0);// 电压幅值 - ReportValue voltage2 = this.listVirtual.get(0).getList().get(1);// 电压幅值 - ReportValue voltage3 = this.listVirtual.get(0).getList().get(2);// 电压幅值 - ReportValue current1 = this.listVirtual.get(1).getList().get(0);// 电流幅值 - ReportValue current2 = this.listVirtual.get(1).getList().get(1);// 电流幅值 - ReportValue current3 = this.listVirtual.get(1).getList().get(2);// 电流幅值 + //电压幅值 + ReportValue voltage1 = this.listVirtual.get(0).getList().get(0); + // 电压幅值 + ReportValue voltage2 = this.listVirtual.get(0).getList().get(1); + // 电压幅值 + ReportValue voltage3 = this.listVirtual.get(0).getList().get(2); + // 电流幅值 + ReportValue current1 = this.listVirtual.get(1).getList().get(0); + // 电流幅值 + ReportValue current2 = this.listVirtual.get(1).getList().get(1); + // 电流幅值 + ReportValue current3 = this.listVirtual.get(1).getList().get(2); String strLineBaseName = String.format("%s%s", new String[]{bdname + "_", name}); - String strAnalysis = "";// 分析建议 - String strError = "";// 报表错误 + // 分析建议 + String strAnalysis = ""; + // 报表错误 + String strError = ""; /************************************************************** **** 基波电压/电流有效值表格 @@ -421,8 +425,9 @@ public class ExportModelJBController extends BaseController { int iCount = 0; // 判断所取的基波电压、基波电流值是否为null for (Object value : reportmap.values()) { - if (value == null) + if (value == null){ iCount++; + } } // 假如所有的数据都为null,则返回(所选的时间段内未找到数据) if (iCount == reportmap.size()) { @@ -485,50 +490,65 @@ public class ExportModelJBController extends BaseController { } } reportmap.put("$BaseVIResult$", strBaseVIResult); - if (!"".equals(strBaseVIResult)) + if (!"".equals(strBaseVIResult)){ strError += strBaseVIResult; + } /************************************************************** **** 所选的时间段内有数据存在则进行其他加载 ***************************************************************/ -// Depts dep = R.getCurrentDept(); -// String detpName = dep.getArea(); - reportmap.put("$detpName$", areaName); // 区域名称 + // 区域名称 + reportmap.put("$detpName$", areaName); // 获取报告生成时间 Date currentTime = new Date(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");// 报告时分秒格式 + // 报告时分秒格式 + SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); String strTime = String.format("%s——%s。", new String[]{DateUtil.format(startDate, "yyyy年MM月dd日 HH时mm分ss秒"), DateUtil.format(endDate, "yyyy年MM月dd日 HH时mm分ss秒")}); - reportmap.put("$number$", StrUtil.isBlank(reportNumber)?"":reportNumber); // 报告编号 - reportmap.put("$titlePoint$",StrUtil.isBlank(crmName)?"":crmName); // 客户名称 - - reportmap.put("$TitleTime$", formatter.format(currentTime)); // 报告生成时间 - reportmap.put("$ReportTitle$", - String.format("对该地区%s电能质量在线监测数据进行分析, 以判断电能质量指标是否满足国标。", new String[]{strLineBaseName}));// 报告标题 - reportmap.put("$ReportTime$", strTime);// 报告分析时间段 - reportmap.put("$RunBaseName$", String.format("以下将对%s电能质量统计数据进行分析,数据包括基波电压/电流、谐波电压/电流、电压偏差、频率偏差、电压总谐波畸变率、2-25次谐波电压含有率、2-25次谐波电流、0.5-15.5次间谐波电压含有率、负序电压不平衡度、负序电流、电压闪变。", - new String[]{strLineBaseName}));// 运行数据分析 - reportmap.put("$BaseVITable$", String.format("报告分析时间段内%s的基波电压/电流分钟统计数据见下表。", new String[]{strLineBaseName}));// 基波电压和电流 - reportmap.put("$VDTable$", String.format("报告分析时间段内%s的电压偏差统计数据见下表。", new String[]{strLineBaseName}));// 供电电压偏差 - reportmap.put("$FRETable$", String.format("报告分析时间段内%s的频率偏差统计数据见下表。", new String[]{strLineBaseName}));// 频率偏差 - reportmap.put("$THETable$", String.format("报告分析时间段内%s的三相电压不平衡度统计数据见下表。", new String[]{strLineBaseName}));// 三相电压不平衡度 - reportmap.put("$PLTTable$", String.format("报告分析时间段内%s的闪变统计数据见下表。", new String[]{strLineBaseName}));// 闪变 - reportmap.put("$ThdTable$", String.format("报告分析时间段内%s的电压总谐波畸变率统计数据见下表。", new String[]{strLineBaseName}));// 电压总谐波畸变率 - reportmap.put("$IneTable$", String.format("报告分析时间段内%s的负序电流统计数据见下表。", new String[]{strLineBaseName}));// 负序电流 - reportmap.put("$RVTable$", - String.format("报告分析时间段内%s的2-25次谐波电压含有率CP95概率值统计数据见下表。", new String[]{strLineBaseName}));// 谐波电压 - reportmap.put("$INTable$", - String.format("报告分析时间段内%s的0.5-15.5次间谐波电压含有率CP95概率值统计数据见下表。", new String[]{strLineBaseName}));// 间谐波 - reportmap.put("$RITable$", - String.format("报告分析时间段内%s的2-25次谐波电流幅值CP95概率值统计数据见下表。", new String[]{strLineBaseName}));// 谐波电流 - - reportmap.put("$LineName1$", name);// 监测点名称1 - reportmap.put("$LineName2$", name);// 监测点名称2 - reportmap.put("$LineName3$", name);// 监测点名称3 - reportmap.put("$LineName4$", name);// 监测点名称4 - reportmap.put("$LineName5$", name);// 监测点名称5 + // 报告编号 + reportmap.put("$number$", StrUtil.isBlank(reportNumber)?"":reportNumber); + // 客户名称 + reportmap.put("$titlePoint$",StrUtil.isBlank(crmName)?"":crmName); + // 报告生成时间 + reportmap.put("$TitleTime$", formatter.format(currentTime)); + // 报告标题 + reportmap.put("$ReportTitle$", String.format("对该地区%s电能质量在线监测数据进行分析, 以判断电能质量指标是否满足国标。", new String[]{strLineBaseName})); + // 报告分析时间段 + reportmap.put("$ReportTime$", strTime); + // 运行数据分析 + reportmap.put("$RunBaseName$", String.format("以下将对%s电能质量统计数据进行分析,数据包括基波电压/电流、谐波电压/电流、电压偏差、频率偏差、电压总谐波畸变率、2-25次谐波电压含有率、2-25次谐波电流、0.5-15.5次间谐波电压含有率、负序电压不平衡度、负序电流、电压闪变。", new String[]{strLineBaseName})); + // 基波电压和电流 + reportmap.put("$BaseVITable$", String.format("报告分析时间段内%s的基波电压/电流分钟统计数据见下表。", new String[]{strLineBaseName})); + // 供电电压偏差 + reportmap.put("$VDTable$", String.format("报告分析时间段内%s的电压偏差统计数据见下表。", new String[]{strLineBaseName})); + // 频率偏差 + reportmap.put("$FRETable$", String.format("报告分析时间段内%s的频率偏差统计数据见下表。", new String[]{strLineBaseName})); + // 三相电压不平衡度 + reportmap.put("$THETable$", String.format("报告分析时间段内%s的三相电压不平衡度统计数据见下表。", new String[]{strLineBaseName})); + // 闪变 + reportmap.put("$PLTTable$", String.format("报告分析时间段内%s的闪变统计数据见下表。", new String[]{strLineBaseName})); + // 电压总谐波畸变率 + reportmap.put("$ThdTable$", String.format("报告分析时间段内%s的电压总谐波畸变率统计数据见下表。", new String[]{strLineBaseName})); + // 负序电流 + reportmap.put("$IneTable$", String.format("报告分析时间段内%s的负序电流统计数据见下表。", new String[]{strLineBaseName})); + // 谐波电压 + reportmap.put("$RVTable$", String.format("报告分析时间段内%s的2-25次谐波电压含有率CP95概率值统计数据见下表。", new String[]{strLineBaseName})); + // 间谐波 + reportmap.put("$INTable$", String.format("报告分析时间段内%s的0.5-15.5次间谐波电压含有率CP95概率值统计数据见下表。", new String[]{strLineBaseName})); + // 谐波电流 + reportmap.put("$RITable$", String.format("报告分析时间段内%s的2-25次谐波电流幅值CP95概率值统计数据见下表。", new String[]{strLineBaseName})); + // 监测点名称1 + reportmap.put("$LineName1$", name); + // 监测点名称2 + reportmap.put("$LineName2$", name); + // 监测点名称3 + reportmap.put("$LineName3$", name); + // 监测点名称4 + reportmap.put("$LineName4$", name); + // 监测点名称5 + reportmap.put("$LineName5$", name); /********************** **** 数据获取 @@ -544,16 +564,20 @@ public class ExportModelJBController extends BaseController { getCurrentRate(param, overLimit); getInRate(param, overLimit); getIne(param, overLimit); - - ReportValue pst1 = this.listFlicker.get(0).getList().get(0);// 短闪 - ReportValue pst2 = this.listFlicker.get(0).getList().get(1);// 短闪 - ReportValue pst3 = this.listFlicker.get(0).getList().get(2);// 短闪 - ReportValue plt1 = this.listFlicker.get(1).getList().get(0);// 长闪 - ReportValue plt2 = this.listFlicker.get(1).getList().get(1);// 长闪 - ReportValue plt3 = this.listFlicker.get(1).getList().get(2);// 长闪 - - reportmap.put("$LineBase$", String.format("%s%s,CT变比为:%s,PT变比为:%s。", - new String[]{bdname, name, lineDto.getCt(), lineDto.getPt()}));// 监测点基本信息 + // 短闪 A + ReportValue pst1 = this.listFlicker.get(0).getList().get(0); + // 短闪 B + ReportValue pst2 = this.listFlicker.get(0).getList().get(1); + // 短闪 C + ReportValue pst3 = this.listFlicker.get(0).getList().get(2); + // 长闪 A + ReportValue plt1 = this.listFlicker.get(1).getList().get(0); + // 长闪 B + ReportValue plt2 = this.listFlicker.get(1).getList().get(1); + // 长闪 C + ReportValue plt3 = this.listFlicker.get(1).getList().get(2); + // 监测点基本信息 + reportmap.put("$LineBase$", String.format("%s%s,CT变比为:%s,PT变比为:%s。", new String[]{bdname, name, lineDto.getCt(), lineDto.getPt()})); /************************************************************** **** 三张大表基础数据幅值 @@ -604,74 +628,105 @@ public class ExportModelJBController extends BaseController { /************************************************************** **** 电压偏差(上偏差和下偏差) ***************************************************************/ - ReportValue vdeviation1 = this.listVdeviation.get(0).getList().get(0); - ReportValue vdeviation2 = this.listVdeviation.get(0).getList().get(1); - ReportValue vdeviation3 = this.listVdeviation.get(0).getList().get(2); - String vdeviationLimit = judgeNull(this.listVdeviation.get(0).getOverLimit());// 获取电压上下偏差的国标限值 + // 获取电压上偏差的国标限值 + String vdeviationLimit = judgeNull(this.listVdeviation.get(0).getOverLimit()); reportmap.put("$VD_L$", vdeviationLimit); - reportmap.put("$VD_U$", judgeNull(this.listVdeviation.get(1).getOverLimit())); + //获取电压下偏差的国标限值 + String ldeviationLimit = judgeNull(this.listVdeviation.get(1).getOverLimit()); + reportmap.put("$VD_U$", ldeviationLimit); String strResultVdeviationdata = ""; String tmpstrResultVdeviationdata = ""; String strResultVdeviationdataValue = ""; // 获取电压偏差 - String tmpstrMap = ""; - reportmap.put("$VDTX_A$", judgeNull(vdeviation1.getFmaxValue())); - reportmap.put("$VDTN_A$", judgeNull(vdeviation1.getMinValue())); - reportmap.put("$VDTE_A$", judgeNull(vdeviation1.getMeanValue())); - reportmap.put("$VDT%_A$", judgeNull(vdeviation1.getCp95Value())); - reportmap.put("$VDTX_B$", judgeNull(vdeviation2.getFmaxValue())); - reportmap.put("$VDTN_B$", judgeNull(vdeviation2.getMinValue())); - reportmap.put("$VDTE_B$", judgeNull(vdeviation2.getMeanValue())); - reportmap.put("$VDT%_B$", judgeNull(vdeviation2.getCp95Value())); - if (pttype != 2) { - reportmap.put("$VDTX_C$", judgeNull(vdeviation3.getFmaxValue())); - reportmap.put("$VDTN_C$", judgeNull(vdeviation3.getMinValue())); - reportmap.put("$VDTE_C$", judgeNull(vdeviation3.getMeanValue())); - reportmap.put("$VDT%_C$", judgeNull(vdeviation3.getCp95Value())); - } else { - reportmap.put("$VDTX_C$", "-"); - reportmap.put("$VDTN_C$", "-"); - reportmap.put("$VDTE_C$", "-"); - reportmap.put("$VDT%_C$", "-"); - } - - // 值错误判断 try { - maxValue = Math.abs(Double.parseDouble(vdeviation1.getFmaxValue().toString())); - minValue = Math.abs(Double.parseDouble(vdeviation1.getMinValue().toString())); - aveValue = Math.abs(Double.parseDouble(vdeviation1.getMeanValue().toString())); - cp95Value = Math.abs(Double.parseDouble(vdeviation1.getCp95Value().toString())); - limit = Math.abs(Double.parseDouble(vdeviationLimit)); + for (int i = 0; i < 3; i++) { + String tmpstrMap ; + switch (i) { + case 0: + tmpstrMap = "A"; + break; + case 1: + tmpstrMap = "B"; + break; + default: + tmpstrMap = "C"; + break; + } + ReportValue vdeviation = this.listVdeviation.get(0).getList().get(i); + if(Objects.equals("C",tmpstrMap)&&pttype == 2){ + reportmap.put("$VDTX_C$", "-"); + reportmap.put("$VDTN_C$", "-"); + reportmap.put("$VDTE_C$", "-"); + reportmap.put("$VDT%_C$", "-"); + continue; + }else { + reportmap.put("$VDTX_" + tmpstrMap + "$", judgeNull(vdeviation.getFmaxValue())); + reportmap.put("$VDTN_" + tmpstrMap + "$", judgeNull(vdeviation.getMinValue())); + reportmap.put("$VDTE_" + tmpstrMap + "$", judgeNull(vdeviation.getMeanValue())); + reportmap.put("$VDT%_" + tmpstrMap + "$", judgeNull(vdeviation.getCp95Value())); + } + + + // 电压偏差 + Double vmaxValue = Double.parseDouble(reportmap.get("$VDTX_" + tmpstrMap + "$").toString()); + Double vminValue = Double.parseDouble(reportmap.get("$VDTX_" + tmpstrMap + "$").toString()); + Double vaveValue = Double.parseDouble(reportmap.get("$VDTX_" + tmpstrMap + "$").toString()); + Double vcp95Value = Double.parseDouble(reportmap.get("$VDT%_" + tmpstrMap + "$").toString()); + + if("".equals(strResultVdeviationdataValue)){ + if (!(vmaxValue >= vminValue && vmaxValue >= vaveValue && vmaxValue >= vcp95Value)) { + strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName + + "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; + } else if (vaveValue < vminValue) { + strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName + + "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; + } else if (vcp95Value < vminValue) { + strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName + + "电压偏差数据数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; + } + } + + if(vmaxValue>Double.valueOf(vdeviationLimit)||vmaxValueDouble.valueOf(vdeviationLimit)||vminValueDouble.valueOf(vdeviationLimit)||vaveValueDouble.valueOf(vdeviationLimit)||vcp95Value= minValue && maxValue >= aveValue && maxValue >= cp95Value)) { - strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName - + "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; - } else if (aveValue < minValue) { - strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName - + "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; - } else if (cp95Value < minValue) { - strResultVdeviationdataValue += "注意:从上表中可以看出" + strLineBaseName - + "电压偏差数据存在异常( 1、最大值>=最小值、平均值、95%概率值;2、平均值>=最小值;3、95%概率值>=最小值)。"; - } - } - // 限值判断 - if (maxValue > limit) { - if (!"".equals(tmpstrResultVdeviationdata)) - tmpstrResultVdeviationdata += "、"; - tmpstrResultVdeviationdata += tmpstrMap + "相"; - } - // 假如为空则所有的都满足 if ("".equals(tmpstrResultVdeviationdata)) { - strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + "A、B、C三相电压偏差满足国标限值(10%)的要求。"; + strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + "A、B、C三相电压偏差满足国标限值("+ldeviationLimit+"%至"+vdeviationLimit+"%)的要求。"; } else { - strAnalysis += tmpstrResultVdeviationdata + "电压偏差不满足国标限值(10%)的要求。"; + strAnalysis += tmpstrResultVdeviationdata + "电压偏差不满足国标限值("+vdeviationLimit+")的要求。"; strResultVdeviationdata += "从上表中可以看出" + strLineBaseName + tmpstrResultVdeviationdata - + "电压偏差不满足国标限值(10%)的要求。"; + + "电压偏差不满足国标限值("+ldeviationLimit+"%至"+vdeviationLimit+"%)的要求。"; } reportmap.put("$ResultVdeviationdata$", strResultVdeviationdata); @@ -682,7 +737,8 @@ public class ExportModelJBController extends BaseController { **** 频率偏差 ***************************************************************/ ReportValue valueOfFreValue = this.listFrequency.get(1).getList().get(0); - String valueOfFreLimit = judgeNull(this.listFrequency.get(1).getOverLimit());// 获取频率偏差国标限值 + // 获取频率偏差国标限值 + String valueOfFreLimit = judgeNull(this.listFrequency.get(1).getOverLimit()); reportmap.put("$FRE_L$", valueOfFreLimit); String strResultFre = ""; String tmpstrResultFre = ""; @@ -703,25 +759,25 @@ public class ExportModelJBController extends BaseController { reportmap.put("$FV0%$", judgeNull(valueOfFreValue.getCp95Value())); try { - maxValue = Math.abs(Double.parseDouble(valueOfFreValue.getFmaxValue().toString())); - minValue = Math.abs(Double.parseDouble(valueOfFreValue.getMinValue().toString())); - aveValue = Math.abs(Double.parseDouble(valueOfFreValue.getMeanValue().toString())); - cp95Value = Math.abs(Double.parseDouble(valueOfFreValue.getCp95Value().toString())); + maxValue = Double.parseDouble(valueOfFreValue.getFmaxValue().toString()); + minValue = Double.parseDouble(valueOfFreValue.getMinValue().toString()); + aveValue = Double.parseDouble(valueOfFreValue.getMeanValue().toString()); + cp95Value = Double.parseDouble(valueOfFreValue.getCp95Value().toString()); limit = Math.abs(Double.parseDouble(valueOfFreLimit)); } catch (Exception e) { strResultFreValue += "注意:从上表中可以看出" + strLineBaseName + "频率偏差数据存在异常(不是数值类型)。"; } - if (maxValue > limit) { + if (Math.abs(maxValue) > limit) { tmpstrResultFre += "最大值为:" + valueOfFreValue.getFmaxValue().toString() + deviceUnit.getUnitFrequencyDev(); } - if (minValue > limit) { + if (Math.abs(minValue) > limit) { tmpstrResultFre += "最小值为:" + valueOfFreValue.getMinValue().toString() + deviceUnit.getUnitFrequencyDev(); } - if (aveValue > limit) { + if (Math.abs(aveValue) > limit) { tmpstrResultFre += "平均值为:" + valueOfFreValue.getMeanValue().toString() + deviceUnit.getUnitFrequencyDev(); } - if (cp95Value > limit) { + if (Math.abs(cp95Value) > limit) { tmpstrResultFre += "95%概率值为:" + valueOfFreValue.getCp95Value().toString() + deviceUnit.getUnitFrequencyDev(); } @@ -737,10 +793,12 @@ public class ExportModelJBController extends BaseController { } if ("".equals(tmpstrResultFre)) { - reportmap.put("$FV0R$", "合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$FV0R$", "合格"); strResultFre += "从上表中可以看出" + strLineBaseName + "频率偏差均满足国标限值(±" + valueOfFreLimit + deviceUnit.getUnitFrequencyDev() + ")的要求。"; } else { - reportmap.put("$FV0R$", "不合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$FV0R$", "不合格"); strAnalysis += tmpstrResultFre + ",均不满足国标限值(±" + valueOfFreLimit + deviceUnit.getUnitFrequencyDev() + ")的要求。"; strResultFre += "从上表中可以看出" + strLineBaseName + "频率偏差" + tmpstrResultFre + ",均不满足国标限值(±" + valueOfFreLimit + deviceUnit.getUnitFrequencyDev() + ")的要求。"; @@ -754,7 +812,8 @@ public class ExportModelJBController extends BaseController { **** 三相电压不平衡度 ***************************************************************/ ReportValue valueOfThree = this.listThreephase.get(0).getList().get(0); - String valueOfThreeLimit = judgeNull(this.listThreephase.get(0).getOverLimit());// 获取三相电压不平衡度国标限值 + // 获取三相电压不平衡度国标限值 + String valueOfThreeLimit = judgeNull(this.listThreephase.get(0).getOverLimit()); reportmap.put("$THE_L$", valueOfThreeLimit); String strResultThree = ""; String tmpstrResultThree = ""; @@ -783,10 +842,12 @@ public class ExportModelJBController extends BaseController { strResultThreeValue += "注意:从上表中可以看出" + strLineBaseName + "三相电压不平衡度数据存在异常(不是数值类型)。"; } if (cp95Value > limit) { - reportmap.put("$TV0R$", "不合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$TV0R$", "不合格"); tmpstrResultThree += "三相电压不平衡度95%概率值为:" + valueOfThree.getCp95Value().toString(); } else { - reportmap.put("$TV0R$", "合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$TV0R$", "合格"); } if (!(maxValue >= minValue && maxValue >= aveValue && maxValue >= cp95Value)) { @@ -816,7 +877,8 @@ public class ExportModelJBController extends BaseController { /************************************************************** **** 电压闪变 ***************************************************************/ - String valueOfFlickerLimit = judgeNull(this.listFlicker.get(1).getOverLimit());// 获取电压长时闪变的限值 + // 获取电压长时闪变的限值 + String valueOfFlickerLimit = judgeNull(this.listFlicker.get(1).getOverLimit()); reportmap.put("$PLT_L$", valueOfFlickerLimit); String strResultFlicker = ""; String tmpstrResultFlicker = ""; @@ -836,8 +898,9 @@ public class ExportModelJBController extends BaseController { strResultFlickerValue += "注意:从上表中可以看出" + strLineBaseName + "长时闪变数据存在异常(不是数值类型)。"; } if (fmaxValue1 > flickerLimit) { - if (!"".equals(tmpstrResultFlicker)) + if (!"".equals(tmpstrResultFlicker)) { tmpstrResultFlicker += ","; + } tmpstrResultFlicker += atype + "最大值为:" + plt1.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "A" + "$", "不合格"); } else { @@ -845,8 +908,9 @@ public class ExportModelJBController extends BaseController { } if (fmaxValue2 > flickerLimit) { - if (!"".equals(tmpstrResultFlicker)) + if (!"".equals(tmpstrResultFlicker)) { tmpstrResultFlicker += ","; + } tmpstrResultFlicker += btype + "最大值为:" + plt2.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "B" + "$", "不合格"); } else { @@ -854,8 +918,9 @@ public class ExportModelJBController extends BaseController { } if (fmaxValue3 > flickerLimit && pttype != 2) { - if (!"".equals(tmpstrResultFlicker)) + if (!"".equals(tmpstrResultFlicker)) { tmpstrResultFlicker += ","; + } tmpstrResultFlicker += ctype + "最大值为:" + plt3.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "C" + "$", "不合格"); } else { @@ -1021,26 +1086,38 @@ public class ExportModelJBController extends BaseController { String tmpstrResult = ""; if (maxValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "A"; - reportmap.put("$CV" + (i + 1) + "R_A$", "不合格");// 三张大表取值 - } else - reportmap.put("$CV" + (i + 1) + "R_A$", "合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_A$", "不合格"); + } else { + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_A$", "合格"); + } if (minValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "B"; - reportmap.put("$CV" + (i + 1) + "R_B$", "不合格");// 三张大表取值 - } else - reportmap.put("$CV" + (i + 1) + "R_B$", "合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_B$", "不合格"); + } else { + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_B$", "合格"); + } if (aveValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "C"; - reportmap.put("$CV" + (i + 1) + "R_C$", "不合格");// 三张大表取值 - } else - reportmap.put("$CV" + (i + 1) + "R_C$", "合格");// 三张大表取值 + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_C$", "不合格"); + } else { + // 三张大表取值 + reportmap.put("$CV" + (i + 1) + "R_C$", "合格"); + } // 判断单个结论是否存在 if (!"".equals(tmpstrResult)) { tmpstrResultVoltageRate += (i + 1) + "次谐波电压含有率95%概率值" + tmpstrResult + ";"; @@ -1054,6 +1131,9 @@ public class ExportModelJBController extends BaseController { strAnalysis += tmpstrResultVoltageRate + "2-25次谐波电压含有率95%概率值均不满足国标限值要求。"; strResultVoltageRate += "从上表中可以看出" + strLineBaseName + tmpstrResultVoltageRate + "均不满足国标限值要求。"; } + reportmap.put("$ResultVoltageRate$", strResultVoltageRate ); + reportmap.put("$ResultVoltageRateValue$", strResultVoltageRateValue); + /************************************************************** **** 电压总谐波畸变率(THD) @@ -1102,28 +1182,31 @@ public class ExportModelJBController extends BaseController { } // 限值判断 if (cp95ValueA > limit) { - if (!"".equals(tmpstrResultDistortion)) + if (!"".equals(tmpstrResultDistortion)) { tmpstrResultDistortion += "、"; + } tmpstrResultDistortion += atype; - reportmap.put("$TV0R_A$", "不合格");// 三张大表取值 + reportmap.put("$TV0R_A$", "不合格"); } else { - reportmap.put("$TV0R_A$", "合格");// 三张大表取值 + reportmap.put("$TV0R_A$", "合格"); } if (cp95ValueB > limit) { - if (!"".equals(tmpstrResultDistortion)) + if (!"".equals(tmpstrResultDistortion)) { tmpstrResultDistortion += "、"; + } tmpstrResultDistortion += btype; - reportmap.put("$TV0R_B$", "不合格");// 三张大表取值 + reportmap.put("$TV0R_B$", "不合格"); } else { - reportmap.put("$TV0R_B$", "合格");// 三张大表取值 + reportmap.put("$TV0R_B$", "合格"); } if (cp95ValueC > limit && pttype != 2) { - if (!"".equals(tmpstrResultDistortion)) + if (!"".equals(tmpstrResultDistortion)){ tmpstrResultDistortion += "、"; + } tmpstrResultDistortion += ctype; - reportmap.put("$TV0R_C$", "不合格");// 三张大表取值 + reportmap.put("$TV0R_C$", "不合格"); } else { - reportmap.put("$TV0R_C$", "合格");// 三张大表取值 + reportmap.put("$TV0R_C$", "合格"); } // 假如为空则所有的都满足 @@ -1134,8 +1217,7 @@ public class ExportModelJBController extends BaseController { strResultDistortion += "从上表中可以看出" + strLineBaseName + tmpstrResultDistortion + "均不满足国标限值要求。"; } - reportmap.put("$ResultVoltageRate$", strResultVoltageRate ); - reportmap.put("$ResultVoltageRateValue$", strResultVoltageRateValue + strResultDistortionValue); + reportmap.put("$ResultThdRate$", strResultDistortion); reportmap.put("$ResultThdRateValue$", strResultDistortionValue); @@ -1194,26 +1276,32 @@ public class ExportModelJBController extends BaseController { String tmpstrResult = ""; if (maxValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "A"; - reportmap.put("$CI" + (i + 1) + "R_A$", "不合格");// 三张大表取值 - } else - reportmap.put("$CI" + (i + 1) + "R_A$", "合格");// 三张大表取值 + reportmap.put("$CI" + (i + 1) + "R_A$", "不合格"); + } else { + reportmap.put("$CI" + (i + 1) + "R_A$", "合格"); + } if (minValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "B"; - reportmap.put("$CI" + (i + 1) + "R_B$", "不合格");// 三张大表取值 - } else - reportmap.put("$CI" + (i + 1) + "R_B$", "合格");// 三张大表取值 + reportmap.put("$CI" + (i + 1) + "R_B$", "不合格"); + } else { + reportmap.put("$CI" + (i + 1) + "R_B$", "合格"); + } if (aveValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "C"; - reportmap.put("$CI" + (i + 1) + "R_C$", "不合格");// 三张大表取值 - } else - reportmap.put("$CI" + (i + 1) + "R_C$", "合格");// 三张大表取值 + reportmap.put("$CI" + (i + 1) + "R_C$", "不合格"); + } else { + reportmap.put("$CI" + (i + 1) + "R_C$", "合格"); + } // 判断单个结论是否存在 if (!"".equals(tmpstrResult)) { tmpstrResultCurrent += (i + 1) + "次谐波电流幅值95%概率值" + tmpstrResult + ";"; @@ -1234,20 +1322,23 @@ public class ExportModelJBController extends BaseController { /************************************************************** - **** 负序电压 + **** 负序电流 ***************************************************************/ - String ineLimit = judgeNull(this.listIneRate.get(0).getOverLimit());// 获取电压长时闪变的限值 + // 获取电压长时闪变的限值 + String ineLimit = judgeNull(this.listIneRate.get(0).getOverLimit()); String strResultIne = ""; String tmpstrResultIne = ""; String strResultIneValue = ""; - ReportValue ine1 = this.listIneRate.get(0).getList().get(0);// 短闪 - ReportValue ine2 = this.listIneRate.get(0).getList().get(1);// 短闪 - ReportValue ine3 = this.listIneRate.get(0).getList().get(2);// 短闪 + // 负序电流 + ReportValue ine1 = this.listIneRate.get(0).getList().get(0); + ReportValue ine2 = this.listIneRate.get(0).getList().get(1); + ReportValue ine3 = this.listIneRate.get(0).getList().get(2); try { if (Double.parseDouble(ine1.getFmaxValue().toString()) > Double.parseDouble(ineLimit)) { - if (!"".equals(tmpstrResultFlicker)) + if (!"".equals(tmpstrResultFlicker)) { tmpstrResultIne += ","; + } tmpstrResultIne += atype + "最大值为:" + ine1.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "A" + "$", "不合格"); } else { @@ -1255,8 +1346,9 @@ public class ExportModelJBController extends BaseController { } if (Double.parseDouble(ine2.getFmaxValue().toString()) > Double.parseDouble(ineLimit)) { - if (!"".equals(tmpstrResultIne)) + if (!"".equals(tmpstrResultIne)) { tmpstrResultIne += ","; + } tmpstrResultIne += btype + "最大值为:" + ine2.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "B" + "$", "不合格"); } else { @@ -1264,16 +1356,18 @@ public class ExportModelJBController extends BaseController { } if (Double.parseDouble(ine3.getFmaxValue().toString()) > Double.parseDouble(ineLimit) ) { - if (!"".equals(tmpstrResultIne)) + if (!"".equals(tmpstrResultIne)) { tmpstrResultIne += ","; + } tmpstrResultIne += ctype + "最大值为:" + ine3.getFmaxValue().toString(); reportmap.put("$" + "L" + "V0R_" + "C" + "$", "不合格"); } else { reportmap.put("$" + "L" + "V0R_" + "C" + "$", "合格"); } } catch (Exception e) { - if ("".equals(strResultIneValue)) + if ("".equals(strResultIneValue)) { strResultIneValue += "注意:从上表中可以看出" + strLineBaseName + "负序电流数据存在异常(不是数值类型)。"; + } } reportmap.put("$INETX_A$", judgeNull(ine1.getFmaxValue())); reportmap.put("$INETN_A$", judgeNull(ine1.getMinValue())); @@ -1319,7 +1413,7 @@ public class ExportModelJBController extends BaseController { String strMap = "$IN"; String strCurrent = strMap + i + "%"; - // 基波电压含有率 + // 间谐波电压 strCurrentA = judgeNull(this.listInRate.get(i).getList().get(0).getCp95Value()); strCurrentB = judgeNull(this.listInRate.get(i).getList().get(1).getCp95Value()); strCurrentC = judgeNull(this.listInRate.get(i).getList().get(2).getCp95Value()); @@ -1361,26 +1455,32 @@ public class ExportModelJBController extends BaseController { String tmpstrResult = ""; if (maxValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "A"; - reportmap.put("$IN" + i + "R_A$", "不合格");// 三张大表取值 - } else - reportmap.put("$IN" + i + "R_A$", "合格");// 三张大表取值 + reportmap.put("$IN" + i + "R_A$", "不合格"); + } else { + reportmap.put("$IN" + i + "R_A$", "合格"); + } if (minValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "B"; - reportmap.put("$IN" + i + "R_B$", "不合格");// 三张大表取值 - } else - reportmap.put("$IN" + i + "R_B$", "合格");// 三张大表取值 + reportmap.put("$IN" + i + "R_B$", "不合格"); + } else { + reportmap.put("$IN" + i + "R_B$", "合格"); + } if (aveValue > limit) { - if (!"".equals(tmpstrResult)) + if (!"".equals(tmpstrResult)) { tmpstrResult += "、"; + } tmpstrResult += "C"; - reportmap.put("$IN" + i + "R_C$", "不合格");// 三张大表取值 - } else - reportmap.put("$IN" + i + "R_C$", "合格");// 三张大表取值 + reportmap.put("$IN" + i + "R_C$", "不合格"); + } else { + reportmap.put("$IN" + i + "R_C$", "合格"); + } // 判断单个结论是否存在 if (!"".equals(tmpstrResult)) { tmpstrResultIn += i + "次间谐波电压含有率95%概率值" + tmpstrResult + ";"; @@ -1403,22 +1503,30 @@ public class ExportModelJBController extends BaseController { // 测试结果填写 reportmap.put("$ResultTitle$", String.format("通过对(%s——%s)时间段内%s电能质量统计数据分析后得出以下结论:", new String[]{DateUtil.format(startDate, "yyyy年MM月dd日 HH时mm分ss秒"), - DateUtil.format(endDate, "yyyy年MM月dd日 HH时mm分ss秒"), strLineBaseName}));// 结论标题 - reportmap.put("$Result_VD$", String.format("(1)电压偏差:%s", new String[]{strResultVdeviationdata}));// 电压偏差 - reportmap.put("$Result_FRE$", String.format("(2)频率偏差:%s", new String[]{strResultFre}));// 频率偏差 - reportmap.put("$Result_THE$", String.format("(3)三相电压不平衡度:%s", new String[]{strResultThree}));// 三相电压不平衡度 - reportmap.put("$Result_FIC$", String.format("(4)电压长时闪变:%s", new String[]{strResultFlicker}));// 电压长时闪变 - reportmap.put("$Result_VOL$", String.format("(5)谐波电压含有率:%s", new String[]{strResultVoltageRate}));// 谐波电压 - reportmap.put("$Result_U$", String.format("(6)电压总谐波畸变率:%s", new String[]{strResultDistortion}));// 谐波电压 - reportmap.put("$Result_IN$", String.format("(7)间谐波电压含有率:%s", new String[]{strResultIn}));// 谐波电压 - reportmap.put("$Result_CUR$", String.format("(8)谐波电流:%s", new String[]{strResultCurrent}));// 谐波电流 - //todo 负序电流 暂降事件 - reportmap.put("$Result_CUR$", String.format("(9)负序电流:%s", new String[]{strResultCurrent}));// 负序电流 + DateUtil.format(endDate, "yyyy年MM月dd日 HH时mm分ss秒"), strLineBaseName})); + // 电压偏差 + reportmap.put("$Result_VD$", String.format("(1)电压偏差:%s", new String[]{strResultVdeviationdata})); + // 频率偏差 + reportmap.put("$Result_FRE$", String.format("(2)频率偏差:%s", new String[]{strResultFre})); + // 三相电压不平衡度 + reportmap.put("$Result_THE$", String.format("(3)三相电压不平衡度:%s", new String[]{strResultThree})); + // 电压长时闪变 + reportmap.put("$Result_FIC$", String.format("(4)电压长时闪变:%s", new String[]{strResultFlicker})); + // 谐波电压 + reportmap.put("$Result_VOL$", String.format("(5)谐波电压含有率:%s", new String[]{strResultVoltageRate})); + // 电压总谐波畸变率 + reportmap.put("$Result_U$", String.format("(6)电压总谐波畸变率:%s", new String[]{strResultDistortion})); + // 间谐波电压含有率 + reportmap.put("$Result_IN$", String.format("(7)间谐波电压含有率:%s", new String[]{strResultIn})); + // 谐波电流 + reportmap.put("$Result_CUR$", String.format("(8)谐波电流:%s", new String[]{strResultCurrent})); + // 负序电流 + reportmap.put("$Result_CUR$", String.format("(9)负序电流:%s", new String[]{strResultCurrent})); // 分析建议填写 if (!"".equals(strAnalysis) || !"".equals(strError)) { - reportmap.put("$Analysis$", "根据统计数据结果分析,监测点为:" + name + "," + strAnalysis + strError);// 分析建议 + reportmap.put("$Analysis$", "根据统计数据结果分析,监测点为:" + name + "," + strAnalysis + strError); } else { - reportmap.put("$Analysis$", "根据统计数据结果分析,监测点为:" + name + ",电能质量数据满足国标限值要求。");// 分析建议 + reportmap.put("$Analysis$", "根据统计数据结果分析,监测点为:" + name + ",电能质量数据满足国标限值要求。"); } /************************************ @@ -1444,7 +1552,8 @@ public class ExportModelJBController extends BaseController { reportmap.put("$YF0X$", judgeNull(powerDto4.getFmaxValue())); reportmap.put("$YF0N$", judgeNull(powerDto4.getMinValue())); reportmap.put("$YF0E$", judgeNull(powerDto4.getMeanValue())); - formatter = new SimpleDateFormat("yyyyMMddHHmmss");// 报告时分秒格式 + // 报告时分秒格式 + formatter = new SimpleDateFormat("yyyyMMddHHmmss"); /**** * 暂态列表 @@ -1512,7 +1621,8 @@ public class ExportModelJBController extends BaseController { tableList.add(2,risEList); tableList.add(3,shortList); } - reportmap.put("$Result_EVENT$", String.format("(10)监测分析时间段内,发生电压暂升事件%s次,电压暂降事件%s次,电压中断事件%s次,需考虑相应治理措施", new String[]{tableList.get(1).size()+"",tableList.get(2).size()+"",tableList.get(3).size()+""}));// 负序电流 + // 暂降事件列表 + reportmap.put("$Result_EVENT$", String.format("(10)监测分析时间段内,发生电压暂升事件%s次,电压暂降事件%s次,电压中断事件%s次,需考虑相应治理措施", new String[]{tableList.get(1).size()+"",tableList.get(2).size()+"",tableList.get(3).size()+""})); String reportFileUrl = ""; try { String fileName = name + formatter.format(currentTime) + ".docx"; diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java index 459fc0c6f..7b1e2c2bd 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/majornetwork/impl/RStatLimitServiceImpl.java @@ -89,6 +89,7 @@ public class RStatLimitServiceImpl implements RStatLimitService { public List getGridDiagramLineData(DeviceInfoParam.BusinessParam deviceInfoParam) { List info = new ArrayList<>(); deviceInfoParam.setLineRunFlag(0); + deviceInfoParam.setLineOrDevice(1); List data = generalDeviceInfoClient.getPracticalRunDeviceInfo(deviceInfoParam).getData(); List list = data.stream().sorted(Comparator.comparing(x -> x.getLineIndexes().size(), Comparator.reverseOrder())).collect(Collectors.toList()); //终端总数量 From c1d933467ef259513cdb1f95818a7a140d08d187 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Fri, 9 Jan 2026 11:42:17 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9B=B2=E9=9D=96=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8F=90=E4=BE=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../harmonic/pojo/THDistortionDetailVO.java | 47 +++++++++ .../pojo/vo/SteadyQualifyDetailVO.java | 97 +++++++++++++++++++ .../controller/SteadyQualifyController.java | 11 +++ .../harmonic/controller/THDController.java | 14 +++ .../service/SteadyQualifyService.java | 7 ++ .../harmonic/service/THDistortionService.java | 7 ++ .../impl/SteadyQualifyServiceImpl.java | 72 ++++++++++++++ .../service/impl/THDistortionServiceImpl.java | 65 ++++++++++++- 8 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/THDistortionDetailVO.java create mode 100644 pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SteadyQualifyDetailVO.java diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/THDistortionDetailVO.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/THDistortionDetailVO.java new file mode 100644 index 000000000..f3b3628be --- /dev/null +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/THDistortionDetailVO.java @@ -0,0 +1,47 @@ +package com.njcn.harmonic.pojo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class THDistortionDetailVO implements Serializable { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty("地市") + private String city; + + @ApiModelProperty("供电公司") + private String company; + + @ApiModelProperty("变电站") + private String subStation; + + @ApiModelProperty("终端ID") + private String deviceId; + + @ApiModelProperty("终端名称") + private String deviceName; + + @ApiModelProperty("终端厂家") + private String manufacturer; + + @ApiModelProperty("终端IP") + private String ip; + + /** + * 监测点名称 + */ + @ApiModelProperty("监测点名称") + private String lineName; + + + /** + * 总畸变率 + */ + @ApiModelProperty("总畸变率") + private Double distortion = 3.14159; +} diff --git a/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SteadyQualifyDetailVO.java b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SteadyQualifyDetailVO.java new file mode 100644 index 000000000..84aeec272 --- /dev/null +++ b/pqs-harmonic/harmonic-api/src/main/java/com/njcn/harmonic/pojo/vo/SteadyQualifyDetailVO.java @@ -0,0 +1,97 @@ +package com.njcn.harmonic.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author: hongawen + */ +@Data +public class SteadyQualifyDetailVO implements Serializable { + + private static final long serialVersionUID = 1L; + + + @ApiModelProperty("地市") + private String city; + + @ApiModelProperty("供电公司") + private String company; + + @ApiModelProperty("变电站") + private String subStation; + + @ApiModelProperty("终端ID") + private String deviceId; + + @ApiModelProperty("终端名称") + private String deviceName; + + @ApiModelProperty("终端厂家") + private String manufacturer; + + @ApiModelProperty("终端IP") + private String ip; + /** + * 监测点名称 + */ + @ApiModelProperty("监测点名称") + private String lineName; + +// @ApiModelProperty("终端运行状态(0:运行;1:检修;2:停运;3:调试;4:退运)") +// private String runFlag; +// +// @ApiModelProperty("终端通讯状态(0:中断;1:正常)") +// private String comFlag; +// +// @ApiModelProperty("最新数据时间") +// private LocalDateTime timeID; + + /** + * 谐波电压 + */ + @ApiModelProperty("谐波电压") + private Double harmonicVoltage =3.14159; + /** + * 电压偏差 + */ + @ApiModelProperty("电压偏差") + private Double voltageOffset =3.14159; + /** + * 相电压不平衡度 + */ + @ApiModelProperty("相电压不平衡度") + private Double voltageUnbalance =3.14159; + /** + * 间谐波电压含有率 + */ + @ApiModelProperty("间谐波电压含有率") + private Double interHarmonic =3.14159; + /** + * 谐波电流 + */ + @ApiModelProperty("谐波电流") + private Double harmonicCurrent =3.14159; + /** + * 负序电流 + */ + @ApiModelProperty("负序电流") + private Double negativeCurrent =3.14159; + /** + * 频率偏差 + */ + @ApiModelProperty("频率偏差") + private Double freqOffset =3.14159; + /** + * 闪变 + */ + @ApiModelProperty("闪变") + private Double flicker =3.14159; + + + +} diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/SteadyQualifyController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/SteadyQualifyController.java index 0dea8dbd8..0d71abf1f 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/SteadyQualifyController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/SteadyQualifyController.java @@ -7,6 +7,7 @@ import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.device.pq.pojo.param.DeviceInfoParam; import com.njcn.harmonic.pojo.vo.SteadyQualifyCensusVO; +import com.njcn.harmonic.pojo.vo.SteadyQualifyDetailVO; import com.njcn.harmonic.pojo.vo.SteadyQualifyVO; import com.njcn.harmonic.service.SteadyQualifyService; import com.njcn.web.controller.BaseController; @@ -69,4 +70,14 @@ public class SteadyQualifyController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getSteadyQualifyTableData") + @ApiOperation("稳态合格率列表(曲靖)") + @ApiImplicitParam(name = "steadyParam", value = "稳态列表参数", required = true) + public HttpResult> getSteadyQualifyTableData(@RequestBody @Validated DeviceInfoParam.BusinessParam steadyParam){ + String methodDescribe = getMethodDescribe("getSteadyQualifyTableData"); + List list = steadyQualifyService.getSteadyQualifyTableData(steadyParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/THDController.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/THDController.java index fa26412b6..496dca214 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/THDController.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/controller/THDController.java @@ -7,7 +7,9 @@ import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.harmonic.pojo.THDistortionDetailVO; import com.njcn.harmonic.pojo.vo.RMpVThdVO; +import com.njcn.harmonic.pojo.vo.SteadyQualifyDetailVO; import com.njcn.harmonic.pojo.vo.THDistortionCensusVO; import com.njcn.harmonic.pojo.vo.THDistortionVO; import com.njcn.harmonic.service.THDistortionService; @@ -48,6 +50,18 @@ public class THDController extends BaseController { return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/getTHDistortionTableData") + @ApiOperation("谐波总畸变率列表(曲靖)") + @ApiImplicitParam(name = "steadyParam", value = "稳态列表参数", required = true) + public HttpResult> getTHDistortionTableData(@RequestBody @Validated DeviceInfoParam.BusinessParam steadyParam){ + String methodDescribe = getMethodDescribe("getTHDistortionTableData"); + List list = thDistortionService.getTHDistortionTableData(steadyParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); + } + + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) @PostMapping("/getNodeTHDistortionData") @ApiOperation("谐波总畸变率节点图") diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/SteadyQualifyService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/SteadyQualifyService.java index c1ed7f433..4ea62461d 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/SteadyQualifyService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/SteadyQualifyService.java @@ -2,6 +2,7 @@ package com.njcn.harmonic.service; import com.njcn.device.pq.pojo.param.DeviceInfoParam; import com.njcn.harmonic.pojo.vo.SteadyQualifyCensusVO; +import com.njcn.harmonic.pojo.vo.SteadyQualifyDetailVO; import com.njcn.harmonic.pojo.vo.SteadyQualifyVO; import java.util.List; @@ -36,4 +37,10 @@ public interface SteadyQualifyService { * @date 2022/03/20 20:34 */ List getEnterpriseSteadyQualify(DeviceInfoParam.BusinessParam steadyParam); + + /** + * 稳态合格率查询表格数据,注:非树表 + * @param steadyParam 查询参数 + */ + List getSteadyQualifyTableData(DeviceInfoParam.BusinessParam steadyParam); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/THDistortionService.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/THDistortionService.java index 5f304db64..c672589f4 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/THDistortionService.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/THDistortionService.java @@ -2,6 +2,7 @@ package com.njcn.harmonic.service; import com.njcn.common.pojo.param.StatisticsBizBaseParam; import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.harmonic.pojo.THDistortionDetailVO; import com.njcn.harmonic.pojo.vo.RMpVThdVO; import com.njcn.harmonic.pojo.vo.THDistortionCensusVO; import com.njcn.harmonic.pojo.vo.THDistortionVO; @@ -40,4 +41,10 @@ public interface THDistortionService { * @Date: 2022/11/7 */ List getTHDTopTenData(StatisticsBizBaseParam statisticsBizBaseParam, Integer topNum); + + /** + * 获取畸变率的数据表格展示 + * @param steadyParam 查询参数 + */ + List getTHDistortionTableData(DeviceInfoParam.BusinessParam steadyParam); } diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/SteadyQualifyServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/SteadyQualifyServiceImpl.java index cb7350e7f..e9403bdbc 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/SteadyQualifyServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/SteadyQualifyServiceImpl.java @@ -8,12 +8,15 @@ import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.njcn.device.pq.api.GeneralDeviceInfoClient; +import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.enums.LineBaseEnum; import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO; import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.vo.LineDetailVO; import com.njcn.harmonic.mapper.SteadyQualifyMapper; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; import com.njcn.harmonic.pojo.vo.SteadyQualifyCensusVO; +import com.njcn.harmonic.pojo.vo.SteadyQualifyDetailVO; import com.njcn.harmonic.pojo.vo.SteadyQualifyVO; import com.njcn.harmonic.rstatlimitrate.service.IRStatLimitRateDService; import com.njcn.harmonic.service.SteadyQualifyService; @@ -46,6 +49,8 @@ public class SteadyQualifyServiceImpl implements SteadyQualifyService { private final UserLedgerFeignClient userLedgerFeignClient; + private final LineFeignClient lineFeignClient; + @Override public List getSteadyQualifyData(DeviceInfoParam.BusinessParam steadyParam) { List steadyQualifyList = new ArrayList<>(); @@ -190,6 +195,73 @@ public class SteadyQualifyServiceImpl implements SteadyQualifyService { return steadyQualifyList; } + @Override + public List getSteadyQualifyTableData(DeviceInfoParam.BusinessParam steadyParam) { + List steadyQualifyDetailVOList = new ArrayList<>(); + //获取终端台账类信息 + List deviceDataList = generalDeviceInfoClient.getPracticalRunDeviceInfo(steadyParam).getData(); + + //收集所有lineIndexes并去重 + List lineIdList = deviceDataList.stream() + .filter(generalDeviceDTO -> CollectionUtil.isNotEmpty(generalDeviceDTO.getLineIndexes())) + .flatMap(generalDeviceDTO -> generalDeviceDTO.getLineIndexes().stream()) + .distinct() + .collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(lineIdList)) { + return steadyQualifyDetailVOList; + } + + //获取稳态合格率数据 + List qualifiesRate = getQualifiesRate(lineIdList, steadyParam.getSearchBeginTime(), steadyParam.getSearchEndTime()); + + //获取监测点集合 + List monitorList = steadyQualifyMapper.getSteadyQualifyData(lineIdList); + + //获取所有监测点信息信息 + List lineInfoByIds = lineFeignClient.getLineDetailByIds(lineIdList).getData(); + Map lineDetailMap = lineInfoByIds.stream() + .collect(Collectors.toMap(LineDetailVO.Detail::getLineId, Function.identity())); + + //组装列表数据 + for (SteadyQualifyVO monitor : monitorList) { + SteadyQualifyDetailVO detailVO = new SteadyQualifyDetailVO(); + + //填充监测点详细信息 + LineDetailVO.Detail lineDetail = lineDetailMap.get(monitor.getId()); + if (lineDetail != null) { + detailVO.setCity(lineDetail.getDeptName()); + detailVO.setCompany(lineDetail.getGdName()); + detailVO.setSubStation(lineDetail.getSubName()); + detailVO.setDeviceId(lineDetail.getDevId()); + detailVO.setDeviceName(lineDetail.getDevName()); + detailVO.setManufacturer(lineDetail.getManufacturer()); + detailVO.setIp(lineDetail.getIp()); + detailVO.setLineName(lineDetail.getLineName()); + } + + //计算单个监测点的合格率 + SteadyQualifyVO dataSingleMonitorMoreDay = getDataSingleMonitorMoreDay(qualifiesRate, monitor.getId()); + detailVO.setFlicker(PubUtils.dataLimits(dataSingleMonitorMoreDay.getFlicker())); + detailVO.setFreqOffset(PubUtils.dataLimits(dataSingleMonitorMoreDay.getFreqOffset())); + detailVO.setVoltageOffset(PubUtils.dataLimits(dataSingleMonitorMoreDay.getVoltageOffset())); + detailVO.setVoltageUnbalance(PubUtils.dataLimits(dataSingleMonitorMoreDay.getVoltageUnbalance())); + detailVO.setNegativeCurrent(PubUtils.dataLimits(dataSingleMonitorMoreDay.getNegativeCurrent())); + detailVO.setHarmonicVoltage(PubUtils.dataLimits(dataSingleMonitorMoreDay.getHarmonicVoltage())); + detailVO.setHarmonicCurrent(PubUtils.dataLimits(dataSingleMonitorMoreDay.getHarmonicCurrent())); + detailVO.setInterHarmonic(PubUtils.dataLimits(dataSingleMonitorMoreDay.getInterHarmonic())); + + steadyQualifyDetailVOList.add(detailVO); + } + + //先按变电站排序,再按地市排序 + steadyQualifyDetailVOList.sort(Comparator + .comparing(SteadyQualifyDetailVO::getSubStation, Comparator.nullsLast(String::compareTo)) + .thenComparing(SteadyQualifyDetailVO::getCity, Comparator.nullsLast(String::compareTo))); + + return steadyQualifyDetailVOList; + } + /** * 获取父级每层数据 */ diff --git a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/THDistortionServiceImpl.java b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/THDistortionServiceImpl.java index 3e6080d3f..1fbd59c5e 100644 --- a/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/THDistortionServiceImpl.java +++ b/pqs-harmonic/harmonic-boot/src/main/java/com/njcn/harmonic/service/impl/THDistortionServiceImpl.java @@ -17,10 +17,10 @@ import com.njcn.device.pq.pojo.param.DeviceInfoParam; import com.njcn.device.pq.pojo.vo.LineDetailVO; import com.njcn.harmonic.mapper.RMpVThdMapper; import com.njcn.harmonic.mapper.THDistortionMapper; +import com.njcn.harmonic.pojo.THDistortionDetailVO; import com.njcn.harmonic.pojo.dto.PublicDTO; import com.njcn.harmonic.pojo.po.RMpVThd; import com.njcn.harmonic.pojo.vo.RMpVThdVO; -import com.njcn.harmonic.pojo.vo.SteadyQualifyVO; import com.njcn.harmonic.pojo.vo.THDistortionCensusVO; import com.njcn.harmonic.pojo.vo.THDistortionVO; import com.njcn.harmonic.service.THDistortionService; @@ -188,6 +188,69 @@ public class THDistortionServiceImpl implements THDistortionService { return rMpVThdVOList; } + @Override + public List getTHDistortionTableData(DeviceInfoParam.BusinessParam steadyParam) { + List thDistortionDetailVOList = new ArrayList<>(); + //获取终端台账类信息 + List deviceDataList = generalDeviceInfoClient.getPracticalRunDeviceInfo(steadyParam).getData(); + + //收集所有lineIndexes并去重 + List lineIdList = deviceDataList.stream() + .filter(generalDeviceDTO -> CollectionUtil.isNotEmpty(generalDeviceDTO.getLineIndexes())) + .flatMap(generalDeviceDTO -> generalDeviceDTO.getLineIndexes().stream()) + .distinct() + .collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(lineIdList)) { + return thDistortionDetailVOList; + } + + //获取畸变率数据 + List distortionData = getCondition(lineIdList, steadyParam.getSearchBeginTime(), steadyParam.getSearchEndTime()); + Map distortionMap = distortionData.stream() + .collect(Collectors.toMap(PublicDTO::getId, Function.identity())); + + //获取监测点集合 + List monitorList = thDistortionMapper.getLineData(lineIdList); + + //获取所有监测点信息信息 + List lineInfoByIds = lineFeignClient.getLineDetailByIds(lineIdList).getData(); + Map lineDetailMap = lineInfoByIds.stream() + .collect(Collectors.toMap(LineDetailVO.Detail::getLineId, Function.identity())); + + //组装列表数据 + for (THDistortionVO monitor : monitorList) { + THDistortionDetailVO detailVO = new THDistortionDetailVO(); + + //填充监测点详细信息 + LineDetailVO.Detail lineDetail = lineDetailMap.get(monitor.getId()); + if (lineDetail != null) { + detailVO.setCity(lineDetail.getDeptName()); + detailVO.setCompany(lineDetail.getGdName()); + detailVO.setSubStation(lineDetail.getSubName()); + detailVO.setDeviceId(lineDetail.getDevId()); + detailVO.setDeviceName(lineDetail.getDevName()); + detailVO.setManufacturer(lineDetail.getManufacturer()); + detailVO.setIp(lineDetail.getIp()); + detailVO.setLineName(lineDetail.getLineName()); + } + + //填充畸变率数据 + if (distortionMap.containsKey(monitor.getId())) { + detailVO.setDistortion(distortionMap.get(monitor.getId()).getData()); + } + + thDistortionDetailVOList.add(detailVO); + } + + //先按变电站排序,再按地市排序 + thDistortionDetailVOList.sort(Comparator + .comparing(THDistortionDetailVO::getSubStation, Comparator.nullsLast(String::compareTo)) + .thenComparing(THDistortionDetailVO::getCity, Comparator.nullsLast(String::compareTo))); + + return thDistortionDetailVOList; + } + /** * 计算父级畸变率