From 2502dde831b939eacf14802e3881392ee43119b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E5=AE=87=E5=A5=87?= Date: Tue, 13 May 2025 16:06:07 +0800 Subject: [PATCH] fix --- .../xkt/AlipayCallbackController.java | 8 ++- .../web/exception/GlobalExceptionHandler.java | 23 +++---- .../com/ruoyi/xkt/domain/AlipayCallback.java | 4 ++ .../xkt/enums/EAlipayCallbackBizType.java | 29 +++++++++ .../xkt/service/IAlipayCallbackService.java | 7 +++ .../impl/AlipayCallbackServiceImpl.java | 10 ++++ .../service/impl/StoreOrderServiceImpl.java | 60 +++++++------------ 7 files changed, 89 insertions(+), 52 deletions(-) create mode 100644 xkt/src/main/java/com/ruoyi/xkt/enums/EAlipayCallbackBizType.java diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AlipayCallbackController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AlipayCallbackController.java index 61b6de730..80de97e81 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AlipayCallbackController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AlipayCallbackController.java @@ -9,6 +9,7 @@ import com.ruoyi.common.core.controller.XktBaseController; import com.ruoyi.xkt.domain.AlipayCallback; import com.ruoyi.xkt.domain.FinanceBill; import com.ruoyi.xkt.domain.StoreOrder; +import com.ruoyi.xkt.enums.EAlipayCallbackBizType; import com.ruoyi.xkt.enums.EProcessStatus; import com.ruoyi.xkt.manager.impl.AliPaymentMangerImpl; import com.ruoyi.xkt.service.IAlipayCallbackService; @@ -85,6 +86,8 @@ public class AlipayCallbackController extends XktBaseController { //1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。 StoreOrder order = storeOrderService.getByOrderNo(alipayCallback.getOutTradeNo()); if (order != null) { + //订单支付 + alipayCallback.setBizType(EAlipayCallbackBizType.ORDER_PAY.getValue()); //2. 判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)。 if (!NumberUtil.equals(order.getTotalAmount(), alipayCallback.getTotalAmount())) { logger.warn("支付宝回调订单金额匹配失败:{}", params); @@ -114,6 +117,7 @@ public class AlipayCallbackController extends XktBaseController { return SUCCESS; } else { //充值业务 + alipayCallback.setBizType(EAlipayCallbackBizType.RECHARGE.getValue()); //1. 商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号。 FinanceBill bill = financeBillService.getByBillNo(alipayCallback.getOutTradeNo()); if (bill != null) { @@ -138,8 +142,8 @@ public class AlipayCallbackController extends XktBaseController { return SUCCESS; } if (EProcessStatus.INIT.getValue().equals(info.getProcessStatus())) { - //充值到账 - financeBillService.entryRechargeCollectionBill(bill.getBillNo()); + //更新回调状态,收款单到账 + alipayCallbackService.processRecharge(info); } else { logger.warn("支付回调重复请求处理: {}", info.getId()); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index c7787d2cf..8bba3eb5c 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -1,6 +1,12 @@ package com.ruoyi.framework.web.exception; -import javax.servlet.http.HttpServletRequest; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.DemoModeException; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.html.EscapeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; @@ -11,13 +17,8 @@ import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.text.Convert; -import com.ruoyi.common.exception.DemoModeException; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.html.EscapeUtil; + +import javax.servlet.http.HttpServletRequest; /** * 全局异常处理器 @@ -58,7 +59,7 @@ public class GlobalExceptionHandler @ExceptionHandler(ServiceException.class) public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) { - log.error(e.getMessage(), e); + log.error("请求地址'{}',发生业务异常'{}'", request.getRequestURI(), e.getMessage()); Integer code = e.getCode(); return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); } @@ -68,8 +69,8 @@ public class GlobalExceptionHandler * {@link cn.hutool.core.lang.Assert} */ @ExceptionHandler(IllegalArgumentException.class) - public AjaxResult illegalArgumentException(IllegalArgumentException e) { - log.error(e.getMessage(), e); + public AjaxResult illegalArgumentException(IllegalArgumentException e, HttpServletRequest request) { + log.error("请求地址'{}',发生校验异常'{}'", request.getRequestURI(), e.getMessage()); return AjaxResult.error(e.getMessage()); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/domain/AlipayCallback.java b/xkt/src/main/java/com/ruoyi/xkt/domain/AlipayCallback.java index 6330b9b50..3c7a9cea7 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/domain/AlipayCallback.java +++ b/xkt/src/main/java/com/ruoyi/xkt/domain/AlipayCallback.java @@ -17,6 +17,10 @@ import java.math.BigDecimal; @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class AlipayCallback extends SimpleEntity { + /** + * 业务类型[1:订单支付 2:充值] + */ + private Integer bizType; /** * 通知的类型 */ diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/EAlipayCallbackBizType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/EAlipayCallbackBizType.java new file mode 100644 index 000000000..c44229ed3 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/EAlipayCallbackBizType.java @@ -0,0 +1,29 @@ +package com.ruoyi.xkt.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author liangyq + * @date 2025-05-13 14:39 + */ +@Getter +@AllArgsConstructor +public enum EAlipayCallbackBizType { + + ORDER_PAY(1, "订单支付"), + RECHARGE(2, "充值"), + ; + + private final Integer value; + private final String label; + + public static EAlipayCallbackBizType of(Integer value) { + for (EAlipayCallbackBizType e : EAlipayCallbackBizType.values()) { + if (e.getValue().equals(value)) { + return e; + } + } + return null; + } +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IAlipayCallbackService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IAlipayCallbackService.java index 536558d5a..028584bf6 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IAlipayCallbackService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IAlipayCallbackService.java @@ -30,4 +30,11 @@ public interface IAlipayCallbackService { * @param info */ void processOrderPaid(AlipayCallback info); + + /** + * 处理充值结果 + * + * @param info + */ + void processRecharge(AlipayCallback info); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java index 64154d86f..7b03df73c 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java @@ -58,4 +58,14 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService { //创建收款单 financeBillService.createOrderPaidCollectionBill(orderExt, info.getId(), EPayChannel.ALI_PAY); } + + @Transactional(rollbackFor = Exception.class) + @Override + public void processRecharge(AlipayCallback info) { + //更新回调状态 + info.setProcessStatus(EProcessStatus.SUCCESS.getValue()); + alipayCallbackMapper.updateById(info); + //收款单到账 + financeBillService.entryRechargeCollectionBill(info.getOutTradeNo()); + } } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java index 30433dae2..d0ab4354a 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java @@ -383,19 +383,13 @@ public class StoreOrderServiceImpl implements IStoreOrderService { expressTracks.add(expressTrackDTO); } orderInfo.setExpressTracks(expressTracks); - Map regionMap = expressService.getRegionMapCache(); - orderInfo.setDestinationProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - orderInfo.setDestinationCityName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - orderInfo.setDestinationCountyName(Optional.ofNullable(regionMap.get(orderInfo.getDestinationCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - orderInfo.setOriginProvinceName(Optional.ofNullable(regionMap.get(orderInfo.getOriginProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - orderInfo.setOriginCityName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - orderInfo.setOriginCountyName(Optional.ofNullable(regionMap.get(orderInfo.getOriginCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); + Map regionMap = expressService.getRegionNameMapCache(); + orderInfo.setDestinationProvinceName(regionMap.get(orderInfo.getDestinationProvinceCode())); + orderInfo.setDestinationCityName(regionMap.get(orderInfo.getDestinationCityCode())); + orderInfo.setDestinationCountyName(regionMap.get(orderInfo.getDestinationCountyCode())); + orderInfo.setOriginProvinceName(regionMap.get(orderInfo.getOriginProvinceCode())); + orderInfo.setOriginCityName(regionMap.get(orderInfo.getOriginCityCode())); + orderInfo.setOriginCountyName(regionMap.get(orderInfo.getOriginCountyCode())); //商品信息 List spIds = detailInfos.stream().map(StoreOrderDetailInfoDTO::getStoreProdId).distinct() .collect(Collectors.toList()); @@ -426,21 +420,15 @@ public class StoreOrderServiceImpl implements IStoreOrderService { Map> orderDetailGroup = orderDetailList .stream() .collect(Collectors.groupingBy(StoreOrderDetailDTO::getStoreOrderId)); - Map regionMap = expressService.getRegionMapCache(); + Map regionMap = expressService.getRegionNameMapCache(); for (StoreOrderPageItemDTO order : list) { //物流信息 - order.setDestinationProvinceName(Optional.ofNullable(regionMap.get(order.getDestinationProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - order.setDestinationCityName(Optional.ofNullable(regionMap.get(order.getDestinationCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - order.setDestinationCountyName(Optional.ofNullable(regionMap.get(order.getDestinationCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - order.setOriginProvinceName(Optional.ofNullable(regionMap.get(order.getOriginProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - order.setOriginCityName(Optional.ofNullable(regionMap.get(order.getOriginCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - order.setOriginCountyName(Optional.ofNullable(regionMap.get(order.getOriginCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); + order.setDestinationProvinceName(regionMap.get(order.getDestinationProvinceCode())); + order.setDestinationCityName(regionMap.get(order.getDestinationCityCode())); + order.setDestinationCountyName(regionMap.get(order.getDestinationCountyCode())); + order.setOriginProvinceName(regionMap.get(order.getOriginProvinceCode())); + order.setOriginCityName(regionMap.get(order.getOriginCityCode())); + order.setOriginCountyName(regionMap.get(order.getOriginCountyCode())); order.setOrderDetails(orderDetailGroup.get(order.getId())); for (StoreOrderDetailInfoDTO detail : order.getOrderDetails()) { //首图 @@ -1434,19 +1422,13 @@ public class StoreOrderServiceImpl implements IStoreOrderService { //生成请求号 reqDTO.setExpressReqNo(IdUtil.simpleUUID()); //行政区划信息 - Map regionMap = expressService.getRegionMapCache(); - reqDTO.setDestinationProvinceName(Optional.ofNullable(regionMap.get(order.getDestinationProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - reqDTO.setDestinationCityName(Optional.ofNullable(regionMap.get(order.getDestinationCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - reqDTO.setDestinationCountyName(Optional.ofNullable(regionMap.get(order.getDestinationCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - reqDTO.setOriginProvinceName(Optional.ofNullable(regionMap.get(order.getOriginProvinceCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - reqDTO.setOriginCityName(Optional.ofNullable(regionMap.get(order.getOriginCityCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); - reqDTO.setOriginCountyName(Optional.ofNullable(regionMap.get(order.getOriginCountyCode())) - .map(ExpressRegionDTO::getRegionName).orElse(null)); + Map regionMap = expressService.getRegionNameMapCache(); + reqDTO.setDestinationProvinceName(regionMap.get(order.getDestinationProvinceCode())); + reqDTO.setDestinationCityName(regionMap.get(order.getDestinationCityCode())); + reqDTO.setDestinationCountyName(regionMap.get(order.getDestinationCountyCode())); + reqDTO.setOriginProvinceName(regionMap.get(order.getOriginProvinceCode())); + reqDTO.setOriginCityName(regionMap.get(order.getOriginCityCode())); + reqDTO.setOriginCountyName(regionMap.get(order.getOriginCountyCode())); //货物信息 List orderItems = CollUtil.emptyIfNull(orderDetails).stream() .map(o -> ExpressShipReqDTO.OrderItem