|
@@ -1,10 +1,29 @@
|
|
|
package com.qs.mp.user.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.qs.mp.admin.domain.Goods;
|
|
|
+import com.qs.mp.admin.domain.GoodsSku;
|
|
|
+import com.qs.mp.admin.service.IGoodsService;
|
|
|
+import com.qs.mp.admin.service.IGoodsSkuService;
|
|
|
+import com.qs.mp.common.enums.ErrorCodeEnum;
|
|
|
+import com.qs.mp.common.enums.PrizeStorageInTypeEnum;
|
|
|
+import com.qs.mp.common.enums.PrizeStorageStatusEnum;
|
|
|
+import com.qs.mp.common.exception.ServiceException;
|
|
|
+import com.qs.mp.common.utils.StringUtils;
|
|
|
+import com.qs.mp.system.service.id.BizIdGenerator;
|
|
|
+import com.qs.mp.user.domain.UserCoin;
|
|
|
import com.qs.mp.user.domain.UserExchangeOrder;
|
|
|
+import com.qs.mp.user.domain.UserPrizeStorage;
|
|
|
+import com.qs.mp.user.domain.param.ExchangeOrderParam;
|
|
|
import com.qs.mp.user.mapper.UserExchangeOrderMapper;
|
|
|
+import com.qs.mp.user.service.IUserCoinService;
|
|
|
import com.qs.mp.user.service.IUserExchangeOrderService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qs.mp.user.service.IUserPrizeStorageService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.Assert;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -17,4 +36,86 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class UserExchangeOrderServiceImpl extends ServiceImpl<UserExchangeOrderMapper, UserExchangeOrder> implements IUserExchangeOrderService {
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IGoodsService goodsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IGoodsSkuService goodsSkuService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserCoinService userCoinService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IUserPrizeStorageService userPrizeStorageService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private BizIdGenerator bizIdGenerator;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void exchange(Long userId, String goodsId, String skuId, int orderNum) {
|
|
|
+ int orderAmt = 0;
|
|
|
+ Goods goods = goodsService.getById(goodsId);
|
|
|
+ GoodsSku goodsSku = new GoodsSku();
|
|
|
+ // 商品库存校验
|
|
|
+ // 计算兑换盲豆数
|
|
|
+ if (StringUtils.isNotBlank(skuId)) {
|
|
|
+ goodsSku = goodsSkuService.getById(skuId);
|
|
|
+ if (goodsSku.getQuantity() < orderNum) {
|
|
|
+ throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1020);
|
|
|
+ }
|
|
|
+ orderAmt = goodsSku.getExchangePrice() * orderNum;
|
|
|
+ } else {
|
|
|
+ if (goods.getQuantity() < orderNum) {
|
|
|
+ throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1020);
|
|
|
+ }
|
|
|
+ orderAmt = goods.getExchangePrice() * orderNum;
|
|
|
+ }
|
|
|
+ // 盲豆余额校验
|
|
|
+ UserCoin userCoin = userCoinService.getById(userId);
|
|
|
+ if (null == userCoin.getCoin() || userCoin.getCoin() < orderAmt) {
|
|
|
+ throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1021);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成兑换订单
|
|
|
+ UserExchangeOrder exchangeOrder = new UserExchangeOrder();
|
|
|
+ exchangeOrder.setOrderId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
|
|
|
+ exchangeOrder.setUserId(userId);
|
|
|
+ exchangeOrder.setGoodsId(goodsId);
|
|
|
+ exchangeOrder.setSkuId(skuId);
|
|
|
+ exchangeOrder.setOrderCoin(orderAmt);
|
|
|
+ save(exchangeOrder);
|
|
|
+
|
|
|
+ // 扣除盲豆数
|
|
|
+ userCoinService.consume(userId, orderAmt, exchangeOrder.getOrderId());
|
|
|
+
|
|
|
+ // 放入奖品库
|
|
|
+ UserPrizeStorage userPrizeStorage = new UserPrizeStorage();
|
|
|
+ userPrizeStorage.setStorageId(bizIdGenerator.newIdWithUidSharding(String.valueOf(userId)));
|
|
|
+ userPrizeStorage.setUserId(userId);
|
|
|
+ userPrizeStorage.setGoodsId(goodsId);
|
|
|
+ userPrizeStorage.setSkuId(skuId);
|
|
|
+ userPrizeStorage.setProperties(goodsSku.getProperties());
|
|
|
+ userPrizeStorage.setTitle(goods.getTitle());
|
|
|
+ userPrizeStorage.setPicUrl(goods.getPicUrl());
|
|
|
+ userPrizeStorage.setGoodsNum(orderNum);
|
|
|
+ userPrizeStorage.setInType(PrizeStorageInTypeEnum.COIN_EXCHANGE);
|
|
|
+ userPrizeStorage.setRefId(exchangeOrder.getOrderId());
|
|
|
+ userPrizeStorage.setStatus(PrizeStorageStatusEnum.NOT_DISTRIBUTED);
|
|
|
+ userPrizeStorageService.save(userPrizeStorage);
|
|
|
+
|
|
|
+ // 修改商品库存
|
|
|
+ if (StringUtils.isNotBlank(skuId)) {
|
|
|
+ boolean updateSku = goodsSkuService.update(new LambdaUpdateWrapper<GoodsSku>()
|
|
|
+ .set(GoodsSku::getQuantity, goodsSku.getQuantity() - orderNum)
|
|
|
+ .set(GoodsSku::getSoldQty, goodsSku.getSoldQty() + orderNum)
|
|
|
+ .eq(GoodsSku::getSkuId, skuId).eq(GoodsSku::getQuantity, goodsSku.getQuantity()).eq(GoodsSku::getSoldQty, goodsSku.getSoldQty()));
|
|
|
+ Assert.isTrue(updateSku, "兑换商品更新SKU库存失败。goodsId:" + goodsId + ",skuId:" + skuId);
|
|
|
+ }
|
|
|
+ boolean updateGoods = goodsService.update(new LambdaUpdateWrapper<Goods>()
|
|
|
+ .set(Goods::getQuantity, goods.getQuantity() - orderNum)
|
|
|
+ .set(Goods::getExchangedQty, goods.getExchangedQty() + orderNum)
|
|
|
+ .eq(Goods::getGoodsId, goodsId).eq(Goods::getQuantity, goods.getQuantity()).eq(Goods::getExchangedQty, goods.getExchangedQty()));
|
|
|
+ Assert.isTrue(updateGoods, "兑换商品更新GOODS库存失败。goodsId:" + goodsId );
|
|
|
+ }
|
|
|
}
|