Compare commits

...

6 Commits

Author SHA1 Message Date
1cd3283ba5 1.迁移接口,简化部署模块 2026-07-02 14:11:49 +08:00
ce9b2b62d9 1.调整适配辽宁现场新能源场站 2026-07-01 15:14:57 +08:00
wr
687f878b5f 1.解决有功功率趋势统计调用ataprocessboot接口改造 2026-07-01 11:27:46 +08:00
764a7b1953 1.调整适配辽宁现场新能源场站 2026-07-01 10:28:50 +08:00
xy
26fa401acb Merge remote-tracking branch 'origin/main' 2026-06-29 11:44:49 +08:00
xy
88a99dbe9c fix(sys-dic-tree): 修复字典树查询状态过滤问题
- 在字典树查询中添加状态过滤条件 a.status = 0
- 确保只返回状态为可用的数据记录
- 修复了可能导致无效数据被查询到的逻辑缺陷
2026-06-29 11:44:38 +08:00
21 changed files with 1148 additions and 29 deletions

View File

@@ -64,19 +64,7 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- 多数据源切换当数据源为oracle时需要使用 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 多数据源切换当数据源为oracle时需要使用 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.oracle.database.jdbc</groupId> <groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId> <artifactId>ojdbc8</artifactId>
@@ -122,7 +110,6 @@
<groupId>com.njcn.platform</groupId> <groupId>com.njcn.platform</groupId>
<artifactId>data-processing-api</artifactId> <artifactId>data-processing-api</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -0,0 +1,11 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//import com.njcn.dataProcess.po.influx.DataHarmrateI;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//
///**
// * @author xy
// */
//public interface DataHarmRateIMapper extends InfluxDbBaseMapper<DataHarmrateI> {
//
//}

View File

@@ -0,0 +1,11 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//import com.njcn.dataProcess.po.influx.DataHarmrateV;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//
///**
// * @author xy
// */
//public interface DataHarmRateVMapper extends InfluxDbBaseMapper<DataHarmrateV> {
//
//}

View File

@@ -0,0 +1,16 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//import com.njcn.dataProcess.po.influx.DataI;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//
//
///**
// * @author hongawen
// * @version 1.0
// * @data 2024/11/7 18:49
// */
//public interface DataIMapper extends InfluxDbBaseMapper<DataI> {
//
//
//
//}

View File

@@ -0,0 +1,17 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//
//import com.njcn.dataProcess.po.influx.DataInharmV;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//
///**
// * <p>
// * Mapper 接口
// * </p>
// *
// * @author hongawen
// * @since 2023-12-28
// */
//public interface DataInharmVMapper extends InfluxDbBaseMapper<DataInharmV> {
//
//}

View File

@@ -0,0 +1,17 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//
//import com.njcn.dataProcess.po.influx.DataPlt;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//
///**
// * <p>
// * Mapper 接口
// * </p>
// *
// * @author hongawen
// * @since 2023-12-28
// */
//public interface DataPltMapper extends InfluxDbBaseMapper<DataPlt> {
//
//}

View File

@@ -0,0 +1,27 @@
//package com.njcn.harmonic.mapper.influxdb;
//
//import com.njcn.dataProcess.dto.LineDataVFiveItemDTO;
//import com.njcn.dataProcess.dto.MeasurementCountDTO;
//import com.njcn.dataProcess.po.influx.DataV;
//import com.njcn.influx.base.InfluxDbBaseMapper;
//import com.njcn.influx.query.InfluxQueryWrapper;
//
//import java.util.List;
//
///**
// * @author hongawen
// * @version 1.0
// * @data 2024/11/7 18:49
// */
//public interface DataVMapper extends InfluxDbBaseMapper<DataV> {
//
//
// List<LineDataVFiveItemDTO> queryDataValue(InfluxQueryWrapper dataVQueryWrapper);
//
//
// List<MeasurementCountDTO> getMeasurementCount(InfluxQueryWrapper influxQueryWrapper);
//
//
//
//
//}

View File

@@ -2,6 +2,8 @@ package com.njcn.harmonic.service;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
import com.njcn.harmonic.pojo.param.LimitCalendarQueryParam; import com.njcn.harmonic.pojo.param.LimitCalendarQueryParam;
import com.njcn.harmonic.pojo.param.LimitExtentDayQueryParam; import com.njcn.harmonic.pojo.param.LimitExtentDayQueryParam;
import com.njcn.harmonic.pojo.param.LimitExtentQueryParam; import com.njcn.harmonic.pojo.param.LimitExtentQueryParam;
@@ -27,4 +29,12 @@ public interface IRStatLimitRateDetailDService extends IService<RStatLimitRateDe
List<LimitProbabilityVO> limitProbabilityData(LimitProbabilityQueryParam param); List<LimitProbabilityVO> limitProbabilityData(LimitProbabilityQueryParam param);
List<LimitTimeProbabilityVO> limitTimeProbabilityData(LimitProbabilityQueryParam param); List<LimitTimeProbabilityVO> limitTimeProbabilityData(LimitProbabilityQueryParam param);
/**
* 稳态超标时间
* @param lineParam
* @return
*/
List<DataLimitRateDetailTimeDto> getLimitRateDetailTime(LineCountEvaluateParam lineParam);
} }

View File

