ソースを参照

签到面板接口代码调整

wangzhijun 1 日 前
コミット
41e7347ad7

+ 50 - 38
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -377,11 +377,8 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
                 : activity.getEndTime().toInstant().atZone(zoneId).toLocalDate();
         boolean isPermanent = "1".equals(activity.getIsPermanent());
 
-        // 4. 阶梯奖励配置(按 continue_days 升序,满足“累加阶梯奖”)
-        List<PointSignReward> rewardList = pointSignRewardService.list(new LambdaQueryWrapper<PointSignReward>()
-                .eq(PointSignReward::getSignTaskId, taskId)
-                .eq(PointSignReward::getIsDeleted, 0)
-                .orderByAsc(PointSignReward::getContinueDays));
+        // 4. 阶梯奖励配置(按配置顺序累加,勿按 continue_days 数值排序)
+        List<PointSignReward> rewardList = listSignRewardsByTaskId(taskId);
 
         // 5. 用户当前连续天数(读接口不加锁)
         PointUserSignStatus status = pointUserSignStatusService.getOne(new LambdaQueryWrapper<PointUserSignStatus>()
@@ -493,14 +490,30 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         return voList;
     }
 
+    /**
+     * 按任务 ID 查询阶梯奖励,并按 sort_order / id 保持后台配置顺序。
+     * continue_days 为“本档再连续 N 天”,不能按数值升序排序(如 3 天档后接 2 天档时 2<3 会算错)。
+     */
+    private List<PointSignReward> listSignRewardsByTaskId(Long taskId) {
+        List<PointSignReward> rewardList = pointSignRewardService.list(new LambdaQueryWrapper<PointSignReward>()
+                .eq(PointSignReward::getSignTaskId, taskId)
+                .eq(PointSignReward::getIsDeleted, 0));
+        if (CollUtil.isEmpty(rewardList)) {
+            return rewardList;
+        }
+        rewardList.sort(Comparator
+                .comparing((PointSignReward r) -> r.getSortOrder() == null ? Long.MAX_VALUE : r.getSortOrder())
+                .thenComparing(r -> r.getId() == null ? Long.MAX_VALUE : r.getId()));
+        return rewardList;
+    }
+
     /**
      * 签到积分计算:基础分 + 阶梯奖励累加
      * <p>
-     * 配置口径:reward.continueDays 表示“本档位需要再连续签到 N 天”,需要做累计阈值:
-     * 例如配置 1/2/3 天,对应阈值为 1、(1+2)=3、(1+2+3)=6。
+     * rewardList 须为后台配置顺序;每档 continueDays 表示“本档再连续签到 N 天”,累计阈值为各档之和。
+     * 例如配置 3 天 +1、再 2 天 +2,阈值为 3、(3+2)=5
      * <p>
-     * 业务规则:首日仅基础分,阶梯奖励从“超过阈值的下一天”开始生效,
-     * 即连续天数满足 (continuousDays > threshold) 才加对应档位奖励。
+     * 连续满某档后的下一次签到起生效:continuousDays > threshold 时加上该档 rewardPoints。
      */
     private int calcCumulativeSignPoints(int basePoints, int continuousDays, List<PointSignReward> rewardList) {
         int total = Math.max(basePoints, 0);
@@ -576,10 +589,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
 
         // 4. 计算奖励积分(基础分 + 阶梯奖励累加)
         int basePoints = task.getBasePoints() == null ? 0 : task.getBasePoints();
-        List<PointSignReward> rewardList = pointSignRewardService.list(new LambdaQueryWrapper<PointSignReward>()
-                .eq(PointSignReward::getSignTaskId, taskId)
-                .eq(PointSignReward::getIsDeleted, 0)
-                .orderByAsc(PointSignReward::getContinueDays));
+        List<PointSignReward> rewardList = listSignRewardsByTaskId(taskId);
         int rewardPoints = calcCumulativeSignPoints(basePoints, newContinuousDays, rewardList);
 
         // 5. 写入签到流水
@@ -858,19 +868,20 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
             return;
         }
 
-        List<PointSignReward> rewards = rewardList.stream()
-                .map(dto -> {
-                    PointSignReward reward = new PointSignReward();
-                    reward.setRewardPoints(dto.getRewardPoints());
-                    reward.setContinueDays(dto.getContinueDays());
-                    reward.setCreateBy(SecurityUtils.getUsername());
-                    reward.setCreateTime(DateUtils.getNowDate());
-                    reward.setUpdateTime(reward.getCreateTime());
-                    reward.setIsDeleted(0);
-                    reward.setSignTaskId(taskId);
-                    return reward;
-                })
-                .collect(Collectors.toList());
+        List<PointSignReward> rewards = new ArrayList<>(rewardList.size());
+        for (int i = 0; i < rewardList.size(); i++) {
+            PointSignRewardDTO dto = rewardList.get(i);
+            PointSignReward reward = new PointSignReward();
+            reward.setRewardPoints(dto.getRewardPoints());
+            reward.setContinueDays(dto.getContinueDays());
+            reward.setSortOrder((long) i);
+            reward.setCreateBy(SecurityUtils.getUsername());
+            reward.setCreateTime(DateUtils.getNowDate());
+            reward.setUpdateTime(reward.getCreateTime());
+            reward.setIsDeleted(0);
+            reward.setSignTaskId(taskId);
+            rewards.add(reward);
+        }
 
         pointSignRewardService.batchInsertPointSignReward(rewards);
     }
@@ -985,18 +996,19 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
             return;
         }
 
-        List<PointSignReward> rewards = rewardList.stream()
-                .map(dto -> {
-                    PointSignReward reward = new PointSignReward();
-                    reward.setRewardPoints(dto.getRewardPoints());
-                    reward.setContinueDays(dto.getContinueDays());
-                    reward.setCreateTime(DateUtils.getNowDate());
-                    reward.setUpdateTime(reward.getCreateTime());
-                    reward.setIsDeleted(0);
-                    reward.setSignTaskId(taskId);
-                    return reward;
-                })
-                .collect(Collectors.toList());
+        List<PointSignReward> rewards = new ArrayList<>(rewardList.size());
+        for (int i = 0; i < rewardList.size(); i++) {
+            PointSignRewardDTO dto = rewardList.get(i);
+            PointSignReward reward = new PointSignReward();
+            reward.setRewardPoints(dto.getRewardPoints());
+            reward.setContinueDays(dto.getContinueDays());
+            reward.setSortOrder((long) i);
+            reward.setCreateTime(DateUtils.getNowDate());
+            reward.setUpdateTime(reward.getCreateTime());
+            reward.setIsDeleted(0);
+            reward.setSignTaskId(taskId);
+            rewards.add(reward);
+        }
 
         pointSignRewardService.batchInsertPointSignReward(rewards);
     }