New file |
| | |
| | | package com.ruoyi.account.util; |
| | | |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import com.ruoyi.account.api.model.TAppUserSign; |
| | | import com.ruoyi.account.service.TAppUserSignService; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDate; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | @Component |
| | | public class SignDayUtil { |
| | | |
| | | // 假设这是你的 signService 接口或者实现类 |
| | | @Resource |
| | | private TAppUserSignService signService; |
| | | |
| | | /** |
| | | * 计算用户的最近连续签到天数 |
| | | * @param userId 用户ID |
| | | * @return 连续签到的最大天数 |
| | | */ |
| | | public int calculateContinuousSignDays(Long userId) { |
| | | DateTime startOfMonth = DateUtil.beginOfMonth(new Date()); |
| | | DateTime endOfMonth = DateUtil.endOfMonth(new Date()); |
| | | // 获取用户的所有签到记录 |
| | | List<TAppUserSign> signRecords = signService.lambdaQuery() |
| | | .between(TAppUserSign::getSignDay, startOfMonth, endOfMonth) |
| | | .eq(TAppUserSign::getAppUserId, userId) |
| | | .orderByDesc(TAppUserSign::getSignDay) |
| | | .list(); |
| | | |
| | | // 如果没有签到记录,则返回0 |
| | | if (signRecords.isEmpty()) { |
| | | return 0; |
| | | } |
| | | |
| | | // 将签到日期转换为 LocalDate 列表,并按照日期排序 |
| | | List<LocalDate> signDays = signRecords.stream() |
| | | .map(TAppUserSign::getSignDay) |
| | | .sorted() |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 计算连续签到的最大天数 |
| | | return calculateMaxContinuousSignDays(signDays); |
| | | } |
| | | |
| | | /** |
| | | * 根据签到日期列表计算连续签到的最大天数 |
| | | * @param signDays 签到日期列表 |
| | | * @return 最大连续签到天数 |
| | | */ |
| | | private int calculateMaxContinuousSignDays(List<LocalDate> signDays) { |
| | | int maxContinuousDays = 0; |
| | | int currentContinuousDays = 0; |
| | | LocalDate lastSignDay = null; |
| | | |
| | | for (LocalDate signDay : signDays) { |
| | | if (lastSignDay != null && signDay.equals(lastSignDay.plusDays(1))) { |
| | | currentContinuousDays++; |
| | | } else { |
| | | maxContinuousDays = Math.max(maxContinuousDays, currentContinuousDays); |
| | | currentContinuousDays = 1; |
| | | } |
| | | lastSignDay = signDay; |
| | | } |
| | | |
| | | // 更新最后的连续天数 |
| | | maxContinuousDays = Math.max(maxContinuousDays, currentContinuousDays); |
| | | |
| | | return maxContinuousDays; |
| | | } |
| | | } |