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.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());
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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}
|
||||||
|
Reference in New Issue
Block a user