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 9bcbf1e03..388802cee 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 @@ -201,7 +201,7 @@ public class TempController extends BaseController { throw new BusinessException("", "查询信息为空"); } String appId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); - orderBasicInfoService.doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId); + orderBasicInfoService.doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId); } catch (Exception e) { logger.error("临时接口交易确认接口 error,", e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_WEIXIN_REFUND_ERROR); @@ -230,7 +230,7 @@ public class TempController extends BaseController { throw new BusinessException("", "查询信息为空"); } String appId = pileMerchantInfoService.queryAppIdByMerchantId(merchantId); - orderBasicInfoService.doBalancePayment(orderBasicInfo, adapayMemberAccount, appId); + orderBasicInfoService.doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId); } catch (Exception e) { logger.error("临时接口交易确认接口 error,", e); response = new RestApiResponse<>(ReturnCodeEnum.CODE_WEIXIN_REFUND_ERROR); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java index bf9ddac46..11e8c1411 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java @@ -153,8 +153,6 @@ public interface IOrderBasicInfoService { void tempOrderSplittingOperations(String merchantId, String tradeDate); - OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException; - List calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount); /** @@ -164,7 +162,9 @@ public interface IOrderBasicInfoService { * @return * @throws BaseAdaPayException */ - OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException; + OrderSettleResult doPaymentConfirmWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException; + + OrderSettleResult doBalancePaymentWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException; /** * 批量查询订单 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java index 041852170..5b4f47ebb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java @@ -2,6 +2,7 @@ package com.jsowell.pile.service; import com.jsowell.pile.domain.MemberAdapayRecord; +import java.math.BigDecimal; import java.util.List; public interface MemberAdapayRecordService{ @@ -28,4 +29,8 @@ public interface MemberAdapayRecordService{ * @param memberId 会员id */ List selectAvailableBalance(String memberId); + + void updateSpendAmount(String paymentId, BigDecimal amount); + + void updateRefundAmount(String paymentId, BigDecimal amount); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java index 92c09ff83..f541c26b8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java @@ -3,12 +3,16 @@ package com.jsowell.pile.service.impl; import com.jsowell.pile.domain.MemberAdapayRecord; import com.jsowell.pile.mapper.MemberAdapayRecordMapper; import com.jsowell.pile.service.MemberAdapayRecordService; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.List; + +@Slf4j @Service -public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ +public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService { @Resource private MemberAdapayRecordMapper memberAdapayRecordMapper; @@ -50,7 +54,8 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ /** * 查询会员的支付记录,按照支付成功时间正序 - * @param memberId 会员id + * + * @param memberId 会员id * @param scenarioType 支付订单/充值余额 * @return 支付记录列表 */ @@ -66,6 +71,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ /** * 查询会员可用余额充值记录 + * * @param memberId 会员id * @return */ @@ -74,4 +80,50 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ return memberAdapayRecordMapper.selectAvailableBalance(memberId); } + /** + * 更新消费金额 + * + * @param paymentId + * @param amount + */ + @Override + public void updateSpendAmount(String paymentId, BigDecimal amount) { + updateSpendAmountAndRefundAmount(paymentId, amount, null); + } + + /** + * 更新剩余金额 + * + * @param paymentId + * @param amount + */ + @Override + public void updateRefundAmount(String paymentId, BigDecimal amount) { + updateSpendAmountAndRefundAmount(paymentId, null, amount); + } + + /** + * 更新交易记录的消费金额和退款金额 + * + * @param paymentId 支付id + * @param SpendAmount 消费金额 + * @param RefundAmount 退款金额 + */ + private void updateSpendAmountAndRefundAmount(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount) { + MemberAdapayRecord record = selectByPaymentId(paymentId); + if (record == null) { + log.info("更新交易记录的消费金额和退款金额paymentId:{}, 查询为空", paymentId); + return; + } + if (RefundAmount != null) { + record.setRefundAmt(record.getRefundAmt().add(RefundAmount)); + } + if (SpendAmount != null) { + record.setSpendAmt(record.getSpendAmt().add(SpendAmount)); + } + // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 + record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt())); + updateByPrimaryKeySelective(record); + } + } 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 5104c2720..db3065d89 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 @@ -694,19 +694,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { dto.setOrderDetail(orderDetail); transactionService.doUpdateOrder(dto); - // 订单支付结算 - OrderSettleResult orderSettleResult = orderPaymentSettlement(orderBasicInfo); + // 订单支付结算and退款 + OrderSettleResult orderSettleResult = orderPaymentSettlementAndRefund(orderBasicInfo); - // 退款逻辑/需要退款的情况 - BigDecimal residue = orderBasicInfo.getRefundAmount(); - if (residue.compareTo(BigDecimal.ZERO) > 0) { - // 执行退款逻辑 - try { - refundOrder(orderBasicInfo, residue); - } catch (Exception e) { - logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e); - } - } + // 记账 + doUpdateClearingBill(orderSettleResult); // 将卡/vin状态解锁 if (!StringUtils.equals("0000000000000000", data.getLogicCard())) { @@ -729,12 +721,19 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSONObject.toJSONString(dto)); } + /** + * 记账 + */ + private void doUpdateClearingBill(OrderSettleResult orderSettleResult) { + logger.info("orderSettleResult:{}", JSON.toJSONString(orderSettleResult)); + } + /** * 订单分账逻辑 - * 订单结算完成,就执行分账 + * 订单结算完成,就执行清分and退款 * 清分账单生成逻辑改为当天第一笔结算后就新建,后面的产生的订单,追加更新 */ - private OrderSettleResult orderPaymentSettlement(OrderBasicInfo orderBasicInfo) { + private OrderSettleResult orderPaymentSettlementAndRefund(OrderBasicInfo orderBasicInfo) { String merchantId = orderBasicInfo.getMerchantId(); String orderCode = orderBasicInfo.getOrderCode(); // 获取一级运营商信息 @@ -764,20 +763,42 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 延时分账的处理逻辑 if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { // 余额支付的订单 - orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId); + orderSettleResult = doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId); } else { // 在线支付,进行支付确认分账 - orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId); + orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId); } } else { - + // 不使用延时分账的汇付商户,钱已经到基本账户中了,只需要退款就可以 + orderSettleResult = notDelayOrder(orderBasicInfo, adapayMemberAccount, appId); } - + // 退款逻辑/需要退款的情况 + BigDecimal residue = orderBasicInfo.getRefundAmount(); + if (residue.compareTo(BigDecimal.ZERO) > 0) { + // 执行退款逻辑 + try { + refundOrder(orderBasicInfo, residue); + } catch (Exception e) { + logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e); + } + } return orderSettleResult; } + /** + * + * @param orderBasicInfo + * @param adapayMemberAccount + * @param wechatAppId + * @return + */ + private OrderSettleResult notDelayOrder(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) { + + return null; + } + /** * 返回更新后的OrderBasicInfo对象 * 专用方法,其他地方如果要用请仔细检查 @@ -1104,10 +1125,10 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { OrderSettleResult orderSettleResult; if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { // 余额支付的订单 - orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId); + orderSettleResult = doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, appId); } else { // 在线支付,进行支付确认分账 - orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId); + orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId); } if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) { // 应收金额 = 订单结算金额汇总 @@ -1210,7 +1231,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount); } else { // 在线支付,进行支付确认分账 - orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId); + orderSettleResult = doPaymentConfirmWithDelay(orderBasicInfo, adapayMemberAccount, appId); } // if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) { // JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription()); @@ -1231,7 +1252,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { * @return */ @Override - public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) { + public OrderSettleResult doBalancePaymentWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) { BigDecimal settleAmount = orderBasicInfo.getSettleAmount(); String orderCode = orderBasicInfo.getOrderCode(); @@ -1253,14 +1274,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt())); status = paymentConfirmResponse.getStatus(); description = paymentConfirmResponse.getDescription(); - - // 更新这笔交易的剩余金额 - MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); - // 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额 - record.setSpendAmt(record.getSpendAmt().add(deductionAmount)); - // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt())); - memberAdapayRecordService.updateByPrimaryKeySelective(record); + memberAdapayRecordService.updateSpendAmount(paymentId, deductionAmount); } } @@ -1332,8 +1346,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { * @param orderBasicInfo 订单 * @param adapayMemberAccount 结算账户 */ - @Override - public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) { + public OrderSettleResult doPaymentConfirmWithDelay(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) { // 查询订单的交易id String orderCode = orderBasicInfo.getOrderCode(); AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode); @@ -2533,13 +2546,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { dto.getMemberId(), ScenarioEnum.BALANCE.getValue(), null); if (paymentReverseRequest != null && paymentReverseRequest.isNotFailed()) { - // 更新这笔交易的剩余金额 - MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); - // 更新此笔交易单的退款金额 = 历史退款金额 + 退款金额 - record.setRefundAmt(record.getRefundAmt().add(deductionAmount)); - // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt())); - memberAdapayRecordService.updateByPrimaryKeySelective(record); + memberAdapayRecordService.updateRefundAmount(paymentId, deductionAmount); // 放缓存 redisCache.setCacheObject(redisKey, paymentReverseRequest, CacheConstants.cache_expire_time_30m); @@ -3004,7 +3011,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 分账金额为0,表示该订单没有执行过分账,再次执行分账 if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { // 余额支付的订单 - doBalancePayment(orderBasicInfo, adapayMemberAccount, wechatAppId); + doBalancePaymentWithDelay(orderBasicInfo, adapayMemberAccount, wechatAppId); } // 再次查询分账