无关风月
2024-12-11 4d7a208f388e42e7dd83dab0e38eadfa0847de1c
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();
    }