Răsfoiți Sursa

活动参与人数采用缓存

cup 2 ani în urmă
părinte
comite
33b1075f5e

+ 24 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/MarketingController.java

@@ -14,12 +14,14 @@ import com.qs.mp.admin.service.IMarketingService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.MarketingCodeTypeEnum;
 import com.qs.mp.common.enums.MarketingStatusEnum;
 import com.qs.mp.common.enums.UserTypeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.framework.redis.RedisLockKey;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.framework.service.IWxSubscribeMessage;
@@ -92,6 +94,9 @@ public class MarketingController extends BaseApiController {
     @Autowired
     private IWxSubscribeMessage wxSubscribeMessage;
 
+    @Autowired
+    private RedisCache redisCache;
+
     @PostMapping("/generateCode/{marketingId}")
     @ApiOperation("立即获取抽奖码")
     public AjaxResult generateCode(@PathVariable("marketingId") Long marketingId) {
@@ -293,6 +298,15 @@ public class MarketingController extends BaseApiController {
                             .eq(MarketingHitPrize::getMarketingId, marketing.getId())
                             .eq(MarketingHitPrize::getUserId, finalUserId));
                     userMarketingListVO.setIsHit(count);
+                } else {
+                    String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, marketing.getId());
+                    Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+                    if (fakeNum == null) {
+                        int realNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
+                        fakeNum = realNum * 2;
+                        redisCache.setCacheObject(fakeNumKey, fakeNum, 30, TimeUnit.HOURS);
+                    }
+                    userMarketingListVO.setFakeNum(fakeNum);
                 }
                 return userMarketingListVO;
             }).collect(Collectors.toList());
@@ -323,6 +337,16 @@ public class MarketingController extends BaseApiController {
         UserMarketingDetailVO userMarketingDetailVO = new UserMarketingDetailVO();
         BeanUtils.copyProperties(marketing, userMarketingDetailVO);
 
+        String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, id);
+        Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+        if (fakeNum == null) {
+            int realNum = marketingUserCodeService.countRealUserNumByMarketingId(id);
+            fakeNum = realNum * 2;
+            redisCache.setCacheObject(fakeNumKey, fakeNum, 30, TimeUnit.HOURS);
+        }
+
+        userMarketingDetailVO.setFakeNum(fakeNum);
+
         List<MarketingAwards> awardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, id));
         if (CollectionUtils.isNotEmpty(awardsList)) {
             List<MarketingAwardsVO> list = awardsList.stream().map(marketingAwards -> {

+ 17 - 8
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java

@@ -20,6 +20,7 @@ import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.bean.BeanUtils;
+import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.framework.service.IWxSubscribeMessage;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
@@ -185,14 +186,17 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
         // 保存助力信息
         marketingUserCodeService.save(marketingUserCode);
 
-        Marketing marketing = this.getById(marketingId);
 
         // 设置更新虚拟参与人数
         int randomNum = (int) 1 + (int) (Math.random() * 3);
-        // 更新活动参与人数
-        this.update(new LambdaUpdateWrapper<Marketing>().set(Marketing::getFakeNum, marketing.getFakeNum() + randomNum)
-            .eq(Marketing::getId, marketing.getId()));
-
+        String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, marketingId);
+        Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+        if (fakeNum == null) {
+            fakeNum = marketingUserCodeService.countRealUserNumByMarketingId(marketingId);
+            redisCache.setCacheObject(fakeNumKey, fakeNum * 2 + randomNum, 30, TimeUnit.HOURS);
+        } else {
+            redisCache.setCacheObject(fakeNumKey, fakeNum + randomNum, 30, TimeUnit.HOURS);
+        }
     }
 
 
@@ -492,9 +496,14 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
 
         // 设置更新虚拟参与人数
         int randomNum = (int) 1 + (int) (Math.random() * 3);
-        // 更新活动参与人数
-        this.update(new LambdaUpdateWrapper<Marketing>().set(Marketing::getFakeNum, marketing.getFakeNum() + randomNum)
-            .eq(Marketing::getId, marketing.getId()));
+        String fakeNumKey = RedisKey.build(RedisKey.MARKETING_FAKE_NUM, marketing.getId());
+        Integer fakeNum = redisCache.getCacheObject(fakeNumKey);
+        if (fakeNum == null) {
+            fakeNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
+            redisCache.setCacheObject(fakeNumKey, fakeNum * 2 + randomNum, 30, TimeUnit.HOURS);
+        } else {
+            redisCache.setCacheObject(fakeNumKey, fakeNum + randomNum, 30, TimeUnit.HOURS);
+        }
 
     }
 

+ 1 - 0
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -9,6 +9,7 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 public enum RedisKey {
+    MARKETING_FAKE_NUM("marketing_fake_num_{0}", "营销活动虚拟参与人数"),
     OPEN_LINK_KEY("open_link_key_{0}_{1}","微信scheme码缓存key"),
     WX_APP_TOKEN_KEY("app_token_key_{0}", "小程序app token"),
     CHANNEL_ORDER_KEY("channel_order_{0}", "经销商下的盲票采购单"),