feat(order): 完善订单创建和支付流程

- 添加优惠券和券码的使用记录及状态更新
- 优化支付成功、取消和退款的处理逻辑
- 增加异常处理,确保事务一致性
This commit is contained in:
2025-08-29 15:50:10 +08:00
parent 5a66856e72
commit e2b760caab

View File

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