Просмотр исходного кода

添加checkIfUserCompletedAnyNewUserTask的判断逻辑

wangzhijun 5 дней назад
Родитель
Сommit
77db0613c5

+ 79 - 27
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java

@@ -157,9 +157,12 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
         int targetCount = Integer.parseInt(task.getTriggerValue());
 
         // 4. 任务校验逻辑
-        if (ObjectUtil.notEqual(PointActivityTypeEnum.DAILY_ACTIVITY.getCode(), activityType) ||
-                ObjectUtil.notEqual(PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode(), activityType) ||
-                ObjectUtil.notEqual(PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode(), activityType)) {
+        List<Integer> validTypes = Arrays.asList(
+                PointActivityTypeEnum.DAILY_ACTIVITY.getCode(),
+                PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode(),
+                PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode()
+        );
+        if (!validTypes.contains(activityType)) {
             throw new ServiceException("不支持的活动类型");
         }
 
@@ -187,6 +190,29 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void completeOrderTaskByPriority(String openId) {
+        completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER, new Function<Date, Integer>() {
+            @Override
+            public Integer apply(Date queryTime) {
+                return orderService.countCompletedOrders(openId, queryTime);
+            }
+        });
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void completeRechargeTaskByPriority(String openId) {
+        completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK, new Function<Date, Integer>() {
+            @Override
+            public Integer apply(Date queryTime) {
+                int latestAmount = rechargeService.getLatestRechargeAmount(openId, queryTime);
+                return ObjectUtil.defaultIfNull(latestAmount, 0);
+            }
+        });
+    }
+
     /**
      * 根据任务类型获取任务名称 JDK8 兼容
      */
@@ -272,7 +298,11 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
      * 按活动类型优先级(新手 > 每日 > 每月)遍历匹配任务,完成首个合格任务后立即返回
      */
     private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum, Function<Date, Integer> countFunction) {
-        // 1. 批量查询所有有效任务
+
+        // 1. 检查用户是否已经完成过任何新手活动
+        boolean hasCompletedNewUser = checkIfUserCompletedAnyNewUserTask(openId);
+
+        // 2. 批量查询所有有效任务
         List<PointActivityTask> allTasks = pointActivityTaskService.list(Wrappers.lambdaQuery(PointActivityTask.class)
                 .eq(PointActivityTask::getTaskName, activityNameEnum.getInfo())
                 .eq(PointActivityTask::getStatus, 0)
@@ -281,13 +311,27 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
             return;
         }
 
-        // 2. 批量查询关联活动,避免N+1查询
+        // 3. 批量查询关联活动,避免N+1查询
         Set<Long> activityIds = allTasks.stream().map(PointActivityTask::getActivityId).collect(Collectors.toSet());
         Map<Long, PointActivity> activityMap = pointActivityService.listByIds(activityIds).stream()
                 .collect(Collectors.toMap(PointActivity::getId, a -> a));
 
-        // 3. 按优先级遍历活动类型
-        for (Integer typeCode : ACTIVITY_TYPE_PRIORITY) {
+        // 4. 根据新手任务状态决定遍历的优先级
+        List<Integer> targetPriorities;
+        if (hasCompletedNewUser) {
+            // 如果已经完成过新手活动,则只处理每日和每月
+            targetPriorities = Arrays.asList(
+                    PointActivityTypeEnum.DAILY_ACTIVITY.getCode(),
+                    PointActivityTypeEnum.MONTHLY_ACTIVITY.getCode()
+            );
+        } else {
+            // 否则,按照默认优先级(新手>每日>每月)处理
+            targetPriorities = ACTIVITY_TYPE_PRIORITY;
+        }
+        // ----------------------------------------------------
+
+        // 5. 按优先级遍历活动类型
+        for (Integer typeCode : targetPriorities) {
             List<PointActivityTask> filteredTasks = filterValidTasks(allTasks, activityMap, typeCode);
             if (CollectionUtil.isEmpty(filteredTasks)) {
                 continue;
@@ -405,26 +449,34 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
         return true;
     }
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void completeOrderTaskByPriority(String openId) {
-        completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER, new Function<Date, Integer>() {
-            @Override
-            public Integer apply(Date queryTime) {
-                return orderService.countCompletedOrders(openId, queryTime);
-            }
-        });
-    }
+    /**
+     * 检查用户是否已经完成过任何新手活动任务
+     */
+    private boolean checkIfUserCompletedAnyNewUserTask(String openId) {
+        // 1. 查询用户所有的任务完成记录
+        List<PointUserActivityTaskCompletion> records = this.list(
+                Wrappers.lambdaQuery(PointUserActivityTaskCompletion.class)
+                        .eq(PointUserActivityTaskCompletion::getOpenId, openId)
+        );
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void completeRechargeTaskByPriority(String openId) {
-        completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK, new Function<Date, Integer>() {
-            @Override
-            public Integer apply(Date queryTime) {
-                int latestAmount = rechargeService.getLatestRechargeAmount(openId, queryTime);
-                return ObjectUtil.defaultIfNull(latestAmount, 0);
-            }
-        });
+        if (CollectionUtil.isEmpty(records)) {
+            return false; // 没有记录,肯定没完成过
+        }
+
+        // 2. 获取这些记录关联的活动ID
+        Set<Long> activityIdSet = records.stream()
+                .map(PointUserActivityTaskCompletion::getActivityId)
+                .collect(Collectors.toSet());
+
+        // 3. 查询这些活动的详细信息,看是否有“新手活动”类型
+        if (CollectionUtil.isNotEmpty(activityIdSet)) {
+            List<PointActivity> activities = pointActivityService.listByIds(activityIdSet);
+            return activities.stream().anyMatch(activity ->
+                    PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode().equals(activity.getActivityType())
+            );
+        }
+
+        return false;
     }
+
 }