You've already forked FrameTour-BE
feat(order): 完善订单创建和支付流程
- 添加优惠券和券码的使用记录及状态更新 - 优化支付成功、取消和退款的处理逻辑 - 增加异常处理,确保事务一致性
This commit is contained in:
@@ -24,6 +24,9 @@ import com.ycwl.basic.pricing.dto.DiscountDetail;
|
|||||||
import com.ycwl.basic.pricing.dto.PriceCalculationResult;
|
import com.ycwl.basic.pricing.dto.PriceCalculationResult;
|
||||||
import com.ycwl.basic.pricing.dto.ProductItem;
|
import com.ycwl.basic.pricing.dto.ProductItem;
|
||||||
import com.ycwl.basic.pricing.dto.VoucherInfo;
|
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.adapter.IPayAdapter;
|
||||||
import com.ycwl.basic.pay.entity.CreateOrderRequest;
|
import com.ycwl.basic.pay.entity.CreateOrderRequest;
|
||||||
import com.ycwl.basic.pay.entity.CreateOrderResponse;
|
import com.ycwl.basic.pay.entity.CreateOrderResponse;
|
||||||
@@ -57,11 +60,12 @@ public class OrderServiceImpl implements IOrderService {
|
|||||||
private final OrderRefundMapper orderRefundMapper;
|
private final OrderRefundMapper orderRefundMapper;
|
||||||
private final OrderEventManager orderEventManager;
|
private final OrderEventManager orderEventManager;
|
||||||
private final ScenicService scenicService;
|
private final ScenicService scenicService;
|
||||||
private final FaceRepository faceRepository;
|
|
||||||
private final MemberMapper memberMapper;
|
private final MemberMapper memberMapper;
|
||||||
|
private final ICouponService couponService;
|
||||||
|
private final IVoucherService voucherService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long createOrder(MobileOrderRequest request, Long userId, Long scenicId, PriceCalculationResult priceResult) {
|
public Long createOrder(MobileOrderRequest request, Long userId, Long scenicId, PriceCalculationResult priceResult) {
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
MemberRespVO member = memberMapper.getById(userId);
|
MemberRespVO member = memberMapper.getById(userId);
|
||||||
@@ -117,7 +121,7 @@ public class OrderServiceImpl implements IOrderService {
|
|||||||
|
|
||||||
log.info("订单商品明细保存成功: orderId={}, itemCount={}", orderId, request.getProducts().size());
|
log.info("订单商品明细保存成功: orderId={}, itemCount={}", orderId, request.getProducts().size());
|
||||||
|
|
||||||
// 4. 记录使用的优惠券信息
|
// 4. 记录使用的优惠券信息并标记为已使用
|
||||||
if (priceResult.getUsedCoupon() != null) {
|
if (priceResult.getUsedCoupon() != null) {
|
||||||
OrderDiscountV2 couponDiscount = new OrderDiscountV2();
|
OrderDiscountV2 couponDiscount = new OrderDiscountV2();
|
||||||
couponDiscount.setOrderId(orderId);
|
couponDiscount.setOrderId(orderId);
|
||||||
@@ -131,9 +135,29 @@ public class OrderServiceImpl implements IOrderService {
|
|||||||
orderDiscountMapper.insert(couponDiscount);
|
orderDiscountMapper.insert(couponDiscount);
|
||||||
log.info("优惠券记录保存成功: orderId={}, couponId={}, discountAmount={}",
|
log.info("优惠券记录保存成功: orderId={}, couponId={}, discountAmount={}",
|
||||||
orderId, priceResult.getUsedCoupon().getCouponId(), priceResult.getUsedCoupon().getActualDiscountAmount());
|
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) {
|
if (priceResult.getUsedVoucher() != null) {
|
||||||
VoucherInfo voucherInfo = priceResult.getUsedVoucher();
|
VoucherInfo voucherInfo = priceResult.getUsedVoucher();
|
||||||
OrderDiscountV2 voucherDiscount = new OrderDiscountV2();
|
OrderDiscountV2 voucherDiscount = new OrderDiscountV2();
|
||||||
@@ -148,6 +172,19 @@ public class OrderServiceImpl implements IOrderService {
|
|||||||
orderDiscountMapper.insert(voucherDiscount);
|
orderDiscountMapper.insert(voucherDiscount);
|
||||||
log.info("券码记录保存成功: orderId={}, voucherCode={}, discountAmount={}",
|
log.info("券码记录保存成功: orderId={}, voucherCode={}, discountAmount={}",
|
||||||
orderId, voucherInfo.getVoucherCode(), voucherInfo.getActualDiscountAmount());
|
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. 记录其他优惠信息(如限时立减等)
|
// 6. 记录其他优惠信息(如限时立减等)
|
||||||
@@ -654,27 +691,26 @@ public class OrderServiceImpl implements IOrderService {
|
|||||||
|
|
||||||
// 触发支付成功事件
|
// 触发支付成功事件
|
||||||
orderEventManager.publishPaymentStatusChangeEvent(
|
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()) {
|
} else if (callbackResponse.isCancel()) {
|
||||||
// 支付取消
|
// 支付取消 - 这种情况下支付状态保持未支付,不需要特别处理
|
||||||
statusChangeType = "CANCELLED";
|
statusChangeType = "CANCELLED";
|
||||||
updatePaymentStatus(order.getId(), PaymentStatus.CANCELLED.name());
|
log.info("支付被取消,支付状态保持未支付: orderId={}", order.getId());
|
||||||
|
|
||||||
// 触发支付取消事件
|
|
||||||
orderEventManager.publishPaymentStatusChangeEvent(
|
|
||||||
new PaymentStatusChangeEvent(order.getId(), PaymentStatus.PENDING, PaymentStatus.CANCELLED)
|
|
||||||
);
|
|
||||||
|
|
||||||
} else if (callbackResponse.isRefund()) {
|
} else if (callbackResponse.isRefund()) {
|
||||||
// 退款
|
// 退款
|
||||||
statusChangeType = "REFUNDED";
|
statusChangeType = "REFUNDED";
|
||||||
updateRefundStatus(order.getId(), RefundStatus.COMPLETED.name());
|
updatePaymentStatus(order.getId(), PaymentStatus.REFUNDED.name());
|
||||||
|
updateRefundStatus(order.getId(), RefundStatus.FULL_REFUND);
|
||||||
|
|
||||||
// 触发退款事件
|
// 触发退款事件
|
||||||
orderEventManager.publishRefundStatusChangeEvent(
|
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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user