@@ -10,7 +10,6 @@ import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.njcn.dataProcess.api.*;
import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.*; import com.njcn.dataProcess.pojo.dto.*;
import com.njcn.device.biz.pojo.po.Overlimit; import com.njcn.device.biz.pojo.po.Overlimit;
@@ -18,11 +17,11 @@ import com.njcn.device.pq.api.OverLimitClient;
import com.njcn.harmonic.constant.Param; import com.njcn.harmonic.constant.Param;
import com.njcn.harmonic.pojo.param.PowerStatisticsParam; import com.njcn.harmonic.pojo.param.PowerStatisticsParam;
import com.njcn.harmonic.pojo.vo.*; import com.njcn.harmonic.pojo.vo.*;
import com.njcn.harmonic.service.IRStatLimitRateDetailDService;
import com.njcn.harmonic.service.activepowerrange.PowerStatisticsService; import com.njcn.harmonic.service.activepowerrange.PowerStatisticsService;
import com.njcn.harmonic.service.activepowerrange.RActivePowerRangeService; import com.njcn.harmonic.service.activepowerrange.RActivePowerRangeService;
import com.njcn.influx.service.CommonService; import com.njcn.harmonic.service.influxdb.*;
import com.njcn.poi.util.PoiUtil; import com.njcn.poi.util.PoiUtil;
import com.njcn.system.api.EpdFeignClient;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
@@ -54,14 +53,14 @@ import java.util.stream.Collectors;
public class PowerStatisticsServiceImpl implements PowerStatisticsService { public class PowerStatisticsServiceImpl implements PowerStatisticsService {
private final RActivePowerRangeService rActivePowerRangeService; private final RActivePowerRangeService rActivePowerRangeService;
private final IRStatLimitRateDetailDService irStatLimitRateDetailDService;
private final DecimalFormat dftwo = new DecimalFormat(Param.DECIMAL_FORMATTWOSTR); private final DecimalFormat dftwo = new DecimalFormat(Param.DECIMAL_FORMATTWOSTR);
private final DataVFeignClient dataVFeignClient; private final IDataV dataV;
private final DataIFeignClient dataIFeignClient; private final IDataI dataI;
private final DataPltFeignClient dataPltFeignClient; private final IDataPlt dataPlt;
private final DataInharmVFeignClient dataInharmVFeignClient; private final IDataInHarmV dataInHarmV;
private final DataHarmRateVFeignClient dataHarmRateVFeignClient; private final IDataHarmRateV dataHarmRateV;
private final OverLimitClient overLimitClient; private final OverLimitClient overLimitClient;
private final DataLimitRateDetailFeignClient dataLimitRateDetailFeignClient;
private List<String> times = Arrays.asList("0~10%", "10~20%", "20~30%", "30~40%", "40~50%", "50~60%", "60~70%", "70~80%", "80~90%", "90~100%"); private List<String> times = Arrays.asList("0~10%", "10~20%", "20~30%", "30~40%", "40~50%", "50~60%", "60~70%", "70~80%", "80~90%", "90~100%");
@@ -111,7 +110,9 @@ public class PowerStatisticsServiceImpl implements PowerStatisticsService {
lineCountEvaluateParam.setStartTime(powerStatisticsParam.getSearchBeginTime()); lineCountEvaluateParam.setStartTime(powerStatisticsParam.getSearchBeginTime());
lineCountEvaluateParam.setEndTime(powerStatisticsParam.getSearchEndTime()); lineCountEvaluateParam.setEndTime(powerStatisticsParam.getSearchEndTime());
//获取超标数据 //获取超标数据
List<DataLimitRateDetailTimeDto> dtoList = dataLimitRateDetailFeignClient.getLimitRateDetailTimeList(lineCountEvaluateParam).getData();
List<DataLimitRateDetailTimeDto> dtoList = irStatLimitRateDetailDService.getLimitRateDetailTime(lineCountEvaluateParam);
Map<String, DataLimitRateDetailTimeDto> timeDateMap = dtoList.stream().collect(Collectors.toMap(x -> x.getTime(), Function.identity())); Map<String, DataLimitRateDetailTimeDto> timeDateMap = dtoList.stream().collect(Collectors.toMap(x -> x.getTime(), Function.identity()));
List<String> timeId = rActivePowerRangePO.getTimeId(); List<String> timeId = rActivePowerRangePO.getTimeId();
String times = reflexObjValue(rActivePowerRangePO, "minsTime" + powerStatisticsParam.getField()).toString().replace("null", ""); String times = reflexObjValue(rActivePowerRangePO, "minsTime" + powerStatisticsParam.getField()).toString().replace("null", "");
@@ -155,11 +156,11 @@ public class PowerStatisticsServiceImpl implements PowerStatisticsService {
String time = param.getSearchBeginTime(); String time = param.getSearchBeginTime();
if ("1".equals(param.getStatisticalId())) { if ("1".equals(param.getStatisticalId())) {
//电压数据 //电压数据
List<DataVDto> dataVAllTime = dataVFeignClient.getRawData(evaluateParam).getData(); List<DataVDto> dataVAllTime = dataV.getRawData(evaluateParam);
//闪变数据 //闪变数据
List<DataPltDto> dataFlickerAllTime = dataPltFeignClient.getRawData(evaluateParam).getData(); List<DataPltDto> dataFlickerAllTime = dataPlt.getRawData(evaluateParam);
//电流数据 //电流数据
List<DataIDto> dataIList = dataIFeignClient.getRawData(evaluateParam).getData(); List<DataIDto> dataIList = dataI.getRawData(evaluateParam);
//电压偏差 //电压偏差
if ("Dev".equals(param.getCode()) || StrUtil.isBlank(param.getCode())) { if ("Dev".equals(param.getCode()) || StrUtil.isBlank(param.getCode())) {
addThdData(info, overlimit.getVoltageDev(), "vuDev", dataVAllTime, "电压上偏差","%",time); addThdData(info, overlimit.getVoltageDev(), "vuDev", dataVAllTime, "电压上偏差","%",time);
@@ -189,17 +190,17 @@ public class PowerStatisticsServiceImpl implements PowerStatisticsService {
} }
if ("2".equals(param.getStatisticalId())) { if ("2".equals(param.getStatisticalId())) {
//谐波数据 //谐波数据
List<DataHarmDto> dataVHarmList = dataHarmRateVFeignClient.getRawData(evaluateParam).getData(); List<DataHarmDto> dataVHarmList = dataHarmRateV.getRawData(evaluateParam);
addThdData(info, overlimit, "getUharm", "v", 2, 26, dataVHarmList, "谐波电压","%",time); addThdData(info, overlimit, "getUharm", "v", 2, 26, dataVHarmList, "谐波电压","%",time);
} }
if ("3".equals(param.getStatisticalId())) { if ("3".equals(param.getStatisticalId())) {
//电流数据 //电流数据
List<DataIDto> dataIList = dataIFeignClient.getRawData(evaluateParam).getData(); List<DataIDto> dataIList = dataI.getRawData(evaluateParam);
addThdData(info, overlimit, "getUharm", "i", 2, 26, dataIList, "谐波电流","A",time); addThdData(info, overlimit, "getUharm", "i", 2, 26, dataIList, "谐波电流","A",time);
} }
if ("4".equals(param.getStatisticalId())) { if ("4".equals(param.getStatisticalId())) {
//间谐波数据 //间谐波数据
List<DataHarmDto> dataVInHarmList = dataInharmVFeignClient.getRawData(evaluateParam).getData(); List<DataHarmDto> dataVInHarmList = dataInHarmV.getRawData(evaluateParam);
addThdData(info, overlimit, "getInuharm", "v", 1, 17, dataVInHarmList, "间谐波电压","%",time); addThdData(info, overlimit, "getInuharm", "v", 1, 17, dataVInHarmList, "间谐波电压","%",time);
} }
return info; return info;

View File

@@ -1,18 +1,23 @@
package com.njcn.harmonic.service.impl; package com.njcn.harmonic.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.lang.Pair; import cn.hutool.core.lang.Pair;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.csdevice.api.CsLineFeignClient; import com.njcn.csdevice.api.CsLineFeignClient;
import com.njcn.csdevice.pojo.po.CsLinePO; import com.njcn.csdevice.pojo.po.CsLinePO;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.AbnormalData;
import com.njcn.dataProcess.pojo.dto.DataLimitRateDetailTimeDto;
import com.njcn.device.biz.pojo.po.Overlimit; import com.njcn.device.biz.pojo.po.Overlimit;
import com.njcn.device.pq.api.OverLimitClient; import com.njcn.device.pq.api.OverLimitClient;
import com.njcn.harmonic.pojo.param.LimitCalendarQueryParam; import com.njcn.harmonic.pojo.param.LimitCalendarQueryParam;
@@ -30,10 +35,13 @@ import com.njcn.harmonic.service.IRStatLimitRateDetailDService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -381,6 +389,76 @@ public class RStatLimitRateDetailDServiceImpl extends ServiceImpl<RStatLimitRate
return result; return result;
} }
@Override
public List<DataLimitRateDetailTimeDto> getLimitRateDetailTime(LineCountEvaluateParam lineParam) {
List<DataLimitRateDetailTimeDto> info = new ArrayList<>();
LambdaQueryWrapper<RStatLimitRateDetailDPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()), RStatLimitRateDetailDPO::getLineId, lineParam.getLineId())
.between(RStatLimitRateDetailDPO::getTime, lineParam.getStartTime(),lineParam.getEndTime())
// .le(RStatLimitRateDetailDPO::getTime, )
// .orderByAsc(RStatLimitRateDetailDPO::getTime)
;
List<RStatLimitRateDetailDPO> list = this.list(lambdaQueryWrapper);
DataLimitRateDetailTimeDto dto;
for (RStatLimitRateDetailDPO detailD : list) {
dto = new DataLimitRateDetailTimeDto();
dto.setLineId(detailD.getLineId());
dto.setTime(detailD.getTime().format((DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))));
dto.setFlickerOvertime(toList(detailD.getFlickerOvertime()));
dto.setFreqDevOvertime(toList(detailD.getFreqDevOvertime()));
dto.setVoltageDevOvertime(toList(detailD.getVoltageDevOvertime()));
dto.setUbalanceOvertime(toList(detailD.getUbalanceOvertime()));
dto.setUaberranceOvertime(toList(detailD.getUaberranceOvertime()));
dto.setINegOvertime(toList(detailD.getINegOvertime()));
dto.setUharmOvertime(toList(detailD,2,25,"getUharm"));
dto.setIharmOvertime(toList(detailD,2,25,"getIharm"));
dto.setInuharmOvertime(toList(detailD,1,16,"getInuharm"));
info.add(dto);
}
return info;
}
private List<String> toList(RStatLimitRateDetailDPO detailD,Integer start, Integer end, String targetName){
List<AbnormalData.Json> json = new ArrayList<>();
for (int i = start; i <= end; i++) {
// 构造方法名
String methodName = targetName + i + "Overtime";
try {
// 获取 DataHarmDto 类的 getVx 方法
Method getVMethod = RStatLimitRateDetailDPO.class.getMethod(methodName);
String value = (String) getVMethod.invoke(detailD);
if(StrUtil.isNotBlank(value)){
json.addAll(JSON.parseArray(value, AbnormalData.Json.class));
}
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
return getString(json);
}
private List<String> toList(String json){
List<AbnormalData.Json> jsons = JSON.parseArray(json, AbnormalData.Json.class);
return getString(jsons);
}
private List<String> getString(List<AbnormalData.Json> jsons) {
if (CollUtil.isNotEmpty(jsons)){
List<String> times = jsons.stream().map(AbnormalData.Json::getTime).collect(Collectors.toList());
String join = String.join(",", times);
String[] split = join.split(",");
return Arrays.stream(split).distinct().collect(Collectors.toList());
}
return new ArrayList<>();
}
/** /**
* 设置LimitExtentVO的最大值和相关信息 * 设置LimitExtentVO的最大值和相关信息
*/ */

View File

@@ -0,0 +1,26 @@
package com.njcn.harmonic.service.influxdb;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.dataProcess.dto.DataHarmrateVDTO;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.CommonMinuteDto;
import com.njcn.dataProcess.pojo.dto.DataHarmDto;
import com.njcn.dataProcess.pojo.dto.DataHarmRateVDto;
import com.njcn.dataProcess.pojo.po.RStatDataHarmRateVD;
import java.util.List;
/**
* @author xy
*/
public interface IDataHarmRateV {
/**
* 获取原始数据
* @param lineParam
* @return
*/
List<DataHarmDto> getRawData(LineCountEvaluateParam lineParam);
}

View File

@@ -0,0 +1,26 @@
package com.njcn.harmonic.service.influxdb;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataIDto;
import java.util.List;
/**
* Description:
* Date: 2024/11/18 11:17【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface IDataI {
/**
* 获取原始数据
* @param lineParam
* @return
*/
List<DataIDto> getRawData(LineCountEvaluateParam lineParam);
}

View File

@@ -0,0 +1,32 @@
package com.njcn.harmonic.service.influxdb;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.dataProcess.dto.DataInharmVDTO;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.CommonMinuteDto;
import com.njcn.dataProcess.pojo.dto.DataHarmDto;
import com.njcn.dataProcess.pojo.dto.DataInHarmVDto;
import com.njcn.dataProcess.pojo.dto.DataVDto;
import com.njcn.dataProcess.pojo.po.RStatDataInHarmVD;
import java.util.List;
/**
* Description:
* Date: 2024/11/18 13:27【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface IDataInHarmV {
/**
* 获取原始数据
* @param lineParam
* @return
*/
List<DataHarmDto> getRawData(LineCountEvaluateParam lineParam);
}

View File

@@ -0,0 +1,31 @@
package com.njcn.harmonic.service.influxdb;
import com.github.jeffreyning.mybatisplus.service.IMppService;
import com.njcn.dataProcess.dto.DataPltDTO;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.CommonMinuteDto;
import com.njcn.dataProcess.pojo.dto.DataPltDto;
import com.njcn.dataProcess.pojo.dto.DataVDto;
import com.njcn.dataProcess.pojo.po.RStatDataPltD;
import java.util.List;
/**
* Description:
* Date: 2024/11/18 11:17【需求编号】
*
* @author clam
* @version V1.0.0
*/
public interface IDataPlt {
/**
* 获取原始数据
* @param lineParam
* @return
*/
List<DataPltDto> getRawData(LineCountEvaluateParam lineParam);
}

View File

@@ -0,0 +1,24 @@
package com.njcn.harmonic.service.influxdb;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataVDto;
import java.util.List;
/**
* @author hongawen
* @version 1.0
* @data 2024/11/7 10:54
*/
public interface IDataV {
/**
* 获取原始数据
* @param lineParam
* @return
*/
List<DataVDto> getRawData(LineCountEvaluateParam lineParam);
}

View File

@@ -0,0 +1,159 @@
package com.njcn.harmonic.service.influxdb.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.njcn.common.utils.HarmonicTimesUtil;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataHarmDto;
import com.njcn.harmonic.service.influxdb.IDataHarmRateV;
import com.njcn.influx.constant.InfluxDbSqlConstant;
import com.njcn.influx.imapper.DataHarmRateVMapper;
import com.njcn.influx.pojo.po.DataHarmRateV;
import com.njcn.influx.query.InfluxQueryWrapper;
import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.lang.reflect.Type;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author xy
*/
@Service
@RequiredArgsConstructor
public class InfluxdbDataHarmRateVImpl implements IDataHarmRateV {
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private final DataHarmRateVMapper DataHarmRateVMapper;
private static final Map<String, String> PHASE_MAPPING = new HashMap<String, String>() {{
put("AB", "A");
put("BC", "B");
put("CA", "C");
put("M", "T");
}};
private final RedisUtil redisUtil;
private static final Set<String> LINE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AB", "BC", "CA", "T")));
private static final Set<String> PHASE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("A", "B", "C", "T")));
@Override
public List<DataHarmDto> getRawData(LineCountEvaluateParam lineParam) {
List<DataHarmDto> result = new ArrayList<>();
List<DataHarmRateV> list = getMinuteData(lineParam);
list.forEach(item->{
DataHarmDto dto = new DataHarmDto();
BeanUtils.copyProperties(item,dto);
dto.setMinTime(DATE_TIME_FORMATTER.format(item.getTime()));
result.add(dto);
});
return result;
}
/**
* 按监测点集合、时间条件获取分钟数据
* timeMap参数来判断是否进行数据处理 timeMap为空则不进行数据处理
* 需要进行剔除异常数据时,这里会有三种情况判断
* 1.无异常数据,则直接返回集合;
* 2.异常数据和无异常数据参杂,剔除异常数据,只计算正常数据;
* 3.全是异常数据,则使用异常数据进行计算,但是日表中需要标记出来,此数据有异常
*/
public List<DataHarmRateV> getMinuteData(LineCountEvaluateParam lineParam) {
List<DataHarmRateV> dataList;
List<DataHarmRateV> result = new ArrayList<>();
List<DataHarmRateV> data = new ArrayList<>();
//获取监测点、接线方式数据
Type type = new TypeToken<Map<String, Integer>>(){}.getType();
Map<String, Integer> map = new Gson().fromJson(
String.valueOf(redisUtil.getObjectByKey("wlLineDetail")),
type
);
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataHarmRateV.class);
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.V, InfluxDbSqlConstant.V, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
influxQueryWrapper.regular(DataHarmRateV::getLineId, lineParam.getLineId())
.select(DataHarmRateV::getLineId)
.select(DataHarmRateV::getPhaseType)
.select(DataHarmRateV::getValueType)
.select(DataHarmRateV::getQualityFlag)
.select(DataHarmRateV::getAbnormalFlag)
.between(DataHarmRateV::getTime, lineParam.getStartTime(), lineParam.getEndTime())
.eq(DataHarmRateV::getQualityFlag,"0");
if(CollUtil.isNotEmpty(lineParam.getPhasicType())){
influxQueryWrapper.regular(DataHarmRateV::getPhaseType,lineParam.getPhasicType());
}
List<DataHarmRateV> list = DataHarmRateVMapper.selectByQueryWrapper(influxQueryWrapper);
if(CollUtil.isNotEmpty(list)){
//过滤掉暂态事件影响的数据 true过滤 false不过滤
if (lineParam.getDataType()) {
dataList = list.stream().filter(item -> Objects.isNull(item.getAbnormalFlag())).collect(Collectors.toList());
} else {
dataList = list;
}
Map<String,List<DataHarmRateV>> lineMap = dataList.stream().collect(Collectors.groupingBy(DataHarmRateV::getLineId));
//有异常数据
if (CollectionUtil.isNotEmpty(lineParam.getAbnormalTime())) {
lineMap.forEach((k,v)->{
List<String> timeList = lineParam.getAbnormalTime().get(k);
//有异常数据,当前监测点自身的异常数据
if (CollectionUtil.isNotEmpty(timeList)) {
List<DataHarmRateV> filterList = v.stream().filter(item -> !timeList.contains(DATE_TIME_FORMATTER.format(item.getTime()))).collect(Collectors.toList());
//1.过滤掉异常数据后还有正常数据,则用正常数据计算
if (CollectionUtil.isNotEmpty(filterList)) {
result.addAll(filterList);
}
//2.过滤掉异常数据后没有正常数据,则用所有异常数据计算,但是需要标记数据为异常的
else {
v.parallelStream().forEach(item -> item.setQualityFlag("1"));
result.addAll(v);
}
}
//没有异常数据,则使用原数据
else {
result.addAll(v);
}
});
}
//没有异常数据,则使用原数据
else {
result.addAll(dataList);
}
}
if (CollectionUtil.isNotEmpty(result)) {
if (!Objects.isNull(map)) {
//现根据监测点分组,然后根据接线方式排除多于数据,在修改相别
Map<String, List<DataHarmRateV>> lineMap = result.stream().collect(Collectors.groupingBy(DataHarmRateV::getLineId));
lineMap.forEach((k,v)->{
if (Objects.isNull(map.get(k))) {
return;
}
Integer conType = map.get(k);
Set<String> validPhasicTypes = (conType != 0) ? LINE_VOLTAGE_TYPES : PHASE_VOLTAGE_TYPES;
List<DataHarmRateV> result2 = v.stream().filter(item -> validPhasicTypes.contains(item.getPhaseType())).collect(Collectors.toList());
data.addAll(result2);
});
} else {
data.addAll(result);
}
if (CollectionUtil.isNotEmpty(data)) {
data.forEach(item -> {
String newType = PHASE_MAPPING.get(item.getPhaseType());
if (newType != null) {
item.setPhaseType(newType);
}
});
}
}
return data;
}
}

