From 6e0a36fd80d1d58d8ec17ff6335377a80fab3d0c Mon Sep 17 00:00:00 2001 From: xy <748613696@qq.com> Date: Mon, 9 Feb 2026 11:25:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E6=A0=87=E8=B6=8A=E9=99=90=E6=A6=82?= =?UTF-8?q?=E7=8E=87=E5=88=86=E5=B8=83=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csdevice/service/impl/IcdServiceImpl.java | 2 + .../RStatLimitRateDetailDServiceImpl.java | 229 +++++++++++++++--- .../impl/StatisticsDataDataServiceImpl.java | 3 +- 3 files changed, 196 insertions(+), 38 deletions(-) diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/IcdServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/IcdServiceImpl.java index 77b8e21..8004ec8 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/IcdServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/IcdServiceImpl.java @@ -98,6 +98,7 @@ class IcdServiceImpl implements IcdService { detail.setDevType(Objects.isNull(finalSysDicTreeMap.get(dev.getDevModel())) ? "/":finalSysDicTreeMap.get(dev.getDevModel()).getCode()); detail.setNode(dev.getNodeProcess()); detail.setMaxProcessNum(node.getMaxProcessNum()); + detail.setDevLogLevel(dev.getDevLogLevel()); // 只获取当前设备的监测点数据 List lines = lineMap.get(dev.getId()); @@ -116,6 +117,7 @@ class IcdServiceImpl implements IcdService { monitorInfo.setPt2(line.getPt2Ratio()); monitorInfo.setCt1(line.getCtRatio()); monitorInfo.setCt2(line.getCt2Ratio()); + monitorInfo.setLineLogLevel(line.getLineLogLevel()); monitorInfos.add(monitorInfo); }); detail.setMonitorData(monitorInfos); diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/RStatLimitRateDetailDServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/RStatLimitRateDetailDServiceImpl.java index f5d9d00..8ee29ec 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/RStatLimitRateDetailDServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/RStatLimitRateDetailDServiceImpl.java @@ -1,6 +1,7 @@ package com.njcn.csharmonic.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; @@ -34,6 +35,7 @@ import java.math.RoundingMode; import java.text.DecimalFormat; import java.time.LocalDate; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @DS("sjzx") @@ -278,10 +280,69 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl overlimitList = overLimitClient.getOverLimitByLineIds(Collections.singletonList(linePO.getLineId())).getData(); - JSONObject overlimitJSON = null; + JSONObject overlimitJSON; if (CollUtil.isNotEmpty(overlimitList)) { overlimitJSON = JSONUtil.parseObj(overlimitList.get(0)); + } else { + overlimitJSON = null; } + //按日期获取各个指标最大值 + Map> detailMap = detailList.stream().sorted(Comparator.comparing(RStatLimitRateDetailDPO::getTime)).collect(Collectors.groupingBy(RStatLimitRateDetailDPO::getTime)); + Map> maxValueMapByDay = new HashMap<>(); + detailMap.forEach((k,v)->{ + Map> maxValueMap = findMaxValueHandle(v); + Map m1 = new HashMap<>(); + maxValueMap.forEach((k1,v1)->{ + m1.put(k1,v1.getKey()); + }); + + Map m2 = new HashMap<>(); + m1.forEach((k1,v1)->{ + double extentValue = 0; + if (k1.startsWith("uharm") && k1.endsWith("Overtime")) { + String d1 = k1.replaceAll("([a-zA-Z]+)(\\d+)(.*)", "$1$2"); + String d2 = k1.replaceAll("([a-zA-Z]+)(\\d+)(.*)", "$1"); + assert overlimitJSON != null; + double limitValue = overlimitJSON.getDouble(d1); + extentValue = calculatePercentage(v1.doubleValue() - limitValue, limitValue); + m2.put(d2,(float) extentValue); + } else if (k1.startsWith("iharm") && k1.endsWith("Overtime")) { + String d1 = k1.replaceAll("([a-zA-Z]+)(\\d+)(.*)", "$1$2"); + String d2 = k1.replaceAll("([a-zA-Z]+)(\\d+)(.*)", "$1"); + assert overlimitJSON != null; + double limitValue = overlimitJSON.getDouble(d1); + extentValue = calculatePercentage(v1.doubleValue() - limitValue, limitValue); + m2.put(d2,(float) extentValue); + } else { + if (v1.doubleValue() != 0.0) { + assert overlimitJSON != null; + double limitValue = overlimitJSON.getDouble(k1); + extentValue = calculatePercentage(v1.doubleValue() - limitValue, limitValue); + } + m2.put(k1,(float) extentValue); + } + }); + Float f1 = m2.get("uharm"); + Float f2 = m2.get("uaberrance"); + m2.remove("uharm"); + m2.remove("uaberrance"); + m2.put("uharm",Math.max(f1,f2)); + maxValueMapByDay.put(k,m2); + }); + + // 确保 extentMap 初始化为线程安全的 ConcurrentHashMap + Map> extentMap = new ConcurrentHashMap<>(); + maxValueMapByDay.forEach((dayKey, dayValues) -> { + dayValues.forEach((key, value) -> { + // 获取当前 key 对应的列表,若不存在则初始化为空列表 + List list = extentMap.computeIfAbsent(key, k -> new ArrayList<>()); + // 直接添加值到列表中 + if (value > 0.0) { + list.add(value); + } + }); + }); + LimitProbabilityVO probabilityVO; for (Map.Entry indexEntry : indexMap.entrySet()) { String indexCode = indexEntry.getKey(); @@ -290,33 +351,21 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl extentValuesList = new ArrayList<>(); - for (RStatLimitRateDetailDPO detail : detailList) { - JSONObject entries = JSONUtil.parseObj(detail); - for (Map.Entry dayEntry : entries.entrySet()) { - String key = dayEntry.getKey(); - if (shouldProcess(key, indexCode)) { - double extentValue = 0; - Object data = dayEntry.getValue(); - if (ObjectUtil.isNotEmpty(data) && overlimitJSON != null) { - float maxValue = parseMaxValueFromJsonArray(data); - String itemKey = StrUtil.sub(key, 0, key.length() - 8); - double limitValue = overlimitJSON.getDouble(itemKey); - if (limitValue != 0) { - extentValue = calculatePercentage(maxValue - limitValue, limitValue); - } - } - extentValuesList.add(extentValue); - } - } - } - List> extentGrades = new ArrayList<>(); - for (int i = 0; i < extentPeriodList.size(); i++) { - Map grade = new HashMap<>(); - int times = 0; - for (Double extentValue : extentValuesList) { + List> extentGrades = getFenBu(extentMap.get(indexCode)); + probabilityVO.setExtentGrades(extentGrades); + result.add(probabilityVO); + } + return result; + } + + public List> getFenBu(List data) { + List> result = new ArrayList<>(); + for (int i = 0; i < extentPeriodList.size(); i++) { + Map grade = new HashMap<>(); + int times = 0; + if (CollectionUtil.isNotEmpty(data)) { + for (Float extentValue : data) { List period = extentPeriodList.get(i); Integer start = period.get(0); Integer end = period.get(1); @@ -327,15 +376,84 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl limitProbabilityData(LimitProbabilityQueryParam param) { +// List result = new ArrayList<>(); +// List detailList = this.list(new LambdaQueryWrapper() +// .eq(RStatLimitRateDetailDPO::getLineId, param.getLineId()) +// .ge(StrUtil.isNotBlank(param.getSearchBeginTime()), RStatLimitRateDetailDPO::getTime, param.getSearchBeginTime()) +// .le(StrUtil.isNotBlank(param.getSearchEndTime()), RStatLimitRateDetailDPO::getTime, param.getSearchEndTime()) +// .orderByAsc(RStatLimitRateDetailDPO::getTime) +// ); +// CsLinePO linePO = csLineFeignClient.getById(param.getLineId()).getData(); +// List overlimitList = overLimitClient.getOverLimitByLineIds(Collections.singletonList(linePO.getLineId())).getData(); +// JSONObject overlimitJSON = null; +// if (CollUtil.isNotEmpty(overlimitList)) { +// overlimitJSON = JSONUtil.parseObj(overlimitList.get(0)); +// } +// LimitProbabilityVO probabilityVO; +// for (Map.Entry indexEntry : indexMap.entrySet()) { +// String indexCode = indexEntry.getKey(); +// probabilityVO = new LimitProbabilityVO(); +// probabilityVO.setIndexName(indexEntry.getValue()); +// probabilityVO.setIndexCode(indexCode); +// probabilityVO.setLineId(linePO.getLineId()); +// probabilityVO.setLineName(linePO.getName()); +// // 计算越限程度 +// List extentValuesList = new ArrayList<>(); +// for (RStatLimitRateDetailDPO detail : detailList) { +// JSONObject entries = JSONUtil.parseObj(detail); +// for (Map.Entry dayEntry : entries.entrySet()) { +// String key = dayEntry.getKey(); +// if (shouldProcess(key, indexCode)) { +// double extentValue = 0; +// Object data = dayEntry.getValue(); +// if (ObjectUtil.isNotEmpty(data) && overlimitJSON != null) { +// float maxValue = parseMaxValueFromJsonArray(data); +// String itemKey = StrUtil.sub(key, 0, key.length() - 8); +// double limitValue = overlimitJSON.getDouble(itemKey); +// if (limitValue != 0) { +// extentValue = calculatePercentage(maxValue - limitValue, limitValue); +// } +// } +// extentValuesList.add(extentValue); +// } +// } +// +// } +// List> extentGrades = new ArrayList<>(); +// for (int i = 0; i < extentPeriodList.size(); i++) { +// Map grade = new HashMap<>(); +// int times = 0; +// for (Double extentValue : extentValuesList) { +// List period = extentPeriodList.get(i); +// Integer start = period.get(0); +// Integer end = period.get(1); +// if (extentValue > start && extentValue <= end) { +// times++; +// } +// if ((i == extentPeriodList.size() - 1) && extentValue > 100.0) { +// times++; +// } +// } +// grade.put(i, times); +// extentGrades.add(grade); +// } +// probabilityVO.setExtentGrades(extentGrades); +// result.add(probabilityVO); +// } +// return result; +// } + private boolean shouldProcess(String key, String indexCode) { return (key.endsWith("Overtime") && key.startsWith(indexCode)) || (Objects.equals(indexCode, "uharm") && key.startsWith("uaberrance")); @@ -435,20 +553,34 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl flickerMaxValue) { @@ -470,11 +602,30 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl uaberranceMaxValue) { + uaberranceMaxValue = dayuaberranceMaxValue; + uaberranceMaxDetail = po; + } + } + if (StrUtil.isNotBlank(freqDevOvertime)) { + float dayFreqDevMaxValue = parseMaxValueFromJsonArray(freqDevOvertime); + if (dayFreqDevMaxValue > freqDevMaxValue) { + freqDevMaxValue = dayFreqDevMaxValue; + freqDevMaxDetail = po; + } + } + + + JSONObject entries = JSONUtil.parseObj(po); float dayUharmMaxValue = 0.0000F; - String dayUharmMaxKey = ""; // 当前记录中uharm的最大值key + // 当前记录中uharm的最大值key + String dayUharmMaxKey = ""; float dayIharmMaxValue = 0.0000F; - String dayIharmMaxKey = ""; // 当前记录中iharm的最大值key + // 当前记录中iharm的最大值key + String dayIharmMaxKey = ""; for (Map.Entry entry : entries.entrySet()) { String key = entry.getKey(); @@ -502,17 +653,21 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl uharmMaxValue) { uharmMaxValue = dayUharmMaxValue; uharmMaxDetail = po; - uharmMaxKey = dayUharmMaxKey; // 记录产生最大值的key + // 记录产生最大值的key + uharmMaxKey = dayUharmMaxKey; } if (dayIharmMaxValue > iharmMaxValue) { iharmMaxValue = dayIharmMaxValue; iharmMaxDetail = po; - iharmMaxKey = dayIharmMaxKey; // 记录产生最大值的key + // 记录产生最大值的key + iharmMaxKey = dayIharmMaxKey; } } result.put("flicker", Pair.of(flickerMaxValue, flickerMaxDetail)); result.put("voltageDev", Pair.of(voltageDevMaxValue, voltageDevMaxDetail)); result.put("ubalance", Pair.of(ubalanceMaxValue, ubalanceMaxDetail)); + result.put("uaberrance", Pair.of(uaberranceMaxValue, uaberranceMaxDetail)); + result.put("freqDev", Pair.of(freqDevMaxValue, freqDevMaxDetail)); result.put(uharmMaxKey.isEmpty() ? "uharm" : uharmMaxKey, Pair.of(uharmMaxValue, uharmMaxDetail)); result.put(iharmMaxKey.isEmpty() ? "iharm" : iharmMaxKey, Pair.of(iharmMaxValue, iharmMaxDetail)); diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java index 847f3e7..7d4fb96 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/StatisticsDataDataServiceImpl.java @@ -137,7 +137,8 @@ public class StatisticsDataDataServiceImpl implements IStatisticsDataDataService vo.setOperationalTime(dev.getCreateTime()); vo.setOperationalStatus(dev.getUsageStatus() == 0 ? "停运" : "在运"); if (Objects.equals(line.getName(),"治理监测点")) { - vo.setLineName(line.getName() + "(" + map.get(dev.getId()).getModuleNumber() + "模块)"); + int moduleNumber = Objects.isNull(map.get(dev.getId()).getModuleNumber()) ? 0 : map.get(dev.getId()).getModuleNumber(); + vo.setLineName(line.getName() + "(" + moduleNumber + "模块)"); } else { vo.setLineName(line.getName()); }