You've already forked FrameTour-BE
refactor(order): 重构订单创建和支付参数获取逻辑
- 新增 createOrderCompact 方法实现旧版订单创建逻辑 - 新增 getPaymentParams 方法获取支付参数 - 更新 AppOrderV2Controller调用新的订单创建和支付参数获取方法 - 在 OrderMapper 中添加 getOrderItems 方法获取订单详情- 更新 VideoRepository 接口,增加根据人脸和模板 ID 获取视频列表的方法 - 在 OrderServiceImpl 中实现新的订单创建和支付参数获取逻辑 - 更新 OrderService 接口,添加新的方法声明 - 在 OrderMapper.xml 中添加新的 SQL 查询语句
This commit is contained in:
@@ -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;
|
||||
|
||||
/**
|
||||
* 移动端价格计算
|
||||
@@ -167,19 +170,27 @@ 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("订单创建失败,请稍后重试");
|
||||
// }
|
||||
}
|
||||
|
||||
// ====== 新增移动端订单查询功能 ======
|
||||
@@ -265,13 +276,16 @@ public class AppOrderV2Controller {
|
||||
|
||||
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());
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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<OrderItemEntity> getOrderItems(Long orderId);
|
||||
}
|
||||
|
@@ -7,6 +7,4 @@ public class CreateOrderReqVO {
|
||||
private Long scenicId;
|
||||
private Integer goodsType;
|
||||
private Long goodsId;
|
||||
private String brokerCode;
|
||||
private Long couponId;
|
||||
}
|
||||
|
@@ -132,4 +132,8 @@ public class VideoRepository {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<MemberVideoEntity> getVideoByFaceAndTemplateId(Long memberId, Long faceId, String templateId) {
|
||||
return videoMapper.userFaceTemplateVideo(memberId, faceId, Long.valueOf(templateId));
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -518,6 +518,9 @@
|
||||
and oi.goods_id = #{goodsId}
|
||||
</if>
|
||||
</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 `order`
|
||||
set member_id = #{memberId}
|
||||
|
Reference in New Issue
Block a user