View File

@@ -0,0 +1,135 @@
package com.njcn.harmonic.service.influxdb.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.njcn.common.utils.HarmonicTimesUtil;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataIDto;
import com.njcn.harmonic.service.influxdb.IDataI;
import com.njcn.influx.constant.InfluxDbSqlConstant;
import com.njcn.influx.imapper.DataIMapper;
import com.njcn.influx.pojo.po.DataI;
import com.njcn.influx.query.InfluxQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author wr
* @description
* @date 2026/7/1 10:49
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class InfluxdbDataIImpl implements IDataI {
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private final DataIMapper dataIMapper;
private static final Map<String, String> PHASE_MAPPING = new HashMap<String, String>() {{
put("AB", "A");
put("BC", "B");
put("CA", "C");
put("M", "T");
}};
@Override
public List<DataIDto> getRawData(LineCountEvaluateParam lineParam) {
List<DataIDto> result = new ArrayList<>();
List<DataI> list = getMinuteDataI(lineParam);;
list.forEach(item->{
DataIDto dto = new DataIDto();
BeanUtils.copyProperties(item,dto);
dto.setMinTime(DATE_TIME_FORMATTER.format(item.getTime()));
result.add(dto);
});
return result;
}
/**
* 按监测点集合、时间条件获取dataI分钟数据
* timeMap参数来判断是否进行数据处理 timeMap为空则不进行数据处理
* 需要进行剔除异常数据时,这里会有三种情况判断
* 1.无异常数据,则直接返回集合;
* 2.异常数据和无异常数据参杂,剔除异常数据,只计算正常数据;
* 3.全是异常数据,则使用异常数据进行计算,但是日表中需要标记出来,此数据有异常
*/
public List<DataI> getMinuteDataI(LineCountEvaluateParam lineParam) {
List<DataI> dataList;
List<DataI> result = new ArrayList<>();
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataI.class);
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.I, InfluxDbSqlConstant.I, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
influxQueryWrapper.regular(DataI::getLineId, lineParam.getLineId())
.select(DataI::getLineId)
.select(DataI::getPhaseType)
.select(DataI::getValueType)
.select(DataI::getINeg)
.select(DataI::getIPos)
.select(DataI::getIThd)
.select(DataI::getIUnbalance)
.select(DataI::getIZero)
.select(DataI::getRms)
.select(DataI::getQualityFlag)
.select(DataI::getAbnormalFlag)
.between(DataI::getTime, lineParam.getStartTime(), lineParam.getEndTime())
.eq(DataI::getQualityFlag,"0");
if(CollUtil.isNotEmpty(lineParam.getPhasicType())){
influxQueryWrapper.regular(DataI::getPhaseType,lineParam.getPhasicType());
}
List<DataI> list = dataIMapper.selectByQueryWrapper(influxQueryWrapper);
if(CollUtil.isNotEmpty(list)){
//过滤掉暂态事件影响的数据 true过滤 false不过滤
if (lineParam.getDataType()) {
dataList = list.stream().filter(item -> Objects.isNull(item.getAbnormalFlag())).collect(Collectors.toList());
} else {
dataList = list;
}
Map<String,List<DataI>> lineMap = dataList.stream().collect(Collectors.groupingBy(DataI::getLineId));
//有异常数据
if (CollectionUtil.isNotEmpty(lineParam.getAbnormalTime())) {
lineMap.forEach((k,v)->{
List<String> timeList = lineParam.getAbnormalTime().get(k);
//有异常数据,当前监测点自身的异常数据
if (CollectionUtil.isNotEmpty(timeList)) {
List<DataI> filterList = v.stream().filter(item -> !timeList.contains(DATE_TIME_FORMATTER.format(item.getTime()))).collect(Collectors.toList());
//1.过滤掉异常数据后还有正常数据,则用正常数据计算
if (CollectionUtil.isNotEmpty(filterList)) {
result.addAll(filterList);
}
//2.过滤掉异常数据后没有正常数据,则用所有异常数据计算,但是需要标记数据为异常的
else {
v.parallelStream().forEach(item -> item.setQualityFlag("1"));
result.addAll(v);
}
}
//没有异常数据,则使用原数据
else {
result.addAll(v);
}
});
}
//没有异常数据,则使用原数据
else {
result.addAll(dataList);
}
}
if (CollectionUtil.isNotEmpty(result)) {
result.forEach(item -> {
String newType = PHASE_MAPPING.get(item.getPhaseType());
if (newType != null) {
item.setPhaseType(newType);
}
});
}
return result;
}
}

