diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java index fcf462648..8314271c3 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/customer/TempController.java @@ -979,4 +979,20 @@ public class TempController extends BaseController { SmsResponse smsResponse = smsBlend.sendMessage("18521561107","888888"); logger.info("发送短信结果:{}, 详情:{}", smsResponse.isSuccess(), JSON.toJSONString(smsResponse)); } + + /** + * 处理OrderSplitRecord中值为0的数据 + */ + @PostMapping("/handleOrderSplitRecord") + public RestApiResponse handleOrderSplitRecord(@RequestBody QueryOrderDTO dto) { + RestApiResponse response; + try { + tempService.handleOrderSplitRecord(dto.getOrderCode()); + response = new RestApiResponse<>(); + } catch (Exception e) { + logger.error("处理OrderSplitRecord中值为0的数据 error,", e); + response = new RestApiResponse<>(e); + } + return response; + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java index 5947cc043..360f1e6e8 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/TempService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/TempService.java @@ -1396,5 +1396,33 @@ public class TempService { }); } + + /** + * 处理OrderSplitRecord中值为0的数据 + * @throws BaseAdaPayException + */ + public void handleOrderSplitRecord(String orderCode) { + // 根据订单号查询订单信息 + OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderCode); + + // 组装after参数 + AfterSettleOrderDTO afterSettleOrderDTO = AfterSettleOrderDTO.builder() + .orderCode(orderBasicInfo.getOrderCode()) + .merchantId(orderBasicInfo.getMerchantId()) + .stationId(orderBasicInfo.getStationId()) + .orderPayAmount(orderBasicInfo.getPayAmount()) // 支付金额 + .orderConsumeAmount(orderBasicInfo.getOrderAmount()) // 消费金额 + .orderSettleAmount(orderBasicInfo.getSettleAmount()) // 结算金额 + .orderElectricityAmount(orderDetail.getTotalElectricityAmount()) // 电费金额 + .orderElectricityDiscountAmount(orderDetail.getDiscountElectricityAmount()) // 电费折扣金额 + .orderServiceAmount(orderDetail.getTotalServiceAmount()) // 服务费金额 + .orderServiceDiscountAmount(orderDetail.getDiscountServiceAmount()) // 服务费折扣金额 + .orderRefundAmount(orderBasicInfo.getRefundAmount()) // 退款金额 + .orderBasicInfo(orderBasicInfo) + .build(); + + orderBasicInfoService.splittingMethodTemp(afterSettleOrderDTO); + } } diff --git a/jsowell-admin/src/test/java/PaymentTestController.java b/jsowell-admin/src/test/java/PaymentTestController.java index f4632afea..2c6a2c58f 100644 --- a/jsowell-admin/src/test/java/PaymentTestController.java +++ b/jsowell-admin/src/test/java/PaymentTestController.java @@ -27,7 +27,10 @@ import com.jsowell.common.enums.ykc.ScenarioEnum; import com.jsowell.common.util.AdapayUtil; import com.jsowell.common.util.DateUtils; import com.jsowell.pile.domain.AdapayMemberAccount; +import com.jsowell.pile.domain.OrderBasicInfo; +import com.jsowell.pile.domain.OrderDetail; import com.jsowell.pile.domain.OrderUnsplitRecord; +import com.jsowell.pile.dto.AfterSettleOrderDTO; import com.jsowell.pile.dto.DebugOrderDTO; import com.jsowell.pile.service.OrderBasicInfoService; import com.jsowell.pile.service.OrderUnsplitRecordService; @@ -52,7 +55,7 @@ import java.util.concurrent.TimeUnit; /** * 专用处理汇付支付相关 */ -@ActiveProfiles("dev") +@ActiveProfiles("pre") @SpringBootTest(classes = JsowellApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @RunWith(SpringRunner.class) public class PaymentTestController { @@ -422,6 +425,21 @@ public class PaymentTestController { } } + /** + * 查询支付确认对象列表 + */ + @Test + public void queryPaymentConfirmListTest() { + String paymentId = "002212025092806193010818137979319861248"; + // 查询支付确认id + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setPaymentId(paymentId); + dto.setWechatAppId(wechatAppId1); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); + System.out.println("查询支付确认对象列表:{}" + JSON.toJSONString(response)); + System.out.println("支付确认id:" + response.getPaymentConfirms().get(0).getId()); + } + /** * 查询退款信息 */ @@ -570,11 +588,11 @@ public class PaymentTestController { // 查询支付确认id QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); - dto.setPaymentId("002212023102515344310563156645282902016"); + dto.setPaymentConfirmId("0022120251010134711990822599294813462528"); dto.setWechatAppId(wechatAppId1); // 查询分账信息 - QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); - System.out.println(JSON.toJSONString(response)); + PaymentConfirmInfo paymentConfirmInfo = adapayService.queryPaymentConfirmDetail(dto); + System.out.println(JSON.toJSONString(paymentConfirmInfo)); } private List getAdapayMemberIds() { @@ -809,4 +827,36 @@ public class PaymentTestController { logger.info("关单接口调用结果:{}", close); } + + /** + * 处理OrderSplitRecord中值为0的数据 + * @throws BaseAdaPayException + */ + @Test + public void handleOrderSplitRecord() throws BaseAdaPayException { + String orderCode = "C48131824908"; + + // 根据订单号查询订单信息 + OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderCode); + + // 组装after参数 + AfterSettleOrderDTO afterSettleOrderDTO = AfterSettleOrderDTO.builder() + .orderCode(orderBasicInfo.getOrderCode()) + .merchantId(orderBasicInfo.getMerchantId()) + .stationId(orderBasicInfo.getStationId()) + .orderPayAmount(orderBasicInfo.getPayAmount()) // 支付金额 + .orderConsumeAmount(orderBasicInfo.getOrderAmount()) // 消费金额 + .orderSettleAmount(orderBasicInfo.getSettleAmount()) // 结算金额 + .orderElectricityAmount(orderDetail.getTotalElectricityAmount()) // 电费金额 + .orderElectricityDiscountAmount(orderDetail.getDiscountElectricityAmount()) // 电费折扣金额 + .orderServiceAmount(orderDetail.getTotalServiceAmount()) // 服务费金额 + .orderServiceDiscountAmount(orderDetail.getDiscountServiceAmount()) // 服务费折扣金额 + .orderRefundAmount(orderBasicInfo.getRefundAmount()) // 退款金额 + .orderBasicInfo(orderBasicInfo) + .build(); + + orderBasicInfoService.splittingMethodTemp(afterSettleOrderDTO); + + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index 4a0487070..5724820fc 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -5,6 +5,7 @@ import com.jsowell.adapay.dto.SplitData; import com.jsowell.adapay.response.PaymentConfirmResponse; import com.jsowell.adapay.response.PaymentReverseResponse; import com.jsowell.adapay.vo.OrderSplitResult; +import com.jsowell.adapay.vo.PaymentInfo; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.pile.domain.*; @@ -215,8 +216,12 @@ public interface OrderBasicInfoService{ OrderSplitResult realTimeOrderSplit(AfterSettleOrderDTO afterSettleOrderDTO) throws BaseAdaPayException; + List getOrderPaymentInfoList(AfterSettleOrderDTO afterSettleOrderDTO); + PaymentConfirmResponse splittingMethod(AfterSettleOrderDTO afterSettleOrderDTO); + PaymentConfirmResponse splittingMethodTemp(AfterSettleOrderDTO afterSettleOrderDTO); + /** * 计算分账数据 * @param stationSplitConfigList diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java index 179c2b17d..5f79c9dfa 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderSplitRecordService.java @@ -1,6 +1,7 @@ package com.jsowell.pile.service; import com.huifu.adapay.core.exception.BaseAdaPayException; +import com.jsowell.adapay.common.PaymentConfirmInfo; import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.SplitData; import com.jsowell.adapay.response.PaymentConfirmResponse; @@ -45,6 +46,8 @@ public interface OrderSplitRecordService { */ void saveOrderSplitRecord(PaymentConfirmParam param, PaymentConfirmResponse response, List stationSplitConfigList, OrderInfoDetailVO orderInfoDetailVO); + void saveOrderSplitRecordTemp(PaymentConfirmParam param, PaymentConfirmInfo response, List splitDataList, OrderInfoDetailVO orderInfoDetailVO); + List selectByOrderCode(String orderCode); /** diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 10e117a93..d5189e2a7 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -2081,7 +2081,8 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { /** * 获取订单待分账信息 */ - private List getOrderPaymentInfoList(AfterSettleOrderDTO afterSettleOrderDTO) { + @Override + public List getOrderPaymentInfoList(AfterSettleOrderDTO afterSettleOrderDTO) { String orderCode = afterSettleOrderDTO.getOrderCode(); OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo(); @@ -2193,6 +2194,102 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { return paymentConfirmRequest; } + /** + * 此方法只用来更新OrderSplitRecord + * @param afterSettleOrderDTO + * @return + */ + @Override + public PaymentConfirmResponse splittingMethodTemp(AfterSettleOrderDTO afterSettleOrderDTO) { + logger.info("处理OrderSplitRecord中值为0的数据, orderCode:{}, 分账金额:{}", + afterSettleOrderDTO.getOrderCode(), afterSettleOrderDTO.getOrderSettleAmount()); + + // 结算金额 + BigDecimal orderSettleAmount = afterSettleOrderDTO.getOrderSettleAmount(); + + // 站点id + String stationId = afterSettleOrderDTO.getStationId(); + + // 订单编号 + String orderCode = afterSettleOrderDTO.getOrderCode(); + + // 订单信息 + OrderBasicInfo orderBasicInfo = afterSettleOrderDTO.getOrderBasicInfo(); + + // 保险金额(有默认值 0.00) + BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount(); + + // 订单是否需要分账, 结算金额必须大于0 + if (orderSettleAmount == null || orderSettleAmount.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("realTimeOrderSplit-订单[{}]结算金额[{}]必须大于0", afterSettleOrderDTO.getOrderCode(), orderSettleAmount); + return null; + } + + // 获取订单待分账信息 + List paymentInfos = getOrderPaymentInfoList(afterSettleOrderDTO); + if (CollectionUtils.isEmpty(paymentInfos)) { + logger.info("realTimeOrderSplit-订单[{}]没有待分账的支付记录", afterSettleOrderDTO.getOrderCode()); + return null; + } + + // 根据站点id查询分账配置(如果未配置则初始化) + List stationSplitConfigList = stationSplitConfigService.queryByStationIdWithInit(stationId); + + // 查字典是否开启收取平台支持服务费 1-开启; 0-关闭 + String dictValue = DictUtils.getDictValue("platform_service_flag", "status"); + if (StringUtils.equals(dictValue, Constants.ONE)) { + // 开启收取平台支持服务费, 更新参与分账的账户列表 + updateSplitConfigList(stationId, stationSplitConfigList, orderCode); + } + + // 计算每个参与分账的用户, 应分多少钱 + List splitDataList = calculationSplitDataList(stationSplitConfigList, afterSettleOrderDTO); + List divMemberList = transformDivMemberList(splitDataList); + logger.info("realTimeOrderSplit-订单:{}, 分账信息:{}", orderCode, JSON.toJSONString(splitDataList)); + + // 执行分账 + if (CollectionUtils.isEmpty(divMemberList)) { + logger.info("realTimeOrderSplit-订单[{}]分账信息为空", orderCode); + return null; + } + + String paymentId = paymentInfos.get(0).getPaymentId(); // 支付id + String merchantId = afterSettleOrderDTO.getMerchantId(); // 运营商id + // 根据运营商id 查询appId + String appId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId); + PaymentConfirmParam param = PaymentConfirmParam.builder() + .paymentId(paymentId) + .divMemberList(divMemberList) + .confirmAmt(orderSettleAmount.add(insuranceAmount)) // 订单结算金额 + 保险金额 + .orderCode(orderCode) + .wechatAppId(appId) + .build(); + // PaymentConfirmResponse paymentConfirmRequest = adapayService.createPaymentConfirmRequest(param); + + // 查询支付确认id + QueryPaymentConfirmDTO queryPaymentConfirmDTO = new QueryPaymentConfirmDTO(); + queryPaymentConfirmDTO.setPaymentId(paymentId); + queryPaymentConfirmDTO.setWechatAppId(Constants.DEFAULT_APP_ID); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(queryPaymentConfirmDTO); + + String paymentConfirmId = response.getPaymentConfirms().get(0).getId(); + + // 查询支付确认id + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setPaymentConfirmId(paymentConfirmId); + dto.setWechatAppId(Constants.DEFAULT_APP_ID); + // 查询分账信息 + PaymentConfirmInfo paymentConfirmInfo = adapayService.queryPaymentConfirmDetail(dto); + + // 如果之前存在订单分账记录, 则删除 + // orderSplitRecordService.deleteOrderSplitRecord(orderCode); + // 保存订单分账记录 + OrderInfoDetailVO orderInfoDetailVO = getOrderInfoDetailVO(orderCode); + orderSplitRecordService.saveOrderSplitRecordTemp(param, paymentConfirmInfo, splitDataList, orderInfoDetailVO); + + return null; + } + /** * 开启了收取平台支持服务费, 更新订单分账账户列表 * @param stationId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java index 269d3c262..9b682edbd 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderSplitRecordServiceImpl.java @@ -6,10 +6,10 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.AdapayCommon; +import com.jsowell.adapay.common.PaymentConfirmInfo; import com.jsowell.adapay.dto.PaymentConfirmParam; import com.jsowell.adapay.dto.SplitData; import com.jsowell.adapay.response.PaymentConfirmResponse; -import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.model.LoginUser; import com.jsowell.common.core.page.PageResponse; @@ -28,7 +28,6 @@ import com.jsowell.pile.dto.QueryOrderSplitDTO; import com.jsowell.pile.dto.QueryOrderSplitRecordDTO; import com.jsowell.pile.dto.SplitConfigStationDTO; import com.jsowell.pile.dto.SplitOrderDTO; -import com.jsowell.pile.mapper.OrderBasicInfoMapper; import com.jsowell.pile.mapper.OrderSplitRecordMapper; import com.jsowell.pile.service.AdapayMemberAccountService; import com.jsowell.pile.service.OrderSplitRecordService; @@ -58,9 +57,6 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService { @Autowired private AdapayMemberAccountService adapayMemberAccountService; - @Autowired - private OrderBasicInfoMapper orderBasicInfoMapper; - @Override public int batchInsert(List list) { return orderSplitRecordMapper.batchInsert(list); @@ -115,6 +111,63 @@ public class OrderSplitRecordServiceImpl implements OrderSplitRecordService { this.batchInsert(list); } + /** + * 保存订单分账记录。临时保存 + * @param param + * @param response + * @param splitDataList + * @param orderInfoDetailVO + */ + @Override + public void saveOrderSplitRecordTemp(PaymentConfirmParam param, PaymentConfirmInfo response, List splitDataList, OrderInfoDetailVO orderInfoDetailVO) { + // 判断入参 + if (param == null || response == null || CollectionUtils.isEmpty(param.getDivMemberList()) || orderInfoDetailVO == null) { + return; + } + // response中status为failed 不保存 + if (response.isFailed()) { + return; + } + String paymentConfirmId = response.getId(); // 支付确认id + String feeAmt = response.getFeeAmt(); // 手续费 + String orderCode = param.getOrderCode(); // 订单号 + BigDecimal settleAmount = param.getConfirmAmt(); // 结算金额 + String paymentId = param.getPaymentId(); // 支付id + List list = Lists.newArrayList(); // 订单分账记录集合 + for (SplitData splitData : splitDataList) { + OrderSplitRecord orderSplitRecord = new OrderSplitRecord(); + orderSplitRecord.setOrderCode(orderCode); + orderSplitRecord.setStatus(AdapayStatusEnum.SUCCEEDED.getValue()); + orderSplitRecord.setSettleAmount(settleAmount); +// orderSplitRecord.setTradeDate(DateUtils.getDate()); // 订单结算日期 yyyy-MM-dd + orderSplitRecord.setTradeDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, orderInfoDetailVO.getSettlementTime())); // 订单结算日期 yyyy-MM-dd + orderSplitRecord.setMerchantId(orderInfoDetailVO.getMerchantId()); + orderSplitRecord.setStationId(orderInfoDetailVO.getStationId()); + orderSplitRecord.setElectricityAmount(orderInfoDetailVO.getTotalElectricityAmount()); + orderSplitRecord.setServiceAmount(orderInfoDetailVO.getTotalServiceAmount()); + orderSplitRecord.setAdapayMemberId(splitData.getMemberId()); + orderSplitRecord.setPaymentId(paymentId); + orderSplitRecord.setPaymentConfirmId(paymentConfirmId); + orderSplitRecord.setElectricitySplitRatio(splitData.getElecRatio() != null ? splitData.getElecRatio() : BigDecimal.ZERO); + orderSplitRecord.setElectricitySplitAmount(splitData.getElecAmount() != null ? splitData.getElecAmount() : BigDecimal.ZERO); + orderSplitRecord.setServiceSplitRatio(splitData.getServiceRatio() != null ? splitData.getServiceRatio() : BigDecimal.ZERO); + orderSplitRecord.setServiceSplitAmount(splitData.getServiceAmount() != null ? splitData.getServiceAmount() : BigDecimal.ZERO); + orderSplitRecord.setRemark(""); + orderSplitRecord.setDelFlag(DelFlagEnum.NORMAL.getValue()); + orderSplitRecord.setCreateBy(Constants.SYSTEM); + orderSplitRecord.setCreateTime(DateUtils.getNowDate()); + // 如果是手续费承担方, 保存feeAmt, 否则保存0 + if (StringUtils.equals(splitData.getFeeFlag(), Constants.Y)) { + orderSplitRecord.setFeeAmount(new BigDecimal(feeAmt)); + } else { + orderSplitRecord.setFeeAmount(BigDecimal.ZERO); + } + list.add(orderSplitRecord); + } + log.info("保存:{}", list); + // this.batchInsert(list); + } + @Override public List selectByOrderCode(String orderCode) { List orderSplitRecords = orderSplitRecordMapper.selectByOrderCode(orderCode);