|
@@ -1,13 +1,38 @@
|
|
|
package com.atguigu.tingshu.order.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.lang.Assert;
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
+import com.atguigu.tingshu.album.AlbumFeignClient;
|
|
|
+import com.atguigu.tingshu.common.constant.RedisConstant;
|
|
|
+import com.atguigu.tingshu.model.album.AlbumInfo;
|
|
|
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.OrderInfoMapper;
|
|
|
import com.atguigu.tingshu.order.service.OrderInfoService;
|
|
|
+import com.atguigu.tingshu.user.client.UserFeignClient;
|
|
|
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+import static com.atguigu.tingshu.common.constant.SystemConstant.*;
|
|
|
+
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
@SuppressWarnings({"all"})
|
|
@@ -16,5 +41,151 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
@Autowired
|
|
|
private OrderInfoMapper orderInfoMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private UserFeignClient userFeignClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AlbumFeignClient albumFeignClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ * 对购买商品(VIP会员、专辑、声音)封装订单结算页所需要数据
|
|
|
+ *
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param tradeVo {购买商品类别,商品ID,声音数量}
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public OrderInfoVo trade(Long userId, TradeVo tradeVo) {
|
|
|
+
|
|
|
+ OrderInfoVo orderInfoVo = new OrderInfoVo();
|
|
|
+
|
|
|
+
|
|
|
+ BigDecimal originalAmount = new BigDecimal("0.00");
|
|
|
+ BigDecimal derateAmount = new BigDecimal("0.00");
|
|
|
+ BigDecimal orderAmount = new BigDecimal("0.00");
|
|
|
+
|
|
|
+ List<OrderDetailVo> orderDetailVoList = new ArrayList<>();
|
|
|
+ List<OrderDerateVo> orderDerateVoList = new ArrayList<>();
|
|
|
+
|
|
|
+
|
|
|
+ String itemType = tradeVo.getItemType();
|
|
|
+
|
|
|
+ if (ORDER_ITEM_TYPE_VIP.equals(itemType)) {
|
|
|
+
|
|
|
+ VipServiceConfig vipServiceConfig = userFeignClient.getVipServiceConfig(tradeVo.getItemId()).getData();
|
|
|
+ Assert.notNull(vipServiceConfig, "套餐:{}不存在", tradeVo.getItemId());
|
|
|
+
|
|
|
+ originalAmount = vipServiceConfig.getPrice();
|
|
|
+ orderAmount = vipServiceConfig.getDiscountPrice();
|
|
|
+ derateAmount = originalAmount.subtract(orderAmount);
|
|
|
+
|
|
|
+
|
|
|
+ OrderDetailVo orderDetailVo = new OrderDetailVo();
|
|
|
+ orderDetailVo.setItemId(tradeVo.getItemId());
|
|
|
+ orderDetailVo.setItemName("VIP套餐:" + vipServiceConfig.getName());
|
|
|
+ orderDetailVo.setItemUrl(vipServiceConfig.getImageUrl());
|
|
|
+ orderDetailVo.setItemPrice(originalAmount);
|
|
|
+ orderDetailVoList.add(orderDetailVo);
|
|
|
+
|
|
|
+
|
|
|
+ if (originalAmount.compareTo(orderAmount) == 1) {
|
|
|
+ OrderDerateVo orderDerateVo = new OrderDerateVo();
|
|
|
+
|
|
|
+ orderDerateVo.setDerateType(ORDER_DERATE_VIP_SERVICE_DISCOUNT);
|
|
|
+ orderDerateVo.setDerateAmount(derateAmount);
|
|
|
+ orderDerateVo.setRemarks("套餐限时减免:" + derateAmount);
|
|
|
+ orderDerateVoList.add(orderDerateVo);
|
|
|
+ }
|
|
|
+ } else if (ORDER_ITEM_TYPE_ALBUM.equals(itemType)) {
|
|
|
+
|
|
|
+
|
|
|
+ Long albumId = tradeVo.getItemId();
|
|
|
+ Boolean isPaid = userFeignClient.isPaidAlbum(albumId).getData();
|
|
|
+ Assert.state(!isPaid, "用户已购买专辑:{}", albumId);
|
|
|
+
|
|
|
+
|
|
|
+ AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(albumId).getData();
|
|
|
+ Assert.notNull(albumInfo, "专辑:{}不存在", albumId);
|
|
|
+
|
|
|
+ BigDecimal price = albumInfo.getPrice();
|
|
|
+
|
|
|
+ BigDecimal discount = albumInfo.getDiscount();
|
|
|
+
|
|
|
+ BigDecimal vipDiscount = albumInfo.getVipDiscount();
|
|
|
+
|
|
|
+
|
|
|
+ Boolean isVIP = false;
|
|
|
+ UserInfoVo userInfoVo = userFeignClient.getUserInfoVo(userId).getData();
|
|
|
+ Assert.notNull(userInfoVo, "用户:{}不存在", userId);
|
|
|
+ if (userInfoVo.getIsVip().intValue() == 1 && userInfoVo.getVipExpireTime().after(new Date())) {
|
|
|
+ isVIP = true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ originalAmount = price;
|
|
|
+ orderAmount = originalAmount;
|
|
|
+
|
|
|
+ if (!isVIP && discount.doubleValue() != -1) {
|
|
|
+ orderAmount =
|
|
|
+ originalAmount.multiply(discount).divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP);
|
|
|
+ derateAmount = originalAmount.subtract(orderAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isVIP && vipDiscount.doubleValue() != -1) {
|
|
|
+ orderAmount =
|
|
|
+ originalAmount.multiply(vipDiscount).divide(new BigDecimal("10"), 2, RoundingMode.HALF_UP);
|
|
|
+ derateAmount = originalAmount.subtract(orderAmount);
|
|
|
+ }
|
|
|
+
|
|
|
+ OrderDetailVo orderDetailVo = new OrderDetailVo();
|
|
|
+ orderDetailVo.setItemId(albumId);
|
|
|
+ orderDetailVo.setItemName("专辑:" + albumInfo.getAlbumTitle());
|
|
|
+ orderDetailVo.setItemUrl(albumInfo.getCoverUrl());
|
|
|
+ orderDetailVo.setItemPrice(originalAmount);
|
|
|
+ orderDetailVoList.add(orderDetailVo);
|
|
|
+
|
|
|
+
|
|
|
+ if(originalAmount.compareTo(orderAmount) == 1){
|
|
|
+ OrderDerateVo orderDerateVo = new OrderDerateVo();
|
|
|
+ orderDerateVo.setDerateType(ORDER_DERATE_ALBUM_DISCOUNT);
|
|
|
+ orderDerateVo.setDerateAmount(derateAmount);
|
|
|
+ orderDerateVo.setRemarks("专辑限时减免:"+derateAmount);
|
|
|
+ orderDerateVoList.add(orderDerateVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ orderInfoVo.setOriginalAmount(originalAmount);
|
|
|
+ orderInfoVo.setOrderAmount(orderAmount);
|
|
|
+ orderInfoVo.setDerateAmount(derateAmount);
|
|
|
+
|
|
|
+ orderInfoVo.setOrderDetailVoList(orderDetailVoList);
|
|
|
+ orderInfoVo.setOrderDerateVoList(orderDerateVoList);
|
|
|
+
|
|
|
+
|
|
|
+ orderInfoVo.setItemType(itemType);
|
|
|
+
|
|
|
+ String tradeNo = IdUtil.randomUUID();
|
|
|
+ String tradeKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId;
|
|
|
+ redisTemplate.opsForValue().set(tradeKey, tradeNo, RedisConstant.ORDER_TRADE_EXPIRE, TimeUnit.MINUTES);
|
|
|
+ orderInfoVo.setTradeNo(tradeNo);
|
|
|
+
|
|
|
+
|
|
|
+ orderInfoVo.setTimestamp(System.currentTimeMillis());
|
|
|
+
|
|
|
+ Map<String, Object> map = BeanUtil.beanToMap(orderInfoVo, false, true);
|
|
|
+ String sign = SignHelper.getSign(map);
|
|
|
+ orderInfoVo.setSign(sign);
|
|
|
+
|
|
|
+ return orderInfoVo;
|
|
|
+ }
|
|
|
|
|
|
}
|