View File

@@ -0,0 +1,132 @@
package com.njcn.harmonic.service.influxdb.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.njcn.common.utils.HarmonicTimesUtil;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataHarmDto;
import com.njcn.harmonic.service.influxdb.IDataInHarmV;
import com.njcn.influx.constant.InfluxDbSqlConstant;
import com.njcn.influx.imapper.DataInHarmVMapper;
import com.njcn.influx.pojo.po.DataInHarmV;
import com.njcn.influx.query.InfluxQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* Description:
* Date: 2024/11/18 14:33【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
@RequiredArgsConstructor
public class InfluxdbDataInharmVImpl implements IDataInHarmV {
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private final DataInHarmVMapper DataInHarmVMapper;
private static final Map<String, String> PHASE_MAPPING = new HashMap<String, String>() {{
put("AB", "A");
put("BC", "B");
put("CA", "C");
put("M", "T");
}};
@Override
public List<DataHarmDto> getRawData(LineCountEvaluateParam lineParam) {
List<DataHarmDto> result = new ArrayList<>();
List<DataInHarmV> list = getMinuteData(lineParam);
list.forEach(item->{
DataHarmDto dto = new DataHarmDto();
BeanUtils.copyProperties(item,dto);
dto.setMinTime(DATE_TIME_FORMATTER.format(item.getTime()));
result.add(dto);
});
return result;
}
/**
* 按监测点集合、时间条件获取dataI分钟数据
* timeMap参数来判断是否进行数据处理 timeMap为空则不进行数据处理
* 需要进行剔除异常数据时,这里会有三种情况判断
* 1.无异常数据,则直接返回集合;
* 2.异常数据和无异常数据参杂,剔除异常数据,只计算正常数据;
* 3.全是异常数据,则使用异常数据进行计算,但是日表中需要标记出来,此数据有异常
*/
public List<DataInHarmV> getMinuteData(LineCountEvaluateParam lineParam) {
List<DataInHarmV> dataList;
List<DataInHarmV> result = new ArrayList<>();
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataInHarmV.class);
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.V, InfluxDbSqlConstant.V, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
influxQueryWrapper.regular(DataInHarmV::getLineId, lineParam.getLineId())
.select(DataInHarmV::getLineId)
.select(DataInHarmV::getPhaseType)
.select(DataInHarmV::getValueType)
.select(DataInHarmV::getQualityFlag)
.select(DataInHarmV::getAbnormalFlag)
.between(DataInHarmV::getTime, lineParam.getStartTime(), lineParam.getEndTime())
.eq(DataInHarmV::getQualityFlag,"0");
if(CollUtil.isNotEmpty(lineParam.getPhasicType())){
influxQueryWrapper.regular(DataInHarmV::getPhaseType,lineParam.getPhasicType());
}
List<DataInHarmV> list = DataInHarmVMapper.selectByQueryWrapper(influxQueryWrapper);
if(CollUtil.isNotEmpty(list)){
//过滤掉暂态事件影响的数据 true过滤 false不过滤
if (lineParam.getDataType()) {
dataList = list.stream().filter(item -> Objects.isNull(item.getAbnormalFlag())).collect(Collectors.toList());
} else {
dataList = list;
}
Map<String,List<DataInHarmV>> lineMap = dataList.stream().collect(Collectors.groupingBy(DataInHarmV::getLineId));
//有异常数据
if (CollectionUtil.isNotEmpty(lineParam.getAbnormalTime())) {
lineMap.forEach((k,v)->{
List<String> timeList = lineParam.getAbnormalTime().get(k);
//有异常数据,当前监测点自身的异常数据
if (CollectionUtil.isNotEmpty(timeList)) {
List<DataInHarmV> filterList = v.stream().filter(item -> !timeList.contains(DATE_TIME_FORMATTER.format(item.getTime()))).collect(Collectors.toList());
//1.过滤掉异常数据后还有正常数据,则用正常数据计算
if (CollectionUtil.isNotEmpty(filterList)) {
result.addAll(filterList);
}
//2.过滤掉异常数据后没有正常数据,则用所有异常数据计算,但是需要标记数据为异常的
else {
v.parallelStream().forEach(item -> item.setQualityFlag("1"));
result.addAll(v);
}
}
//没有异常数据,则使用原数据
else {
result.addAll(v);
}
});
}
//没有异常数据,则使用原数据
else {
result.addAll(dataList);
}
}
if (CollectionUtil.isNotEmpty(result)) {
result.forEach(item -> {
String newType = PHASE_MAPPING.get(item.getPhaseType());
if (newType != null) {
item.setPhaseType(newType);
}
});
}
return result;
}
}

