|  | @@ -83,17 +83,20 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private SysMessageService sysMessageService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  | -    private ActivityRewardChangeStockDao changeStockDao;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private RedissonClient redissonClient;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //保存/更新拓展字段
 | 
	
		
			
				|  |  |      private static final Map<ActivityTypeEnum, Consumer<ActivityPlanDto>> saveOrUpdateExpand = new HashMap<>();
 | 
	
		
			
				|  |  | -    //取消活动
 | 
	
		
			
				|  |  | -    private static final Map<ActivityTypeEnum, Consumer<Long>> cancelActivity = new HashMap<>();
 | 
	
		
			
				|  |  | -    //活动完成(结束)
 | 
	
		
			
				|  |  | +    //开始活动(活动刚开始触发)
 | 
	
		
			
				|  |  | +    private static final Map<ActivityTypeEnum, Consumer<Long>> startActivity = new HashMap<>();
 | 
	
		
			
				|  |  | +    //开启活动(开启活动按钮)
 | 
	
		
			
				|  |  | +    private static final Map<ActivityTypeEnum, Consumer<Long>> openActivity = new HashMap<>();
 | 
	
		
			
				|  |  | +    //关闭活动(关闭活动按钮)
 | 
	
		
			
				|  |  | +    private static final Map<ActivityTypeEnum, Consumer<Long>> closeActivity = new HashMap<>();
 | 
	
		
			
				|  |  | +    //活动中定时轮询
 | 
	
		
			
				|  |  | +    private static final Map<ActivityTypeEnum, Consumer<Object>> activityIng = new HashMap<>();
 | 
	
		
			
				|  |  | +    //活动完成(活动截止时间到触发)
 | 
	
		
			
				|  |  |      private static final Map<ActivityTypeEnum, Consumer<Long>> successActivity = new HashMap<>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @PostConstruct
 | 
	
	
		
			
				|  | @@ -103,13 +106,21 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |          saveOrUpdateExpand.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::createOrUpdate);
 | 
	
		
			
				|  |  |          //达标赠送活动
 | 
	
		
			
				|  |  |          saveOrUpdateExpand.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::createOrUpdate);
 | 
	
		
			
				|  |  | +        /**********开始活动(活动刚开始触发)******************/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        /**********开启活动(开启活动按钮)******************/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        /**********取消活动******************/
 | 
	
		
			
				|  |  | +        /**********关闭活动(关闭活动按钮)******************/
 | 
	
		
			
				|  |  |          //评测活动
 | 
	
		
			
				|  |  | -        cancelActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::cancelActivity);
 | 
	
		
			
				|  |  | -        /**********活动完成(结束)******************/
 | 
	
		
			
				|  |  | +        closeActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::closeActivity);
 | 
	
		
			
				|  |  | +        /**********活动中定时轮询******************/
 | 
	
		
			
				|  |  | +        //达标赠送活动
 | 
	
		
			
				|  |  | +        activityIng.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::activityIng);
 | 
	
		
			
				|  |  | +        /**********活动完成(活动截止时间到触发)******************/
 | 
	
		
			
				|  |  |          //评测活动
 | 
	
		
			
				|  |  |          successActivity.put(ActivityTypeEnum.EVALUATION, activityPlanEvaluationService::successActivity);
 | 
	
		
			
				|  |  | +        //达标赠送活动
 | 
	
		
			
				|  |  | +        successActivity.put(ActivityTypeEnum.STANDARD_GIFT, activityPlanStandardService::successActivity);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
	
		
			
				|  | @@ -142,14 +153,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |              throw new BizException("参数异常");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType())) {
 | 
	
		
			
				|  |  | -            activityPlan.setActivityClient(ClientEnum.STUDENT);
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            if (null == activityPlan.getActivityClient()) {
 | 
	
		
			
				|  |  | -                throw new BizException("活动客户端不能为空");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          if (null == activityPlan.getId()) {
 | 
	
		
			
				|  |  |              activityPlan.setDraftFlag(1);
 | 
	
		
			
				|  |  |              activityPlan.setCreateBy(activityPlan.getUserId());
 | 
	
	
		
			
				|  | @@ -193,10 +196,15 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |                  activityPlan.setActivityStart(now);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              activityPlan.setActivityState(activityState);
 | 
	
		
			
				|  |  | +            //开启活动
 | 
	
		
			
				|  |  | +            Consumer<Long> afterFunction = openActivity.get(activityPlan.getActivityType());
 | 
	
		
			
				|  |  | +            if (!Objects.isNull(afterFunction)) {
 | 
	
		
			
				|  |  | +                afterFunction.accept(activityPlan.getId());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |              activityPlan.setActivityState(2);
 | 
	
		
			
				|  |  | -            //取消活动
 | 
	
		
			
				|  |  | -            Consumer<Long> afterFunction = cancelActivity.get(activityPlan.getActivityType());
 | 
	
		
			
				|  |  | +            //关闭活动
 | 
	
		
			
				|  |  | +            Consumer<Long> afterFunction = closeActivity.get(activityPlan.getActivityType());
 | 
	
		
			
				|  |  |              if (!Objects.isNull(afterFunction)) {
 | 
	
		
			
				|  |  |                  afterFunction.accept(activityPlan.getId());
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -225,8 +233,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if(!ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())){
 | 
	
		
			
				|  |  | -            if(null == activityPlan.getRegistrationMethod()){
 | 
	
		
			
				|  |  | +        if (!ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (null == activityPlan.getRegistrationMethod()) {
 | 
	
		
			
				|  |  |                  throw new BizException("报名缴费方式不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (RegistrationMethodEnum.CHARGE.equals(activityPlan.getRegistrationMethod())
 | 
	
	
		
			
				|  | @@ -237,25 +246,42 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 | 
	
		
			
				|  |  |                      && (null == activityPlan.getShareRate())) {
 | 
	
		
			
				|  |  |                  throw new BizException("活动收费时,分润比例不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if(StringUtil.isEmpty(activityPlan.getSubjectUrl())){
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getSubjectUrl())) {
 | 
	
		
			
				|  |  |                  throw new BizException("主题图片不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if(StringUtil.isEmpty(activityPlan.getBackgroundUrl())){
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getBackgroundUrl())) {
 | 
	
		
			
				|  |  |                  throw new BizException("平铺背景不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if(StringUtil.isEmpty(activityPlan.getShareUrl())){
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getShareUrl())) {
 | 
	
		
			
				|  |  |                  throw new BizException("分享图片不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            if(StringUtil.isEmpty(activityPlan.getRuleDescribe())){
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getRuleDescribe())) {
 | 
	
		
			
				|  |  |                  throw new BizException("活动规则不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (ActivityTypeEnum.EVALUATION.equals(activityPlan.getActivityType())) {
 | 
	
		
			
				|  |  | -            if(null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty()){
 | 
	
		
			
				|  |  | +            activityPlan.setActivityClient(ClientEnum.STUDENT);
 | 
	
		
			
				|  |  | +            if (null == activityPlan.getPlanEvaluation() || null == activityPlan.getPlanEvaluation().getEvaluationDifficulty()) {
 | 
	
		
			
				|  |  |                  throw new BizException("活动类型为评测活动时,评测难度不能为空");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (ActivityTypeEnum.STANDARD_GIFT.equals(activityPlan.getActivityType())) {
 | 
	
		
			
				|  |  | +            if (null == activityPlan.getPlanStandard()) {
 | 
	
		
			
				|  |  | +                throw new BizException("缺少达标赠送参数");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getPlanStandard().getCondition())) {
 | 
	
		
			
				|  |  | +                throw new BizException("达标条件不能为空");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (StringUtil.isEmpty(activityPlan.getPlanStandard().getCalculationMethod())) {
 | 
	
		
			
				|  |  | +                throw new BizException("计算方式不能为空");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (null == activityPlan.getActivityClient()) {
 | 
	
		
			
				|  |  | +            throw new BizException("活动客户端不能为空");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          return true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -406,34 +432,40 @@ 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);
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                activityPlan.setActivityState(0);
 | 
	
		
			
				|  |  | -                baseMapper.updateById(activityPlan);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //关闭活动
 | 
	
		
			
				|  |  | -                Consumer<Long> afterFunction = cancelActivity.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);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        //活动完成
 | 
	
		
			
				|  |  | -        List<ActivityPlan> rewardList = baseMapper.activityReward();
 | 
	
		
			
				|  |  | -        for (ActivityPlan activityPlan : rewardList) {
 | 
	
		
			
				|  |  | -            //活动置为已发奖(已完成)
 | 
	
		
			
				|  |  | -            activityPlan.setRewardFlag(1);
 | 
	
		
			
				|  |  | -            updateById(activityPlan);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //完成活动
 | 
	
		
			
				|  |  | -            Consumer<Long> afterFunction = successActivity.get(activityPlan.getActivityType());
 | 
	
		
			
				|  |  | -            if (!Objects.isNull(afterFunction)) {
 | 
	
		
			
				|  |  | -                afterFunction.accept(activityPlan.getId());
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void activityIng() {
 | 
	
		
			
				|  |  | +        for (ActivityTypeEnum activityTypeEnum : activityIng.keySet()) {
 | 
	
		
			
				|  |  | +            activityIng.get(activityTypeEnum).accept(null);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |