package com.jsowell.service; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.constant.Constants; import com.jsowell.pile.dto.DebugOrderDTO; import com.jsowell.pile.dto.QueryOrderSplitRecordDTO; import com.jsowell.pile.service.OrderBasicInfoService; import com.jsowell.pile.vo.web.OrderPaymentDetailVO; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class SplitBillService { private final Logger log = LoggerFactory.getLogger(SplitBillService.class); @Autowired private OrderBasicInfoService orderBasicInfoService; @Autowired private TempService tempService; @Autowired private AdapayService adapayService; /** * 重试运营商分账 * @param dto */ public void retryMerchantSplit(QueryOrderSplitRecordDTO dto) throws BaseAdaPayException { // 首先根据 merchantId、startTime、endTime 查出日期区间内所有订单信息(包括 paymentId) List recordList = orderBasicInfoService.getSplitOrders(dto); if (CollectionUtils.isEmpty(recordList)) { log.info("重试运营商分账-根据参数未查询到符合条件的订单, param:{}", dto); return; } // 获取 paymentIdList // List paymentIdList = recordList.stream() // .map(OrderPaymentDetailVO::getPaymentId) // .collect(Collectors.toList()); // 循环一次,获得paymentIdList 与 Map List paymentIdList = Lists.newArrayList(); Map paymentIdMap = Maps.newHashMap(); for (OrderPaymentDetailVO orderPaymentDetailVO : recordList) { paymentIdList.add(orderPaymentDetailVO.getPaymentId()); paymentIdMap.put(orderPaymentDetailVO.getPaymentId(), orderPaymentDetailVO); } // 判断订单是否已经成功分账, 将未分账的订单进行筛选、汇总 List unSplitPaymentIdList = adapayService.getSplitInfoByPaymentIdList(paymentIdList); if (CollectionUtils.isEmpty(unSplitPaymentIdList)) { log.info("重试运营商分账-所有订单都已经成功分账"); return; } // 将 paymentIdList 与 recordList 进行匹配,筛选出 orderCodeList List orderCodeList = Lists.newArrayList(); // Set paymentIdSet = new HashSet<>(unSplitPaymentIdList); // List orderCodeList = recordList.stream() // .filter(record -> paymentIdSet.contains(record.getPaymentId())) // .map(OrderPaymentDetailVO::getOrderCode) // .collect(Collectors.toList()); 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 { tempService.debugOrder(debugOrderDTO); } catch (Exception e) { log.error("重试运营商分账-debugOrder接口调用异常, param:{}", debugOrderDTO, e); } } } }