diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java index 86f1ab5e0..b2adc2256 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java @@ -155,7 +155,7 @@ public class TempController extends BaseController { dto.getStationIdList().parallelStream().forEach(stationId -> { for (String tradeDate : dateList) { - orderBasicInfoService.generateDailyOrderReports(stationId, tradeDate); + settleOrderReportService.generateDailyOrderReports(stationId, tradeDate); } }); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/SettleOrderReportMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/SettleOrderReportMapper.java index 1ba5ccb53..6badd93b3 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/SettleOrderReportMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/SettleOrderReportMapper.java @@ -4,9 +4,11 @@ import com.jsowell.pile.domain.SettleOrderReport; import com.jsowell.pile.dto.MerchantOrderReportDTO; import com.jsowell.pile.vo.web.SettleOrderReportVO; import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; import java.util.List; +@Repository public interface SettleOrderReportMapper { /** * delete by primary key diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/ISettleOrderReportService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/ISettleOrderReportService.java index 6d1223e45..168e7cf13 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/ISettleOrderReportService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/ISettleOrderReportService.java @@ -100,4 +100,11 @@ public interface ISettleOrderReportService { List queryOrderReport(List stationIdList, String startTime, String endTime); + /** + * 计算站点订单报表 + * + * @param stationId 站点id + * @param tradeDate 交易日期 + */ + void generateDailyOrderReports(String stationId, String tradeDate); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/SettleOrderReportService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/SettleOrderReportService.java deleted file mode 100644 index d50d7f9a9..000000000 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/SettleOrderReportService.java +++ /dev/null @@ -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 list); - - int batchInsert(List list); - -} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/SettleOrderReportServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/SettleOrderReportServiceImpl.java index 037a9012a..7b14b8794 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/SettleOrderReportServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/SettleOrderReportServiceImpl.java @@ -2,33 +2,43 @@ package com.jsowell.pile.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; import com.jsowell.adapay.service.AdapayService; +import com.jsowell.common.constant.Constants; import com.jsowell.common.core.page.PageResponse; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.PageUtils; import com.jsowell.common.util.StringUtils; +import com.jsowell.common.util.id.IdUtils; import com.jsowell.pile.domain.SettleOrderReport; import com.jsowell.pile.dto.MerchantOrderReportDTO; +import com.jsowell.pile.dto.QueryOrderDTO; import com.jsowell.pile.dto.SettleOrderReportDTO; import com.jsowell.pile.mapper.AdapayCallbackRecordMapper; +import com.jsowell.pile.mapper.OrderBasicInfoMapper; import com.jsowell.pile.mapper.SettleOrderReportMapper; import com.jsowell.pile.service.ClearingWithdrawInfoService; import com.jsowell.pile.service.IPileMerchantInfoService; +import com.jsowell.pile.service.IPileStationInfoService; import com.jsowell.pile.service.ISettleOrderReportService; -import com.jsowell.pile.vo.web.ClearingBillVO; -import com.jsowell.pile.vo.web.MerchantOrderReportVO; -import com.jsowell.pile.vo.web.OrderSettleDetailVO; -import com.jsowell.pile.vo.web.SettleOrderReportVO; +import com.jsowell.pile.vo.base.SplitSettleAmountVO; +import com.jsowell.pile.vo.web.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; 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.List; +import java.util.stream.Collectors; /** * 结算订单报Service业务层处理 @@ -36,11 +46,18 @@ import java.util.List; * @author jsowell * @date 2023-06-05 */ +@Slf4j @Service public class SettleOrderReportServiceImpl implements ISettleOrderReportService { @Autowired private SettleOrderReportMapper settleOrderReportMapper; + @Autowired + private OrderBasicInfoMapper orderBasicInfoMapper; + + @Autowired + private IPileStationInfoService pileStationInfoService; + @Autowired private AdapayCallbackRecordMapper adapayCallbackRecordMapper; @@ -323,5 +340,145 @@ public class SettleOrderReportServiceImpl implements ISettleOrderReportService { 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 orderListVOS = orderBasicInfoMapper.selectOrderBasicInfoList(dto); + // if (CollectionUtils.isEmpty(orderListVOS)) { + // logger.info("站点:{}, 在{}-{}没有查询到订单数据", stationInfo.getStationName(), startTime, endTime); + // return; + // } + List 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 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; + } + } diff --git a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java index 43cd00c46..b2ac076f3 100644 --- a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java +++ b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java @@ -52,6 +52,9 @@ public class JsowellTask { @Autowired private AMapService aMapService; + @Autowired + private ISettleOrderReportService settleOrderReportService; + /** * 关闭15分钟未支付的订单 * close15MinutesOfUnpaidOrders @@ -131,7 +134,7 @@ public class JsowellTask { // 计算每个站点前一天的报表 for (PileStationInfo stationInfo : list) { try { - orderBasicInfoService.generateDailyOrderReports(stationInfo.getId() + "", yesterday.toString()); + settleOrderReportService.generateDailyOrderReports(stationInfo.getId() + "", yesterday.toString()); } catch (Exception e) { log.error("计算站点订单报表 发生异常 stationId:{}", stationInfo.getId(), e); }