jiangqs
2023-09-04 c97706c3cc213b7db3d381e8a0435ff0ef9a04d6
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopTotalServiceImpl.java
@@ -5,13 +5,15 @@
import com.ruoyi.shop.mapper.shop.ShopTotalMapper;
import com.ruoyi.shop.service.shop.ShopTotalService;
import com.ruoyi.system.api.domain.dto.ShopTotalChangeDto;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * <p>
@@ -24,8 +26,12 @@
@Service
public class ShopTotalServiceImpl extends ServiceImpl<ShopTotalMapper, ShopTotal> implements ShopTotalService {
    private Lock lock = new ReentrantLock();
    private ExecutorService executor = Executors.newSingleThreadExecutor();
    @Autowired
    private RedissonClient redissonClient;
    @Resource
    private ShopTotalMapper shopTotalMapper;
    /**
     * @param shopTotalChangeDto
@@ -34,49 +40,75 @@
     */
    @Override
    public void changeShopTotal(ShopTotalChangeDto shopTotalChangeDto) {
        executor.execute(() -> {
            lock.lock();
            try {
                handleShopTotal(shopTotalChangeDto);
            } finally {
                lock.unlock();
            }
        });
        //redis库存控制极简版
        RLock redissonLock = redissonClient.getLock("shop_total_"+shopTotalChangeDto.getShopId());
        try{
            redissonLock.lock(30, TimeUnit.SECONDS);
            handleShopTotal(shopTotalChangeDto);
        }finally{
            redissonLock.unlock();
        }
    }
    @Override
    public ShopTotal shopsTotalByIds(List<Long> shopIds) {
        return shopTotalMapper.shopsTotalByIds(shopIds);
    }
    //更新商户统计实现
    private void handleShopTotal(ShopTotalChangeDto shopTotalChangeDto){
        log.debug("商户统计变动"+shopTotalChangeDto.toString());
        ShopTotal shopTotal = this.getById(shopTotalChangeDto.getShopId());
        //订单变化
        BigDecimal payMoney = BigDecimal.ZERO;
        Boolean haveOrder = false;
        if(shopTotalChangeDto.getCycleMoney()!=null){
            shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().add(shopTotalChangeDto.getCycleMoney()));
            payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
            shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()+1);
            haveOrder = true;
        }
        if(shopTotalChangeDto.getExperienceMoney()!=null){
            shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().add(shopTotalChangeDto.getExperienceMoney()));
            payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
            shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()+1);
            haveOrder = true;
        }
        if(shopTotalChangeDto.getServiceMoney()!=null){
            shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().add(shopTotalChangeDto.getServiceMoney()));
            payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
            shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()+1);
            haveOrder = true;
        }
        if(shopTotalChangeDto.getGoodsMoney()!=null){
            shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().add(shopTotalChangeDto.getGoodsMoney()));
            payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
            shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()+1);
            haveOrder = true;
        }
        if(haveOrder){
            shopTotal.setTotalOrderMoney(shopTotal.getTotalOrderMoney().add(payMoney));
            shopTotal.setTotalOrder(shopTotal.getTotalOrder()+1);
        if(shopTotalChangeDto.getOrderType()!=null){
            if(shopTotalChangeDto.getOrderType()==1){
                if(shopTotalChangeDto.getCycleMoney()!=null){
                    shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().add(shopTotalChangeDto.getCycleMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
                    shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()+1);
                }
                if(shopTotalChangeDto.getExperienceMoney()!=null){
                    shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().add(shopTotalChangeDto.getExperienceMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
                    shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()+1);
                }
                if(shopTotalChangeDto.getServiceMoney()!=null){
                    shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().add(shopTotalChangeDto.getServiceMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
                    shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()+1);
                }
                if(shopTotalChangeDto.getGoodsMoney()!=null){
                    shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().add(shopTotalChangeDto.getGoodsMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
                    shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()+1);
                }
                shopTotal.setTotalOrderMoney(shopTotal.getTotalOrderMoney().add(payMoney));
                shopTotal.setTotalOrder(shopTotal.getTotalOrder()+1);
            }else{
                if(shopTotalChangeDto.getCycleMoney()!=null){
                    shopTotal.setTotalCycleMoney(shopTotal.getTotalCycleMoney().subtract(shopTotalChangeDto.getCycleMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getCycleMoney());
                    shopTotal.setTotalCycleOrder(shopTotal.getTotalCycleOrder()-1);
                }
                if(shopTotalChangeDto.getExperienceMoney()!=null){
                    shopTotal.setTotalExperienceMoney(shopTotal.getTotalExperienceMoney().subtract(shopTotalChangeDto.getExperienceMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getExperienceMoney());
                    shopTotal.setTotalExperienceOrder(shopTotal.getTotalExperienceOrder()-1);
                }
                if(shopTotalChangeDto.getServiceMoney()!=null){
                    shopTotal.setTotalServiceMoney(shopTotal.getTotalServiceMoney().subtract(shopTotalChangeDto.getServiceMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getServiceMoney());
                    shopTotal.setTotalServiceOrder(shopTotal.getTotalServiceOrder()-1);
                }
                if(shopTotalChangeDto.getGoodsMoney()!=null){
                    shopTotal.setTotalGoodsMoney(shopTotal.getTotalGoodsMoney().subtract(shopTotalChangeDto.getGoodsMoney()));
                    payMoney = payMoney.add(shopTotalChangeDto.getGoodsMoney());
                    shopTotal.setTotalGoodsOrder(shopTotal.getTotalGoodsOrder()-1);
                }
                shopTotal.setTotalOrderMoney(shopTotal.getTotalOrderMoney().subtract(payMoney));
                shopTotal.setTotalOrder(shopTotal.getTotalOrder()-1);
            }
        }
        //活动变化
        if(shopTotalChangeDto.getActivityCount()!=null){
@@ -95,6 +127,7 @@
                shopTotal.setTotalCycleService(shopTotal.getTotalCycleService()+shopTotalChangeDto.getCycleService());
                shopTotal.setUseableCycleService(shopTotal.getUseableCycleService()+shopTotalChangeDto.getCycleService());
                shopTotal.setTotalCyclePerson(shopTotal.getTotalCyclePerson()+shopTotalChangeDto.getCyclePerson());
                shopTotal.setUseableCyclePerson(shopTotal.getUseableCyclePerson()+shopTotalChangeDto.getCyclePerson());
                serviceCount = serviceCount + shopTotalChangeDto.getCycleService();
            }
            haveService = true;
@@ -109,6 +142,7 @@
                shopTotal.setTotalServiceService(shopTotal.getTotalServiceService()+shopTotalChangeDto.getServiceService());
                shopTotal.setUseableServiceService(shopTotal.getUseableServiceService()+shopTotalChangeDto.getServiceService());
                shopTotal.setTotalServicePerson(shopTotal.getTotalServicePerson()+shopTotalChangeDto.getServicePerson());
                shopTotal.setUseableServicePerson(shopTotal.getUseableServicePerson()+shopTotalChangeDto.getServicePerson());
                serviceCount = serviceCount + shopTotalChangeDto.getServiceService();
            }
            haveService = true;
@@ -123,6 +157,7 @@
                shopTotal.setTotalExperienceService(shopTotal.getTotalExperienceService()+shopTotalChangeDto.getExperienceService());
                shopTotal.setUseableExperienceService(shopTotal.getUseableExperienceService()+shopTotalChangeDto.getExperienceService());
                shopTotal.setTotalExperiencePerson(shopTotal.getTotalExperiencePerson()+shopTotalChangeDto.getExperiencePerson());
                shopTotal.setUseableExperiencePerson(shopTotal.getUseableExperiencePerson()+shopTotalChangeDto.getExperiencePerson());
                serviceCount = serviceCount + shopTotalChangeDto.getExperienceService();
            }
            haveService = true;