瀏覽代碼

代码调整

wangzhijun 4 天之前
父節點
當前提交
18b1833018

+ 74 - 20
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java

@@ -193,24 +193,13 @@ 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);
-            }
-        });
+        completeTaskByPriority(openId, TaskNameEnum.COMPLETE_ORDER, PointActivityTaskTypeEnum.COMPLETE_ORDER);
     }
 
     @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);
-            }
-        });
+        completeTaskByPriority(openId, TaskNameEnum.RECHARGE_TASK, PointActivityTaskTypeEnum.RECHARGE_TASK);
     }
 
     /**
@@ -266,7 +255,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
             // 获取正在进行中的新手活动
             LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(PointActivity::getActivityType, PointActivityTypeEnum.NEW_USER_ACTIVITY.getCode())
-                    .eq(PointActivity::getStatus, 0)
+                    .eq(PointActivity::getStatus, 1)
                     .orderByDesc(PointActivity::getStartTime)
                     .last("limit 1");
             PointActivity activity = this.pointActivityService.getOne(queryWrapper);
@@ -308,7 +297,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
      * 通用优先级任务完成方法
      * 按活动类型优先级(新手 > 每日 > 每月)遍历匹配任务,完成首个合格任务后立即返回
      */
-    private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum, Function<Date, Integer> countFunction) {
+    private void completeTaskByPriority(String openId, TaskNameEnum activityNameEnum, PointActivityTaskTypeEnum taskTypeEnum) {
 
         // 1. 检查用户是否已经完成过任何新手活动
         boolean hasCompletedNewUser = checkIfUserCompletedAnyNewUserTask(openId);
@@ -351,7 +340,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
             // 4. 遍历当前类型的任务,尝试完成
             for (PointActivityTask task : filteredTasks) {
                 PointActivity activity = activityMap.get(task.getActivityId());
-                if (tryCompleteSingleTask(openId, task, activity, typeCode, taskTypeEnum, activityNameEnum, countFunction)) {
+                if (tryCompleteSingleTask(openId, task, activity, typeCode, taskTypeEnum, activityNameEnum)) {
                     return; // 完成首个合格任务后立即返回
                 }
             }
@@ -375,7 +364,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
      */
     private boolean tryCompleteSingleTask(String openId, PointActivityTask task, PointActivity activity,
                                           Integer typeCode, PointActivityTaskTypeEnum taskTypeEnum,
-                                          TaskNameEnum activityNameEnum, Function<Date, Integer> countFunction) {
+                                          TaskNameEnum activityNameEnum) {
         try {
             // 1. 解析频率限制
             TaskLimitTimesEnum limitEnum = parseFrequencyLimit(task);
@@ -385,7 +374,7 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
 
             // 2. 校验业务数据是否达标
             Date queryTime = getQueryStartTime(activity.getIsPermanent(), typeCode);
-            if (!isTaskTargetMet(task, taskTypeEnum, limitEnum.getTime(), countFunction, queryTime)) {
+            if (!isTaskTargetMet(task, taskTypeEnum, limitEnum.getTime(), queryTime, activity, openId)) {
                 return false;
             }
 
@@ -433,8 +422,10 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
      * - 完成订单:实际完成次数 >= 频率限制次数
      */
     private boolean isTaskTargetMet(PointActivityTask task, PointActivityTaskTypeEnum taskTypeEnum,
-                                    int targetCount, Function<Date, Integer> countFunction, Date queryTime) {
-        int actualCount = countFunction.apply(queryTime);
+                                    int targetCount, Date queryTime,
+                                    PointActivity activity, String openId) {
+        // 调用getActualCountByActivityType方法获取实际完成次数
+        int actualCount = getActualCountByActivityType(task, activity, queryTime, openId);
 
         if (ObjUtil.equals(taskTypeEnum.getCode(), PointActivityTaskTypeEnum.RECHARGE_TASK.getCode())) {
             // 充值任务:triggerValue 为目标金额
@@ -490,4 +481,67 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
         return false;
     }
 
+    /**
+     * 根据活动类型获取任务完成次数
+     */
+    private int getActualCountByActivityType(PointActivityTask task, PointActivity activity,
+                                             Date queryTime, String openId) {
+        switch (activity.getActivityType()) {
+            case 1: // 新手活动
+                return getNewHandTaskCompletionCount(task, openId);
+            case 2: // 每日活动
+                return getDailyTaskCompletionCount(task, openId, queryTime);
+            default: // 每月活动
+                return getMonthlyTaskCompletionCount(task, openId, queryTime);
+        }
+    }
+
+    /**
+     * 获取新手活动任务完成次数(无时间限制,只要参与就累计)
+     */
+    private int getNewHandTaskCompletionCount(PointActivityTask task, String openId) {
+        PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
+                new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
+                        .eq(PointUserActivityTaskCompletion::getOpenId, openId)
+                        .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
+                        .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
+        );
+
+        return completion != null ? completion.getCompletedCount() : 0;
+    }
+
+    /**
+     * 获取每日活动任务完成次数
+     */
+    private int getDailyTaskCompletionCount(PointActivityTask task, String openId, Date todayStart) {
+        Date todayEnd = DateUtil.endOfDay(todayStart != null ? todayStart : new Date());
+
+        PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
+                new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
+                        .eq(PointUserActivityTaskCompletion::getOpenId, openId)
+                        .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
+                        .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
+                        .between(PointUserActivityTaskCompletion::getLastCompletedTime, todayStart, todayEnd)
+        );
+
+        return completion != null ? completion.getCompletedCount() : 0;
+    }
+
+    /**
+     * 获取每月活动任务完成次数
+     */
+    private int getMonthlyTaskCompletionCount(PointActivityTask task, String openId, Date todayStart) {
+        Date monthEnd = DateUtil.endOfMonth(todayStart != null ? todayStart : new Date());
+
+        PointUserActivityTaskCompletion completion = pointUserActivityTaskCompletionMapper.selectOne(
+                new LambdaQueryWrapper<PointUserActivityTaskCompletion>()
+                        .eq(PointUserActivityTaskCompletion::getOpenId, openId)
+                        .eq(PointUserActivityTaskCompletion::getTaskId, task.getId())
+                        .eq(PointUserActivityTaskCompletion::getActivityId, task.getActivityId())
+                        .between(PointUserActivityTaskCompletion::getLastCompletedTime, todayStart, monthEnd)
+        );
+
+        return completion != null ? completion.getCompletedCount() : 0;
+    }
+
 }