Bläddra i källkod

益寿缘app-优化App看课奖励累计天数逻辑

cgp 1 vecka sedan
förälder
incheckning
6156a90c84

+ 2 - 1
fs-service/src/main/java/com/fs/app/mapper/FsAppRoleMapper.java

@@ -3,6 +3,7 @@ package com.fs.app.mapper;
 import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.app.domain.FsAppRole;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * APP角色Mapper接口
@@ -74,5 +75,5 @@ public interface FsAppRoleMapper extends BaseMapper<FsAppRole>{
      * @param levelSortAsc 指定排序方式,'true'表示数字越小级别越高,'false'表示数字越大级别越高
      * @return FsAppRole 最高级别的角色信息
      */
-    FsAppRole selectHighestLevelAppRoleByUserId(Long userId, String levelSortAsc);
+    FsAppRole selectHighestLevelAppRoleByUserId(@Param("userId") Long userId, @Param("levelSortAsc") String levelSortAsc);
 }

+ 66 - 15
fs-service/src/main/java/com/fs/his/service/impl/AppUserRewardServiceImpl.java

@@ -77,8 +77,6 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
         //执行奖品领取逻辑
         RewardStrategy strategy = strategyFactory.getStrategy(reward.getActivityType(), reward.getRewardType());
         RewardResult result = strategy.process(reward);
-        //RewardResult result = new RewardResult();
-        //result.setSuccess(true);
         if (result.isSuccess()) {
             // 更新奖品状态
             rewardsMapper.updateStatus(rewardsId, 1, result.getOrderCode(), DateUtils.getNowDate());
@@ -335,39 +333,93 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
         if (defaultConfig == null) {
             return noShowWindow;
         }
+
         String activityType = ActivityTypeEnum.WATCH_COURSE.getCode();
+
+        // 1. 有效期检查
+        if (isRewardPeriodExpired(fsUser, defaultConfig)) {
+            return noShowWindow;
+        }
+
+        // 2. 累计天数超标检查
+        if (isExceedMaxDays(fsUser, defaultConfig)) {
+            return noShowWindow;
+        }
+
+        // 3. 获取今日已领数据
         List<FsUserRewards> todayRewards = rewardsMapper.selectTodayListDataByUserIdAndActivityType(fsUserId, activityType);
-        // 实物商品逻辑
+
+        // 4. 实物商品逻辑
         if (defaultConfig.getCourseRewardType() == 3) {
-            Long courseNeedDay = defaultConfig.getCourseNeedDay();// 看课商品领取所需天数
-            Integer courseDay = fsUser.getAppRewardsViewedDays();// 客户实际累计看课天数
+            Long courseNeedDay = defaultConfig.getCourseNeedDay();// 商品领取所需天数
+            Integer courseDay = fsUser.getAppRewardsViewedDays();// 用户累计看课天数
 
-            // 不满足累计天数 → 不展示
             if (courseNeedDay == null || courseNeedDay <= 0 || courseDay < courseNeedDay) {
                 return noShowWindow;
             }
-            // 今天已领过 → 不展示
             if (CollectionUtils.isNotEmpty(todayRewards)) {
                 return noShowWindow;
             }
-            // 满足条件 → 展示
             return defaultConfig;
         }
 
-        // 积分/红包逻辑
-        // 今日没有完课 → 不展示
+        // 5. 积分/红包逻辑
         Object cacheObject = redisCache.getCacheObject(watchCourseKey);
         if (cacheObject == null) {
             return noShowWindow;
         }
-        // 今天已领过 → 不展示
         if (CollectionUtils.isNotEmpty(todayRewards)) {
             return noShowWindow;
         }
-        // 满足条件 → 展示
         return defaultConfig;
     }
 
+    /**
+     * 检查奖励是否过期(首次登录时间+有效期)
+     */
+    private boolean isRewardPeriodExpired(FsUser fsUser, FsAppRole config) {
+        Date firstLoginTime = fsUser.getFirstLoginTime();// 首次登录时间
+        Long validDays = config.getCourseDay();// 有效期
+
+        if (firstLoginTime == null || validDays == null || validDays <= 0) {
+            return false;
+        }
+
+        // 计算过期日期
+        Calendar expireCal = Calendar.getInstance();
+        expireCal.setTime(firstLoginTime);
+        expireCal.add(Calendar.DAY_OF_MONTH, validDays.intValue());
+
+        // 只比较年月日
+        Date expireDate = DateUtils.truncate(expireCal.getTime(), Calendar.DAY_OF_MONTH);
+        Date today = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
+
+        boolean expired = today.after(expireDate);
+        if (expired) {
+            log.info("用户看课奖励已过期, userId: {}, expireDate: {}", fsUser.getUserId(), expireDate);
+        }
+        return expired;
+    }
+
+    /**
+     * 检查是否超过最大领取天数
+     */
+    private boolean isExceedMaxDays(FsUser fsUser, FsAppRole config) {
+        Integer viewedDays = fsUser.getAppRewardsViewedDays();// 用户累计看课天数
+        Long needDays = config.getCourseNeedDay();// 看课商品领取所需天数
+
+        if (viewedDays == null || needDays == null) {
+            return false;
+        }
+
+        boolean exceeded = viewedDays > needDays;
+        if (exceeded) {
+            log.info("用户累计看课天数已超过领取所需天数, userId: {}, viewedDays: {}, needDays: {}",
+                    fsUser.getUserId(), viewedDays, needDays);
+        }
+        return exceeded;
+    }
+
     @Override
     public void recordUserWatchCourseDays(Long fsUserId) {
         String watchCourseKey = APP_WATCH_COURSE_DAY_KEY  + fsUserId;
@@ -408,7 +460,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
 
     //根据用户id、角色id获取配置的奖品信息(实物商品包含商品名称和图片)
     private FsAppRole getAppRoleConfig(Long fsUserId){
-        //获取当前用户最高权重角色, "false"表示查询等级数字最的权重角色
+        //获取当前用户最高权重角色, "false"表示查询等级数字最的权重角色
         FsAppRole fsAppRole = appRoleMapper.selectHighestLevelAppRoleByUserId(fsUserId,"false");
         if (fsAppRole==null){
             log.info("未找到用户:{}对应的角色配置", fsUserId);
@@ -486,8 +538,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
         // 2. 获取用户的角色配置,以确定有效期
         FsAppRole fsAppRole = appRoleMapper.selectHighestLevelAppRoleByUserId(reward.getFsUserId(), "false");
         if (fsAppRole == null) {
-            // 如果找不到角色配置,可以视为永不过期,返回一个很大的数,或者返回null
-            // 这里假设没有配置就不过期
+            // 如果找不到角色配置,可以视为永不过期,返回null
             return null;
         }
 

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/controller/AppUserRewardController.java

@@ -161,10 +161,10 @@ public class AppUserRewardController  extends AppBaseController{
     }
 
     /**
-     * 查询活动类型
+     * 记录用户累计有效看课标识
      */
     @Login
-    @ApiOperation("查询活动类型")
+    @ApiOperation("记录用户累计有效看课标识")
     @GetMapping("/recordUserWatchCourseDays")
     public R recordUserWatchCourseDays() {
         String loginUserId = getUserId();