Explorar el Código

Merge branch 'dev' into 'mp-server-test'

Dev

See merge request quanshu/mp-server!785
jiang hao hace 2 años
padre
commit
7bdf7fd459

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

@@ -7,19 +7,23 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.qs.mp.admin.domain.Marketing;
 import com.qs.mp.admin.domain.MarketingAwards;
 import com.qs.mp.admin.domain.MarketingAwardsPrize;
+import com.qs.mp.admin.domain.MarketingMsg;
 import com.qs.mp.admin.domain.vo.MarketingAwardsVO;
 import com.qs.mp.admin.service.IMarketingAwardsPrizeService;
 import com.qs.mp.admin.service.IMarketingAwardsService;
+import com.qs.mp.admin.service.IMarketingMsgService;
 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 +96,12 @@ public class MarketingController extends BaseApiController {
     @Autowired
     private IWxSubscribeMessage wxSubscribeMessage;
 
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private IMarketingMsgService marketingMsgService;
+
     @PostMapping("/generateCode/{marketingId}")
     @ApiOperation("立即获取抽奖码")
     public AjaxResult generateCode(@PathVariable("marketingId") Long marketingId) {
@@ -230,9 +240,14 @@ public class MarketingController extends BaseApiController {
         }finally {
             distributedLocker.unlock(lockKey);
         }
-        // 异步给被助力人发送成功消息
-        wxSubscribeMessage.sendMarketingHelp(helpedUserId, marketing);
 
+        // 保存助力成功消息记录
+        MarketingMsg marketingMsg = new MarketingMsg();
+        marketingMsg.setMarketingId(marketing.getId());
+        marketingMsg.setContext(marketing.getTitle());
+        marketingMsg.setUserId(helpedUserId);
+        marketingMsg.setType(3);
+        marketingMsgService.save(marketingMsg);
 
         return AjaxResult.success("助力成功");
     }
@@ -293,6 +308,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 +347,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 -> {

+ 31 - 7
mp-quartz/src/main/java/com/qs/mp/quartz/task/MarketingTask.java

@@ -209,9 +209,21 @@ public class MarketingTask {
         }
 
         try {
-            List<MarketingMsg> marketingMsgList = marketingMsgService.list(new LambdaQueryWrapper<MarketingMsg>()
-                .eq(MarketingMsg::getType, type)
-                .last("limit " + limit));
+            List<MarketingMsg> marketingMsgList = new ArrayList<>();
+            if (type == 3) {
+                // 获取活动通知信息
+                marketingMsgList = marketingMsgService.list(new LambdaQueryWrapper<MarketingMsg>()
+                    .select(MarketingMsg::getMarketingId, MarketingMsg::getUserId, MarketingMsg::getContext)
+                    .eq(MarketingMsg::getType, 3)
+                    .groupBy(MarketingMsg::getMarketingId, MarketingMsg::getUserId, MarketingMsg::getContext)
+                    .last("limit " + limit));
+
+            } else {
+                marketingMsgList = marketingMsgService.list(new LambdaQueryWrapper<MarketingMsg>()
+                    .eq(MarketingMsg::getType, type)
+                    .last("limit " + limit));
+            }
+
 
             if (CollectionUtils.isEmpty(marketingMsgList)) {
                 return;
@@ -221,17 +233,29 @@ public class MarketingTask {
                 Marketing marketing = new Marketing();
                 marketing.setId(marketingMsg.getMarketingId());
                 marketing.setTitle(marketingMsg.getContext());
-                if (marketingMsg.getType() == 1) {
+                if (type == 1) {
                     // 发送活动开奖通知
                     wxSubscribeMessage.sendMarketingLottery(marketingMsg.getUserId(), marketing);
-                } else {
+                } else if (type == 2){
                     // 发送活动开始通知
                     wxSubscribeMessage.sendMarketingStart(marketingMsg.getUserId(), marketing);
+                } else if (type == 3) {
+                    // 发送助力成功通知
+                    wxSubscribeMessage.sendMarketingHelp(marketingMsg.getUserId(), marketing);
                 }
             }
 
-            // 删除已发送的消息
-            marketingMsgService.removeByIds(marketingMsgList.stream().map(MarketingMsg::getId).collect(Collectors.toList()));
+            if (type == 3) {
+                List<Long> userIdList = marketingMsgList.stream().map(MarketingMsg::getUserId)
+                    .collect(Collectors.toList());
+                marketingMsgService.remove(new LambdaUpdateWrapper<MarketingMsg>()
+                    .eq(MarketingMsg::getType, 3)
+                    .in(MarketingMsg::getUserId, userIdList));
+            } else {
+                // 删除已发送的消息
+                marketingMsgService.removeByIds(marketingMsgList.stream().map(MarketingMsg::getId).collect(Collectors.toList()));
+            }
+
         } catch (Exception e) {
             LogUtil.error(logger, e, "发送活动订阅通知异常");
         } finally {

+ 1 - 2
mp-service/src/main/java/com/qs/mp/admin/domain/MarketingMsg.java

@@ -43,7 +43,7 @@ public class MarketingMsg implements Serializable {
     private Long userId;
 
     /**
-     * 信息类型1开奖,2活动开始
+     * 信息类型1开奖,2活动开始,3助力通知
      */
     @TableField("type")
     private Integer type;
@@ -64,7 +64,6 @@ public class MarketingMsg implements Serializable {
      * 逻辑删除标识
      */
     @TableField("is_deleted")
-    @TableLogic
     private Integer isDeleted;
 
 

+ 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}", "经销商下的盲票采购单"),

+ 0 - 1
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxSubscribeMessageImpl.java

@@ -51,7 +51,6 @@ public class WxSubscribeMessageImpl implements IWxSubscribeMessage {
   }
 
   @Override
-  @Async("threadPoolTaskExecutor")
   public void sendMarketingHelp(Long userId, Marketing marketing) {
     String openId = getOpenIdByUserId(userId);
     WxSubscribeMessage wxSubscribeMessage = new WxSubscribeMessage(userAppId, openId, state);