This commit is contained in:
Guoqs
2024-07-30 14:52:17 +08:00
12 changed files with 492 additions and 17 deletions

View File

@@ -0,0 +1,40 @@
package com.jsowell.pile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 获取站点运营分析信息DTO
*
* @author Lemon
* @Date 2024/7/24 15:36:29
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StationBusinessAnalyzeInfoDTO {
/**
* 日期类型
* 1-近7天
* 2-近30天
* 3-近12个月
*/
private String type;
/**
* 选中日期
*/
private String dateTime;
/**
* 站点id
*/
private String stationId;
private List<String> stationIds;
}

View File

@@ -5,8 +5,10 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* TODO
* 站点统计信息DTO
*
* @author Lemon
* @Date 2024/7/23 15:52:34
@@ -18,6 +20,8 @@ import lombok.NoArgsConstructor;
public class StationStatisticsInfoDTO {
private String merchantId;
private List<String> stationIds;
private String startTime;
private String endTime;

View File

@@ -5,6 +5,7 @@ import com.jsowell.pile.domain.OrderDetail;
import com.jsowell.pile.dto.*;
import com.jsowell.pile.dto.nanrui.NRQueryOrderDTO;
import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryOrdersInfoDTO;
import com.jsowell.pile.vo.BusinessOrderDetailInfoVO;
import com.jsowell.pile.vo.SupStationStatsVO;
import com.jsowell.pile.vo.base.MerchantOrderInfoVO;
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
@@ -368,4 +369,13 @@ public interface OrderBasicInfoMapper {
List<SupStationStatsVO> queryOrderListByStationId(String stationId);
List<OrderListVO> queryOrderByOccupyTime(QueryOrderDTO dto);
/**
* 通过站点id查询订单详情
* @param stationIds
* @param startTime
* @param endTime
* @return
*/
List<BusinessOrderDetailInfoVO> getOrderDetailByStationIds(@Param("stationIds") List<String> stationIds, @Param("startTime") String startTime, @Param("endTime") String endTime);
}

View File

@@ -12,6 +12,7 @@ import com.jsowell.pile.domain.SettleOrderReport;
import com.jsowell.pile.dto.*;
import com.jsowell.pile.dto.nanrui.NRQueryOrderDTO;
import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryOrdersInfoDTO;
import com.jsowell.pile.vo.BusinessOrderDetailInfoVO;
import com.jsowell.pile.vo.SupStationStatsVO;
import com.jsowell.pile.vo.base.MerchantOrderInfoVO;
import com.jsowell.pile.vo.base.OrderAmountDetailVO;
@@ -460,4 +461,12 @@ public interface OrderBasicInfoService{
* @return
*/
List<OrderListVO> queryOrderByOccupyTime(QueryOrderDTO dto);
/**
* 通过站点idList创建时间查询订单数据详情
* @param stationIds
* @param startTime
* @param endTime
*/
List<BusinessOrderDetailInfoVO> getOrderDetailByStationIds(List<String> stationIds, String startTime, String endTime);
}

View File

@@ -2,13 +2,11 @@ package com.jsowell.pile.service;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.pile.domain.PileStationInfo;
import com.jsowell.pile.dto.FastCreateStationDTO;
import com.jsowell.pile.dto.QueryStationDTO;
import com.jsowell.pile.dto.QueryStationInfoDTO;
import com.jsowell.pile.dto.StationStatisticsInfoDTO;
import com.jsowell.pile.dto.*;
import com.jsowell.pile.dto.amap.GetStationInfoDTO;
import com.jsowell.pile.dto.lutongyunting.BindParkingPlatformDTO;
import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryStationInfoDTO;
import com.jsowell.pile.vo.StationBusinessAnalyzeInfoVO;
import com.jsowell.pile.vo.base.ThirdPartyStationInfoVO;
import com.jsowell.pile.vo.ningxiajiaotou.NXJTStationInfoVO;
import com.jsowell.pile.vo.uniapp.business.StationStatisticsInfosVO;
@@ -160,4 +158,10 @@ public interface PileStationInfoService {
* @param dto
*/
List<StationStatisticsInfosVO> getStationStatisticsInfos(StationStatisticsInfoDTO dto);
/**
* 获取站点运营分析信息
* @param dto
*/
StationBusinessAnalyzeInfoVO getStationBusinessAnalyzeInfo(StationBusinessAnalyzeInfoDTO dto);
}

View File

@@ -49,6 +49,7 @@ import com.jsowell.pile.transaction.dto.ClearingBillTransactionDTO;
import com.jsowell.pile.transaction.dto.OrderTransactionDTO;
import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.util.UserUtils;
import com.jsowell.pile.vo.BusinessOrderDetailInfoVO;
import com.jsowell.pile.vo.SupStationStatsVO;
import com.jsowell.pile.vo.base.PileInfoVO;
import com.jsowell.pile.vo.base.*;
@@ -3732,5 +3733,17 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
return orderBasicInfoMapper.queryOrderByOccupyTime(dto);
}
/**
* 通过站点id查询订单详情
* @param stationIds
* @param startTime
* @param endTime
* @return
*/
@Override
public List<BusinessOrderDetailInfoVO> getOrderDetailByStationIds(List<String> stationIds, String startTime, String endTime) {
return orderBasicInfoMapper.getOrderDetailByStationIds(stationIds, startTime, endTime);
}
}