View File

@@ -0,0 +1,157 @@
package com.njcn.harmonic.service.influxdb.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.influx.pojo.po.DataPlt;
import com.njcn.dataProcess.pojo.dto.DataPltDto;
import com.njcn.harmonic.service.influxdb.IDataPlt;
import com.njcn.influx.imapper.DataPltMapper;
import com.njcn.influx.pojo.po.DataV;
import com.njcn.influx.query.InfluxQueryWrapper;
import com.njcn.redis.utils.RedisUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.lang.reflect.Type;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* Description:
* Date: 2024/11/18 14:33【需求编号】
*
* @author clam
* @version V1.0.0
*/
@Service
@RequiredArgsConstructor
public class InfluxdbDataPltImpl implements IDataPlt {
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private final DataPltMapper dataPltMapper;
private final RedisUtil redisUtil;
private static final Map<String, String> PHASE_MAPPING = new HashMap<String, String>() {{
put("AB", "A");
put("BC", "B");
put("CA", "C");
put("M", "T");
}};
private static final Set<String> LINE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AB", "BC", "CA", "T")));
private static final Set<String> PHASE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("A", "B", "C", "T")));
@Override
public List<DataPltDto> getRawData(LineCountEvaluateParam lineParam) {
List<DataPltDto> result = new ArrayList<>();
List<DataPlt> list = getMinuteDataPlt(lineParam);
list.forEach(item->{
DataPltDto dto = new DataPltDto();
BeanUtils.copyProperties(item,dto);
dto.setMinTime(DATE_TIME_FORMATTER.format(item.getTime()));
result.add(dto);
});
return result;
}
/**
* 按监测点集合、时间条件获取dataI分钟数据
* timeMap参数来判断是否进行数据处理 timeMap为空则不进行数据处理
* 需要进行剔除异常数据时,这里会有三种情况判断
* 1.无异常数据,则直接返回集合;
* 2.异常数据和无异常数据参杂,剔除异常数据,只计算正常数据;
* 3.全是异常数据,则使用异常数据进行计算,但是日表中需要标记出来,此数据有异常
*/
public List<DataPlt> getMinuteDataPlt(LineCountEvaluateParam lineParam) {
List<DataPlt> dataList;
List<DataPlt> result = new ArrayList<>();
List<DataPlt> data = new ArrayList<>();
//获取监测点、接线方式数据
Type type = new TypeToken<Map<String, Integer>>(){}.getType();
Map<String, Integer> map = new Gson().fromJson(
String.valueOf(redisUtil.getObjectByKey("wlLineDetail")),
type
);
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataPlt.class);
influxQueryWrapper.regular(DataPlt::getLineId, lineParam.getLineId())
.select(DataPlt::getLineId)
.select(DataPlt::getPhaseType)
.select(DataPlt::getPlt)
.select(DataPlt::getQualityFlag)
.select(DataPlt::getAbnormalFlag)
.between(DataPlt::getTime, lineParam.getStartTime(), lineParam.getEndTime())
.eq(DataPlt::getQualityFlag,"0");
if(CollUtil.isNotEmpty(lineParam.getPhasicType())){
influxQueryWrapper.regular(DataV::getPhaseType,lineParam.getPhasicType());
}
List<DataPlt> list = dataPltMapper.selectByQueryWrapper(influxQueryWrapper);
if(CollUtil.isNotEmpty(list)){
//过滤掉暂态事件影响的数据 true过滤 false不过滤
if (lineParam.getDataType()) {
dataList = list.stream().filter(item -> Objects.isNull(item.getAbnormalFlag())).collect(Collectors.toList());
} else {
dataList = list;
}
Map<String,List<DataPlt>> lineMap = dataList.stream().collect(Collectors.groupingBy(DataPlt::getLineId));
//有异常数据
if (CollectionUtil.isNotEmpty(lineParam.getAbnormalTime())) {
lineMap.forEach((k,v)->{
List<String> timeList = lineParam.getAbnormalTime().get(k);
//有异常数据,当前监测点自身的异常数据
if (CollectionUtil.isNotEmpty(timeList)) {
List<DataPlt> filterList = v.stream().filter(item -> !timeList.contains(DATE_TIME_FORMATTER.format(item.getTime()))).collect(Collectors.toList());
//1.过滤掉异常数据后还有正常数据,则用正常数据计算
if (CollectionUtil.isNotEmpty(filterList)) {
result.addAll(filterList);
}
//2.过滤掉异常数据后没有正常数据,则用所有异常数据计算,但是需要标记数据为异常的
else {
v.parallelStream().forEach(item -> item.setQualityFlag("1"));
result.addAll(v);
}
}
//没有异常数据,则使用原数据
else {
result.addAll(v);
}
});
}
//没有异常数据,则使用原数据
else {
result.addAll(dataList);
}
}
if (CollectionUtil.isNotEmpty(result)) {
if (!Objects.isNull(map)) {
//现根据监测点分组,然后根据接线方式排除多于数据,在修改相别
Map<String, List<DataPlt>> lineMap = result.stream().collect(Collectors.groupingBy(DataPlt::getLineId));
lineMap.forEach((k,v)->{
if (Objects.isNull(map.get(k))) {
return;
}
Integer conType = map.get(k);
Set<String> validPhasicTypes = (conType != 0) ? LINE_VOLTAGE_TYPES : PHASE_VOLTAGE_TYPES;
List<DataPlt> result2 = v.stream().filter(item -> validPhasicTypes.contains(item.getPhaseType())).collect(Collectors.toList());
data.addAll(result2);
});
} else {
data.addAll(result);
}
if (CollectionUtil.isNotEmpty(data)) {
data.forEach(item -> {
String newType = PHASE_MAPPING.get(item.getPhaseType());
if (newType != null) {
item.setPhaseType(newType);
}
});
}
}
return data;
}
}

