1.增加配网用户侧算法适配

2.新增河北用户侧数据完整性接口
3.新增河北用户侧越限详情接口
This commit is contained in:
2024-09-04 16:47:08 +08:00
parent ed10b12e79
commit 9fca0e5714
29 changed files with 818 additions and 25 deletions

View File

@@ -0,0 +1,20 @@
package com.njcn.harmonic.controller.distribution;
import com.njcn.harmonic.service.majornetwork.RStatLimitService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 配网用户侧指标越限
*/
@RestController
@RequestMapping("/pwLimit")
@Slf4j
@Api(tags = "配网用户侧指标越限")
@RequiredArgsConstructor
public class PwUserLimitController {
private final RStatLimitService rStatLimitService;
}

View File

@@ -1,13 +1,16 @@
package com.njcn.harmonic.controller.majornetwork;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.HttpResultUtil;
import com.njcn.device.pms.pojo.param.pwUser.PwUserMonitorParam;
import com.njcn.harmonic.pojo.param.RStatLimitQueryParam;
import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO;
import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO;
import com.njcn.harmonic.pojo.vo.MonitorLimitRateVO;
import com.njcn.harmonic.pojo.vo.RStatLimitTargetVO;
import com.njcn.harmonic.service.majornetwork.RStatLimitService;
import com.njcn.web.controller.BaseController;
@@ -16,6 +19,7 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -78,4 +82,14 @@ public class RStatLimitController extends BaseController {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@PostMapping("/pwMonitorLimitData")
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@ApiOperation("获取配网指标超标详情")
public HttpResult<Page<MonitorLimitRateVO>> pwMonitorLimitData(@RequestBody @Validated PwUserMonitorParam pwUserMonitorParam){
String methodDescribe = getMethodDescribe("pwMonitorLimitData");
Page<MonitorLimitRateVO> page = rStatLimitService.pwMonitorLimitData(pwUserMonitorParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, page, methodDescribe);
}
}

View File

@@ -1,9 +1,13 @@
package com.njcn.harmonic.service.majornetwork;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.device.pms.pojo.param.pwUser.PwUserMonitorParam;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.vo.GridDiagramVO;
import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO;
import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO;
import com.njcn.harmonic.pojo.vo.MonitorLimitRateVO;
import com.njcn.harmonic.pojo.vo.RStatLimitRateDVO;
import com.njcn.harmonic.pojo.vo.RStatLimitTargetVO;
import org.springframework.web.bind.annotation.RequestParam;
@@ -46,4 +50,8 @@ public interface RStatLimitService {
List<GridDiagramVO.RunData> getGridDiagramRunData(DeviceInfoParam.BusinessParam param);
List<RStatLimitRateDPO> getOverData(String lineId, String startTime, String endTime, Integer type);
Page<MonitorLimitRateVO> pwMonitorLimitData(PwUserMonitorParam pwUserMonitorParam);
}

View File

