This commit is contained in:
2023-08-26 18:19:23 +08:00
parent 23740f646c
commit 7529dd80b2
6 changed files with 175 additions and 34 deletions

View File

@@ -155,7 +155,7 @@ public class TempController extends BaseController {
dto.getStationIdList().parallelStream().forEach(stationId -> { dto.getStationIdList().parallelStream().forEach(stationId -> {
for (String tradeDate : dateList) { for (String tradeDate : dateList) {
orderBasicInfoService.generateDailyOrderReports(stationId, tradeDate); settleOrderReportService.generateDailyOrderReports(stationId, tradeDate);
} }
}); });

View File

@@ -4,9 +4,11 @@ import com.jsowell.pile.domain.SettleOrderReport;
import com.jsowell.pile.dto.MerchantOrderReportDTO; import com.jsowell.pile.dto.MerchantOrderReportDTO;
import com.jsowell.pile.vo.web.SettleOrderReportVO; import com.jsowell.pile.vo.web.SettleOrderReportVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository
public interface SettleOrderReportMapper { public interface SettleOrderReportMapper {
/** /**
* delete by primary key * delete by primary key

View File

@@ -100,4 +100,11 @@ public interface ISettleOrderReportService {
List<SettleOrderReport> queryOrderReport(List<String> stationIdList, String startTime, String endTime); List<SettleOrderReport> queryOrderReport(List<String> stationIdList, String startTime, String endTime);
/**
* 计算站点订单报表
*
* @param stationId 站点id
* @param tradeDate 交易日期
*/
void generateDailyOrderReports(String stationId, String tradeDate);
} }

View File

@@ -1,28 +0,0 @@
package com.jsowell.pile.service;
import java.util.List;
import com.jsowell.pile.domain.SettleOrderReport;
public interface SettleOrderReportService{
int deleteByPrimaryKey(Integer id);
int insert(SettleOrderReport record);
int insertOrUpdate(SettleOrderReport record);
int insertOrUpdateSelective(SettleOrderReport record);
int insertSelective(SettleOrderReport record);
SettleOrderReport selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(SettleOrderReport record);
int updateByPrimaryKey(SettleOrderReport record);
int updateBatch(List<SettleOrderReport> list);
int batchInsert(List<SettleOrderReport> list);
}

View File

@@ -2,33 +2,43 @@ package com.jsowell.pile.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO;
import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse;
import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.page.PageResponse; import com.jsowell.common.core.page.PageResponse;
import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.PageUtils; import com.jsowell.common.util.PageUtils;
import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.id.IdUtils;
import com.jsowell.pile.domain.SettleOrderReport; import com.jsowell.pile.domain.SettleOrderReport;
import com.jsowell.pile.dto.MerchantOrderReportDTO; import com.jsowell.pile.dto.MerchantOrderReportDTO;
import com.jsowell.pile.dto.QueryOrderDTO;
import com.jsowell.pile.dto.SettleOrderReportDTO; import com.jsowell.pile.dto.SettleOrderReportDTO;
import com.jsowell.pile.mapper.AdapayCallbackRecordMapper; import com.jsowell.pile.mapper.AdapayCallbackRecordMapper;
import com.jsowell.pile.mapper.OrderBasicInfoMapper;
import com.jsowell.pile.mapper.SettleOrderReportMapper; import com.jsowell.pile.mapper.SettleOrderReportMapper;
import com.jsowell.pile.service.ClearingWithdrawInfoService; import com.jsowell.pile.service.ClearingWithdrawInfoService;
import com.jsowell.pile.service.IPileMerchantInfoService; import com.jsowell.pile.service.IPileMerchantInfoService;
import com.jsowell.pile.service.IPileStationInfoService;
import com.jsowell.pile.service.ISettleOrderReportService; import com.jsowell.pile.service.ISettleOrderReportService;
import com.jsowell.pile.vo.web.ClearingBillVO; import com.jsowell.pile.vo.base.SplitSettleAmountVO;
import com.jsowell.pile.vo.web.MerchantOrderReportVO; import com.jsowell.pile.vo.web.*;
import com.jsowell.pile.vo.web.OrderSettleDetailVO; import lombok.extern.slf4j.Slf4j;
import com.jsowell.pile.vo.web.SettleOrderReportVO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 结算订单报Service业务层处理 * 结算订单报Service业务层处理
@@ -36,11 +46,18 @@ import java.util.List;
* @author jsowell * @author jsowell
* @date 2023-06-05 * @date 2023-06-05
*/ */
@Slf4j
@Service @Service
public class SettleOrderReportServiceImpl implements ISettleOrderReportService { public class SettleOrderReportServiceImpl implements ISettleOrderReportService {
@Autowired @Autowired
private SettleOrderReportMapper settleOrderReportMapper; private SettleOrderReportMapper settleOrderReportMapper;
@Autowired
private OrderBasicInfoMapper orderBasicInfoMapper;
@Autowired
private IPileStationInfoService pileStationInfoService;
@Autowired @Autowired
private AdapayCallbackRecordMapper adapayCallbackRecordMapper; private AdapayCallbackRecordMapper adapayCallbackRecordMapper;
@@ -323,5 +340,145 @@ public class SettleOrderReportServiceImpl implements ISettleOrderReportService {
return settleOrderReportMapper.queryOrderReport(stationIdList, startTime, endTime); return settleOrderReportMapper.queryOrderReport(stationIdList, startTime, endTime);
} }
/**
* 计算站点订单报表
*
* @param stationId 站点id
* @param tradeDate 交易日期
*/
@Override
public void generateDailyOrderReports(String stationId, String tradeDate) {
// logger.info("线程名===={}", Thread.currentThread().getName());
if (StringUtils.isBlank(stationId)) {
return;
}
if (StringUtils.isBlank(tradeDate)) {
// 日期为空默认昨天
tradeDate = LocalDate.now().plusDays(-1).toString();
}
PileStationVO stationInfo = pileStationInfoService.getStationInfo(stationId);
// 查询站点前一天结算完成的订单
QueryOrderDTO dto = new QueryOrderDTO();
dto.setStationId(stationId);
LocalDate parse = LocalDate.parse(tradeDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String startTime = DateUtils.formatDateTime(LocalDateTime.of(parse, LocalTime.MIN));
String endTime = DateUtils.formatDateTime(LocalDateTime.of(parse, LocalTime.MAX));
dto.setStartSettleTime(startTime);
dto.setEndSettleTime(endTime);
// 查询结算完成的订单
List<OrderListVO> orderListVOS = orderBasicInfoMapper.selectOrderBasicInfoList(dto);
// if (CollectionUtils.isEmpty(orderListVOS)) {
// logger.info("站点:{}, 在{}-{}没有查询到订单数据", stationInfo.getStationName(), startTime, endTime);
// return;
// }
List<String> collect = orderListVOS.stream().map(OrderListVO::getOrderCode).collect(Collectors.toList());
log.info("站点:{}, 在{}-{}查询到订单数据{}条,订单编号:{}", stationInfo.getStationName(), startTime, endTime, orderListVOS.size(), collect);
// 统计出日报信息
BigDecimal useElectricity = BigDecimal.ZERO;
int chargeNum = 0;
long chargeTime = 0L;
BigDecimal totalElectricityAmount = BigDecimal.ZERO;
BigDecimal totalServiceAmount = BigDecimal.ZERO;
BigDecimal totalOrderAmount = BigDecimal.ZERO;
BigDecimal totalVirtualAmount = BigDecimal.ZERO;
BigDecimal totalSettleAmount = BigDecimal.ZERO;
List<String> orderCodeList = Lists.newArrayList();
for (OrderListVO vo : orderListVOS) {
// 统计结算金额大于0的
BigDecimal settleAmount = StringUtils.isBlank(vo.getSettleAmount())
? BigDecimal.ZERO
: new BigDecimal(vo.getSettleAmount());
if (settleAmount.compareTo(BigDecimal.ZERO) <= 0) {
// 只统计用电量大于0的
continue;
}
// 订单消费金额
String orderAmount = vo.getOrderAmount();
// 用电度数
BigDecimal chargingDegree = StringUtils.isBlank(vo.getChargingDegree())
? BigDecimal.ZERO
: new BigDecimal(vo.getChargingDegree());
// 充电度数累计
useElectricity = useElectricity.add(chargingDegree);
// 充电次数
chargeNum += 1;
orderCodeList.add(vo.getOrderCode());
// 充电时间累计
if (StringUtils.isNotBlank(vo.getChargeStartTime()) && StringUtils.isNotBlank(vo.getChargeEndTime())) {
long l = DateUtils.intervalTime(vo.getChargeStartTime(), vo.getChargeEndTime());
chargeTime += l;
}
// 电费金额
BigDecimal e = vo.getTotalElectricityAmount() != null ? vo.getTotalElectricityAmount() : BigDecimal.ZERO;
totalElectricityAmount = totalElectricityAmount.add(e);
// 服务费金额
BigDecimal serviceAmount = vo.getTotalServiceAmount() != null ? vo.getTotalServiceAmount() : BigDecimal.ZERO;
totalServiceAmount = totalServiceAmount.add(serviceAmount);
// 订单金额
totalOrderAmount = totalOrderAmount.add(new BigDecimal(orderAmount));
// 虚拟金额
String virtualAmount = StringUtils.isNotBlank(vo.getVirtualAmount()) ? vo.getVirtualAmount() : Constants.ZERO;
totalVirtualAmount = totalVirtualAmount.add(new BigDecimal(virtualAmount));
// 结算金额
totalSettleAmount = totalSettleAmount.add(settleAmount);
}
// 计算报表
SettleOrderReport settleOrderReport = new SettleOrderReport();
String settleCode = "SETTLE_" + IdUtils.getOrderCode();
settleOrderReport.setSettleCode(settleCode);
settleOrderReport.setMerchantId(stationInfo.getMerchantId());
settleOrderReport.setStationId(stationId);
settleOrderReport.setUseElectricity(useElectricity);
settleOrderReport.setChargeNum(chargeNum + "");
settleOrderReport.setChargeTime(chargeTime + "");
settleOrderReport.setElectricityAmount(totalElectricityAmount);
settleOrderReport.setServiceAmount(totalServiceAmount);
settleOrderReport.setTotalAmount(totalOrderAmount);
settleOrderReport.setVirtualAmount(totalVirtualAmount);
settleOrderReport.setTradeDate(tradeDate);
settleOrderReport.setOrderCodes(Joiner.on(",").join(orderCodeList));
// 计算手续费 = 结算金额 * 0.55%
SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(totalSettleAmount);
settleOrderReport.setTradeFee(splitSettleAmountVO.getFeeAmount());
settleOrderReport.setTradeAmount(splitSettleAmountVO.getTradeAmount());
// 根据站点id和交易日期查询
SettleOrderReport selectResult = this.selectByStationIdAndDate(stationId, tradeDate);
if (selectResult != null) {
settleOrderReport.setId(selectResult.getId());
}
// 订单日报 新增或更新
this.insertOrUpdate(settleOrderReport);
}
/**
* 通过结算金额,计算客户到账金额和手续费
*
* @param settleAmount 需要拆分的结算金额
* @return
*/
private SplitSettleAmountVO splitSettleAmount(BigDecimal settleAmount) {
SplitSettleAmountVO resultVO = new SplitSettleAmountVO();
if (settleAmount == null) {
return resultVO;
}
// 计算手续费 = 结算金额 * 0.55%
BigDecimal fee = settleAmount.multiply(new BigDecimal(Constants.FEE_RATES));
resultVO.setSettleAmount(settleAmount);
resultVO.setFeeAmount(fee);
resultVO.setTradeAmount(settleAmount.subtract(fee));
return resultVO;
}
} }

View File

@@ -52,6 +52,9 @@ public class JsowellTask {
@Autowired @Autowired
private AMapService aMapService; private AMapService aMapService;
@Autowired
private ISettleOrderReportService settleOrderReportService;
/** /**
* 关闭15分钟未支付的订单 * 关闭15分钟未支付的订单
* close15MinutesOfUnpaidOrders * close15MinutesOfUnpaidOrders
@@ -131,7 +134,7 @@ public class JsowellTask {
// 计算每个站点前一天的报表 // 计算每个站点前一天的报表
for (PileStationInfo stationInfo : list) { for (PileStationInfo stationInfo : list) {
try { try {
orderBasicInfoService.generateDailyOrderReports(stationInfo.getId() + "", yesterday.toString()); settleOrderReportService.generateDailyOrderReports(stationInfo.getId() + "", yesterday.toString());
} catch (Exception e) { } catch (Exception e) {
log.error("计算站点订单报表 发生异常 stationId:{}", stationInfo.getId(), e); log.error("计算站点订单报表 发生异常 stationId:{}", stationInfo.getId(), e);
} }