Browse Source

提交代码

wangzhijun 2 tuần trước cách đây
mục cha
commit
1ca3d1adec

+ 141 - 0
nightFragrance-massage/src/main/java/com/ylx/point/enums/TaskLimitTimesEnum.java

@@ -0,0 +1,141 @@
+package com.ylx.point.enums;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * 任务次数限制枚举
+ * 包含:无限制、总次数限制、每日次数限制
+ * 自带策略模式校验逻辑
+ */
+@Getter
+public enum TaskLimitTimesEnum {
+
+    // ====================== 枚举实例 ======================
+    /**
+     * 无限制
+     */
+    UNLIMITED("0", null, "无限制", null, (current, max) -> true),
+
+    /**
+     * 总次数限制 - 仅限一次
+     */
+    LIMIT_ONCE("1", 1, "仅限一次", LimitCategory.TOTAL, (current, max) -> current < max),
+    /**
+     * 总次数限制 - 仅限二次
+     */
+    LIMIT_TWICE("3", 2, "仅限二次", LimitCategory.TOTAL, (current, max) -> current < max),
+    /**
+     * 总次数限制 - 仅限三次
+     */
+    LIMIT_THRICE("5", 3, "仅限三次", LimitCategory.TOTAL, (current, max) -> current < max),
+
+    /**
+     * 每日限制 - 每日一次
+     */
+    DAILY_ONCE("2", 1, "每日一次", LimitCategory.DAILY, (current, max) -> current < max),
+    /**
+     * 每日限制 - 每日二次
+     */
+    DAILY_TWICE("4", 2, "每日二次", LimitCategory.DAILY, (current, max) -> current < max),
+    /**
+     * 每日限制 - 每日三次
+     */
+    DAILY_THRICE("6", 3, "每日三次", LimitCategory.DAILY, (current, max) -> current < max);
+
+    // ====================== 内部枚举:限制类型 ======================
+    public enum LimitCategory {
+        /**
+         * 总次数限制(累计次数)
+         */
+        TOTAL,
+        /**
+         * 每日次数限制
+         */
+        DAILY
+    }
+
+    // ====================== 函数式接口:限制策略 ======================
+    @FunctionalInterface
+    public interface LimitStrategy {
+        /**
+         * 校验次数是否超限
+         * @param currentCount 当前已使用次数
+         * @param maxLimit 最大允许次数
+         * @return true=未超限 / false=已超限
+         */
+        boolean checkLimit(int currentCount, int maxLimit);
+    }
+
+    // ====================== 字段 ======================
+    /**
+     * 枚举值(数据库/前端传值)
+     */
+    private final String value;
+    /**
+     * 限制次数
+     */
+    private final Integer time;
+    /**
+     * 中文描述
+     */
+    private final String label;
+    /**
+     * 限制分类:总次数/每日
+     */
+    private final LimitCategory category;
+    /**
+     * 校验策略
+     */
+    private final LimitStrategy strategy;
+
+    // ====================== 构造器 ======================
+    TaskLimitTimesEnum(String value, Integer time, String label, LimitCategory category, LimitStrategy strategy) {
+        this.value = value;
+        this.time = time;
+        this.label = label;
+        this.category = category;
+        this.strategy = strategy;
+    }
+
+    // ====================== 核心方法 ======================
+    /**
+     * 执行次数限制校验
+     * @param currentCount 当前已使用次数
+     * @return true=可以继续执行 / false=已超限
+     */
+    public boolean executeCheck(int currentCount) {
+        // 无限制直接放行
+        if (this == UNLIMITED) {
+            return true;
+        }
+        // 执行策略校验
+        return strategy.checkLimit(currentCount, this.time);
+    }
+
+    // ====================== 工具方法 ======================
+    /**
+     * 根据 value 获取枚举
+     */
+    public static TaskLimitTimesEnum getByValue(String value) {
+        if (value == null) {
+            return null;
+        }
+        return Arrays.stream(values())
+                .filter(e -> value.equals(e.value))
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 根据 value 安全获取枚举(避免空指针)
+     */
+    public static Optional<TaskLimitTimesEnum> getOptionalByValue(String value) {
+        return Arrays.stream(values())
+                .filter(e -> e.value.equals(value))
+                .findFirst();
+    }
+
+}

+ 34 - 9
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -17,10 +17,7 @@ import com.ylx.common.utils.SecurityUtils;
 import com.ylx.point.domain.*;
 import com.ylx.point.domain.dto.*;
 import com.ylx.point.domain.vo.*;
-import com.ylx.point.enums.ActivityCompletionTaskTypeEnum;
-import com.ylx.point.enums.TaskNameEnum;
-import com.ylx.point.enums.PointActivityStatusEnum;
-import com.ylx.point.enums.PointActivityTypeEnum;
+import com.ylx.point.enums.*;
 import com.ylx.point.mapper.PointActivityMapper;
 import com.ylx.point.service.*;
 import lombok.extern.slf4j.Slf4j;
@@ -267,7 +264,23 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         WxLoginUser wxLoginUser = getCurrentWxLoginUser();
         String openId = wxLoginUser.getCOpenid();
         dto.setOpenId(openId);
-        return pointActivityMapper.selectTaskWithProgress(page, dto);
+        Page<UserPointActivityVo> userPointActivityVoPage = pointActivityMapper.selectTaskWithProgress(page, dto);
+        if (ObjectUtil.isNotNull(userPointActivityVoPage) && CollectionUtil.isNotEmpty(userPointActivityVoPage.getRecords())) {
+            userPointActivityVoPage.getRecords().forEach(userPointActivityVo -> {
+                String frequencyLimitValue = userPointActivityVo.getTriggerValue();
+                // 2. 非空才走枚举匹配,为空直接设0
+                String triggerValue = "0";
+                if (StrUtil.isNotBlank(frequencyLimitValue)) {
+                    // 3. 链式调用 + 空安全,避免NPE
+                    triggerValue = Optional.ofNullable(TaskLimitTimesEnum.getByValue(frequencyLimitValue))
+                            .map(TaskLimitTimesEnum::getTime)
+                            .map(Object::toString)
+                            .orElse("0");
+                }
+                userPointActivityVo.setTriggerValue(triggerValue);
+            });
+        }
+        return userPointActivityVoPage;
     }
 
     @Override
