Files
jsowell-charger-web/jsowell-admin/src/main/java/com/jsowell/service/SplitBillService.java

207 lines
9.1 KiB
Java
Raw Normal View History

2025-10-10 11:54:35 +08:00
package com.jsowell.service;
2025-10-10 13:32:53 +08:00
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
2025-10-11 13:06:11 +08:00
import com.google.common.collect.Sets;
2025-10-10 13:10:56 +08:00
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.jsowell.adapay.service.AdapayService;
2025-10-10 11:54:35 +08:00
import com.jsowell.common.constant.Constants;
2025-10-11 11:26:55 +08:00
import com.jsowell.common.util.DateUtils;
2025-10-10 11:54:35 +08:00
import com.jsowell.pile.dto.DebugOrderDTO;
import com.jsowell.pile.dto.QueryOrderSplitRecordDTO;
import com.jsowell.pile.service.OrderBasicInfoService;
2025-10-11 11:26:55 +08:00
import com.jsowell.pile.service.PileStationInfoService;
import com.jsowell.pile.service.SettleOrderReportService;
2025-10-10 13:32:53 +08:00
import com.jsowell.pile.vo.web.OrderPaymentDetailVO;
2025-10-11 11:26:55 +08:00
import com.jsowell.pile.vo.web.PileStationVO;
2025-10-10 13:32:53 +08:00
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2025-10-10 11:54:35 +08:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
2025-10-10 13:32:53 +08:00
import java.util.Map;
2025-10-11 13:06:11 +08:00
import java.util.Set;
2025-10-10 11:54:35 +08:00
@Service
public class SplitBillService {
2025-10-10 13:32:53 +08:00
private final Logger log = LoggerFactory.getLogger(SplitBillService.class);
2025-10-10 11:54:35 +08:00
@Autowired
private OrderBasicInfoService orderBasicInfoService;
@Autowired
private TempService tempService;
2025-10-10 13:32:53 +08:00
2025-10-10 13:10:56 +08:00
@Autowired
private AdapayService adapayService;
2025-10-10 11:54:35 +08:00
2025-10-11 11:26:55 +08:00
@Autowired
private PileStationInfoService pileStationInfoService;
@Autowired
private SettleOrderReportService settleOrderReportService;
2025-10-10 11:54:35 +08:00
/**
* 重试运营商分账
* @param dto
*/
2025-10-10 13:10:56 +08:00
public void retryMerchantSplit(QueryOrderSplitRecordDTO dto) throws BaseAdaPayException {
2025-10-11 11:26:55 +08:00
String startTime = dto.getStartTime();
String endTime = dto.getEndTime();
2025-10-10 11:54:35 +08:00
// 首先根据 merchantId、startTime、endTime 查出日期区间内所有订单信息(包括 paymentId
2025-10-10 13:32:53 +08:00
List<OrderPaymentDetailVO> recordList = orderBasicInfoService.getSplitOrders(dto);
if (CollectionUtils.isEmpty(recordList)) {
log.info("重试运营商分账-根据参数未查询到符合条件的订单, param:{}", dto);
return;
}
// 循环一次获得paymentIdList 与 Map
List<String> paymentIdList = Lists.newArrayList();
Map<String, OrderPaymentDetailVO> paymentIdMap = Maps.newHashMap();
2025-10-11 13:06:11 +08:00
Set<String> stationIdSet = Sets.newHashSet();
2025-10-11 14:12:32 +08:00
for (OrderPaymentDetailVO orderPaymentDetailVO : recordList) {
paymentIdList.add(orderPaymentDetailVO.getPaymentId());
paymentIdMap.put(orderPaymentDetailVO.getPaymentId(), orderPaymentDetailVO);
stationIdSet.add(orderPaymentDetailVO.getStationId());
}
// 判断订单是否已经成功分账, 将未分账的订单进行筛选、汇总
List<String> unSplitPaymentIdList = adapayService.getSplitInfoByPaymentIdList(paymentIdList);
if (CollectionUtils.isEmpty(unSplitPaymentIdList)) {
log.info("重试运营商分账-所有订单都已经成功分账");
return;
}
// 将 paymentIdList 与 recordList 进行匹配,筛选出 orderCodeList
List<String> orderCodeList = Lists.newArrayList();
for (String unSplitPaymentId : unSplitPaymentIdList) {
OrderPaymentDetailVO orderPaymentDetailVO = paymentIdMap.get(unSplitPaymentId);
if (orderPaymentDetailVO != null) {
orderCodeList.add(orderPaymentDetailVO.getOrderCode());
}
}
// 调用 debugOrder 接口进行重新分账
for (String orderCode : orderCodeList) {
DebugOrderDTO debugOrderDTO = new DebugOrderDTO();
debugOrderDTO.setOrderCode(orderCode);
debugOrderDTO.setReSplitFlag(Constants.ONE);
try {
Map<String, Object> stringObjectMap = tempService.debugOrder(debugOrderDTO);
log.info("重试运营商分账-debugOrder接口调用成功, param:{}, result:{}", debugOrderDTO, stringObjectMap);
} catch (Exception e) {
log.error("重试运营商分账-debugOrder接口调用异常, param:{}", debugOrderDTO, e);
}
}
// 重新计算站点日报和运营商日报
// 获取日期区间内所有日期
List<String> dateList = DateUtils.getAllDatesInTheDateRange(startTime, endTime);
stationIdSet.parallelStream().forEach(stationId -> {
PileStationVO stationInfo = pileStationInfoService.getStationInfo(stationId);
for (String tradeDate : dateList) {
try {
settleOrderReportService.generateDailyOrderReports(stationInfo, tradeDate);
log.info("重试运营商分账-生成站点日报成功, param:{}", tradeDate);
}catch (Exception e) {
log.error("重试运营商分账-生成站点日报异常, param:{}", tradeDate, e);
}
}
});
// 重新计算运营商日报
for (String tradeDate : dateList) {
try {
orderBasicInfoService.generateMerchantBill(dto.getMerchantId(), tradeDate);
log.info("重试运营商分账-生成运营商日报成功, param:{}", tradeDate);
}catch (Exception e) {
log.error("重试运营商分账-生成运营商日报异常, param:{}", tradeDate, e);
}
}
}
public void retryMerchantSplitV2(QueryOrderSplitRecordDTO dto) throws BaseAdaPayException {
String startTime = dto.getStartTime();
String endTime = dto.getEndTime();
// 首先根据 merchantId、startTime、endTime 查出日期区间内所有订单信息(包括 paymentId
List<OrderPaymentDetailVO> recordList = orderBasicInfoService.getSplitOrders(dto);
if (CollectionUtils.isEmpty(recordList)) {
log.info("重试运营商分账-根据参数未查询到符合条件的订单, param:{}", dto);
return;
}
// 循环一次获得paymentIdList 与 Map
List<String> paymentIdList = Lists.newArrayList();
Map<String, OrderPaymentDetailVO> paymentIdMap = Maps.newHashMap();
Set<String> stationIdSet = Sets.newHashSet();
2025-10-10 13:32:53 +08:00
for (OrderPaymentDetailVO orderPaymentDetailVO : recordList) {
paymentIdList.add(orderPaymentDetailVO.getPaymentId());
paymentIdMap.put(orderPaymentDetailVO.getPaymentId(), orderPaymentDetailVO);
2025-10-11 13:06:11 +08:00
stationIdSet.add(orderPaymentDetailVO.getStationId());
2025-10-10 13:32:53 +08:00
}
// 判断订单是否已经成功分账, 将未分账的订单进行筛选、汇总
2025-10-10 13:10:56 +08:00
List<String> unSplitPaymentIdList = adapayService.getSplitInfoByPaymentIdList(paymentIdList);
2025-10-10 13:32:53 +08:00
if (CollectionUtils.isEmpty(unSplitPaymentIdList)) {
log.info("重试运营商分账-所有订单都已经成功分账");
return;
}
2025-10-10 11:54:35 +08:00
// 将 paymentIdList 与 recordList 进行匹配,筛选出 orderCodeList
2025-10-10 13:32:53 +08:00
List<String> orderCodeList = Lists.newArrayList();
for (String unSplitPaymentId : unSplitPaymentIdList) {
OrderPaymentDetailVO orderPaymentDetailVO = paymentIdMap.get(unSplitPaymentId);
if (orderPaymentDetailVO != null) {
orderCodeList.add(orderPaymentDetailVO.getOrderCode());
}
}
2025-10-10 11:54:35 +08:00
// 调用 debugOrder 接口进行重新分账
for (String orderCode : orderCodeList) {
DebugOrderDTO debugOrderDTO = new DebugOrderDTO();
debugOrderDTO.setOrderCode(orderCode);
debugOrderDTO.setReSplitFlag(Constants.ONE);
2025-10-10 13:32:53 +08:00
try {
2025-10-10 13:39:42 +08:00
Map<String, Object> stringObjectMap = tempService.debugOrder(debugOrderDTO);
log.info("重试运营商分账-debugOrder接口调用成功, param:{}, result:{}", debugOrderDTO, stringObjectMap);
2025-10-10 13:32:53 +08:00
} catch (Exception e) {
log.error("重试运营商分账-debugOrder接口调用异常, param:{}", debugOrderDTO, e);
}
2025-10-10 11:54:35 +08:00
}
2025-10-11 11:26:55 +08:00
// 重新计算站点日报和运营商日报
// 获取日期区间内所有日期
List<String> dateList = DateUtils.getAllDatesInTheDateRange(startTime, endTime);
2025-10-11 13:06:11 +08:00
stationIdSet.parallelStream().forEach(stationId -> {
2025-10-11 11:26:55 +08:00
PileStationVO stationInfo = pileStationInfoService.getStationInfo(stationId);
for (String tradeDate : dateList) {
try {
settleOrderReportService.generateDailyOrderReports(stationInfo, tradeDate);
log.info("重试运营商分账-生成站点日报成功, param:{}", tradeDate);
}catch (Exception e) {
log.error("重试运营商分账-生成站点日报异常, param:{}", tradeDate, e);
}
}
});
// 重新计算运营商日报
for (String tradeDate : dateList) {
try {
orderBasicInfoService.generateMerchantBill(dto.getMerchantId(), tradeDate);
log.info("重试运营商分账-生成运营商日报成功, param:{}", tradeDate);
}catch (Exception e) {
log.error("重试运营商分账-生成运营商日报异常, param:{}", tradeDate, e);
}
}
2025-10-10 11:54:35 +08:00
}
}