From 57b087a4fb693e52a64c80cf0e752b0cf8878fee Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 30 Aug 2025 14:25:28 +0800 Subject: [PATCH] =?UTF-8?q?refactor(order):=20=E9=87=8D=E6=9E=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=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 createOrderCompact 方法实现旧版订单创建逻辑 - 新增 getPaymentParams 方法获取支付参数 - 更新 AppOrderV2Controller调用新的订单创建和支付参数获取方法 - 在 OrderMapper 中添加 getOrderItems 方法获取订单详情- 更新 VideoRepository 接口,增加根据人脸和模板 ID 获取视频列表的方法 - 在 OrderServiceImpl 中实现新的订单创建和支付参数获取逻辑 - 更新 OrderService 接口,添加新的方法声明 - 在 OrderMapper.xml 中添加新的 SQL 查询语句 --- .../mobile/AppOrderV2Controller.java | 50 ++++--- .../com/ycwl/basic/mapper/OrderMapper.java | 2 + .../model/pc/order/req/CreateOrderReqVO.java | 2 - .../basic/repository/VideoRepository.java | 4 + .../ycwl/basic/service/pc/OrderService.java | 8 ++ .../service/pc/impl/OrderServiceImpl.java | 124 ++++++++++++++++++ src/main/resources/mapper/OrderMapper.xml | 3 + 7 files changed, 173 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java index e84ade6..3a7d764 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java @@ -2,6 +2,8 @@ package com.ycwl.basic.controller.mobile; import com.github.pagehelper.PageInfo; import com.ycwl.basic.constant.BaseContextHandler; +import com.ycwl.basic.model.pc.order.req.CreateOrderReqVO; +import com.ycwl.basic.service.pc.OrderService; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.pricing.dto.*; import com.ycwl.basic.pricing.service.IPriceCalculationService; @@ -37,6 +39,7 @@ public class AppOrderV2Controller { private final FaceService faceService; private final PriceCacheService priceCacheService; private final IOrderService orderService; + private final OrderService oldOrderService; /** * 移动端价格计算 @@ -166,20 +169,28 @@ public class AppOrderV2Controller { log.info("价格缓存验证通过: userId={}, scenicId={}, finalAmount={}", currentUserId, scenicId, cachedResult.getFinalAmount()); - - // 创建订单 + + // 使用旧版创建订单逻辑 try { - Long orderId = orderService.createOrder(request, currentUserId, scenicId, cachedResult); - - log.info("移动端订单创建成功: orderId={}, userId={}, scenicId={}, finalAmount={}", - orderId, currentUserId, scenicId, cachedResult.getFinalAmount()); - - return ApiResponse.success(orderId.toString()); - + Long orderId = oldOrderService.createOrderCompact(currentUserId, request, cachedResult); + return ApiResponse.success(String.valueOf(orderId)); } catch (Exception e) { - log.error("订单创建失败: userId={}, scenicId={}, error={}", currentUserId, scenicId, e.getMessage(), e); return ApiResponse.fail("订单创建失败,请稍后重试"); } + + // 创建订单 +// try { +// Long orderId = orderService.createOrder(request, currentUserId, scenicId, cachedResult); +// +// log.info("移动端订单创建成功: orderId={}, userId={}, scenicId={}, finalAmount={}", +// orderId, currentUserId, scenicId, cachedResult.getFinalAmount()); +// +// return ApiResponse.success(orderId.toString()); +// +// } catch (Exception e) { +// log.error("订单创建失败: userId={}, scenicId={}, error={}", currentUserId, scenicId, e.getMessage(), e); +// return ApiResponse.fail("订单创建失败,请稍后重试"); +// } } // ====== 新增移动端订单查询功能 ====== @@ -264,14 +275,17 @@ public class AppOrderV2Controller { Long currentUserId = Long.valueOf(currentUserIdStr); log.info("获取支付参数: userId={}, orderId={}", currentUserId, orderId); - - try { - PaymentParamsResponse response = orderService.getPaymentParams(orderId, currentUserId, request); - return ApiResponse.success(response); - } catch (Exception e) { - log.error("获取支付参数失败: userId={}, orderId={}", currentUserId, orderId, e); - return ApiResponse.fail(e.getMessage()); - } + + return oldOrderService.getPaymentParams(orderId, currentUserId, request); + +// +// try { +// PaymentParamsResponse response = orderService.getPaymentParams(orderId, currentUserId, request); +// return ApiResponse.success(response); +// } catch (Exception e) { +// log.error("获取支付参数失败: userId={}, orderId={}", currentUserId, orderId, e); +// return ApiResponse.fail(e.getMessage()); +// } } /** diff --git a/src/main/java/com/ycwl/basic/mapper/OrderMapper.java b/src/main/java/com/ycwl/basic/mapper/OrderMapper.java index 202c354..b022369 100644 --- a/src/main/java/com/ycwl/basic/mapper/OrderMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/OrderMapper.java @@ -57,4 +57,6 @@ public interface OrderMapper { OrderEntity getUserOrderItem(Long userId, Long scenicId, int orderType, Long configId, Integer goodsType, Long goodsId); int updateMemberIdByFaceId(OrderEntity orderEntity); + + List getOrderItems(Long orderId); } diff --git a/src/main/java/com/ycwl/basic/model/pc/order/req/CreateOrderReqVO.java b/src/main/java/com/ycwl/basic/model/pc/order/req/CreateOrderReqVO.java index bc41fd3..20b75f8 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/req/CreateOrderReqVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/req/CreateOrderReqVO.java @@ -7,6 +7,4 @@ public class CreateOrderReqVO { private Long scenicId; private Integer goodsType; private Long goodsId; - private String brokerCode; - private Long couponId; } diff --git a/src/main/java/com/ycwl/basic/repository/VideoRepository.java b/src/main/java/com/ycwl/basic/repository/VideoRepository.java index c0d4ae6..3c69c71 100644 --- a/src/main/java/com/ycwl/basic/repository/VideoRepository.java +++ b/src/main/java/com/ycwl/basic/repository/VideoRepository.java @@ -132,4 +132,8 @@ public class VideoRepository { } return true; } + + public List getVideoByFaceAndTemplateId(Long memberId, Long faceId, String templateId) { + return videoMapper.userFaceTemplateVideo(memberId, faceId, Long.valueOf(templateId)); + } } diff --git a/src/main/java/com/ycwl/basic/service/pc/OrderService.java b/src/main/java/com/ycwl/basic/service/pc/OrderService.java index 60f308e..398bb96 100644 --- a/src/main/java/com/ycwl/basic/service/pc/OrderService.java +++ b/src/main/java/com/ycwl/basic/service/pc/OrderService.java @@ -1,6 +1,7 @@ package com.ycwl.basic.service.pc; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.dto.MobileOrderRequest; import com.ycwl.basic.enums.OrderStateEnum; import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.RefundOrderReq; @@ -11,7 +12,10 @@ import com.ycwl.basic.model.pc.order.req.OrderUpdateReq; import com.ycwl.basic.model.pc.order.req.OrderReqQuery; import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO; import com.ycwl.basic.model.pc.order.resp.OrderRespVO; +import com.ycwl.basic.order.dto.PaymentParamsRequest; +import com.ycwl.basic.order.dto.PaymentParamsResponse; import com.ycwl.basic.pay.entity.PayResponse; +import com.ycwl.basic.pricing.dto.PriceCalculationResult; import com.ycwl.basic.utils.ApiResponse; import java.util.List; @@ -68,4 +72,8 @@ public interface OrderService { ApiResponse> createBatchOrder(Long userId, CreateBatchOrderReqVO batchOrderReqVO) throws Exception; PayResponse queryOrder(Long orderId); + + Long createOrderCompact(Long userId, MobileOrderRequest request, PriceCalculationResult cachedResult); + + ApiResponse getPaymentParams(Long orderId, Long userId, PaymentParamsRequest request); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java index 6c12663..37b6768 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java @@ -1,8 +1,16 @@ package com.ycwl.basic.service.pc.impl; import cn.hutool.core.date.DateUtil; +import com.ycwl.basic.dto.MobileOrderRequest; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity; +import com.ycwl.basic.order.dto.PaymentParamsRequest; +import com.ycwl.basic.order.dto.PaymentParamsResponse; +import com.ycwl.basic.pricing.dto.CouponUseRequest; +import com.ycwl.basic.pricing.dto.PriceCalculationResult; +import com.ycwl.basic.pricing.dto.ProductItem; +import com.ycwl.basic.pricing.service.ICouponService; +import com.ycwl.basic.pricing.service.IVoucherService; import com.ycwl.basic.utils.JacksonUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -122,6 +130,10 @@ public class OrderServiceImpl implements OrderService { private ScenicService scenicService; @Autowired private VideoMapper videoMapper; + @Autowired + private IVoucherService iVoucherService; + @Autowired + private ICouponService iCouponService; @Override public ApiResponse> pageQuery(OrderReqQuery query) { @@ -734,4 +746,116 @@ public class OrderServiceImpl implements OrderService { return payResponse; } + @Override + public Long createOrderCompact(Long userId, MobileOrderRequest request, PriceCalculationResult cachedResult) { + FaceEntity face = faceRepository.getFace(request.getFaceId()); + ProductItem productItem = request.getProducts().getFirst(); + Integer type = switch (productItem.getProductType()) { + case PHOTO_SET -> 2; + case VLOG_VIDEO -> 0; + case RECORDING_SET -> 1; + default -> 0; + }; + Long goodsId = switch (productItem.getProductType()) { + case PHOTO_SET, RECORDING_SET -> face.getId(); + case VLOG_VIDEO -> { + List videos = videoRepository.getVideoByFaceAndTemplateId(face.getMemberId(), face.getId(), productItem.getProductId()); + yield videos.getFirst().getVideoId(); + } + default -> 0L; + }; + IsBuyRespVO isBuy = orderBiz.isBuy(userId, face.getScenicId(), type, goodsId); + if (isBuy.isBuy()) { + throw new BaseException("您已购买此内容,无需重复购买!"); + } + // 看看有没有之前购买的订单 + OrderEntity order = orderMapper.getUserOrderItem(userId, face.getScenicId(), 0, null, type, goodsId); + boolean haveOldOrder = false; + if (order != null) { + // 如果订单已支付,直接返回错误,不允许重复购买 + if (order.getStatus() == OrderStateEnum.PAID.getState()) { + throw new BaseException("您已购买此内容,无需重复购买!"); + } + // 只有未支付的订单才允许复用 + if (order.getStatus() == OrderStateEnum.UNPAID.getState() + && DateUtil.isSameDay(order.getCreateAt(), new Date())) { + haveOldOrder = true; + } + } + if (!haveOldOrder) { + order = new OrderEntity(); + order.setId(SnowFlakeUtil.getLongId()); + order.setFaceId(face.getId()); + order.setMemberId(userId); + MemberRespVO member = memberMapper.getById(userId); + order.setOpenId(member.getOpenId()); + order.setScenicId(face.getScenicId()); + + order.setSlashPrice(cachedResult.getOriginalAmount()); + order.setPrice(cachedResult.getFinalAmount()); + // promo code + order.setPayPrice(cachedResult.getFinalAmount()); + if (order.getPayPrice().equals(BigDecimal.ZERO)) { + order.setStatus(OrderStateEnum.PAID.getState()); + order.setPayAt(new Date()); + } else { + order.setStatus(OrderStateEnum.UNPAID.getState()); + } + } + + // coupon + order.setCouponPrice(BigDecimal.ZERO); + order.setCouponRecordId(null); + order.setCouponId(null); + if (cachedResult.getUsedCoupon() != null) { + order.setCouponPrice(cachedResult.getUsedCoupon().getActualDiscountAmount()); + order.setCouponId(Math.toIntExact(cachedResult.getUsedCoupon().getCouponId())); + + CouponUseRequest couponUseRequest = new CouponUseRequest(); + couponUseRequest.setCouponId(cachedResult.getUsedCoupon().getCouponId()); + couponUseRequest.setUserId(userId); + couponUseRequest.setOrderId(order.getId().toString()); + couponUseRequest.setOriginalAmount(cachedResult.getOriginalAmount()); + couponUseRequest.setDiscountAmount(cachedResult.getUsedCoupon().getActualDiscountAmount()); + couponUseRequest.setScenicId(cachedResult.toString()); + iCouponService.useCoupon(couponUseRequest); + } + if (cachedResult.getUsedVoucher() != null) { + order.setBrokerId(cachedResult.getUsedVoucher().getBrokerId()); + order.setPromoCode(cachedResult.getUsedVoucher().getVoucherCode()); + iVoucherService.markVoucherAsUsed(cachedResult.getUsedVoucher().getVoucherCode(), order.getId().toString()); + } + List orderItems = new ArrayList<>(); + OrderItemEntity orderItem = new OrderItemEntity(); + orderItem.setGoodsId(goodsId); + orderItem.setGoodsType(type); + orderItem.setOrderId(order.getId()); + orderItems.add(orderItem); + // 在事务中保存订单数据 + try { + self.saveOrderInTransaction(order, orderItems, haveOldOrder); + return order.getId(); + } catch (Exception e) { + log.error("保存订单失败", e); + throw new BaseException("订单创建失败"); + } + } + + @Override + public ApiResponse getPaymentParams(Long orderId, Long userId, PaymentParamsRequest request) { + PaymentParamsResponse response = new PaymentParamsResponse(); + response.setOrderId(orderId); + response.setOrderNo(orderId.toString()); + OrderEntity order = orderMapper.get(orderId); + response.setNeedPay(true); + List orderItems = orderMapper.getOrderItems(orderId); + try { + Map wxPayRespVO = initiatePayment(order, orderItems); + response.setPaymentParams(wxPayRespVO); + return ApiResponse.success(response); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml index 785f1a6..502b05d 100644 --- a/src/main/resources/mapper/OrderMapper.xml +++ b/src/main/resources/mapper/OrderMapper.xml @@ -518,6 +518,9 @@ and oi.goods_id = #{goodsId} + update `order` set member_id = #{memberId}