|
@@ -377,11 +377,8 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
: activity.getEndTime().toInstant().atZone(zoneId).toLocalDate();
|
|
: activity.getEndTime().toInstant().atZone(zoneId).toLocalDate();
|
|
|
boolean isPermanent = "1".equals(activity.getIsPermanent());
|
|
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. 用户当前连续天数(读接口不加锁)
|
|
// 5. 用户当前连续天数(读接口不加锁)
|
|
|
PointUserSignStatus status = pointUserSignStatusService.getOne(new LambdaQueryWrapper<PointUserSignStatus>()
|
|
PointUserSignStatus status = pointUserSignStatusService.getOne(new LambdaQueryWrapper<PointUserSignStatus>()
|
|
@@ -493,14 +490,30 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
return voList;
|
|
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>
|
|
* <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>
|
|
* <p>
|
|
|
- * 业务规则:首日仅基础分,阶梯奖励从“超过阈值的下一天”开始生效,
|
|
|
|
|
- * 即连续天数满足 (continuousDays > threshold) 才加对应档位奖励。
|
|
|
|
|
|
|
+ * 连续满某档后的下一次签到起生效:continuousDays > threshold 时加上该档 rewardPoints。
|
|
|
*/
|
|
*/
|
|
|
private int calcCumulativeSignPoints(int basePoints, int continuousDays, List<PointSignReward> rewardList) {
|
|
private int calcCumulativeSignPoints(int basePoints, int continuousDays, List<PointSignReward> rewardList) {
|
|
|
int total = Math.max(basePoints, 0);
|
|
int total = Math.max(basePoints, 0);
|
|
@@ -576,10 +589,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
|
|
|
|
|
// 4. 计算奖励积分(基础分 + 阶梯奖励累加)
|
|
// 4. 计算奖励积分(基础分 + 阶梯奖励累加)
|
|
|
int basePoints = task.getBasePoints() == null ? 0 : task.getBasePoints();
|
|
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);
|
|
int rewardPoints = calcCumulativeSignPoints(basePoints, newContinuousDays, rewardList);
|
|
|
|
|
|
|
|
// 5. 写入签到流水
|
|
// 5. 写入签到流水
|
|
@@ -858,19 +868,20 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
return;
|
|
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);
|
|
pointSignRewardService.batchInsertPointSignReward(rewards);
|
|
|
}
|
|
}
|
|
@@ -985,18 +996,19 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
|
|
|
return;
|
|
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);
|
|
pointSignRewardService.batchInsertPointSignReward(rewards);
|
|
|
}
|
|
}
|