From e2b760caab548a66500421d6029217d84e892d18 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 29 Aug 2025 15:50:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E5=AE=8C=E5=96=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=88=9B=E5=BB=BA=E5=92=8C=E6=94=AF=E4=BB=98=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加优惠券和券码的使用记录及状态更新 - 优化支付成功、取消和退款的处理逻辑 - 增加异常处理,确保事务一致性 --- .../order/service/impl/OrderServiceImpl.java | 64 +++++++++++++++---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java index f629a1b..a3f3539 100644 --- a/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java @@ -24,6 +24,9 @@ import com.ycwl.basic.pricing.dto.DiscountDetail; import com.ycwl.basic.pricing.dto.PriceCalculationResult; import com.ycwl.basic.pricing.dto.ProductItem; import com.ycwl.basic.pricing.dto.VoucherInfo; +import com.ycwl.basic.pricing.dto.CouponUseRequest; +import com.ycwl.basic.pricing.service.ICouponService; +import com.ycwl.basic.pricing.service.IVoucherService; import com.ycwl.basic.pay.adapter.IPayAdapter; import com.ycwl.basic.pay.entity.CreateOrderRequest; import com.ycwl.basic.pay.entity.CreateOrderResponse; @@ -57,11 +60,12 @@ public class OrderServiceImpl implements IOrderService { private final OrderRefundMapper orderRefundMapper; private final OrderEventManager orderEventManager; private final ScenicService scenicService; - private final FaceRepository faceRepository; private final MemberMapper memberMapper; + private final ICouponService couponService; + private final IVoucherService voucherService; @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public Long createOrder(MobileOrderRequest request, Long userId, Long scenicId, PriceCalculationResult priceResult) { Date now = new Date(); MemberRespVO member = memberMapper.getById(userId); @@ -117,7 +121,7 @@ public class OrderServiceImpl implements IOrderService { log.info("订单商品明细保存成功: orderId={}, itemCount={}", orderId, request.getProducts().size()); - // 4. 记录使用的优惠券信息 + // 4. 记录使用的优惠券信息并标记为已使用 if (priceResult.getUsedCoupon() != null) { OrderDiscountV2 couponDiscount = new OrderDiscountV2(); couponDiscount.setOrderId(orderId); @@ -131,9 +135,29 @@ public class OrderServiceImpl implements IOrderService { orderDiscountMapper.insert(couponDiscount); log.info("优惠券记录保存成功: orderId={}, couponId={}, discountAmount={}", orderId, priceResult.getUsedCoupon().getCouponId(), priceResult.getUsedCoupon().getActualDiscountAmount()); + + // 标记优惠券为已使用 + try { + CouponUseRequest couponUseRequest = new CouponUseRequest(); + couponUseRequest.setCouponId(priceResult.getUsedCoupon().getCouponId()); + couponUseRequest.setUserId(userId); + couponUseRequest.setOrderId(orderNo); + couponUseRequest.setOriginalAmount(priceResult.getOriginalAmount()); + couponUseRequest.setDiscountAmount(priceResult.getUsedCoupon().getActualDiscountAmount()); + couponUseRequest.setScenicId(scenicId.toString()); + + couponService.useCoupon(couponUseRequest); + log.info("优惠券状态更新成功: couponId={}, orderId={}", + priceResult.getUsedCoupon().getCouponId(), orderNo); + } catch (Exception e) { + log.error("优惠券状态更新失败: couponId={}, orderId={}, error={}", + priceResult.getUsedCoupon().getCouponId(), orderNo, e.getMessage(), e); + // 这里可以选择抛出异常或者记录错误继续执行,根据业务需求决定 + throw new BaseException("优惠券使用失败: " + e.getMessage()); + } } - // 5. 记录使用的券码信息 + // 5. 记录使用的券码信息并标记为已使用 if (priceResult.getUsedVoucher() != null) { VoucherInfo voucherInfo = priceResult.getUsedVoucher(); OrderDiscountV2 voucherDiscount = new OrderDiscountV2(); @@ -148,6 +172,19 @@ public class OrderServiceImpl implements IOrderService { orderDiscountMapper.insert(voucherDiscount); log.info("券码记录保存成功: orderId={}, voucherCode={}, discountAmount={}", orderId, voucherInfo.getVoucherCode(), voucherInfo.getActualDiscountAmount()); + + // 标记券码为已使用 + try { + String remark = "订单使用,订单号:" + orderNo; + voucherService.markVoucherAsUsed(voucherInfo.getVoucherCode(), remark); + log.info("券码状态更新成功: voucherCode={}, orderId={}", + voucherInfo.getVoucherCode(), orderNo); + } catch (Exception e) { + log.error("券码状态更新失败: voucherCode={}, orderId={}, error={}", + voucherInfo.getVoucherCode(), orderNo, e.getMessage(), e); + // 这里可以选择抛出异常或者记录错误继续执行,根据业务需求决定 + throw new BaseException("券码使用失败: " + e.getMessage()); + } } // 6. 记录其他优惠信息(如限时立减等) @@ -654,27 +691,26 @@ public class OrderServiceImpl implements IOrderService { // 触发支付成功事件 orderEventManager.publishPaymentStatusChangeEvent( - new PaymentStatusChangeEvent(order.getId(), PaymentStatus.PENDING, PaymentStatus.PAID) + new PaymentStatusChangeEvent(order.getId(), order.getOrderNo(), + PaymentStatus.UNPAID, PaymentStatus.PAID, "支付回调成功", null) ); } else if (callbackResponse.isCancel()) { - // 支付取消 + // 支付取消 - 这种情况下支付状态保持未支付,不需要特别处理 statusChangeType = "CANCELLED"; - updatePaymentStatus(order.getId(), PaymentStatus.CANCELLED.name()); - - // 触发支付取消事件 - orderEventManager.publishPaymentStatusChangeEvent( - new PaymentStatusChangeEvent(order.getId(), PaymentStatus.PENDING, PaymentStatus.CANCELLED) - ); + log.info("支付被取消,支付状态保持未支付: orderId={}", order.getId()); } else if (callbackResponse.isRefund()) { // 退款 statusChangeType = "REFUNDED"; - updateRefundStatus(order.getId(), RefundStatus.COMPLETED.name()); + updatePaymentStatus(order.getId(), PaymentStatus.REFUNDED.name()); + updateRefundStatus(order.getId(), RefundStatus.FULL_REFUND); // 触发退款事件 orderEventManager.publishRefundStatusChangeEvent( - new RefundStatusChangeEvent(order.getId(), RefundStatus.PENDING, RefundStatus.COMPLETED) + new RefundStatusChangeEvent(order.getId(), order.getOrderNo(), null, null, + RefundStatus.NO_REFUND, RefundStatus.FULL_REFUND, + order.getFinalAmount(), "支付回调退款", null) ); }