Просмотр исходного кода

Merge branch 'master' of git.dayaedu.com:yonge/cooleshow

liweifan 3 лет назад
Родитель
Сommit
58d1aab5b7

+ 1 - 0
cooleshow-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/OrderCacheEnum.java

@@ -17,6 +17,7 @@ public enum OrderCacheEnum {
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
     LOCK_REFUND_ORDER_MALL("商城退款锁"),
     LOCK_ORDER_NO_MALL("订单号锁"),
+    LOCK_STOCK_MALL("商品库存锁"),
 
     ;
     /***

+ 59 - 11
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java

@@ -1,19 +1,31 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mbg.model.OmsCartItem;
 import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.CartPromotionItem;
+import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.cooleshow.portal.service.OmsCartItemService;
 import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.payment.util.DistributedLock;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static com.yonge.cooleshow.mall.common.api.CommonResult.failed;
+import static com.yonge.cooleshow.mall.common.enums.OrderCacheEnum.LOCK_STOCK_MALL;
 
 /**
  * 购物车管理Controller
@@ -28,15 +40,34 @@ public class OmsCartItemController {
     @Autowired
     private UmsMemberService memberService;
 
+
+    @Autowired
+    private RedissonClient redissonClient;
+
     @ApiOperation("添加商品到购物车")
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult<OmsCartItem> add(@RequestBody OmsCartItem cartItem) {
-        OmsCartItem omsCartItem = cartItemService.add(cartItem);
-        if (omsCartItem != null) {
-            return CommonResult.success(omsCartItem);
+
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_STOCK_MALL.getRedisKey(cartItem.getProductSkuId()));
+        try {
+            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+            if (b) {
+                OmsCartItem omsCartItem = cartItemService.add(cartItem);
+                return CommonResult.success(omsCartItem);
+            }
+            return failed("请求超时");
+        } catch (BizException e) {
+            return failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return failed("请求超时");
+        } finally {
+            if (lock.getHoldCount()>0) {
+                lock.unlock();
+            }
         }
-        return CommonResult.failed();
+
     }
 
     @ApiOperation("获取当前会员的购物车列表")
@@ -62,11 +93,28 @@ public class OmsCartItemController {
     @ResponseBody
     public CommonResult updateQuantity(@RequestParam Long id,
                                        @RequestParam Integer quantity) {
-        int count = cartItemService.updateQuantity(id, memberService.getCurrentMember().getId(), quantity);
-        if (count > 0) {
-            return CommonResult.success(count);
+
+        OmsCartItem omsCartItem = cartItemService.get(id);
+
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_STOCK_MALL.getRedisKey(omsCartItem.getProductSkuId()));
+        try {
+            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+            if (b) {
+                int i = cartItemService.updateQuantity(id, memberService.getCurrentMember().getId(), quantity);
+                return CommonResult.success(i);
+            }
+            return failed("请求超时");
+        } catch (BizException e) {
+            return failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return failed("请求超时");
+        } finally {
+            if (lock.getHoldCount()>0) {
+                lock.unlock();
+            }
         }
-        return CommonResult.failed();
+
     }
 
     @ApiOperation("获取购物车中指定商品的规格,用于重选规格")
@@ -85,7 +133,7 @@ public class OmsCartItemController {
         if (count > 0) {
             return CommonResult.success(count);
         }
-        return CommonResult.failed();
+        return failed();
     }
 
     @ApiOperation("删除购物车中的指定商品")
@@ -97,7 +145,7 @@ public class OmsCartItemController {
         if (count > 0) {
             return CommonResult.success(count);
         }
-        return CommonResult.failed();
+        return failed();
     }
 
     @ApiOperation("清空当前会员的购物车")
@@ -108,6 +156,6 @@ public class OmsCartItemController {
         if (count > 0) {
             return CommonResult.success(count);
         }
-        return CommonResult.failed();
+        return failed();
     }
 }

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java

@@ -54,4 +54,6 @@ public interface OmsCartItemService {
      * 清空购物车
      */
     int clear(Long memberId);
+
+    OmsCartItem get(Long id);
 }

+ 27 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -55,6 +55,11 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
         } else if (cartItem.getHidden() == 1) {
             existCartItem = null;
         }
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(cartItem.getProductSkuId());
+        if (pmsSkuStock == null) {
+            throw new BizException("商品规格不存在");
+        }
         if (existCartItem == null) {
             PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartItem.getProductId());
 
@@ -69,10 +74,8 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             cartItem.setProductBrand(pmsProduct.getName());
             cartItem.setProductSn(pmsProduct.getProductSn());
             if (cartItem.getProductSkuId() != null) {
-                PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(cartItem.getProductSkuId());
-
-                if (pmsSkuStock == null) {
-                    throw new BizException("商品规格不存在");
+                if (pmsSkuStock.getStock() < cartItem.getQuantity()) {
+                    throw new BizException("库存不足");
                 }
                 cartItem.setProductSkuCode(pmsSkuStock.getSkuCode());
                 cartItem.setProductAttr(pmsSkuStock.getSpData());
@@ -83,6 +86,9 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
             cartItemMapper.insert(cartItem);
             return cartItem;
         } else {
+            if (pmsSkuStock.getStock() < existCartItem.getQuantity() + cartItem.getQuantity()) {
+                throw new BizException("库存不足");
+            }
             cartItem.setModifyDate(new Date());
             existCartItem.setQuantity(existCartItem.getQuantity() + cartItem.getQuantity());
             cartItemMapper.updateByPrimaryKey(existCartItem);
@@ -138,6 +144,18 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     public int updateQuantity(Long id, Long memberId, Integer quantity) {
         OmsCartItem cartItem = new OmsCartItem();
         cartItem.setQuantity(quantity);
+        OmsCartItem omsCartItem = cartItemMapper.selectByPrimaryKey(id);
+
+        if (omsCartItem.getProductSkuId() == null) {
+            throw new BizException("商品已售空");
+        }
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(omsCartItem.getProductSkuId());
+
+        if (pmsSkuStock.getStock() < quantity) {
+            throw new BizException("库存不足");
+        }
+
         OmsCartItemExample example = new OmsCartItemExample();
         example.createCriteria().andDeleteStatusEqualTo(0)
                 .andIdEqualTo(id).andMemberIdEqualTo(memberId);
@@ -179,4 +197,9 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
         example.createCriteria().andMemberIdEqualTo(memberId);
         return cartItemMapper.updateByExampleSelective(record,example);
     }
+
+    @Override
+    public OmsCartItem get(Long id) {
+        return cartItemMapper.selectByPrimaryKey(id);
+    }
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -2252,6 +2252,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
             payment.setCourseId(courseId);
             payment.setCourseGroupId(groupId);
             payment.setCourseType(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
+            payment.setCreatedTime(new Date());
+            payment.setUpdatedTime(new Date());
             payments.add(payment);
         }
 

+ 1 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

@@ -195,4 +195,5 @@ public class DistributedLock {
             unlock(lock);
         }
     }
+
 }