From e00c94f982a248cb75db30a04402a3d298de281c Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Sat, 16 Aug 2025 12:25:40 +0800 Subject: [PATCH] =?UTF-8?q?8.16=20=E8=A7=A3=E5=86=B3=E4=B8=9A=E5=8A=A1bug?= =?UTF-8?q?=20=E8=90=A5=E9=94=80=E8=AE=A2=E5=8D=95=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=9C=AA=E4=BB=98=E6=AC=BE=EF=BC=8C=E8=BF=99=E7=A7=8D=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=B8=8B=E9=80=80=E5=8D=95=E4=B9=9F=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E4=BA=86=E6=94=AF=E4=BB=98=E5=AE=9D=E9=80=80=E5=8D=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/order/service/OrderService.java | 120 ++++++++---------- .../infrastructure/gateway/ProductRPC.java | 4 +- 2 files changed, 58 insertions(+), 66 deletions(-) diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java index d0d9cd4..ed4e543 100644 --- a/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java +++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java @@ -147,79 +147,31 @@ public class OrderService extends AbstractOrderService{ } /** - * 预备退单 + * 公共退款逻辑:根据订单状态决定退单方式 */ - @Override - public boolean preRefundOrder(String userId, String orderId) { - // 1. 查单 - OrderEntity orderEntity = repository.queryOrderByUserIdAndOrderId(userId, orderId); - if (orderEntity == null) { - log.warn("退单失败,订单不存在或不属于该用户 userId:{} orderId:{}", userId, orderId); - return false; - } - + private boolean doRefund(OrderEntity orderEntity) { + String userId = orderEntity.getUserId(); + String orderId = orderEntity.getOrderId(); String status = orderEntity.getOrderStatusVO().getCode(); - // 已关闭直接拒绝 - if (OrderStatusVO.CLOSE.getCode().equals(status)) { - log.warn("退单失败,订单已关闭 userId:{} orderId:{} status:{}", userId, orderId, status); - return false; - } - // 2. 营销锁单走营销通道 + 统一改库 - int marketType = orderEntity.getMarketType(); // 建议后续用枚举替代裸常量 - if (marketType == 1) { - try { - port.refundMarketPayOrder(userId, orderId); - } catch (Exception e) { - // 这里按你的容忍度决定是否直接返回 false - log.error("营销退单通道异常 userId:{} orderId:{} err:{}", userId, orderId, e.getMessage(), e); - return false; - } - boolean result = repository.refundMarketOrder(userId, orderId); - if (result) { - log.info("营销退单成功(已改库) userId:{} orderId:{}", userId, orderId); - } else { - log.warn("营销退单失败(改库失败) userId:{} orderId:{}", userId, orderId); - } - return result; - } - - // 3. 普通订单分未付款 / 已付款 + // 1. 未付款:仅改库 if (OrderStatusVO.CREATE.getCode().equals(status) || OrderStatusVO.PAY_WAIT.getCode().equals(status)) { - // 未付款:仅改库 boolean result = repository.refundOrder(userId, orderId); if (result) { - log.info("普通未付款退单成功(仅改库) userId:{} orderId:{}", userId, orderId); + log.info("退款成功(未付款订单,仅改库) userId:{} orderId:{}", userId, orderId); } else { - log.warn("普通未付款退单失败(改库失败) userId:{} orderId:{}", userId, orderId); + log.warn("退款失败(未付款订单改库失败) userId:{} orderId:{}", userId, orderId); } return result; - } else { - // 已付款:三方退款 + 改库(用你已有的方法) - return refundPayOrder(userId, orderId); - } - } - - /** - * 真正的退钱、关闭订单逻辑 - */ - @Override - public boolean refundPayOrder(String userId, String orderId) /* throws AlipayApiException */ { - // 1. 查询订单信息,验证订单是否存在且属于该用户 - OrderEntity orderEntity = repository.queryOrderByUserIdAndOrderId(userId, orderId); - if (orderEntity == null) { - log.warn("退款失败,订单不存在或不属于该用户 userId:{} orderId:{}", userId, orderId); - return false; } - boolean dbOk = false; // 以落库结果为最终返回 - + // 2. 已付款:三方退款 + 改库 + boolean dbOk = false; try { - // 2. 调用支付宝退款(沙箱里允许失败) AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); AlipayTradeRefundModel refundModel = new AlipayTradeRefundModel(); - refundModel.setOutTradeNo(orderEntity.getOrderId()); + refundModel.setOutTradeNo(orderId); refundModel.setRefundAmount(orderEntity.getPayAmount().toString()); refundModel.setRefundReason("交易退单"); request.setBizModel(refundModel); @@ -228,16 +180,13 @@ public class OrderService extends AbstractOrderService{ if (resp.isSuccess()) { log.info("支付宝退款成功 userId:{} orderId:{}", userId, orderId); } else { - // 不影响后续改库 log.warn("支付宝退款失败(沙箱忽略) code={}, subCode={}, msg={}", resp.getCode(), resp.getSubCode(), resp.getSubMsg()); } } catch (Exception e) { - // 捕获所有异常,避免抛出导致 MQ 重试 log.error("调用支付宝退款异常(沙箱忽略) userId:{} orderId:{} err:{}", userId, orderId, e.getMessage(), e); } finally { - // 3. 必须执行状态变更(你要求的“必须执行”) try { dbOk = repository.refundOrder(userId, orderId); if (dbOk) { @@ -246,14 +195,57 @@ public class OrderService extends AbstractOrderService{ log.warn("订单状态更新失败 userId:{} orderId:{}", userId, orderId); } } catch (Exception de) { - // 落库异常要打日志并返回 false,交由上层决定是否重试/告警 log.error("订单状态更新异常 userId:{} orderId:{} err:{}", userId, orderId, de.getMessage(), de); dbOk = false; } } - - // 返回以数据库落库为准;支付宝失败在沙箱场景被忽略 return dbOk; } + + /** + * 预备退单 + */ + @Override + public boolean preRefundOrder(String userId, String orderId) { + OrderEntity orderEntity = repository.queryOrderByUserIdAndOrderId(userId, orderId); + if (orderEntity == null) { + log.warn("退单失败,订单不存在或不属于该用户 userId:{} orderId:{}", userId, orderId); + return false; + } + + String status = orderEntity.getOrderStatusVO().getCode(); + if (OrderStatusVO.CLOSE.getCode().equals(status)) { + log.warn("退单失败,订单已关闭 userId:{} orderId:{} status:{}", userId, orderId, status); + return false; + } + + int marketType = orderEntity.getMarketType(); + if (marketType == 1) { + try { + port.refundMarketPayOrder(userId, orderId); + } catch (Exception e) { + log.error("营销退单通道异常 userId:{} orderId:{} err:{}", userId, orderId, e.getMessage(), e); + return false; + } + return repository.refundMarketOrder(userId, orderId); + } + + // 普通订单走统一逻辑 + return doRefund(orderEntity); + } + + /** + * 真正的退款逻辑(给 MQ 或别的地方直接调) + */ + @Override + public boolean refundPayOrder(String userId, String orderId) { + OrderEntity orderEntity = repository.queryOrderByUserIdAndOrderId(userId, orderId); + if (orderEntity == null) { + log.warn("退款失败,订单不存在或不属于该用户 userId:{} orderId:{}", userId, orderId); + return false; + } + return doRefund(orderEntity); + } + } diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java index ac1b7ad..84ab959 100644 --- a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java +++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java @@ -14,8 +14,8 @@ public class ProductRPC { public ProductDTO queryProductByProductId(String productId){ ProductDTO productVO = new ProductDTO(); productVO.setProductId(productId); - productVO.setProductName("MyBatisBook"); - productVO.setProductDesc("MyBatisBook"); + productVO.setProductName("早晨从中午开始"); + productVO.setProductDesc("早晨从中午开始"); productVO.setPrice(new BigDecimal("100.00")); return productVO; }