@@ -1,25 +1,34 @@
package com.njcn.device.pq.service.impl ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.date.DateUtil ;
import cn.hutool.core.date.* ;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper ;
import com.njcn.device.pq.mapper.OnlineRateMapper ;
import com.njcn.device.pq.mapper.RStatIntegrityDMapper ;
import com.njcn.device.pq.mapper.RStatOnlinerateDMapper ;
import com.njcn.device.pq.pojo.param.OnlineRateParam ;
import com.njcn.device.pq.pojo.param.PulicTimeParam ;
import com.njcn.device.pq.pojo.param.PulicTimeStatisParam ;
import com.njcn.device.pq.pojo.po.RStatOnlinerateD ;
import com.njcn.device.pq.pojo.vo.* ;
import com.njcn.device.pq.service.CommunicateService ;
import com.njcn.device.pq.service.LineService ;
import com.njcn.device.pq.utils.PublicDateUtil ;
import com.njcn.web.enums.DateFlagEnum ;
import lombok.AllArgsConstructor ;
import lombok.SneakyThrows ;
import org.apache.commons.lang.StringUtils ;
import org.springframework.stereotype.Service ;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.text.DecimalFormat ;
import java.text.ParseException ;
import java.text.SimpleDateFormat ;
import java.time.format.DateTimeFormatter ;
import java.util.* ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
/**
@@ -30,6 +39,8 @@ import java.util.*;
@AllArgsConstructor
public class CommunicateServiceImpl implements CommunicateService {
final float DEFAULT_ONLINE_RATE = 3 . 14159f ;
private final LineService lineService ;
private final RStatOnlinerateDMapper onlinerateDMapper ;
@@ -49,101 +60,79 @@ public class CommunicateServiceImpl implements CommunicateService {
String devId = lineService . getLineIdByDevId ( pulicTimeStatisParam . getId ( ) ) ;
List < Float > floatList = new ArrayList < > ( ) ;
List < Float > floats = new ArrayList < > ( ) ;
floatList . add ( getCondition ( pulicTimeStatisParam . getId ( ) , pulicTimeStatisParam . getSearchBeginTime ( ) , pulicTimeStatisParam . getSearchEndTime ( ) , 0 ) ) ;
floats . add ( getCondition ( devId , pulicTimeStatisParam . getSearchBeginTime ( ) , pulicTimeStatisParam . getSearchEndTime ( ) , 1 ) ) ;
floatList . add ( getCondition ( pulicTimeStatisParam . getId ( ) , pulicTimeStatisParam . getSearchBeginTime ( ) , pulicTimeStatisParam . getSearchEndTime ( ) , 0 ) ) ;
floats . add ( getCondition ( devId , pulicTimeStatisParam . getSearchBeginTime ( ) , pulicTimeStatisParam . getSearchEndTime ( ) , 1 ) ) ;
if ( StringUtils . isNotBlank ( pulicTimeStatisParam . getPeriodBeginTime ( ) ) & & StringUtils . isNotBlank ( pulicTimeStatisParam . getPeriodEndTime ( ) ) ) {
floatList . add ( getCondition ( pulicTimeStatisParam . getId ( ) , pulicTimeStatisParam . getPeriodBeginTime ( ) , pulicTimeStatisParam . getPeriodEndTime ( ) , 0 ) ) ;
floats . add ( getCondition ( devId , pulicTimeStatisParam . getPeriodBeginTime ( ) , pulicTimeStatisParam . getPeriodEndTime ( ) , 1 ) ) ;
floatList . add ( getCondition ( pulicTimeStatisParam . getId ( ) , pulicTimeStatisParam . getPeriodBeginTime ( ) , pulicTimeStatisParam . getPeriodEndTime ( ) , 0 ) ) ;
floats . add ( getCondition ( devId , pulicTimeStatisParam . getPeriodBeginTime ( ) , pulicTimeStatisParam . getPeriodEndTime ( ) , 1 ) ) ;
}
communicateStatisticsVO . setOnlineRateData ( floats ) ;
communicateStatisticsVO . setIntegrityData ( floatList ) ;
return communicateStatisticsVO ;
}
@SneakyThrows
@Override
public List < DeviceOnlineDataVO > getRunOnlineRateData ( PulicTimeParam pulicTimeParam ) {
List < DeviceOnlineDataVO > deviceOnlineDataList = new ArrayList < > ( ) ;
//根据监测点id获取终端id
String devId = lineService . getLineIdByDevId ( pulicTimeParam . getId ( ) ) ;
DecimalFormat decimalFormat = new DecimalFormat ( " .00 " ) ;
Float floatList ;
if ( pulicTimeParam . getTimeFlag ( ) = = 0 ) {
// 获取两个时间的之间的月份
List < String > int ervalTime = this . getIntervalTime ( pulicTimeParam . getSearchBeginTime ( ) , pulicTimeParam . getSearchEndTime ( ) ) ;
LambdaQueryWrapper < RStatOnlinerateD > lambdaQueryWrapper = new LambdaQueryWrapper < > ( ) ;
lambdaQueryWrapper . eq ( RStatOnlinerateD : : getDevIndex , devId )
. between ( RStatOnlinerateD : : getTimeId , pulicTimeParam . getSearchBeginTime ( ) , pulicTimeParam . getSearchEndTime ( ) ) ;
List < R StatOnlinerateD > rStatOnl inerateDList = onlinerateDMapper . selectList ( lambdaQueryWrapper ) ;
List < String > intervalTime = processDateRange ( pulicTimeParam . getSearchBeginTime ( ) , pulicTimeParam . getSearchEndTime ( ) , pulicTimeParam . getTimeFlag ( ) ) ;
if ( isMonthlyTimeFlag ( pulicTimeParam . getTimeFlag ( ) ) ) {
// 按月处理
Map < String , List < RStatOnlinerateD > > map = rStatOnlinerateDList . stream ( ) . collect ( Collectors . groupingBy ( it - > it . getTimeId ( ) . format ( DateTimeFormatter . ofPattern ( DatePattern . NORM_MONTH_PATTERN ) ) ) ) ;
for ( String interTime : intervalTime ) {
DeviceOnlineDataVO inter = new DeviceOnlineDataVO ( ) ;
String startTime , end Time;
inter . setMonth ( interTime . substring ( 5 ) ) ;
inter . s etYear ( interTime . substring ( 0 , 4 ) ) ;
inter . setDay ( " / " ) ;
startTime = PublicDateUtil . getFisrtDayOfMonth ( Integer . parseInt ( interTime . substring ( 0 , 4 ) ) , Integer . parseInt ( interTime . substring ( 5 ) ) ) ;
endTime = PublicDateUtil . getLastDayOfMonth ( Integer . parseInt ( interTime . substring ( 0 , 4 ) ) , Integer . parseInt ( interTime . substring ( 5 ) ) ) ;
floatList = getCondition ( devId , startTime , endTime , 1 ) ;
if ( floatList = = 0 ) {
inter . setOnlineRate ( 3 . 14159f ) ;
} else {
inter . setOnlineRate ( Float . parseFloat ( decimalFormat . format ( floatList ) ) ) ;
DeviceOnlineDataVO deviceOnlineDataVO = new DeviceOnlineDataVO ( ) ;
deviceOnlineDataVO . setDateView ( inter Time) ;
if ( map . containsKey ( interTime ) ) {
double rate = map . g et( interTime ) .stream ( ) . mapToDouble ( it - > ( double ) it . getOnlineMin ( ) / ( it . getOnlineMin ( ) + it . getOfflineMin ( ) ) ) . average ( ) . orElse ( 3 . 14159 ) ;
deviceOnlineDataVO . setOnlineRate ( rate = = DEFAULT_ONLINE_RATE ? DEFAULT_ONLINE_RATE : new BigDecimal ( rate * 100 ) . setScale ( 2 , RoundingMode . HALF_UP ) . floatValue ( ) ) ;
} else {
deviceOnlineDataVO . setOnlineRate ( DEFAULT_ONLINE_RATE ) ;
}
deviceOnlineDataList . add ( inter ) ;
deviceOnlineDataList . add ( deviceOnlineDataVO ) ;
}
} else {
List < String > intervalTime = this . getIntervalTime ( pulicTimeParam . getSearchBeginTime ( ) , pulicTimeParam . getSearchEndTime ( ) ) ;
for ( int j = 0 ; j < intervalTime . size ( ) ; j + + ) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( " yyyy-MM-dd " ) ;
Date dt ;
Date dtDate ;
if ( j = = 0 ) {
dt = simpleDateFormat . parse ( pulicTimeParam . getSearchBeginTime ( ) ) ;
} else {
String startTime = PublicDateUtil . getFisrtDayOfMonth ( Integer . parseInt ( intervalTime . get ( j ) . substring ( 0 , 4 ) ) , Integer . parseInt ( intervalTime . get ( j ) . substring ( 5 ) ) ) ;
dt = simpleDateFormat . parse ( startTime ) ;
}
int beginDay = Integer . valueOf ( String . format ( " %td " , dt ) ) ;
if ( j = = intervalTime . size ( ) - 1 ) {
dtDate = simpleDateFormat . parse ( pulicTimeParam . getSearchEndTime ( ) ) ;
} else {
String startTime = PublicDateUtil . getLastDayOfMonth ( Integer . parseInt ( intervalTime . get ( j ) . substring ( 0 , 4 ) ) , Integer . parseInt ( intervalTime . get ( j ) . substring ( 5 ) ) ) ;
dtDate = simpleDateFormat . parse ( startTime ) ;
}
Integer year = Integer . valueOf ( String . format ( " %tY " , dt ) ) ;
Integer mon = Integer . valueOf ( String . format ( " %tm " , dt ) ) ;
Integer day = Integer . valueOf ( String . format ( " %td " , dtDate ) ) ;
List < String > dayTime = this . getIntervalDateTime ( year , beginDay , mon , day ) ;
for ( String interTime : dayTime ) {
DeviceOnlineDataVO inter = new DeviceOnlineDataVO ( ) ;
String startTime , endTime ;
inter . setMonth ( interTime . substring ( 5 , 7 ) ) ;
inter . setYear ( interTime . substring ( 0 , 4 ) ) ;
inter . setDay ( interTime . substring ( 8 ) ) ;
startTime = simpleDateFormat . format ( DateUtil . beginOfDay ( DateUtil . parse ( interTime ) ) ) ;
endTime = simpleDateFormat . format ( DateUtil . endOfDay ( DateUtil . parse ( interTime ) ) ) ;
floatList = getCondition ( devId , startTime , endTime , 1 ) ;
if ( floatList = = 0 ) {
inter . setOnlineRate ( 3 . 14159f ) ;
} else {
inter . setOnlineRate ( Float . parseFloat ( decimalFormat . format ( floatList ) ) ) ;
}
deviceOnlineDataList . add ( inter ) ;
// 按日处理
Map < String , List < RStatOnlinerateD > > map = rStatOnlinerateDList . stream ( ) . collect ( Collectors . groupingBy ( it - > it . getTimeId ( ) . format ( DateTimeFormatter . ofPattern ( DatePattern . NORM_DATE_PATTERN ) ) ) ) ;
for ( String interTime : intervalTime ) {
DeviceOnlineDataVO deviceOnlineDataVO = new DeviceOnlineDataVO ( ) ;
deviceOnlineDataVO . setDateView ( interTime ) ;
if ( map . containsKey ( interTime ) ) {
double rate = map . get ( interTime ) . stream ( ) . mapToDouble ( it - > ( double ) it . getOnlineMin ( ) / ( it . getOnlineMin ( ) + it . getOfflineMin ( ) ) ) . average ( ) . orElse ( 3 . 14159 ) ;
deviceOnlineDataVO . setOnlineRate ( rate = = DEFAULT_ONLINE_RATE ? DEFAULT_ONLINE_RATE : new BigDecimal ( rate * 100 ) . setScale ( 2 , RoundingMode . HALF_UP ) . floatValue ( ) ) ;
} else {
deviceOnlineDataVO . setOnlineRate ( DEFAULT_ONLINE_RATE ) ;
}
deviceOnlineDataList . add ( deviceOnlineDataVO ) ;
}
}
return deviceOnlineDataList ;
}
// 判断是否为按月/季/年统计
private boolean isMonthlyTimeFlag ( int timeFlag ) {
return timeFlag = = 1 | | timeFlag = = 2 ;
}
/**
* influxDB相关操作
* 查询监测点的数据完整性
*/
private Float getCondition ( String lineList , String startTime , String endTime , Integer state ) {
final Float [ ] resultList = { 0 . 0f } ;
OnlineRateParam param = new OnlineRateParam ( ) ;
OnlineRateParam param = new OnlineRateParam ( ) ;
param . setIds ( Arrays . asList ( lineList ) ) ;
param . setStartTime ( DateUtil . beginOfDay ( DateUtil . parse ( startTime ) ) . toString ( ) ) ;
param . setEndTime ( DateUtil . endOfDay ( DateUtil . parse ( endTime ) ) . toString ( ) ) ;
param . setStartTime ( DateUtil . beginOfDay ( DateUtil . parse ( startTime ) ) . toString ( ) ) ;
param . setEndTime ( DateUtil . endOfDay ( DateUtil . parse ( endTime ) ) . toString ( ) ) ;
if ( state = = 1 ) {
//在线率
List < RStatOnlinerateVO > onlineRateByDevIds = onlinerateDMapper . getOnlineRateByDevIds ( param ) ;
@@ -166,131 +155,34 @@ public class CommunicateServiceImpl implements CommunicateService {
return resultList [ 0 ] ;
}
/**
* 根据用户选择的时间区间返回月份日期
*/
@SneakyThrows
private List < String > getIntervalTime ( String startTime , String endTime ) {
List < String > times = new ArrayList < > ( ) ;
SimpleDateFormat sdf = new SimpleDateFormat ( " yyyy-MM " ) ;
Date start = sdf . parse ( startTime ) ;
Date end = sdf . parse ( endTime ) ;
// 同月
if ( start. getTime ( ) = = end . getTime ( ) ) {
String time = startTime . substring ( 0 , 7 ) ;
times . add ( tim e ) ;
} else if ( start . getYear ( ) = = end . getYear ( ) ) {
// 同年
int startM = start . getMonth ( ) + 1 ;
int endM = end . getMonth ( ) + 1 ;
int temp = endM - startM ;
for ( int i = 0 ; i < = temp ; i + + ) {
String time = start . getYear ( ) + 1900 + " " ;
int month = startM + i ;
if ( month < 10 ) {
time = time + " -0 " + month ;
} else {
time = time + " - " + month ;
}
times . add ( time ) ;
}
public static List < String > processDateRange ( String startDateStr , String endDateStr , Integer timeType ) {
DateTime startDate = DateUtil . parse ( startDateStr , DatePattern . NORM_DATE_PATTERN ) ;
DateTime endDate = DateUtil . parse ( endDateStr , DatePattern . NORM_DATE_PATTERN ) ;
List < String > result = new ArrayList < > ( ) ;
// 计算月份差( 基于每月1号计算)
DateTime startMonth = DateUtil . beginOfMonth ( startDate ) ;
DateTime endMonth = DateUtil . beginOfMonth ( endDate ) ;
long monthsBetween = DateUtil . betweenMonth ( startMonth , endMonth , fals e ) ;
if ( Objects . equals ( timeType , DateFlagEnum . WEEK_FLAG . getCode ( ) ) | | Objects . equals ( timeType , DateFlagEnum . CUSTOM_FLAG . getCode ( ) ) | | Objects . equals ( timeType , DateFlagEnum . MONTH_FLAG . getCode ( ) ) ) {
// 同一个月,返回每天日期
DateRange dailyRange = new DateRange ( startDate , endDate , DateField . DAY_OF_MONTH ) ;
dailyRange . forEach ( date - > result . add ( DateUtil . format ( date , DatePattern . NORM_DATE_PATTERN ) ) ) ;
} else {
// 不同年!!!!这里忽略了年份之间跨年的情况
int startY = start . getYear ( ) + 1900 ;
int startM = start . getMonth ( ) + 1 ;
int endY = end . getYear ( ) + 1900 ;
int endM = end . g etMonth( ) + 1 ;
int tempS = 12 - startM ;
// 连续的年份
if ( endY - startY = = 1 ) {
// 第一年的时间获取
for ( int i = 0 ; i < = tempS ; i + + ) {
int month = startM + i ;
String time = startY + " - " ;
if ( month < 10 ) {
time = time + " 0 " + month ;
} else {
time = time + month ;
}
times . add ( time ) ;
}
// 第二年的时间获取
for ( int i = 1 ; i < = endM ; i + + ) {
String time = endY + " - " ;
if ( i < 10 ) {
time = time + " 0 " + i ;
} else {
time = time + i ;
}
times . add ( time ) ;
}
} else {
// 不连续的年份
// 第一年的时间获取
for ( int i = 0 ; i < = tempS ; i + + ) {
int month = startM + i ;
String time = startY + " - " ;
if ( month < 10 ) {
time = time + " 0 " + month ;
} else {
time = time + month ;
}
times . add ( time ) ;
}
int tempY = endY - startY ;
// 中间年份的时间
for ( int i = 1 ; i < tempY ; i + + ) {
for ( int j = 1 ; j < = 12 ; j + + ) {
String time = startY + i + " - " ;
if ( j < 10 ) {
time = time + " 0 " + j ;
} else {
time = time + j ;
}
times . add ( time ) ;
}
}
// 最后一年的时间获取
for ( int i = 1 ; i < = endM ; i + + ) {
String time = endY + " - " ;
if ( i < 10 ) {
time = time + " 0 " + i ;
} else {
time = time + i ;
}
times . add ( time ) ;
}
// 大于一个季度,返回每月第一天日期
DateTime current = DateUtil . beginOfMonth ( startDate ) ;
while ( current . isBeforeOrEquals ( endDate ) ) {
result . add ( DateUtil . format ( current , DatePattern . NORM_MONTH_PATTERN ) ) ;
current = DateUtil . offs etMonth( current , 1 ) ;
}
}
return times ;
return result ;
}
@SneakyThrows
private List < String > getIntervalDateTime ( Integer startTime , int beginDay , Integer endTime , Integer dd ) {
List < String > list = new ArrayList < > ( ) ;
Calendar calendar = Calendar . getInstance ( Locale . CHINA ) ;
calendar . set ( startTime , endTime - 1 , 1 ) ;
int year = calendar . get ( Calendar . YEAR ) ; //年份
int month = calendar . get ( Calendar . MONTH ) + 1 ; //月份
for ( int i = beginDay ; i < = dd ; i + + ) {
String date = null ;
if ( month < 10 & & i < 10 ) {
date = year + " -0 " + month + " -0 " + i ;
}
if ( month < 10 & & i > = 10 ) {
date = year + " -0 " + month + " - " + i ;
}
if ( month > = 10 & & i < 10 ) {
date = year + " - " + month + " -0 " + i ;
}
if ( month > = 10 & & i > = 10 ) {
date = year + " - " + month + " - " + i ;
}
list . add ( date ) ;
}
return list ;
}
}