From 74b0e0814e37d640596f44ec86d20fa9ecce9ed6 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 05 二月 2025 10:42:06 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java |  195 +++++++++++++++++++++++++++---------------------
 1 files changed, 109 insertions(+), 86 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
index fdb537f..0ef3d4a 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -19,6 +19,9 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.security.annotation.Logical;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.order.api.feignClient.OrderClient;
 import com.ruoyi.order.api.model.TShoppingOrder;
@@ -30,6 +33,7 @@
 import com.ruoyi.other.service.TActivityService;
 import com.ruoyi.other.service.TCouponService;
 import com.ruoyi.other.service.TGoodsService;
+import com.ruoyi.other.util.RedisLock;
 import com.ruoyi.payment.api.feignClient.AliPaymentClient;
 import com.ruoyi.payment.api.feignClient.WxPaymentClient;
 import com.ruoyi.payment.api.vo.AliPaymentReq;
@@ -37,6 +41,7 @@
 import com.ruoyi.payment.api.vo.PaymentOrder;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -44,6 +49,8 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -61,7 +68,6 @@
     private TGoodsService goodsService;
     @Autowired
     private TActivityService activityService;
-
     @Resource
     private TokenService tokenService;
     @Resource
@@ -74,6 +80,11 @@
     private TCouponService couponService;
     @Resource
     private WxPaymentClient wxPaymentClient;