View File

@@ -0,0 +1,221 @@
package com.njcn.harmonic.service.influxdb.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.njcn.common.utils.HarmonicTimesUtil;
import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataVDto;
import com.njcn.harmonic.service.influxdb.IDataV;
import com.njcn.influx.constant.InfluxDbSqlConstant;
import com.njcn.influx.imapper.DataVMapper;
import com.njcn.influx.pojo.po.DataV;
import com.njcn.influx.query.InfluxQueryWrapper;
import com.njcn.redis.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Type;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author wr
* @description
* @date 2026/7/1 10:49
*/
@Slf4j
@Service
public class InfluxdbDataVImpl implements IDataV {
private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
private static final Map<String, String> PHASE_MAPPING = new HashMap<String, String>() {{
put("AB", "A");
put("BC", "B");
put("CA", "C");
put("M", "T");
}};
@Resource
private DataVMapper dataVMapper;
@Resource
private RedisUtil redisUtil;
private static final Set<String> LINE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("AB", "BC", "CA", "T")));
private static final Set<String> PHASE_VOLTAGE_TYPES =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList("A", "B", "C", "T")));
@Override
public List<DataVDto> getRawData(LineCountEvaluateParam lineParam) {
List<DataVDto> result = new ArrayList<>();
List<DataV> list = getMinuteDataV(lineParam);
if (CollectionUtil.isNotEmpty(list)) {
list.forEach(item -> {
DataVDto dto = new DataVDto();
BeanUtils.copyProperties(item, dto);
dto.setMinTime(DATE_TIME_FORMATTER.format(item.getTime()));
result.add(dto);
});
}
return result;
}
/**
* 按监测点集合、时间条件获取dataV分钟数据
* timeMap参数来判断是否进行数据处理 timeMap为空则不进行数据处理
* 剔除异常数据,这里会有三种情况判断
* 1.无异常数据,则直接返回集合;
* 2.异常数据和无异常数据参杂,剔除异常数据,只计算正常数据;
* 3.全是异常数据,则使用异常数据进行计算,但是日表中需要标记出来,此数据有异常
*/
public List<DataV> getMinuteDataV(LineCountEvaluateParam lineParam) {
List<DataV> result = new ArrayList<>();
List<DataV> data = new ArrayList<>();
//获取监测点、接线方式数据
Type type = new TypeToken<Map<String, Integer>>(){}.getType();
Map<String, Integer> map = new Gson().fromJson(
String.valueOf(redisUtil.getObjectByKey("wlLineDetail")),
type
);
InfluxQueryWrapper influxQueryWrapper = new InfluxQueryWrapper(DataV.class);
influxQueryWrapper.samePrefixAndSuffix(InfluxDbSqlConstant.V, InfluxDbSqlConstant.V, HarmonicTimesUtil.harmonicTimesList(1, 50, 1));
influxQueryWrapper.regular(DataV::getLineId, lineParam.getLineId())
.select(DataV::getLineId)
.select(DataV::getPhaseType)
.select(DataV::getValueType)
.select(DataV::getFreq)
.select(DataV::getFreqDev)
.select(DataV::getRms)
.select(DataV::getRmsLvr)
.select(DataV::getVNeg)
.select(DataV::getVPos)
.select(DataV::getVThd)
.select(DataV::getVUnbalance)
.select(DataV::getVZero)
.select(DataV::getVlDev)
.select(DataV::getVuDev)
.select(DataV::getQualityFlag)
.select(DataV::getAbnormalFlag)
.between(DataV::getTime, lineParam.getStartTime(), lineParam.getEndTime())
.eq(DataV::getQualityFlag, "0");
if (CollUtil.isNotEmpty(lineParam.getPhasicType())) {
influxQueryWrapper.regular(DataV::getPhaseType, lineParam.getPhasicType());
}
quality(result, influxQueryWrapper, lineParam);
if (CollectionUtil.isNotEmpty(result)) {
if (!Objects.isNull(map)) {
//现根据监测点分组,然后根据接线方式排除多于数据,在修改相别
Map<String, List<DataV>> lineMap = result.stream().collect(Collectors.groupingBy(DataV::getLineId));
lineMap.forEach((k,v)->{
if (Objects.isNull(map.get(k))) {
return;
}
//这边需要特殊处理下,将线电压数据赋值
Map<String, DataV> lineVoltageIndex = v.stream()
.filter(d -> PHASE_MAPPING.containsKey(d.getPhaseType()))
.filter(d -> d.getRmsLvr() != null)
.collect(Collectors.toMap(
d -> buildKey(d.getTime(), d.getValueType(), d.getPhaseType()),
Function.identity(),
(existing, replacement) -> existing
));
v.stream()
.filter(d -> PHASE_VOLTAGE_TYPES.contains(d.getPhaseType()))
.forEach(phaseData -> {
// 根据当前相电压反查对应的线电压相别
String targetLinePhasic = getReverseLinePhasic(phaseData.getPhaseType());
if (targetLinePhasic == null) {
return;
}
String key = buildKey(phaseData.getTime(), phaseData.getValueType(), targetLinePhasic);
DataV matchedLineData = lineVoltageIndex.get(key);
if (matchedLineData != null && matchedLineData.getRmsLvr() != null) {
phaseData.setRmsLvr(matchedLineData.getRmsLvr());
}
});
Integer conType = map.get(k);
Set<String> validPhasicTypes = (conType != 0) ? LINE_VOLTAGE_TYPES : PHASE_VOLTAGE_TYPES;
List<DataV> result2 = v.stream().filter(item -> validPhasicTypes.contains(item.getPhaseType())).collect(Collectors.toList());
data.addAll(result2);
});
} else {
data.addAll(result);
}
if (CollectionUtil.isNotEmpty(data)) {
data.forEach(item -> {
String newType = PHASE_MAPPING.get(item.getPhaseType());
if (newType != null) {
item.setPhaseType(newType);
}
});
}
}
return data;
}
private void quality(List<DataV> result, InfluxQueryWrapper influxQueryWrapper, LineCountEvaluateParam lineParam) {
List<DataV> dataList;
List<DataV> list = dataVMapper.selectByQueryWrapper(influxQueryWrapper);
if (CollUtil.isNotEmpty(list)) {
//过滤掉暂态事件影响的数据 true过滤 false不过滤
if (lineParam.getDataType()) {
dataList = list.stream().filter(item -> Objects.isNull(item.getAbnormalFlag())).collect(Collectors.toList());
} else {
dataList = list;
}
Map<String, List<DataV>> lineMap = dataList.stream().collect(Collectors.groupingBy(DataV::getLineId));
//有异常数据
Map<String, List<String>> timeMap = lineParam.getAbnormalTime();
if (CollectionUtil.isNotEmpty(timeMap)) {
lineMap.forEach((k, v) -> {
List<String> timeList = timeMap.get(k);
//有异常数据,当前监测点自身的异常数据
if (CollectionUtil.isNotEmpty(timeList)) {
List<DataV> filterList = v.stream().filter(item -> !timeList.contains(DATE_TIME_FORMATTER.format(item.getTime()))).collect(Collectors.toList());
//1.过滤掉异常数据后还有正常数据,则用正常数据计算
if (CollectionUtil.isNotEmpty(filterList)) {
result.addAll(filterList);
}
//2.过滤掉异常数据后没有正常数据,则用所有异常数据计算,但是需要标记数据为异常的
else {
v.parallelStream().forEach(item -> item.setQualityFlag("1"));
result.addAll(v);
}
}
//没有异常数据,则使用原数据
else {
result.addAll(v);
}
});
}
//没有异常数据,则使用原数据
else {
result.addAll(dataList);
}
}
}
private static String buildKey(Object time, Object valueType, Object phasicType) {
return time + "|" + valueType + "|" + phasicType;
}
private static String getReverseLinePhasic(String phaseType) {
if (phaseType == null) {
return null;
}
switch (phaseType) {
case "A":
return "AB";
case "B":
return "BC";
case "C":
return "CA";
default:
return null;
}
}
}

View File

@@ -15,5 +15,6 @@
sys_dic_tree b sys_dic_tree b
WHERE WHERE
b.pids LIKE concat('%',#{id},'%') and a.id = b.pid) b.pids LIKE concat('%',#{id},'%') and a.id = b.pid)
AND a.status = 0
</select> </select>
</mapper> </mapper>