View File

@@ -27,6 +27,8 @@ import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryStationInfoDTO;
import com.jsowell.pile.mapper.PileStationInfoMapper;
import com.jsowell.pile.service.*;
import com.jsowell.pile.util.UserUtils;
import com.jsowell.pile.vo.BusinessOrderDetailInfoVO;
import com.jsowell.pile.vo.StationBusinessAnalyzeInfoVO;
import com.jsowell.pile.vo.SupStationStatsVO;
import com.jsowell.pile.vo.base.*;
import com.jsowell.pile.vo.ningxiajiaotou.NXJTStationInfoVO;
@@ -45,10 +47,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -642,6 +641,7 @@ public class PileStationInfoServiceImpl implements PileStationInfoService {
@Override
public List<StationStatisticsInfosVO> getStationStatisticsInfos(StationStatisticsInfoDTO dto) {
String merchantId = dto.getMerchantId();
List<String> stationIds = dto.getStationIds();
// 获取当前登录账号的运营商权限
List<MerchantInfoVO> merchantInfoVOList = UserUtils.getMerchantInfoVOList();
List<String> merchantIds = new ArrayList<>();
@@ -653,15 +653,17 @@ public class PileStationInfoServiceImpl implements PileStationInfoService {
}else {
merchantIds.add(merchantId);
}
// 根据运营商ids查出所有站点id
List<PileStationInfo> pileStationInfos = getStationInfosByMerchantIds(merchantIds);
if (CollectionUtils.isEmpty(pileStationInfos)) {
// 未查到该运营商下的站点
throw new BusinessException(ReturnCodeEnum.CODE_SELECT_INFO_IS_NULL);
if (CollectionUtils.isEmpty(stationIds)) {
// 根据运营商ids查出所有站点id
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<String> stationIds = pileStationInfos.stream()
.map(x -> String.valueOf(x.getId()))
.collect(Collectors.toList());
// 创建DecimalFormat对象并设置格式
DecimalFormat df = new DecimalFormat("0.00%");
// 根据站点ids查询站点营收报表
@@ -741,5 +743,188 @@ public class PileStationInfoServiceImpl implements PileStationInfoService {
return resultList;
}
/**
* 获取站点运营分析信息
* @param dto
*/
@Override
public StationBusinessAnalyzeInfoVO getStationBusinessAnalyzeInfo(StationBusinessAnalyzeInfoDTO dto) {
StationBusinessAnalyzeInfoVO vo = new StationBusinessAnalyzeInfoVO();
String dateTime = dto.getDateTime();
// 获取type类型
String type = dto.getType();
// 获取站点id如果为空则默认查询该账号下所有站点
String stationId = dto.getStationId();
List<String> stationIds = new ArrayList<>();
if (stationId == null) {
List<MerchantInfoVO> merchantInfoVOList = UserUtils.getMerchantInfoVOList();
List<String> merchantIds = merchantInfoVOList.stream()
.map(MerchantInfoVO::getMerchantId)
.collect(Collectors.toList());
// 根据运营商ids查出所有站点id
List<PileStationInfo> pileStationInfos = getStationInfosByMerchantIds(merchantIds);
stationIds = pileStationInfos.stream()
.map(x -> String.valueOf(x.getId()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(pileStationInfos)) {
// 未查到该运营商下的站点
throw new BusinessException(ReturnCodeEnum.CODE_SELECT_INFO_IS_NULL);
}
} else {
stationIds.add(stationId);
}
// 日期区间
String startTime = null;
String endTime = null;
if (dateTime == null) {
// 用户未选中某天时
Date date = null;
if (StringUtils.equals(Constants.ONE, type)) {
// 7天
date = DateUtils.addDays(new Date(), -7);
}else if (StringUtils.equals(Constants.TWO, type)) {
// 30天
date = DateUtils.addDays(new Date(), -30);
}
startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date);
endTime = DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD);
} else {
// 用户选中某天的数据时↓
startTime = dateTime;
endTime = dateTime;
}
// 根据站点ids和日期区间查询订单详情
List<BusinessOrderDetailInfoVO> orderDetails = orderBasicInfoService.getOrderDetailByStationIds(stationIds, startTime, endTime);
for (BusinessOrderDetailInfoVO orderDetail : orderDetails) {
if (orderDetail.getSharpAmount() == null) {
orderDetail.setSharpAmount(BigDecimal.ZERO);
}
if (orderDetail.getPeakAmount() == null) {
orderDetail.setPeakAmount(BigDecimal.ZERO);
}
if (orderDetail.getFlatAmount() == null) {
orderDetail.setFlatAmount(BigDecimal.ZERO);
}
if (orderDetail.getValleyAmount() == null) {
orderDetail.setValleyAmount(BigDecimal.ZERO);
}
if (orderDetail.getSharpUsedElectricity() == null) {
orderDetail.setSharpUsedElectricity(BigDecimal.ZERO);
}
if (orderDetail.getPeakUsedElectricity() == null) {
orderDetail.setPeakUsedElectricity(BigDecimal.ZERO);
}
if (orderDetail.getFlatUsedElectricity() == null) {
orderDetail.setFlatUsedElectricity(BigDecimal.ZERO);
}
if (orderDetail.getValleyUsedElectricity() == null) {
orderDetail.setValleyUsedElectricity(BigDecimal.ZERO);
}
if (orderDetail.getTotalServiceAmount() == null) {
orderDetail.setTotalServiceAmount(BigDecimal.ZERO);
}
if (orderDetail.getSettleAmount() == null) {
orderDetail.setSettleAmount(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> businessOrderDetailInfoVOS = new ArrayList<>(map.values());
String usedElectricityRiseRate = "-";
String orderAmountRiseRate = "-";
String serviceAmountRiseRate = "-";
BigDecimal todayUsedElectricity = BigDecimal.ZERO;
BigDecimal yesterdayUsedElectricity = BigDecimal.ZERO;
BigDecimal todaySettleAmount = BigDecimal.ZERO;
BigDecimal yesterdaySettleAmount = BigDecimal.ZERO;
BigDecimal todayServiceAmount = BigDecimal.ZERO;
BigDecimal yesterdayServiceAmount = BigDecimal.ZERO;
if (dateTime != null) {
// 如果指定日期不为空,则将指定日期与指定日期的前一天进行数据对比
BusinessOrderDetailInfoVO orderDetailToday = map.get(dateTime); // 指定日期
// 指定日期前一天
String dateTimeYesterday = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.addDays(DateUtils.parseDate(dateTime), -1));
BusinessOrderDetailInfoVO orderDetailYesterday = collect.get(dateTimeYesterday);
if (orderDetailYesterday == null) {
// 如果为空,为第一天数据,默认置空
vo.setElectricityGrowthRate("-");
vo.setOrderAmountGrowthRate("-");
vo.setServiceAmountGrowthRate("-");
// vo.setBusinessOrderDetailInfoVOList();
}else {
// 充电量增长率
todayUsedElectricity = orderDetailToday.getTotalUsedElectricity();
yesterdayUsedElectricity = orderDetailYesterday.getTotalUsedElectricity();
// 订单金额增长率
todaySettleAmount = orderDetailToday.getSettleAmount();
yesterdaySettleAmount = orderDetailYesterday.getSettleAmount();
// 服务费增长率
todayServiceAmount = orderDetailToday.getTotalServiceAmount();
yesterdayServiceAmount = orderDetailYesterday.getTotalServiceAmount();
}
}else {
// 如果指定日期为空,则默认最后一天(当天)与前一天做对比
BusinessOrderDetailInfoVO orderDetailToday = businessOrderDetailInfoVOS.get(businessOrderDetailInfoVOS.size() - 1);
BusinessOrderDetailInfoVO orderDetailYesterday = businessOrderDetailInfoVOS.get(businessOrderDetailInfoVOS.size() - 2);
// 充电量增长率
todayUsedElectricity = orderDetailToday.getTotalUsedElectricity();
yesterdayUsedElectricity = orderDetailYesterday.getTotalUsedElectricity();
// 订单金额增长率
todaySettleAmount = orderDetailToday.getSettleAmount();
yesterdaySettleAmount = orderDetailYesterday.getSettleAmount();
// 服务费增长率
todayServiceAmount = orderDetailToday.getTotalServiceAmount();
yesterdayServiceAmount = orderDetailYesterday.getTotalServiceAmount();
}
if (yesterdayUsedElectricity.compareTo(BigDecimal.ZERO) == 0) {
usedElectricityRiseRate = "0%";
}else {
BigDecimal divideUsedElectricity = todayUsedElectricity.subtract(yesterdayUsedElectricity).divide(yesterdayUsedElectricity, 2, BigDecimal.ROUND_HALF_UP);
usedElectricityRiseRate = divideUsedElectricity.multiply(new BigDecimal("100")) + "%";
}
if (yesterdaySettleAmount.compareTo(BigDecimal.ZERO) == 0) {
orderAmountRiseRate = "0%";
}else {
BigDecimal divideSettleAmount = todaySettleAmount.subtract(yesterdaySettleAmount).divide(yesterdaySettleAmount, 2, BigDecimal.ROUND_HALF_UP);
orderAmountRiseRate = divideSettleAmount.multiply(new BigDecimal("100")) + "%";
}
if (yesterdayServiceAmount.compareTo(BigDecimal.ZERO) == 0) {
serviceAmountRiseRate = "0%";
}else {
BigDecimal divideServiceAmount = todayServiceAmount.subtract(yesterdayServiceAmount).divide(yesterdayServiceAmount, 2, BigDecimal.ROUND_HALF_UP);
serviceAmountRiseRate = divideServiceAmount.multiply(new BigDecimal("100")) + "%";
}
vo.setElectricityGrowthRate(usedElectricityRiseRate);
vo.setServiceAmountGrowthRate(serviceAmountRiseRate);
vo.setOrderAmountGrowthRate(orderAmountRiseRate);
vo.setBusinessOrderDetailInfoVOList(businessOrderDetailInfoVOS);
return vo;
}
}

View File

@@ -0,0 +1,110 @@
package com.jsowell.pile.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* 运营端小程序订单详情VO
*
* @author Lemon
* @Date 2024/7/27 15:05:00
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BusinessOrderDetailInfoVO {
/**
* 交易日期
*/
private String tradeDate;
/**
* 订单号
*/
// private String orderCode;
/**
* 站点id
*/
private String stationId;
/**
* 尖时段用电量
*/
private BigDecimal sharpUsedElectricity;
/**
* 尖时段总金额
*/
private BigDecimal sharpAmount;
/**
* 尖时段电费
*/
private BigDecimal sharpElectricityPrice;
/**
* 峰时段用电量
*/
private BigDecimal peakUsedElectricity;
/**
* 峰时段总金额
*/
private BigDecimal peakAmount;
/**
* 峰时段电费
*/
private BigDecimal peakElectricityPrice;
/**
* 平时段用电量
*/
private BigDecimal flatUsedElectricity;
/**
* 平时段总金额
*/
private BigDecimal flatAmount;
/**
* 平时段电费
*/
private BigDecimal flatElectricityPrice;
/**
* 谷时段用电量
*/
private BigDecimal valleyUsedElectricity;
/**
* 谷时段总金额
*/
private BigDecimal valleyAmount;
/**
* 谷时段电费
*/
private BigDecimal valleyElectricityPrice;
/**
* 总服务费
*/
private BigDecimal totalServiceAmount;
/**
* 结算金额
*/
private BigDecimal settleAmount;
/**
* 总充电量
*/
private BigDecimal totalUsedElectricity;
}

View File

@@ -0,0 +1,38 @@
package com.jsowell.pile.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 运营端小程序站点运营统计数据VO
*
* @author Lemon
* @Date 2024/7/24 15:42:47
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StationBusinessAnalyzeInfoVO {
/**
* 充电量增长率
*/
private String electricityGrowthRate;
/**
* 订单金额增长率
*/
private String orderAmountGrowthRate;
/**
* 服务费增长率
*/
private String serviceAmountGrowthRate;
private List<BusinessOrderDetailInfoVO> businessOrderDetailInfoVOList;
}