Browse Source

活动参与用户增加声部过滤;修复用户发奖重复

Eric 2 years ago
parent
commit
bee5c7fffc

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

@@ -30,6 +30,7 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
     LOCK_ACTIVITY_REWARD_STOCK("锁活动奖品变更"),
     LOCK_ACTIVITY_STOCK("锁活动变更"),
     LOCK_STANDARD_GIFT_CRON("达标活动定时任务锁"),
+    LOCK_EVALUATION_CRON("评测活动定时任务锁"),
     ;
     /***
      * 缓存描述

+ 15 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/task/TaskController.java

@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
@@ -39,6 +40,8 @@ public class TaskController extends BaseController {
     private PlatformCashAccountRecordService platformCashAccountRecordService;
     @Autowired
     private ActivityPlanService activityPlanService;
+    @Autowired
+    private ActivityPlanEvaluationService activityPlanEvaluationService;
 
     @Value("${app.blacklist:}")
     private String blacklistFilePath;
@@ -111,4 +114,16 @@ public class TaskController extends BaseController {
         activityPlanService.activityIng();
         return HttpResponseResult.succeed();
     }
+
+    /**
+     * 活动测试
+     * @param activityId 活动ID
+     * @return HttpResponseResult<Object>
+     */
+    @GetMapping("/test")
+    public HttpResponseResult<Object> test(@RequestParam("activityId") Long activityId) {
+
+        activityPlanEvaluationService.successActivity(activityId);
+        return HttpResponseResult.succeed();
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRegistrationSearch.java

@@ -34,6 +34,9 @@ public class ActivityRegistrationSearch extends QueryInfo {
     @ApiModelProperty(value = "是否获奖 0 否 1 是")
     private YesOrNoEnum rewardFlag;
 
+    @ApiModelProperty(value = "声部ID集合")
+    private List<Long> subjectIds;
+
     public ActivityTypeEnum getActivityType() {
         return activityType;
     }
@@ -65,4 +68,12 @@ public class ActivityRegistrationSearch extends QueryInfo {
     public void setRewardFlag(YesOrNoEnum rewardFlag) {
         this.rewardFlag = rewardFlag;
     }
+
+    public List<Long> getSubjectIds() {
+        return subjectIds;
+    }
+
+    public void setSubjectIds(List<Long> subjectIds) {
+        this.subjectIds = subjectIds;
+    }
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationRecordServiceImpl.java

@@ -228,7 +228,7 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
 
             // 总分排名, 根据声部ID进行查询
             activityRankings = activityPlanMapper.selectActivityHighestScoreRankingInfo(activityPlanId, activityEvaluationId,
-                    0D, limit);
+                    1D, limit);
 
             List<Long> userIds = activityRankings.stream()
                     .map(ActivityRankingVo::getUserId).distinct().collect(Collectors.toList());
@@ -272,7 +272,7 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
 
             // 总分排名
             userRanking = activityPlanMapper.selectActivityHighestScoreUserRanking(activityPlanId, activityEvaluationId,
-                    0D, userId);
+                    1D, userId);
 
             // 学生声部信息
             Student student = studentMapper.selectOne(Wrappers.<Student>lambdaQuery().eq(Student::getUserId, userId));

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

@@ -540,7 +540,7 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
 
                     // 单声部计算用户总分排名用户信息
                     List<ActivityRankingVo> records = getBaseMapper().selectActivityHighestScoreRankingInfo(activityPlanId, Long.parseLong(item.getKey()),
-                            0D, 1);
+                            1D, 1);
 
                     if (CollectionUtils.isNotEmpty(records)) {
 
@@ -732,34 +732,53 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         // 方法调整为异常执行,预防HTTP接口调用返回超时响应
         ThreadPool.getExecutor().submit(() -> {
 
-            List<ActivityPlan> list = baseMapper.activityState();
-            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());
+            RLock lock = redissonClient.getLock(CacheNameEnum.LOCK_EVALUATION_CRON.getCode());
+            try {
+                if (lock.isLocked()) {
+                    log.warn("activityState {}, lockName={}", DateTime.now().toString(MK.TIME_PATTERN), lock.getName());
+                    return;
+                }
+
+                // 增加达标活动计算同步标识,前一个请求未执行完时忽略后续执行请求
+                lock.lock();
+
+                List<ActivityPlan> list = baseMapper.activityState();
+                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);
+                                        return true;
+                                    }, plan.getId(), 10l);
+                }
+
+            } catch (Exception e) {
+                log.error("activityState time={}", DateTime.now().toString(MK.TIME_PATTERN), e);
+            } finally {
+                // 释放锁
+                if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                    lock.unlock(); // 删除同步标识
+                }
             }
 
         });

+ 5 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml

@@ -173,10 +173,13 @@
         FROM
             activity_evaluation_record t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_
         WHERE
-            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ > #{rankingScore}
+            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ >= #{rankingScore}
             <if test="subjectId != null">
                 AND t1.resource_id_ = #{subjectId}
             </if>
+            <if test="subjectId == null">
+                AND t1.user_id_ NOT IN (SELECT t3.user_id_ FROM activity_user_reward t3 WHERE t3.activity_id_ = #{activityId})
+            </if>
         ORDER BY
             t1.score_ DESC,
             t1.registration_time_ ASC
@@ -190,7 +193,7 @@
         FROM
             activity_evaluation_record t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_
         WHERE
-            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ > #{rankingScore}
+            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ >= #{rankingScore}
             <if test="subjectId != null">
                 AND t1.resource_id_ = #{subjectId}
             </if>

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRegistrationMapper.xml

@@ -63,6 +63,9 @@
                     <if test="param.activityId != null">
                         and aer.activity_id_ = #{param.activityId}
                     </if>
+		            <if test="param.subjectIds != null and param.subjectIds.size() > 0">
+                        AND aer.resource_id_ IN (<foreach collection="param.subjectIds" separator="," item="">#{item}</foreach>)
+                    </if>
 		            <if test="param.musicSheetIds != null and param.musicSheetIds.size()>0">
                         and ae.music_sheet_id_ IN
                         <foreach collection="param.musicSheetIds" item="item" separator="," open="(" close=")">