@@ -1178,6 +1178,155 @@ public class PileStationInfoServiceImpl implements PileStationInfoService {
return vo ;
}
/**
* 获取站点运营分析信息( 7天、30天)
*
* @param dto
*/
@Override
public StationBusinessAnalyzeInfoVO getStationBusinessAnalyzeInfoV1 ( StationBusinessAnalyzeInfoDTO dto ) {
StationBusinessAnalyzeInfoVO vo = new StationBusinessAnalyzeInfoVO ( ) ;
String dateTime = dto . getDateTime ( ) ;
String type = dto . getType ( ) ;
List < String > stationIds = dto . getStationIds ( ) ;
// 如果没有传 stationIds, 则查当前账号下所有站点
if ( CollectionUtils . isEmpty ( stationIds ) ) {
List < MerchantInfoVO > merchantInfoVOList = UserUtils . getMerchantInfoVOList ( ) ;
if ( CollectionUtils . isEmpty ( merchantInfoVOList ) ) {
throw new BusinessException ( ReturnCodeEnum . CODE_SELECT_INFO_IS_NULL ) ;
}
List < String > merchantIds = merchantInfoVOList . stream ( )
. map ( MerchantInfoVO : : getMerchantId )
. collect ( Collectors . toList ( ) ) ;
List < PileStationInfo > pileStationInfos = getStationInfosByMerchantIds ( merchantIds ) ;
if ( CollectionUtils . isEmpty ( pileStationInfos ) ) {
throw new BusinessException ( ReturnCodeEnum . CODE_SELECT_INFO_IS_NULL ) ;
}
stationIds = pileStationInfos . stream ( )
. map ( x - > String . valueOf ( x . getId ( ) ) )
. collect ( Collectors . toList ( ) ) ;
}
List < BusinessOrderDetailInfoVO > orderDetails ;
if ( StringUtils . equals ( Constants . THREE , type ) ) {
// 近12个月
String startTime = DateUtils . getFirstDayOfLastYearMonth ( ) ; // 去年同月第一天
String endTime = DateUtils . getLastDayOfCurrentMonth ( ) ; // 本月最后一天
orderDetails = orderBasicInfoService . getOrderDetailByStationIdsForMonth ( stationIds , startTime , endTime ) ;
} else {
// 日期区间( 7天或30天)
Date startDate ;
if ( StringUtils . equals ( Constants . ONE , type ) ) {
startDate = DateUtils . addDays ( new Date ( ) , - 7 ) ;
} else if ( StringUtils . equals ( Constants . TWO , type ) ) {
startDate = DateUtils . addDays ( new Date ( ) , - 30 ) ;
} else {
// 默认7天
startDate = DateUtils . addDays ( new Date ( ) , - 7 ) ;
}
String startTime = DateUtils . parseDateToStr ( DateUtils . YYYY_MM_DD , startDate ) ;
String endTime = DateUtils . dateTimeNow ( DateUtils . YYYY_MM_DD ) ;
orderDetails = orderBasicInfoService . getOrderDetailByStationIds ( stationIds , startTime , endTime ) ;
}
if ( CollectionUtils . isEmpty ( orderDetails ) ) {
return vo ;
}
// 空值安全处理
for ( BusinessOrderDetailInfoVO orderDetail : orderDetails ) {
orderDetail . setSharpAmount ( Optional . ofNullable ( orderDetail . getSharpAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setPeakAmount ( Optional . ofNullable ( orderDetail . getPeakAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setFlatAmount ( Optional . ofNullable ( orderDetail . getFlatAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setValleyAmount ( Optional . ofNullable ( orderDetail . getValleyAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setSharpUsedElectricity ( Optional . ofNullable ( orderDetail . getSharpUsedElectricity ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setPeakUsedElectricity ( Optional . ofNullable ( orderDetail . getPeakUsedElectricity ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setFlatUsedElectricity ( Optional . ofNullable ( orderDetail . getFlatUsedElectricity ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setValleyUsedElectricity ( Optional . ofNullable ( orderDetail . getValleyUsedElectricity ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setTotalServiceAmount ( Optional . ofNullable ( orderDetail . getTotalServiceAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
orderDetail . setSettleAmount ( Optional . ofNullable ( orderDetail . getSettleAmount ( ) ) . orElse ( BigDecimal . ZERO ) ) ;
}
// 聚合汇总
Map < String , BusinessOrderDetailInfoVO > collect = orderDetails . stream ( )
. sorted ( Comparator . comparing ( BusinessOrderDetailInfoVO : : getTradeDate ) )
. collect ( Collectors . toMap ( BusinessOrderDetailInfoVO : : getTradeDate , Function . identity ( ) , ( a , b ) - > {
a . setSharpUsedElectricity ( a . getSharpUsedElectricity ( ) . add ( b . getSharpUsedElectricity ( ) ) ) ;
a . setSharpAmount ( a . getSharpAmount ( ) . add ( b . getSharpAmount ( ) ) ) ;
a . setPeakUsedElectricity ( a . getPeakUsedElectricity ( ) . add ( b . getPeakUsedElectricity ( ) ) ) ;
a . setPeakAmount ( a . getPeakAmount ( ) . add ( b . getPeakAmount ( ) ) ) ;
a . setFlatUsedElectricity ( a . getFlatUsedElectricity ( ) . add ( b . getFlatUsedElectricity ( ) ) ) ;
a . setFlatAmount ( a . getFlatAmount ( ) . add ( b . getFlatAmount ( ) ) ) ;
a . setValleyUsedElectricity ( a . getValleyUsedElectricity ( ) . add ( b . getValleyUsedElectricity ( ) ) ) ;
a . setValleyAmount ( a . getValleyAmount ( ) . add ( b . getValleyAmount ( ) ) ) ;
a . setTotalServiceAmount ( a . getTotalServiceAmount ( ) . add ( b . getTotalServiceAmount ( ) ) ) ;
a . setSettleAmount ( a . getSettleAmount ( ) . add ( b . getSettleAmount ( ) ) ) ;
a . setTotalUsedElectricity (
a . getSharpUsedElectricity ( )
. add ( a . getPeakUsedElectricity ( ) )
. add ( a . getFlatUsedElectricity ( ) )
. add ( a . getValleyUsedElectricity ( ) )
) ;
return a ;
} ) ) ;
// TreeMap 排序
TreeMap < String , BusinessOrderDetailInfoVO > map = new TreeMap < > ( collect ) ;
List < BusinessOrderDetailInfoVO > detailList = new ArrayList < > ( map . values ( ) ) ;
// 对比变量
BigDecimal todayUsed = BigDecimal . ZERO , yesterdayUsed = BigDecimal . ZERO ;
BigDecimal todaySettle = BigDecimal . ZERO , yesterdaySettle = BigDecimal . ZERO ;
BigDecimal todayService = BigDecimal . ZERO , yesterdayService = BigDecimal . ZERO ;
BusinessOrderDetailInfoVO todayInfo = null , yesterdayInfo = null ;
if ( StringUtils . isNotBlank ( dateTime ) ) {
todayInfo = map . get ( dateTime ) ;
String yesterdayStr = DateUtils . parseDateToStr ( DateUtils . YYYY_MM_DD ,
DateUtils . addDays ( DateUtils . parseDate ( dateTime ) , - 1 ) ) ;
yesterdayInfo = map . get ( yesterdayStr ) ;
} else if ( ! detailList . isEmpty ( ) & & detailList . size ( ) > 1 ) {
todayInfo = detailList . get ( detailList . size ( ) - 1 ) ;
yesterdayInfo = detailList . get ( detailList . size ( ) - 2 ) ;
}
if ( todayInfo ! = null & & yesterdayInfo ! = null ) {
todayUsed = todayInfo . getTotalUsedElectricity ( ) ;
yesterdayUsed = yesterdayInfo . getTotalUsedElectricity ( ) ;
todaySettle = todayInfo . getSettleAmount ( ) ;
yesterdaySettle = yesterdayInfo . getSettleAmount ( ) ;
todayService = todayInfo . getTotalServiceAmount ( ) ;
yesterdayService = yesterdayInfo . getTotalServiceAmount ( ) ;
}
// 计算增长率
vo . setElectricityGrowthRate ( calcGrowthRate ( todayUsed , yesterdayUsed ) ) ;
vo . setOrderAmountGrowthRate ( calcGrowthRate ( todaySettle , yesterdaySettle ) ) ;
vo . setServiceAmountGrowthRate ( calcGrowthRate ( todayService , yesterdayService ) ) ;
vo . setBusinessOrderDetailInfoVOList ( detailList ) ;
return vo ;
}
/** 计算增长率 */
private String calcGrowthRate ( BigDecimal now , BigDecimal last ) {
if ( last = = null | | last . compareTo ( BigDecimal . ZERO ) = = 0 ) {
return " 0% " ;
}
BigDecimal rate = now . subtract ( last )
. divide ( last , 4 , BigDecimal . ROUND_HALF_UP )
. multiply ( new BigDecimal ( " 100 " ) ) ;
return rate . stripTrailingZeros ( ) . toPlainString ( ) + " % " ;
}
/**
* 获取站点运营分析信息( 12个月)
*