cup 2 yıl önce
ebeveyn
işleme
05c95e386d

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

@@ -11,8 +11,10 @@ import com.qs.mp.admin.service.IMarketingAwardsService;
 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.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.security.handle.HostHolder;
@@ -41,6 +43,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -51,6 +54,8 @@ import java.util.stream.Collectors;
 @RequestMapping("/api/v1/mp/user/marketing")
 @Api(tags = "营销活动相关接口")
 public class MarketingController extends BaseApiController {
+    // 营销活动真实参与人数锁
+    public static final String MARKETING_REAL_NUM_LOCK = "MARKETING_REAL_NUM_LOCK:%s";
 
     @Autowired
     private IMarketingService marketingService;
@@ -70,6 +75,9 @@ public class MarketingController extends BaseApiController {
     @Autowired
     private HostHolder hostHolder;
 
+    @Autowired
+    private DistributedLocker distributedLocker;
+
     @PostMapping("/help")
     @ApiOperation("活动助力")
     public AjaxResult help(@RequestBody MarketingHelpParam marketingHelpParam) {
@@ -78,7 +86,48 @@ public class MarketingController extends BaseApiController {
             return AjaxResult.error("用户未登录");
         }
 
-        marketingService.help(marketingHelpParam, userId);
+        String inviteCode = marketingHelpParam.getInviteCode();
+        if (StringUtils.isBlank(inviteCode)) {
+            return AjaxResult.error("邀请码不能为空");
+        }
+
+        Marketing marketing = marketingService.getById(marketingHelpParam.getMarketingId());
+        if (Objects.isNull(marketing)) {
+            return AjaxResult.error("活动不存在");
+        }
+        // 未开启的活动不能助力
+        if (!MarketingStatusEnum.ON.getValue().equals(marketing.getIsOn())) {
+            return AjaxResult.error("活动未开启~");
+        }
+        Date now = DateUtils.getNowDate();
+        // 结束的活动不支持助力
+        if (marketing.getTriggerStatus() == 1 || marketing.getEndTime().before(now)) {
+            return AjaxResult.error("活动已过期~");
+        }
+        // 未开始的活动不能助力
+        if (marketing.getStartTime().after(now)) {
+            return AjaxResult.error("活动未开始~");
+        }
+
+        // 邀请码解码,被助力人id
+        Long helpedUserId = MarketingUtils.decodeInviteCode(inviteCode);
+        if (userId.equals(helpedUserId)) {
+            return AjaxResult.error("不能助力自己哦");
+        }
+
+        String lockKey = String.format(MARKETING_REAL_NUM_LOCK, marketing.getId());
+
+        if (!distributedLocker.tryLock(lockKey,3,30, TimeUnit.SECONDS)) {
+            return AjaxResult.error("活动太火爆了,请稍后重试!");
+        }
+
+        try {
+            marketingService.help(marketingHelpParam, userId);
+        }finally {
+            distributedLocker.unlock(lockKey);
+        }
+
+
         return AjaxResult.success("助力成功");
     }
 

+ 11 - 55
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java

@@ -61,9 +61,6 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
     // 普通奖池
     public static final String MARKETING_LOTTERY_ORDINARY_POOL = "MARKETING_LOTTERY_ORDINARY_POOL:%s";
 
-    // 营销活动真实参与人数锁
-    public static final String MARKETING_REAL_NUM_LOCK = "MARKETING_REAL_NUM_LOCK:%s";
-
     protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
 
     @Autowired
@@ -309,57 +306,15 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void help(MarketingHelpParam marketingHelpParam, Long userId) {
         String inviteCode = marketingHelpParam.getInviteCode();
-        if (com.qs.mp.common.utils.StringUtils.isBlank(inviteCode)) {
-            throw new ServiceException("邀请码不能为空");
-        }
-
-        Marketing marketing = this.getById(marketingHelpParam.getMarketingId());
-        if (Objects.isNull(marketing)) {
-            throw new ServiceException("活动不存在");
-        }
-        // 未开启的活动不能助力
-        if (!MarketingStatusEnum.ON.getValue().equals(marketing.getIsOn())) {
-            throw new ServiceException("活动未开启~");
-        }
-        Date now = DateUtils.getNowDate();
-        // 结束的活动不支持助力
-        if (marketing.getTriggerStatus() == 1 || marketing.getEndTime().before(now)) {
-            throw new ServiceException("活动已过期~");
-        }
-        // 未开始的活动不能助力
-        if (marketing.getStartTime().after(now)) {
-            throw new ServiceException("活动未开始~");
-        }
-
-
         // 邀请码解码,被助力人id
         Long helpedUserId = MarketingUtils.decodeInviteCode(inviteCode);
-        if (userId.equals(helpedUserId)) {
-            throw new ServiceException("不能助力自己哦");
-        }
-        String lockKey = String.format(MARKETING_REAL_NUM_LOCK, marketing.getId());
 
-        if (!distributedLocker.tryLock(lockKey,3,30,TimeUnit.SECONDS)) {
-            throw new ServiceException("活动太火爆了,请稍后重试!");
-        }
-        try {
-
-            // 处理助力信息
-            updateMarketingHelpInfo(marketingHelpParam, userId, marketing, helpedUserId);
-
-            // 给被助力人发送成功消息
-            wxSubscribeMessage.sendMarketingHelp(helpedUserId, marketing);
-
-        } finally {
-            distributedLocker.unlock(lockKey);
-        }
-
-    }
+        Marketing marketing = this.getById(marketingHelpParam.getMarketingId());
 
-    @Transactional(rollbackFor = Exception.class)
-    public void updateMarketingHelpInfo(MarketingHelpParam marketingHelpParam, Long userId, Marketing marketing, Long helpedUserId) {
+        // 处理助力信息
         // 判断是否已经助力过
         int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
                 .eq(MarketingUserCode::getHelpUserId, userId));
@@ -381,7 +336,7 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
         }
 
         MarketingUserCode marketingUserCode = new MarketingUserCode();
-        marketingUserCode.setMarketingId(marketingHelpParam.getMarketingId());
+        // 设置抽奖码
         marketingUserCode.setCode(code);
         // 设置被助力人
         marketingUserCode.setUserId(helpedUserId);
@@ -392,17 +347,18 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
         // 保存助力信息
         marketingUserCodeService.save(marketingUserCode);
 
-
         // 获取最新活动信息
-        Marketing marketingParam = this.getById(marketing.getId());
-        marketingParam.setRealNum(marketingParam.getRealNum() + 1);
+        marketing.setRealNum(marketing.getRealNum() + 1);
         int randomNum = (int) 1 + (int) (Math.random() * 10);
-        marketingParam.setFakeNum(marketingParam.getFakeNum() + randomNum);
+        marketing.setFakeNum(marketing.getFakeNum() + randomNum);
         // 更新活动参与人数
-        boolean rtn = this.updateById(marketingParam);
+        boolean rtn = this.updateById(marketing);
         Assert.isTrue(rtn, "更新活动参与人数异常。marketingId:" + marketing.getId());
-    }
 
+        // 给被助力人发送成功消息
+        wxSubscribeMessage.sendMarketingHelp(helpedUserId, marketing);
+
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)