소스 검색

立即获取抽奖码

cup 2 년 전
부모
커밋
943c996018

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

@@ -13,11 +13,13 @@ 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.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.RedisLockKey;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
@@ -84,6 +86,52 @@ public class MarketingController extends BaseApiController {
     @Autowired
     private ISysUserService sysUserService;
 
+    @PostMapping("/generateCode/{marketingId}")
+    @ApiOperation("立即获取抽奖码")
+    public AjaxResult generateCode(@PathVariable("marketingId") Long marketingId) {
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        if (Objects.isNull(userId)) {
+            return AjaxResult.error("用户未登录");
+        }
+
+        Marketing marketing = marketingService.getById(marketingId);
+        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("活动未开始~");
+        }
+
+        if (!marketing.getCodeType().equals(MarketingCodeTypeEnum.INSTANT.getValue())) {
+            return AjaxResult.error("错误请求");
+        }
+
+        String lockKey = RedisLockKey.build(RedisLockKey.MARKETING_REAL_NUM_LOCK, marketingId);
+        if (!distributedLocker.tryLock(lockKey)) {
+            return AjaxResult.error("活动太火爆了,请稍后重试!");
+        }
+
+        try {
+            marketingService.generateCode(marketingId, userId);
+        }finally {
+            distributedLocker.unlock(lockKey);
+        }
+
+        return AjaxResult.success("获取成功");
+
+    }
+
+
     @PostMapping("/recent")
     @ApiOperation("获取已开始且最近要开奖的营销活动")
     @ApiResponses(
@@ -163,7 +211,7 @@ public class MarketingController extends BaseApiController {
             return AjaxResult.error("不能助力自己哦");
         }
 
-        String lockKey = String.format(MARKETING_REAL_NUM_LOCK, marketing.getId());
+        String lockKey = RedisLockKey.build(RedisLockKey.MARKETING_REAL_NUM_LOCK, marketingHelpParam.getMarketingId());
 
         if (!distributedLocker.tryLock(lockKey)) {
             return AjaxResult.error("活动太火爆了,请稍后重试!");

+ 36 - 0
mp-common/src/main/java/com/qs/mp/common/enums/MarketingCodeTypeEnum.java

@@ -0,0 +1,36 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 活动邀请码获取枚举类
+ *
+ * @author Cup
+ * @date 2022/5/30
+ */
+@ApiModel("活动邀请码获取枚举类")
+public enum MarketingCodeTypeEnum implements IEnum<Integer> {
+
+    INSTANT(1, "立即获取邀请码"),
+    HELP(2, "助力获取邀请码");
+
+
+    private Integer value;
+    private String desc;
+
+    MarketingCodeTypeEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+
+    @Override
+    public Integer getValue() {
+        return this.value;
+    }
+}

+ 7 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IMarketingService.java

@@ -57,4 +57,11 @@ public interface IMarketingService extends IService<Marketing> {
      * @param marketing
      */
     void lottery(Marketing marketing);
+
+    /**
+     * 立即获取抽奖码
+     * @param marketingId
+     * @param userId
+     */
+    void generateCode(Long marketingId, Long userId);
 }

+ 57 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/MarketingServiceImpl.java

@@ -108,6 +108,63 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
     private DistributedLocker distributedLocker;
 
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void generateCode(Long marketingId, Long userId) {
+
+        // 判断是否已经获取过
+        int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                .eq(MarketingUserCode::getUserId, userId)
+                .eq(MarketingUserCode::getMarketingId, marketingId)
+                .isNull(MarketingUserCode::getHelpUserId));
+        if (count > 0) {
+            throw new ServiceException("您已经获取过抽奖码了");
+        }
+
+
+        // 生成抽奖码
+        String code = "";
+        while (true) {
+            code = MarketingUtils.generatePrizeCode();
+            // 判断抽奖码是否已经存在
+            int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
+                    .eq(MarketingUserCode::getMarketingId, marketingId)
+                    .eq(MarketingUserCode::getCode, code));
+            if (codeCount > 0) {
+                continue;
+            }
+            break;
+        }
+
+        MarketingUserCode marketingUserCode = new MarketingUserCode();
+        // 设置活动id
+        marketingUserCode.setMarketingId(marketingId);
+        // 设置抽奖码
+        marketingUserCode.setCode(code);
+        // 设置用户
+        marketingUserCode.setUserId(userId);
+        // 设置用户类型
+        marketingUserCode.setUserType(UserTypeEnum.ORDINARY.getValue());
+
+        // 保存助力信息
+        marketingUserCodeService.save(marketingUserCode);
+
+        Marketing marketing = this.getById(marketingId);
+
+
+        // 真实用户
+        int realNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
+        // 获取最新活动信息
+        marketing.setRealNum(realNum);
+        int randomNum = (int) 1 + (int) (Math.random() * 10);
+        marketing.setFakeNum(marketing.getFakeNum() + randomNum);
+        // 更新活动参与人数
+        boolean rtn = this.updateById(marketing);
+        Assert.isTrue(rtn, "更新活动参与人数异常。marketingId:" + marketing.getId());
+
+    }
+
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void lottery(Marketing marketing) {

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

@@ -10,6 +10,7 @@ import com.qs.mp.common.utils.MessageHelper;
  */
 public enum RedisLockKey {
 
+    MARKETING_REAL_NUM_LOCK("marketing_real_num_lock_{0}", "活动真实人数增加锁"),
     MARKETING_LOTTERY_KEY("marketing_lottery_key_{0}","免费抽奖活动开奖"),
     USER_TICKET_CASH_LOCK("user_ticket_cash_lock_{0}", "盲票兑奖锁");