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

@@ -2,6 +2,8 @@ package com.ycwl.basic.controller.mobile;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.constant.BaseContextHandler; 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.utils.ApiResponse;
import com.ycwl.basic.pricing.dto.*; import com.ycwl.basic.pricing.dto.*;
import com.ycwl.basic.pricing.service.IPriceCalculationService; import com.ycwl.basic.pricing.service.IPriceCalculationService;
@@ -37,6 +39,7 @@ public class AppOrderV2Controller {
private final FaceService faceService; private final FaceService faceService;
private final PriceCacheService priceCacheService; private final PriceCacheService priceCacheService;
private final IOrderService orderService; private final IOrderService orderService;
private final OrderService oldOrderService;
/** /**
* 移动端价格计算 * 移动端价格计算
@@ -167,19 +170,27 @@ public class AppOrderV2Controller {
log.info("价格缓存验证通过: userId={}, scenicId={}, finalAmount={}", log.info("价格缓存验证通过: userId={}, scenicId={}, finalAmount={}",
currentUserId, scenicId, cachedResult.getFinalAmount()); currentUserId, scenicId, cachedResult.getFinalAmount());
// 创建订单 // 使用旧版创建订单逻辑
try { try {
Long orderId = orderService.createOrder(request, currentUserId, scenicId, cachedResult); Long orderId = oldOrderService.createOrderCompact(currentUserId, request, cachedResult);
return ApiResponse.success(String.valueOf(orderId));
log.info("移动端订单创建成功: orderId={}, userId={}, scenicId={}, finalAmount={}",
orderId, currentUserId, scenicId, cachedResult.getFinalAmount());
return ApiResponse.success(orderId.toString());
} catch (Exception e) { } catch (Exception e) {
log.error("订单创建失败: userId={}, scenicId={}, error={}", currentUserId, scenicId, e.getMessage(), e);
return ApiResponse.fail("订单创建失败,请稍后重试"); 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("订单创建失败,请稍后重试");
// }
} }
// ====== 新增移动端订单查询功能 ====== // ====== 新增移动端订单查询功能 ======
@@ -265,13 +276,16 @@ public class AppOrderV2Controller {
log.info("获取支付参数: userId={}, orderId={}", currentUserId, orderId); log.info("获取支付参数: userId={}, orderId={}", currentUserId, orderId);
try { return oldOrderService.getPaymentParams(orderId, currentUserId, request);
PaymentParamsResponse response = orderService.getPaymentParams(orderId, currentUserId, request);
return ApiResponse.success(response); //
} catch (Exception e) { // try {
log.error("获取支付参数失败: userId={}, orderId={}", currentUserId, orderId, e); // PaymentParamsResponse response = orderService.getPaymentParams(orderId, currentUserId, request);
return ApiResponse.fail(e.getMessage()); // return ApiResponse.success(response);
} // } catch (Exception e) {
// log.error("获取支付参数失败: userId={}, orderId={}", currentUserId, orderId, e);
// return ApiResponse.fail(e.getMessage());
// }
} }
/** /**

View File

@@ -57,4 +57,6 @@ public interface OrderMapper {
OrderEntity getUserOrderItem(Long userId, Long scenicId, int orderType, Long configId, Integer goodsType, Long goodsId); OrderEntity getUserOrderItem(Long userId, Long scenicId, int orderType, Long configId, Integer goodsType, Long goodsId);
int updateMemberIdByFaceId(OrderEntity orderEntity); int updateMemberIdByFaceId(OrderEntity orderEntity);
List<OrderItemEntity> getOrderItems(Long orderId);
} }

View File

@@ -7,6 +7,4 @@ public class CreateOrderReqVO {
private Long scenicId; private Long scenicId;
private Integer goodsType; private Integer goodsType;
private Long goodsId; private Long goodsId;
private String brokerCode;
private Long couponId;
} }

View File

@@ -132,4 +132,8 @@ public class VideoRepository {
} }
return true; return true;
} }
public List<MemberVideoEntity> getVideoByFaceAndTemplateId(Long memberId, Long faceId, String templateId) {
return videoMapper.userFaceTemplateVideo(memberId, faceId, Long.valueOf(templateId));
}
} }

View File

@@ -1,6 +1,7 @@
package com.ycwl.basic.service.pc; package com.ycwl.basic.service.pc;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.ycwl.basic.dto.MobileOrderRequest;
import com.ycwl.basic.enums.OrderStateEnum; import com.ycwl.basic.enums.OrderStateEnum;
import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.OrderAppPageReq;
import com.ycwl.basic.model.mobile.order.RefundOrderReq; 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.req.OrderReqQuery;
import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO; import com.ycwl.basic.model.pc.order.resp.OrderAppRespVO;
import com.ycwl.basic.model.pc.order.resp.OrderRespVO; 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.pay.entity.PayResponse;
import com.ycwl.basic.pricing.dto.PriceCalculationResult;
import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.ApiResponse;
import java.util.List; import java.util.List;
@@ -68,4 +72,8 @@ public interface OrderService {
ApiResponse<Map<String, Object>> createBatchOrder(Long userId, CreateBatchOrderReqVO batchOrderReqVO) throws Exception; ApiResponse<Map<String, Object>> createBatchOrder(Long userId, CreateBatchOrderReqVO batchOrderReqVO) throws Exception;
PayResponse queryOrder(Long orderId); 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; package com.ycwl.basic.service.pc.impl;
import cn.hutool.core.date.DateUtil; 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.source.entity.MemberSourceEntity;
import com.ycwl.basic.model.pc.video.entity.MemberVideoEntity; 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.ycwl.basic.utils.JacksonUtil;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@@ -122,6 +130,10 @@ public class OrderServiceImpl implements OrderService {
private ScenicService scenicService; private ScenicService scenicService;
@Autowired @Autowired
private VideoMapper videoMapper; private VideoMapper videoMapper;
@Autowired
private IVoucherService iVoucherService;
@Autowired
private ICouponService iCouponService;
@Override @Override
public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) { public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) {
@@ -734,4 +746,116 @@ public class OrderServiceImpl implements OrderService {
return payResponse; 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);
}
}
} }

View File

@@ -518,6 +518,9 @@
and oi.goods_id = #{goodsId} and oi.goods_id = #{goodsId}
</if> </if>
</select> </select>
<select id="getOrderItems" resultType="com.ycwl.basic.model.pc.order.entity.OrderItemEntity">
select * from order_item where order_id = #{orderId}
</select>
<update id="updateMemberIdByFaceId"> <update id="updateMemberIdByFaceId">
update `order` update `order`
set member_id = #{memberId} set member_id = #{memberId}