区域报告修改,添加间谐波电压含有率

This commit is contained in:
cdf
2026-06-07 15:55:50 +08:00
parent 748fd62afb
commit 50181459bf
5 changed files with 86 additions and 22 deletions

View File

@@ -3,6 +3,8 @@ package com.njcn.harmonic.pojo.param.report;
import com.njcn.harmonic.pojo.dto.report.CommReportLedgerDto;
import lombok.Data;
import java.util.List;
/**
* @Author: cdf
* @CreateTime: 2026-01-06
@@ -17,6 +19,6 @@ public class AreaHarmReportParam {
private String deptId;
private String scale;
private List<String> voltageIds;
}

View File

@@ -191,6 +191,11 @@ public class OverAreaLimitVO {
private Double negativeOverDayBiLi = -1.0;
//间谐波电压超标情况
/**
* 超标监测点集合,区域报告使用
*/
private List<String> inHarmonicVMonitorList = new ArrayList<>();;
/**
* 个数
*/

View File

@@ -535,6 +535,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
Set<String> flickerMonitorList = new HashSet<>();
Set<String> harmonicVoltageMonitorList = new HashSet<>();
Set<String> harmonicCurrentMonitorList = new HashSet<>();
Set<String> harmonicInHarmonciVMonitorList = new HashSet<>();
int threeV = 0, fiveV = 0, sevenV = 0, elevenV = 0, otherV = 0;
Set<String> threeVList = new HashSet<>(), fiveVList = new HashSet<>(), sevenVList = new HashSet<>(), elevenVList = new HashSet<>(), otherVList = new HashSet<>();
@@ -579,6 +580,8 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
inuharmCount++;
}
//区域报告
if (Objects.nonNull(param.getAreaReportFlag()) && param.getAreaReportFlag() == 1) {
if (item.getFreqDevOvertime() > 0) {
@@ -602,7 +605,9 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
}
if (inHarmFlag(item)) {
harmonicInHarmonciVMonitorList.add(item.getLineId());
}
if (item.getUharm3Overtime() > 0) {
threeV++;
@@ -646,6 +651,7 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
otherI++;
otherIList.add(item.getLineId());
}
}
}
@@ -686,6 +692,8 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
//间谐波电压
overAreaLimitVO.setInterHarmonicMonitorNumber(inuharmCount);
overAreaLimitVO.setInterHarmonicBiLi(BigDecimal.valueOf(inuharmCount * 1.0 / data.size() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
overAreaLimitVO.setInHarmonicVMonitorList(new ArrayList<>(harmonicInHarmonciVMonitorList));
}
@@ -938,6 +946,16 @@ public class AnalyzeServiceImpl implements IAnalyzeService {
return count > 0;
}
private boolean inHarmVFlag(RStatLimitTargetDPO rStatLimitRateDPO) {
int count = rStatLimitRateDPO.getInuharm1Overtime() + rStatLimitRateDPO.getInuharm2Overtime() + rStatLimitRateDPO.getInuharm3Overtime() +
rStatLimitRateDPO.getInuharm4Overtime() + rStatLimitRateDPO.getInuharm5Overtime() + rStatLimitRateDPO.getInuharm6Overtime() +
rStatLimitRateDPO.getInuharm7Overtime() + rStatLimitRateDPO.getInuharm8Overtime() +
rStatLimitRateDPO.getInuharm9Overtime() + rStatLimitRateDPO.getInuharm10Overtime() + rStatLimitRateDPO.getInuharm11Overtime()+
rStatLimitRateDPO.getInuharm12Overtime() + rStatLimitRateDPO.getInuharm13Overtime() + rStatLimitRateDPO.getInuharm14Overtime()+
rStatLimitRateDPO.getInuharm15Overtime() + rStatLimitRateDPO.getInuharm16Overtime();
return count > 0;
}
private boolean inHarmFlag(RStatLimitTargetDPO t) {
int count = t.getInuharm1Overtime() + t.getInuharm2Overtime() + t.getInuharm3Overtime() + t.getInuharm4Overtime() + t.getInuharm5Overtime() + t.getInuharm6Overtime() + t.getInuharm7Overtime() + t.getInuharm8Overtime() + t.getInuharm9Overtime() + t.getInuharm10Overtime() + t.getInuharm11Overtime() + t.getInuharm12Overtime() + t.getInuharm13Overtime() + t.getInuharm14Overtime() + t.getInuharm15Overtime() + t.getInuharm16Overtime();
return count > 0;

View File

@@ -133,9 +133,9 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
tableList.add(new ArrayList<>());
// 1. 台账表格
List<String[]> ledgerTable = buildLedgerTable(param.getDeptId(),param.getScale());
List<String[]> ledgerTable = buildLedgerTable(param.getDeptId(),param.getVoltageIds());
if(CollUtil.isEmpty(ledgerTable)){
throw new BusinessException(CommonResponseEnum.FAIL,"当前部门不存在在运监测点");
throw new BusinessException(CommonResponseEnum.FAIL,"未查询到在运监测点");
}
tableList.add(ledgerTable);
@@ -146,7 +146,7 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
List<OverAreaLimitVO> qualityData = getPowerQualityData(param);
if (CollUtil.isNotEmpty(qualityData)) {
// 构建监控点名称映射
Map<String, String> monitorNameMap = buildMonitorNameMap(param.getDeptId(),param.getScale());
Map<String, String> monitorNameMap = buildMonitorNameMap(param.getDeptId(),param.getVoltageIds());
// 过滤有效数据(在线监控数>0
List<OverAreaLimitVO> validData = qualityData.stream()
@@ -160,6 +160,7 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
tableList.add(buildFlickerTable(validData));
tableList.add(buildVoltageHarmonicTable(validData));
tableList.add(buildCurrentHarmonicTable(validData));
tableList.add(buildIHarmonicVTable(validData));
// 计算并设置指标数据到临时存储,稍后合并
calculateAndStoreIndicatorData(reportData, validData, monitorNameMap);
@@ -177,8 +178,8 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
/**
* 构建台账表格
*/
private List<String[]> buildLedgerTable(String deptId, String scale) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId,scale);
private List<String[]> buildLedgerTable(String deptId, List<String> voltageIds) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId,voltageIds);
if (CollUtil.isEmpty(ledgerList)) {
return new ArrayList<>();
}
@@ -271,6 +272,23 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
.collect(Collectors.toList());
}
/**
* 构建间谐波表格
*/
private List<String[]> buildIHarmonicVTable(List<OverAreaLimitVO> dataList) {
return dataList.stream()
.filter(vo -> vo.getOnlineMonitorNumber() != null && vo.getOnlineMonitorNumber() > 0)
.map(vo -> new String[]{
vo.getName(),
vo.getOnlineMonitorNumber().toString(),
vo.getInterHarmonicMonitorNumber().toString(),
vo.getInterHarmonicBiLi().toString(),
vo.getInterHarmonicDayAvgBiLi().toString(),
vo.getInterHarmonicOverDayBiLi().toString()
})
.collect(Collectors.toList());
}
/**
* 构建谐波电压表格
*/
@@ -330,7 +348,7 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
vo.getOnlineMonitorNumber().toString(),
vo.getHarmonicCurrentMonitorNumber().toString(),
vo.getHarmonicCurrentBiLi().toString(),
vo.getHarmonicVoltageDayAvgBiLi().toString(), // 注意:这里保持原逻辑,使用谐波电压日均值
vo.getHarmonicCurrentDayAvgBiLi().toString(), // 注意:这里保持原逻辑,使用谐波电压日均值
vo.getHarmonicCurrentOverDayBiLi().toString()
});
@@ -377,6 +395,8 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
// 谐波电流
processCurrentHarmonic(reportData, validData, monitorNameMap);
//间谐波电压含有率
processIHarmonicV(reportData, validData, monitorNameMap);
// 生成结论
generateConclusion(reportData);
}
@@ -441,6 +461,22 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
reportData.put("$flickerLine$", formatMonitorList(monitorList));
}
/**
* 处理间谐波电压含有率
*/
private void processIHarmonicV(Map<String, Object> reportData,
List<OverAreaLimitVO> dataList,
Map<String, String> monitorNameMap) {
double avgRate = calculateAverage(dataList, OverAreaLimitVO::getInterHarmonicBiLi);
List<String> monitorList = extractMonitorNames(dataList,
vo -> vo.getInHarmonicVMonitorList(), monitorNameMap);
reportData.put("$iharmVRate$", formatPercentage(avgRate));
reportData.put("$iharmVMark$", getGrade(avgRate));
reportData.put("$iharmVLine$", formatMonitorList(monitorList));
}
/**
* 处理谐波电压
*/
@@ -512,7 +548,7 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
indicatorScores.put("闪变", reportData.get("$flickerMark$").toString());
indicatorScores.put("谐波电压", reportData.get("$v_all_Mark$").toString());
indicatorScores.put("谐波电流", reportData.get("$i_all_Mark$").toString());
indicatorScores.put("间谐波电压含有率", reportData.get("$iharmVMark$").toString());
// 按等级分类指标
Map<String, List<String>> categorizedIndicators = categorizeIndicators(indicatorScores);
@@ -751,12 +787,12 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
/**
* 获取台账信息
*/
private List<MonitorCommLedgerInfoDTO> getLedgerInfo(String deptId, String scale) {
private List<MonitorCommLedgerInfoDTO> getLedgerInfo(String deptId, List<String> voltageIds) {
DeptGetLineParam param = new DeptGetLineParam();
param.setDeptId(deptId);
List<MonitorCommLedgerInfoDTO> data = commTerminalGeneralClient.deptGetLineInfo(param).getData();
if(StringUtils.hasText(scale)){
data=data.stream().filter(temp->Objects.equals(scale,temp.getVoltageLevel())).collect(Collectors.toList());
if(CollUtil.isNotEmpty(voltageIds)){
data=data.stream().filter(temp->voltageIds.contains(temp.getVoltageLevel())).collect(Collectors.toList());
}
return data;
}
@@ -775,8 +811,8 @@ public class AreaHarmonicServiceImpl implements AreaHarmonicService {
/**
* 构建监控点名称映射
*/
private Map<String, String> buildMonitorNameMap(String deptId, String scale) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId, scale);
private Map<String, String> buildMonitorNameMap(String deptId, List<String> voltageIds) {
List<MonitorCommLedgerInfoDTO> ledgerList = getLedgerInfo(deptId, voltageIds);
return ledgerList.stream()
.collect(Collectors.toMap(
MonitorCommLedgerInfoDTO::getMonitorId,

View File

@@ -581,7 +581,7 @@ public class CustomReportTableServiceImpl implements CustomReportTableService {
} catch (Exception e) {
// 自定义报表防止没有默认模板从resource目录加载默认模板
String defaultTemplatePath = "file/default_excel_report.json";
InputStream defaultStream = getClass().getClassLoader().getResourceAsStream(defaultTemplatePath);
try (InputStream defaultStream = getClass().getClassLoader().getResourceAsStream(defaultTemplatePath)) {
if (defaultStream == null) {
if (e instanceof BusinessException) {
throw new BusinessException(e.getMessage());
@@ -592,6 +592,9 @@ public class CustomReportTableServiceImpl implements CustomReportTableService {
jsonArray = new JSONArray(new JSONTokener(defaultStream, new JSONConfig()));
parseTemplate(jsonArray, reportTemplateDTOList, reportLimitList, terminalList);
}
}catch (Exception e1){
throw new BusinessException(HarmonicResponseEnum.CUSTOM_REPORT_JSON);
}
}
//查询不分相别的指标
DictData dictData = dicDataFeignClient.getDicDataByCodeAndType(DicDataEnum.EPD.getCode(), DicDataTypeEnum.CS_DATA_TYPE.getCode()).getData();