@@ -1,5 +1,6 @@
package com.njcn.harmonic.service.majornetwork.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.func.Func;
@@ -8,10 +9,14 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.dto.SimpleDTO;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient;
import com.njcn.device.biz.pojo.dto.DeptGetSubStationDTO;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.device.pms.api.DistributionMonitorClient;
import com.njcn.device.pms.pojo.param.pwUser.PwUserMonitorParam;
import com.njcn.device.pms.pojo.vo.pwUser.PwUserMonitorDataVO;
import com.njcn.device.pq.api.GeneralDeviceInfoClient;
import com.njcn.device.pq.api.LineIntegrityClient;
import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO;
@@ -26,13 +31,20 @@ import com.njcn.harmonic.pojo.param.StatSubstationBizBaseParam;
import com.njcn.harmonic.pojo.po.RMpVThd;
import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO;
import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO;
import com.njcn.harmonic.pojo.vo.MonitorLimitRateVO;
import com.njcn.harmonic.pojo.vo.RStatLimitTargetVO;
import com.njcn.harmonic.service.IRStatLimitTargetDService;
import com.njcn.harmonic.service.majornetwork.RStatLimitService;
import com.njcn.prepare.harmonic.api.line.LimitrateFeignClient;
import com.njcn.system.pojo.enums.StatisticsEnum;
import com.njcn.web.factory.PageFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@@ -55,6 +67,8 @@ public class RStatLimitServiceImpl implements RStatLimitService {
private final IRStatLimitTargetDService targetDService;
private final CommTerminalGeneralClient commTerminalGeneralClient;
private final DistributionMonitorClient distributionMonitorClient;
private final LimitrateFeignClient limitrateFeignClient;
@Override
@@ -399,7 +413,151 @@ public class RStatLimitServiceImpl implements RStatLimitService {
return rStatLimitRateDMapper.selectList(queryWrapper);
}
private void onLineAndIntegrity(List<String> lineIds, List<RStatIntegrityD> onIntegrityByIds, List<String> devIds, List<RStatOnlinerateVO> onlineRateByDevIds,List<RStatLimitTargetDPO> limitTargetList, GridDiagramVO.LineData lineData) {
@Override
public Page<MonitorLimitRateVO> pwMonitorLimitData(PwUserMonitorParam pwUserMonitorParam) {
Page<MonitorLimitRateVO> pageResult = new Page<>(PageFactory.getPageNum(pwUserMonitorParam),PageFactory.getPageSize(pwUserMonitorParam));
List<PwUserMonitorDataVO> pwUserMonitorDataVOList = distributionMonitorClient.getPwUserIds(pwUserMonitorParam).getData();
if(CollUtil.isEmpty(pwUserMonitorDataVOList)){
return pageResult;
}
List<String> ids = pwUserMonitorDataVOList.stream().map(PwUserMonitorDataVO::getId).collect(Collectors.toList());
QueryWrapper<RStatLimitRateDPO> queryWrapper = new QueryWrapper<>();
StringBuilder stringBuilder = new StringBuilder();
for(int i = 2;i<26;i++){
if(i == 25){
stringBuilder.append("sum(uharm_").append(i).append("_overtime) as uharm_").append(i).append("_overtime ");
}else {
stringBuilder.append("sum(uharm_").append(i).append("_overtime) as uharm_").append(i).append("_overtime").append(",");
}
}
queryWrapper.select("my_index lineId ,sum(all_time) all_time,sum(flicker_all_time) flicker_all_time,sum(freq_dev_overtime) freq_dev_overtime,sum(voltage_dev_overtime) voltage_dev_overtime,sum(ubalance_overtime) ubalance_overtime,sum(flicker_overtime) flicker_overtime,sum(uaberrance_overtime) uaberrance_overtime",stringBuilder.toString())
.in("my_index",ids).between("time_id",pwUserMonitorParam.getSearchBeginTime(),pwUserMonitorParam.getSearchEndTime()).eq("phasic_type","T").groupBy("my_index");
if(StrUtil.isNotBlank(pwUserMonitorParam.getOrderBy())){
String sortBy = strToSql(pwUserMonitorParam.getSortBy());
if(pwUserMonitorParam.getOrderBy().equals("asc")){
queryWrapper.orderBy(true,true,sortBy);
}else {
queryWrapper.orderBy(true,false,sortBy);
}
}
Page<RStatLimitRateDPO> temPage = rStatLimitRateDMapper.selectPage(new Page<>(PageFactory.getPageNum(pwUserMonitorParam),PageFactory.getPageSize(pwUserMonitorParam)),queryWrapper);
pageResult.setTotal(temPage.getTotal());
if(CollUtil.isNotEmpty(temPage.getRecords())){
Map<String,PwUserMonitorDataVO> map = pwUserMonitorDataVOList.stream().collect(Collectors.toMap(PwUserMonitorDataVO::getId,Function.identity()));
List<MonitorLimitRateVO> resultList = new ArrayList<>();
for(RStatLimitRateDPO item : temPage.getRecords()){
MonitorLimitRateVO monitorLimitRateVO = new MonitorLimitRateVO();
PwUserMonitorDataVO pwUserMonitorDataVO = map.get(item.getLineId());
BeanUtil.copyProperties(pwUserMonitorDataVO,monitorLimitRateVO);
if(item.getAllTime() == 0){
monitorLimitRateVO.setFlickerOvertime(BigDecimal.valueOf(3.14159));
monitorLimitRateVO.setFreqDevOvertime(BigDecimal.valueOf(3.14159));
monitorLimitRateVO.setUaberranceOvertime(BigDecimal.valueOf(3.14159));
monitorLimitRateVO.setUbalanceOvertime(BigDecimal.valueOf(3.14159));
monitorLimitRateVO.setVoltageDevOvertime(BigDecimal.valueOf(3.14159));
}else {
monitorLimitRateVO.setFlickerOvertime(BigDecimal.valueOf((double) item.getFlickerOvertime()/item.getFlickerAllTime()*100).setScale(2, RoundingMode.HALF_UP));
monitorLimitRateVO.setFreqDevOvertime(BigDecimal.valueOf((double) item.getFreqDevOvertime()/item.getAllTime()*100).setScale(2, RoundingMode.HALF_UP));
monitorLimitRateVO.setUaberranceOvertime(BigDecimal.valueOf((double) item.getUaberranceOvertime()/item.getAllTime()*100).setScale(2, RoundingMode.HALF_UP));
monitorLimitRateVO.setUbalanceOvertime(BigDecimal.valueOf((double) item.getUbalanceOvertime()/item.getAllTime()*100).setScale(2, RoundingMode.HALF_UP));
monitorLimitRateVO.setVoltageDevOvertime(BigDecimal.valueOf((double) item.getVoltageDevOvertime()/item.getAllTime()*100).setScale(2, RoundingMode.HALF_UP));
}
setUharmOvertimeRatios(item,monitorLimitRateVO);
resultList.add(monitorLimitRateVO);
}
pageResult.setRecords(resultList);
}
return pageResult;
}
public String strToSql(String originalString){
StringBuilder modifiedStringBuilder = new StringBuilder();
// 标记是否需要在下一个字符前添加下划线
boolean needUnderscore = false;
for (int i = 0; i < originalString.length(); i++) {
char currentChar = originalString.charAt(i);
// 检查当前字符是否为大写字母
if (Character.isUpperCase(currentChar)) {
// 如果不是字符串的第一个字符,或者即使是第一个字符但也需要下划线(实际上第一个大写不需要)
// 但由于逻辑简化我们只在需要时设置needUnderscore
needUnderscore = true;
} else if (Character.isDigit(currentChar)) {
// 如果当前字符是数字
// 检查下一个字符(如果存在)是否也是数字
if (i + 1 < originalString.length() && Character.isDigit(originalString.charAt(i + 1))) {
// 当前字符和下一个字符都是数字,但我们只在数字序列的开头添加下划线
// 如果这不是字符串的开头,并且之前没有添加过下划线(即不是在前一个数字后)
if (i > 0 && !Character.isDigit(originalString.charAt(i - 1))) {
needUnderscore = true;
}
// 对于数字序列的其余部分我们不需要再设置needUnderscore为true
} else {
// 当前字符是单个数字,且不是字符串的开头,则可能需要下划线
if (i > 0 && !Character.isDigit(originalString.charAt(i - 1))) {
needUnderscore = true;
}
}
} else {
// 重置needUnderscore因为当前字符既不是大写也不是数字
// 但注意如果当前字符后面紧跟大写或数字序列needUnderscore会在后续迭代中被设置
needUnderscore = false;
}
// 如果需要下划线且不是字符串的开头,则添加下划线
if (needUnderscore && i > 0) {
modifiedStringBuilder.append('_');
needUnderscore = false; // 重置标记,因为我们已经添加了下划线
}
// 将当前字符添加到StringBuilder中
modifiedStringBuilder.append(currentChar);
}
return modifiedStringBuilder.toString();
}
//赋值2到25次谐波
public void setUharmOvertimeRatios(final RStatLimitRateDPO item, final MonitorLimitRateVO monitorLimitRateVO) {
// 使用一个循环来避免重复代码
for (int i = 2; i <= 25; i++) {
// 使用反射来动态调用方法如果方法名遵循getUharmXOvertime()模式)
String methodName = "getUharm" + i + "Overtime";
String setterName = "setUharm" + i + "Overtime";
// 假设这些方法都存在且返回long或int类型
long uharmOvertime = 0;
try {
Method method = item.getClass().getMethod(methodName);
uharmOvertime = (int) method.invoke(item);
long allTime = item.getAllTime();
if (allTime == 0) {
// 防止除以0的错误
monitorLimitRateVO.getClass().getMethod(setterName, BigDecimal.class)
.invoke(monitorLimitRateVO, BigDecimal.valueOf(3.14159));
} else {
BigDecimal ratio = BigDecimal.valueOf((double) uharmOvertime / allTime*100)
.setScale(2, RoundingMode.HALF_UP);
monitorLimitRateVO.getClass().getMethod(setterName, BigDecimal.class)
.invoke(monitorLimitRateVO, ratio);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
// 处理异常,例如记录日志或抛出运行时异常
throw new RuntimeException("Error setting UharmOvertime ratio", e);
}
}
}
private void onLineAndIntegrity(List<String> lineIds, List<RStatIntegrityD> onIntegrityByIds, List<String> devIds, List<RStatOnlinerateVO> onlineRateByDevIds,List<RStatLimitTargetDPO> limitTargetList, GridDiagramVO.LineData lineData) {
//监测完整率
List<RStatIntegrityD> integrityDS = onIntegrityByIds.stream().filter(x -> lineIds.contains(x.getLineIndex())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(integrityDS)) {