@@ -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 ) ) {