@@ -607,7 +620,18 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         vo.setCompletedCount(completion != null ? String.valueOf(completion.getCompletedCount()) : "0");
 
         // 触发条件:直接从任务配置中获取,或者根据 taskCode 查字典
-        vo.setTriggerValue(task.getFrequencyLimitValue());
+        // 1. 获取值 + 统一判空
+        String frequencyLimitValue = task.getFrequencyLimitValue();
+        // 2. 非空才走枚举匹配,为空直接设0
+        String triggerValue = "0";
+        if (StrUtil.isNotBlank(frequencyLimitValue)) {
+            // 3. 链式调用 + 空安全,避免NPE
+            triggerValue = Optional.ofNullable(TaskLimitTimesEnum.getByValue(frequencyLimitValue))
+                    .map(TaskLimitTimesEnum::getTime)
+                    .map(Object::toString)
+                    .orElse("0");
+        }
+        vo.setTriggerValue(triggerValue);
 
         return vo;
     }
@@ -629,7 +653,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
                 (ObjectUtil.isNull(timeConfig.getStartTime()) || ObjectUtil.isNull(timeConfig.getEndTime())))) {
             throw new ServiceException("活动时间配置不能为空");
         }
-        
+
         // 检查是否为签到活动
         if (PointActivityTypeEnum.SIGN_TASK.getCode().equals(dto.getActivityType())) {
             // 检查该城市是否已存在进行中的签到活动
@@ -639,14 +663,15 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
     /**
      * 检查指定城市是否已存在进行中的签到活动
+     *
      * @param cityCode 城市代码
      */
     private void checkExistingSignInActivity(String cityCode) {
         // 构建查询条件:活动类型为签到任务,状态为进行中,城市代码匹配
         LambdaQueryWrapper<PointActivity> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(PointActivity::getActivityType, PointActivityTypeEnum.SIGN_TASK.getCode())
-                   .eq(PointActivity::getStatus, PointActivityStatusEnum.IN_PROGRESS.getCode())
-                   .eq(PointActivity::getCityCode, cityCode);
+                .eq(PointActivity::getStatus, PointActivityStatusEnum.IN_PROGRESS.getCode())
+                .eq(PointActivity::getCityCode, cityCode);
 
         // 查询是否存在符合条件的活动
         long count = this.count(queryWrapper);