code review:sign 签到逻辑

This commit is contained in:
YunaiV
2023-10-24 19:08:08 +08:00
parent c7695def5e
commit 07dbfc5546
9 changed files with 14 additions and 107 deletions

View File

@ -43,12 +43,13 @@ public interface MemberSignInRecordConvert {
AppMemberSignInRecordRespVO coverRecordToAppRecordVo(MemberSignInRecordDO memberSignInRecordDO);
default MemberSignInRecordDO convert(Long userId, MemberSignInRecordDO lastRecord, List<MemberSignInConfigDO> signInConfigs) {
// 1. 获取最大签到天数积分配置
signInConfigs.sort(Comparator.comparing(MemberSignInConfigDO::getDay));
MemberSignInConfigDO lastConfig = signInConfigs.get(signInConfigs.size() - 1); // 最大签到天数配置
default MemberSignInRecordDO convert(Long userId, MemberSignInRecordDO lastRecord, List<MemberSignInConfigDO> configs) {
// 1. 计算是第几天签到
configs.sort(Comparator.comparing(MemberSignInConfigDO::getDay));
MemberSignInConfigDO lastConfig = CollUtil.getLast(configs); // 最大签到天数配置
// 1.2. 计算今天是第几天签到
int day = 1;
// TODO @puhui999要判断是不是昨天签到的是否是昨天的判断可以抽个方法到 util 里
if (lastRecord != null) {
day = lastRecord.getDay() + 1;
}
@ -56,14 +57,12 @@ public interface MemberSignInRecordConvert {
if (day > lastConfig.getDay()) {
day = 1; // 超过最大配置的天数,重置到第一天。(也就是说开启下一轮签到)
}
// 1.4 初始化签到信息
MemberSignInRecordDO record = new MemberSignInRecordDO().setUserId(userId)
.setDay(day) // 设置签到天数
.setPoint(0) // 设置签到积分默认为 0
.setExperience(0); // 设置签到经验默认为 0
// 2. 获取签到对应的积分
MemberSignInConfigDO config = CollUtil.findOne(signInConfigs, item -> ObjUtil.equal(item.getDay(), record.getDay()));
// 2.1 初始化签到信息
MemberSignInRecordDO record = new MemberSignInRecordDO().setUserId(userId)
.setDay(day).setPoint(0).setExperience(0);
// 2.2 获取签到对应的积分
MemberSignInConfigDO config = CollUtil.findOne(configs, item -> ObjUtil.equal(item.getDay(), record.getDay()));
if (config == null) {
return record;
}

View File

@ -85,6 +85,7 @@ public class MemberSignInRecordServiceImpl implements MemberSignInRecordService
// TODO @puhui999连续签到可以基于 lastRecord 的 day 和当前时间判断呀?按 day 统计连续签到天数可能不准确
// 1. day 只是记录第几天签到的有可能不连续,比如第一次签到是周一,第二次签到是周三这样 lastRecord 的 day 为 2 但是并不是连续的两天
// 2. day 超出签到规则的最大天数会重置到从第一天开始签到(我理解为开始下一轮,类似一周签到七天七天结束下周又从周一开始签到)
// 1. 回复周三签到day 要归 1 呀。连续签到哈;
List<MemberSignInRecordDO> signInRecords = signInRecordMapper.selectListByUserId(userId);
signInRecords.sort(Comparator.comparing(MemberSignInRecordDO::getCreateTime).reversed()); // 根据签到时间倒序
summary.setContinuousDay(calculateConsecutiveDays(signInRecords));