新增用户每日活跃记录功能-捕获异常

This commit is contained in:
tianfeng 2026-03-16 19:06:20 +08:00
parent b84935509d
commit 24a5a185e9

View File

@ -10,6 +10,7 @@ import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
@ -20,6 +21,7 @@ import org.springframework.stereotype.Service;
/**
* 用户每日活跃日志服务.
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class UserDailyActiveServiceImpl implements UserDailyActiveService {
@ -29,38 +31,42 @@ public class UserDailyActiveServiceImpl implements UserDailyActiveService {
@Override
public void record(Long userId, String sysOrigin, String registerCountryCode, String language) {
ZonedDateTime now = ZonedDateTimeUtils.nowAsiaShanghai();
String activeDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Timestamp nowTs = Timestamp.from(now.toInstant());
try {
ZonedDateTime now = ZonedDateTimeUtils.nowAsiaShanghai();
String activeDate = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Timestamp nowTs = Timestamp.from(now.toInstant());
String redisKey = UserDailyActiveKey.ACTIVE_FLAG.getKey(userId, activeDate);
boolean isFirst = Boolean.TRUE.equals(
stringRedisTemplate.opsForValue().setIfAbsent(redisKey, "1", 2, TimeUnit.DAYS)
);
if (isFirst) {
UserDailyActiveLog log = new UserDailyActiveLog()
.setId(IdWorkerUtils.getId())
.setUserId(userId)
.setActiveDate(activeDate)
.setSysOrigin(sysOrigin)
.setRegisterCountryCode(registerCountryCode)
.setLanguage(language)
.setActiveCount(1)
.setFirstActiveTime(nowTs)
.setLastActiveTime(nowTs)
.setCreateTime(nowTs)
.setUpdateTime(nowTs);
mongoTemplate.insert(log);
} else {
mongoTemplate.updateFirst(
Query.query(Criteria.where("userId").is(userId).and("activeDate").is(activeDate)),
new Update()
.inc("activeCount", 1)
.set("lastActiveTime", nowTs)
.set("updateTime", nowTs),
UserDailyActiveLog.class
String redisKey = UserDailyActiveKey.ACTIVE_FLAG.getKey(userId, activeDate);
boolean isFirst = Boolean.TRUE.equals(
stringRedisTemplate.opsForValue().setIfAbsent(redisKey, "1", 2, TimeUnit.DAYS)
);
if (isFirst) {
UserDailyActiveLog log = new UserDailyActiveLog()
.setId(IdWorkerUtils.getId())
.setUserId(userId)
.setActiveDate(activeDate)
.setSysOrigin(sysOrigin)
.setRegisterCountryCode(registerCountryCode)
.setLanguage(language)
.setActiveCount(1)
.setFirstActiveTime(nowTs)
.setLastActiveTime(nowTs)
.setCreateTime(nowTs)
.setUpdateTime(nowTs);
mongoTemplate.insert(log);
} else {
mongoTemplate.updateFirst(
Query.query(Criteria.where("userId").is(userId).and("activeDate").is(activeDate)),
new Update()
.inc("activeCount", 1)
.set("lastActiveTime", nowTs)
.set("updateTime", nowTs),
UserDailyActiveLog.class
);
}
} catch (Exception e) {
log.warn("[用户每日活跃] 记录失败 userId={}", userId, e);
}
}