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) ); }