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 currentContinuousDays;
|
}
|
}
|