| | |
| | | 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> |
| | |
| | | @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 |
| | |
| | | */ |
| | | @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){ |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |