Browse Source

运营活动开发

liweifan 3 years ago
parent
commit
ec5b876f71

+ 1 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java

@@ -28,6 +28,7 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
     LOCK_WITHDRAWAL("锁用户结算"),
     LOCK_REWARD_STOCK("锁奖品库存变更"),
     LOCK_ACTIVITY_REWARD_STOCK("锁活动奖品变更"),
+    LOCK_ACTIVITY_STOCK("锁活动变更"),
     ;
     /***
      * 缓存描述

+ 30 - 21
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java

@@ -83,6 +83,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
     //保存/更新拓展字段
     private static final Map<ActivityTypeEnum, Consumer<ActivityPlanDto>> saveOrUpdateExpand = new HashMap<>();
     //开始活动(活动刚开始触发)
@@ -429,27 +432,33 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Transactional(rollbackFor = Exception.class)
     public void activityState() {
         List<ActivityPlan> list = baseMapper.activityState();
-        for (ActivityPlan activityPlan : list) {
-            if (activityPlan.getActivityState() == 0) {
-                activityPlan.setActivityState(1);
-                baseMapper.updateById(activityPlan);
-
-                //开始活动
-                Consumer<Long> afterFunction = startActivity.get(activityPlan.getActivityType());
-                if (!Objects.isNull(afterFunction)) {
-                    afterFunction.accept(activityPlan.getId());
-                }
-            } else {
-                activityPlan.setActivityState(0);
-                activityPlan.setRewardFlag(1);
-                baseMapper.updateById(activityPlan);
-
-                //完成活动
-                Consumer<Long> afterFunction = successActivity.get(activityPlan.getActivityType());
-                if (!Objects.isNull(afterFunction)) {
-                    afterFunction.accept(activityPlan.getId());
-                }
-            }
+        for (ActivityPlan plan : list) {
+            DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_STOCK.getRedisKey(plan.getId())
+                            , (id) -> {
+                                ActivityPlan activityPlan = getById(id);
+                                if (activityPlan.getActivityState() == 0) {
+                                    activityPlan.setActivityState(1);
+                                    baseMapper.updateById(activityPlan);
+
+                                    //开始活动
+                                    Consumer<Long> afterFunction = startActivity.get(activityPlan.getActivityType());
+                                    if (!Objects.isNull(afterFunction)) {
+                                        afterFunction.accept(activityPlan.getId());
+                                    }
+                                } else {
+                                    activityPlan.setActivityState(0);
+                                    activityPlan.setRewardFlag(1);
+                                    baseMapper.updateById(activityPlan);
+
+                                    //完成活动
+                                    Consumer<Long> afterFunction = successActivity.get(activityPlan.getActivityType());
+                                    if (!Objects.isNull(afterFunction)) {
+                                        afterFunction.accept(activityPlan.getId());
+                                    }
+                                }
+                                return true;
+                            }, plan.getId(), 10l);
         }
     }
 

+ 34 - 20
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java

@@ -6,13 +6,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.ConditionEnum;
 import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
@@ -32,9 +38,13 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
     @Autowired
     private ActivityPlanService activityPlanService;
     @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+    @Autowired
     private UserFirstTimeService userFirstTimeService;
     @Autowired
     private ActivityRewardService activityRewardService;
+    @Autowired
+    private RedissonClient redissonClient;
 
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
@@ -60,20 +70,21 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
                 .select(ActivityPlan::getId));
 
         for (ActivityPlan activityPlan : activityIds) {
-            ActivityPlanVo detail = activityPlanService.detail(activityPlan.getId());
-
-            dealActivityIng(detail);
+            DistributedLock.of(redissonClient)
+                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_STOCK.getRedisKey(activityPlan.getId())
+                            , this::dealActivityIng, activityPlan.getId(), 10l);
         }
-
     }
 
-    private void dealActivityIng(ActivityPlanVo detail) {
-        if(null == detail){
-            return;
+    private Boolean dealActivityIng(Long activityId) {
+        ActivityPlanVo detail = activityPlanService.detail(activityId);
+        if (null == detail) {
+            return true;
         }
+
         ActivityPlanStandard planStandard = detail.getPlanStandard();
-        if(null == planStandard){
-            return;
+        if (null == planStandard) {
+            return true;
         }
 
         UserFirstTimeSearch search = new UserFirstTimeSearch();
@@ -86,29 +97,32 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
         List<String> timeTypes = WrapperUtil.toList(timeType);
 
         List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
-        if(CollectionUtils.isEmpty(userFirstTimes)){
-            return;
+        if (CollectionUtils.isEmpty(userFirstTimes)) {
+            return true;
         }
         Map<Long, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
-        if(ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())){
-            for(Long userId : userMap.keySet()){
+        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
+            for (Long userId : userMap.keySet()) {
                 //给用户发奖
-                activityRewardService.sendReward(userId,detail.getId());
+                activityRewardService.sendReward(userId, detail.getId());
             }
-        }else{
-            for(Long userId : userMap.keySet()){
+        } else {
+            for (Long userId : userMap.keySet()) {
                 List<UserFirstTime> firstTimes = userMap.get(userId);
-                if(firstTimes.size() == timeTypes.size()){
+                if (firstTimes.size() == timeTypes.size()) {
                     //给用户发奖
-                    activityRewardService.sendReward(userId,detail.getId());
+                    activityRewardService.sendReward(userId, detail.getId());
                 }
             }
-
         }
+        return true;
     }
 
     @Override
     public void successActivity(Long activytyId) {
-
+        //处理活动发奖
+        dealActivityIng(activytyId);
+        //归还库存
+        activityPlanRewardService.recoveryReward(activytyId);
     }
 }