refactor(order): 重构订单创建和支付参数获取逻辑

- 新增 createOrderCompact 方法实现旧版订单创建逻辑
- 新增 getPaymentParams 方法获取支付参数
- 更新 AppOrderV2Controller调用新的订单创建和支付参数获取方法
- 在 OrderMapper 中添加 getOrderItems 方法获取订单详情- 更新 VideoRepository 接口,增加根据人脸和模板 ID 获取视频列表的方法
- 在 OrderServiceImpl 中实现新的订单创建和支付参数获取逻辑
- 更新 OrderService 接口,添加新的方法声明
- 在 OrderMapper.xml 中添加新的 SQL 查询语句
This commit is contained in:
2025-08-30 14:25:28 +08:00
parent 607c5bc057
commit 57b087a4fb
7 changed files with 173 additions and 20 deletions

View File

@@ -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<Map<String, Object>> createBatchOrder(Long userId, CreateBatchOrderReqVO batchOrderReqVO) throws Exception;
PayResponse queryOrder(Long orderId);
Long createOrderCompact(Long userId, MobileOrderRequest request, PriceCalculationResult cachedResult);
ApiResponse<PaymentParamsResponse> getPaymentParams(Long orderId, Long userId, PaymentParamsRequest request);
}

View File

@@ -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<PageInfo<OrderRespVO>> 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<MemberVideoEntity> 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<OrderItemEntity> 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<PaymentParamsResponse> 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<OrderItemEntity> orderItems = orderMapper.getOrderItems(orderId);
try {
Map<String, Object> wxPayRespVO = initiatePayment(order, orderItems);
response.setPaymentParams(wxPayRespVO);
return ApiResponse.success(response);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}