|
@@ -3,24 +3,21 @@ package com.atguigu.tingshu.order.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
-import cn.hutool.core.lang.Assert;
|
|
|
-import cn.hutool.core.util.IdUtil;
|
|
|
import com.atguigu.tingshu.account.AccountFeignClient;
|
|
|
import com.atguigu.tingshu.album.AlbumFeignClient;
|
|
|
import com.atguigu.tingshu.common.constant.RedisConstant;
|
|
|
import com.atguigu.tingshu.common.execption.GuiguException;
|
|
|
import com.atguigu.tingshu.common.result.Result;
|
|
|
import com.atguigu.tingshu.common.util.AuthContextHolder;
|
|
|
-import com.atguigu.tingshu.model.album.AlbumInfo;
|
|
|
-import com.atguigu.tingshu.model.album.TrackInfo;
|
|
|
import com.atguigu.tingshu.model.order.OrderDerate;
|
|
|
import com.atguigu.tingshu.model.order.OrderDetail;
|
|
|
import com.atguigu.tingshu.model.order.OrderInfo;
|
|
|
-import com.atguigu.tingshu.model.user.VipServiceConfig;
|
|
|
import com.atguigu.tingshu.order.helper.SignHelper;
|
|
|
import com.atguigu.tingshu.order.mapper.OrderDerateMapper;
|
|
|
import com.atguigu.tingshu.order.mapper.OrderDetailMapper;
|
|
|
import com.atguigu.tingshu.order.mapper.OrderInfoMapper;
|
|
|
+import com.atguigu.tingshu.order.pattern.factory.TradeOrderStrategyFactory;
|
|
|
+import com.atguigu.tingshu.order.pattern.strategy.TradeOrderStrategy;
|
|
|
import com.atguigu.tingshu.order.service.OrderDetailService;
|
|
|
import com.atguigu.tingshu.order.service.OrderInfoService;
|
|
|
import com.atguigu.tingshu.user.client.UserFeignClient;
|
|
@@ -29,20 +26,19 @@ import com.atguigu.tingshu.vo.order.OrderDerateVo;
|
|
|
import com.atguigu.tingshu.vo.order.OrderDetailVo;
|
|
|
import com.atguigu.tingshu.vo.order.OrderInfoVo;
|
|
|
import com.atguigu.tingshu.vo.order.TradeVo;
|
|
|
-import com.atguigu.tingshu.vo.user.UserInfoVo;
|
|
|
import com.atguigu.tingshu.vo.user.UserPaidRecordVo;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.data.redis.core.script.DefaultRedisScript;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.math.RoundingMode;
|
|
|
-import java.util.*;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.atguigu.tingshu.common.constant.SystemConstant.*;
|
|
@@ -76,7 +72,21 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
@Autowired
|
|
|
private AccountFeignClient accountFeignClient;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private TradeOrderStrategyFactory tradeOrderStrategyFactory;
|
|
|
+
|
|
|
|
|
|
+ @Override
|
|
|
+ public OrderInfoVo trade(Long userId, TradeVo tradeVo) {
|
|
|
+ //1.创建订单VO
|
|
|
+ OrderInfoVo orderInfoVo = new OrderInfoVo();
|
|
|
+ //2.获取购买商品类别:付款项目类型: 1001-专辑 1002-声音 1003-vip会员
|
|
|
+ String itemType = tradeVo.getItemType();
|
|
|
+ //3.从工厂获取策略实现类对象
|
|
|
+ TradeOrderStrategy tradeOrderStrategy = tradeOrderStrategyFactory.getTradeOrderStrategy(itemType);
|
|
|
+ tradeOrderStrategy.handleTrade(tradeVo, orderInfoVo);
|
|
|
+ return orderInfoVo;
|
|
|
+ }
|
|
|
/**
|
|
|
* 对购买商品(VIP会员、专辑、声音)封装订单结算页所需要数据
|
|
|
*
|
|
@@ -84,11 +94,13 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
* @param tradeVo {购买商品类别,商品ID,声音数量}
|
|
|
* @return
|
|
|
*/
|
|
|
- @Override
|
|
|
+ /*@Override
|
|
|
public OrderInfoVo trade(Long userId, TradeVo tradeVo) {
|
|
|
//1.创建订单VO
|
|
|
OrderInfoVo orderInfoVo = new OrderInfoVo();
|
|
|
|
|
|
+ //获取购买商品类别:付款项目类型: 1001-专辑 1002-声音 1003-vip会员
|
|
|
+ String itemType = tradeVo.getItemType();
|
|
|
//1.1.初始化订单结算页三个价格:原价、减免价、订单价
|
|
|
BigDecimal originalAmount = new BigDecimal("0.00");
|
|
|
BigDecimal derateAmount = new BigDecimal("0.00");
|
|
@@ -97,8 +109,6 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
List<OrderDetailVo> orderDetailVoList = new ArrayList<>();
|
|
|
List<OrderDerateVo> orderDerateVoList = new ArrayList<>();
|
|
|
|
|
|
- //获取购买商品类别:付款项目类型: 1001-专辑 1002-声音 1003-vip会员
|
|
|
- String itemType = tradeVo.getItemType();
|
|
|
//2.处理购买商品类别:VIP套餐
|
|
|
if (ORDER_ITEM_TYPE_VIP.equals(itemType)) {
|
|
|
//2.1 远程调用"用户服务"获取套餐详情
|
|
@@ -237,7 +247,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
orderInfoVo.setSign(sign);
|
|
|
//6.响应订单VO
|
|
|
return orderInfoVo;
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
/**
|
|
|
* 提交订单
|
|
@@ -246,6 +256,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
* @return {orderNo:订单编号}
|
|
|
*/
|
|
|
@Override
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class)
|
|
|
public String submitOrder(Long userId, OrderInfoVo orderInfoVo) {
|
|
|
//1.业务校验-验证流水号 防止回退造成订单重复提交
|
|
|
//1.1 从Redis中获取当前用户存入流水号值
|
|
@@ -290,7 +301,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
accountDeductVo.setContent(orderInfo.getOrderTitle());
|
|
|
//4.1.2 远程调用完成扣减余额
|
|
|
Result result = accountFeignClient.checkAndDeduct(accountDeductVo);
|
|
|
- //4.1.3 判断业务状态码是否为200
|
|
|
+ //4.1.3 判断业务状态码是否为200 TODO 如果这里不判断响应业务状态码 下游系统调用发生异常,由于存在全局异常处理,正常响应Result Http请求状态码200
|
|
|
if (!result.getCode().equals(200)) {
|
|
|
throw new GuiguException(result.getCode(), result.getMessage());
|
|
|
}
|
|
@@ -315,8 +326,12 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
if (!result.getCode().equals(200)) {
|
|
|
throw new GuiguException(result.getCode(), result.getMessage());
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
+ //模拟异常
|
|
|
+ //if (orderInfo.getId() % 2 == 0) {
|
|
|
+ // int i = 1 / 0;
|
|
|
+ //}
|
|
|
}
|
|
|
if (ORDER_PAY_WAY_WEIXIN.equals(payWay)) {
|
|
|
//5. TODO 处理付款方式为:微信支付 采用延迟消息进行延迟关单
|
|
@@ -334,6 +349,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
+
|
|
|
public OrderInfo saveOrderInfo(OrderInfoVo orderInfoVo) {
|
|
|
//1.保存订单信息
|
|
|
//1.1 将订单VO拷贝到订单PO对象中
|