+    @Resource
+    private RedisService redisService;
+    
+    @Autowired
+    public RedisTemplate redisTemplate;
 
 
     /**
@@ -87,7 +98,9 @@
                 .like("name", name)).stream().map(TGoods::getId).collect(Collectors.toList());
         return R.ok(collect);
     }
-
+    
+    
+    @RequiresPermissions(value = {"/goods/add"}, logical = Logical.OR)
     @PostMapping("/saveGoods")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品添加")
     @Log(title = "【商品管理】添加商品", businessType = BusinessType.INSERT)
@@ -95,9 +108,10 @@
         goodsService.save(dto);
         return AjaxResult.success();
     }
-
-
-
+    
+    
+    
+    @RequiresPermissions(value = {"/goods/del"}, logical = Logical.OR)
     @GetMapping("/delete")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品删除")
     @Log(title = "【商品管理】删除商品", businessType = BusinessType.DELETE)
@@ -105,9 +119,10 @@
         goodsService.removeBatchByIds(Arrays.asList(ids.split(",")));
         return AjaxResult.success();
     }
-
-
-
+    
+    
+    
+    @RequiresPermissions(value = {"/goods/update"}, logical = Logical.OR)
     @PostMapping("/updateVip")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品修改")
     @Log(title = "【商品管理】修改商品", businessType = BusinessType.UPDATE)
@@ -115,9 +130,9 @@
         goodsService.updateById(dto);
         return AjaxResult.success();
     }
-
-
-
+    
+    
+    @RequiresPermissions(value = {"/goods/select"}, logical = Logical.OR)
     @GetMapping("/getInfo")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品查看详情")
     public AjaxResult<TGoods> getInfo(Integer id) {
@@ -152,10 +167,11 @@
             return R.ok(byId);
             }
     }
-
-
-
-
+    
+    
+    
+    
+    @RequiresPermissions(value = {"/goods"}, logical = Logical.OR)
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品列表分页查询")
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TGoods>> pageList(@RequestBody GoodsDTO dto) {
@@ -177,7 +193,6 @@
         //检查当前用户积分是否够
         Long userId = tokenService.getLoginUserApplet().getUserId();
         Integer point = 0;
-
         if (exchangeDto.getGoodType()==1) {
             //查询当前商品信息
             TGoods good = goodsService.getById(exchangeDto.getGoodId());
@@ -203,85 +218,93 @@
         return R.ok();
 
     }
+    
+    
+    
     @ApiOperation(tags = {"小程序-兑换商城"},value = "积分兑换商品")
     @PostMapping(value = "/app/shop")
     public AjaxResult<PageInfo<TGoods>> shop(@RequestBody ExchangeDto exchangeDto) {
-        //检查当前用户积分是否够
-        Long userId = tokenService.getLoginUserApplet().getUserId();
-        Integer point = 0;
-        TAppUser user = appUserClient.getUserById(userId).getData();
-
-        if (exchangeDto.getGoodType()==1) {
-            //查询当前商品信息
-            TGoods good = goodsService.getById(exchangeDto.getGoodId());
-            point = good.getRedeemPoints();
-            //检查当前用户是否到达兑换上限
-            Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData();
-            if (good.getLimitExchangeTimes() != -1 && count >= good.getLimitExchangeTimes()) {
-                return AjaxResult.error("当前用户已兑换"+count+"张");
+        //redis锁 和支付使用同一个锁
+        RedisLock redisLock = new RedisLock(redisTemplate, "POINT_EXCHANGE_LOCK", 5, 30000);
+        try {
+            redisLock.lock();
+            Long userId = tokenService.getLoginUserApplet().getUserId();
+            Integer point = 0;
+            TAppUser user = appUserClient.getUserById(userId).getData();
+            if (exchangeDto.getGoodType()==1) {
+                //查询当前商品信息
+                TGoods good = goodsService.getById(exchangeDto.getGoodId());
+                point = good.getRedeemPoints();
+                if (user.getPoints().compareTo(good.getRedeemPoints()) < 0){
+                    return AjaxResult.error("当前用户积分不足");
+                }
+                //检查当前用户是否到达兑换上限
+                Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData();
+                if (good.getLimitExchangeTimes() != -1 && count >= good.getLimitExchangeTimes()) {
+                    return AjaxResult.error("当前用户已兑换"+count+"张");
+                }else {
+                    //减少库存
+                    if (good.getInventory()!=-1) {
+                        good.setInventory(good.getInventory() - exchangeDto.getNum());
+                        goodsService.updateById(good);
+                    }
+                }
             }else {
-                //减少库存
-                if (good.getInventory()!=-1) {
-                    good.setInventory(good.getInventory() - exchangeDto.getNum());
-                    goodsService.updateById(good);
+                TCoupon coupon = couponService.getById(exchangeDto.getGoodId());
+                point = coupon.getRedeemPoints();
+                if (user.getPoints().compareTo(coupon.getRedeemPoints()) < 0){
+                    return AjaxResult.error("当前用户积分不足");
+                }
+                Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData();
+                if (coupon.getInventoryQuantity() != -1 && count >= coupon.getInventoryQuantity()) {
+                    return AjaxResult.error("当前用户已到达兑换"+coupon+"次");
+                }else {
+                    if (coupon.getInventoryQuantity()!=-1) {
+                        coupon.setInventoryQuantity(coupon.getInventoryQuantity() - 1);
+                        couponService.updateById(coupon);
+                    }
                 }
             }
-        if (user.getPoints()<good.getRedeemPoints()){
-            return AjaxResult.error("当前用户积分不足");
-             }
-        }else {
-            TCoupon coupon = couponService.getById(exchangeDto.getGoodId());
-            point = coupon.getRedeemPoints();
-
-            Long count = orderClient.getExchangeById(exchangeDto.getGoodId(), userId,exchangeDto.getGoodType()).getData();
-            if (user.getPoints()<point){
-                return AjaxResult.error("当前用户积分不足");
-            }
-            if (coupon.getInventoryQuantity() != -1 && count >= coupon.getInventoryQuantity()) {
-                return AjaxResult.error("当前用户已到达兑换"+coupon+"次");
-            }else {
-                if (coupon.getInventoryQuantity()!=-1) {
-                    coupon.setInventoryQuantity(coupon.getInventoryQuantity() - 1);
-                    couponService.updateById(coupon);
+            exchangeDto.setPoint(point);
+            exchangeDto.setUserId(userId);
+            //生成积分兑换成功的订单
+            R<ExchangeBackDto> longR = orderClient.exchangeCreate(exchangeDto);
+            if (exchangeDto.getGoodType()==2) {
+                TCoupon coupon = couponService.getById(exchangeDto.getGoodId());
+        
+                //如果是优惠卷,赠送优惠卷给用户
+                GrantCouponDto grantCouponDto = new GrantCouponDto();
+                grantCouponDto.setUserIds(userId.toString());
+                grantCouponDto.setCouponId(exchangeDto.getGoodId());
+                grantCouponDto.setWaysToObtain(1);
+                grantCouponDto.setEndTime(LocalDateTime.now());
+                grantCouponDto.setType(3);
+                switch (coupon.getValidityPeriodMode()){
+                    case 1:
+                        grantCouponDto.setEndTime(coupon.getEndTime());
+                        break;
+                    case 2:
+                        grantCouponDto.setEndTime(LocalDateTime.now().plusDays(coupon.getDays()));
+                        break;
                 }
+                appCouponClient.grantCoupon(grantCouponDto);
             }
-
-
+            //生成消耗积分的记录
+            PointChangeDto pointChangeDto = new PointChangeDto();
+            pointChangeDto.setUserId(userId);
+            pointChangeDto.setPoints(point);
+            pointChangeDto.setRemark(String.valueOf(longR.getData().getId()));
+            pointChangeDto.setType(6);
+            pointChangeDto.setCode(longR.getData().getCode());
+            appUserClient.changeDown(pointChangeDto);
+            return AjaxResult.success(longR.getData().getId());
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            //解锁
+            redisLock.unlock();
         }
-        exchangeDto.setPoint(point);
-        exchangeDto.setUserId(userId);
-        //生成积分兑换成功的订单
-        R<ExchangeBackDto> longR = orderClient.exchangeCreate(exchangeDto);
-        if (exchangeDto.getGoodType()==2) {
-            TCoupon coupon = couponService.getById(exchangeDto.getGoodId());
-
-            //如果是优惠卷,赠送优惠卷给用户
-            GrantCouponDto grantCouponDto = new GrantCouponDto();
-            grantCouponDto.setUserIds(userId.toString());
-            grantCouponDto.setCouponId(exchangeDto.getGoodId());
-            grantCouponDto.setWaysToObtain(1);
-            grantCouponDto.setEndTime(LocalDateTime.now());
-            grantCouponDto.setType(3);
-            switch (coupon.getValidityPeriodMode()){
-                case 1:
-                    grantCouponDto.setEndTime(coupon.getEndTime());
-                    break;
-                case 2:
-                    grantCouponDto.setEndTime(LocalDateTime.now().plusDays(coupon.getDays()));
-                    break;
-            }
-            appCouponClient.grantCoupon(grantCouponDto);
-        }
-        //生成消耗积分的记录
-        PointChangeDto pointChangeDto = new PointChangeDto();
-        pointChangeDto.setUserId(userId);
-        pointChangeDto.setPoints(point);
-        pointChangeDto.setRemark(String.valueOf(longR.getData().getId()));
-        pointChangeDto.setType(6);
-        pointChangeDto.setCode(longR.getData().getCode());
-        appUserClient.changeDown(pointChangeDto);
-        return AjaxResult.success(longR.getData().getId());
-
+        return AjaxResult.success();
 
     }
 

--
Gitblit v1.7.1