修正消息中心不显示

This commit is contained in:
2025-11-22 16:01:36 +08:00
parent f3a9926caf
commit 12592c5a24
15 changed files with 331 additions and 380 deletions

View File

@@ -18,6 +18,7 @@ import org.xyzh.common.core.event.AchievementEvent;
import org.xyzh.common.core.page.PageDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.dto.user.TbSysUser;
import org.xyzh.common.dto.user.TbSysUserInfo;
import org.xyzh.common.dto.usercenter.TbAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievementProgress;
@@ -26,6 +27,7 @@ import org.xyzh.common.utils.IDUtils;
import org.xyzh.common.vo.AchievementVO;
import org.xyzh.system.utils.LoginUtil;
import org.xyzh.api.system.permission.ResourcePermissionService;
import org.xyzh.system.mapper.UserInfoMapper;
import org.xyzh.common.vo.UserDeptRoleVO;
import org.xyzh.common.core.enums.ResourceType;
@@ -62,6 +64,9 @@ public class ACHAchievementServiceImpl implements AchievementService {
@Autowired
private RedisService redisService;
@Autowired
private UserInfoMapper userInfoMapper;
// ==================== 成就定义管理 ====================
@@ -551,7 +556,7 @@ public class ACHAchievementServiceImpl implements AchievementService {
// 检查是否达成
if (checker.check(event, achievement, currentProgress)) {
TbUserAchievement userAchievement = grantAchievementInternal(event.getUserID(), achievement.getAchievementID());
TbUserAchievement userAchievement = grantAchievementInternal(event.getUserID(), achievement);
if (userAchievement != null) {
newAchievements.add(userAchievement);
logger.info("用户 {} 通过事件 {} 获得成就: {}", event.getUserID(), event.getEventType(), achievement.getName());
@@ -748,17 +753,21 @@ public class ACHAchievementServiceImpl implements AchievementService {
/**
* 内部授予成就方法(不检查是否已获得)
*/
private TbUserAchievement grantAchievementInternal(String userID, String achievementID) {
private TbUserAchievement grantAchievementInternal(String userID, TbAchievement achievement) {
try {
TbUserAchievement userAchievement = new TbUserAchievement();
userAchievement.setID(IDUtils.generateID());
userAchievement.setUserID(userID);
userAchievement.setAchievementID(achievementID);
userAchievement.setAchievementID(achievement.getAchievementID());
userAchievement.setObtainTime(new Date());
int result = userAchievementMapper.insertUserAchievement(userAchievement);
if (result > 0) {
updateProgressToCompleted(userID, achievementID);
updateProgressToCompleted(userID, achievement.getAchievementID());
// 检查是否需要更新用户等级learning_time开头的成就
updateUserLevelIfNeeded(userID, achievement);
return userAchievement;
}
return null;
@@ -824,5 +833,56 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
return null;
}
/**
* 检查并更新用户等级仅针对learning_time开头的成就
* @param userID 用户ID
* @param achievement 成就对象
*/
private void updateUserLevelIfNeeded(String userID, TbAchievement achievement) {
try {
// 检查成就ID是否以learning_time开头
if (achievement == null || achievement.getAchievementID() == null ||
!achievement.getAchievementID().startsWith("learning_time")) {
return;
}
// 检查成就是否有等级信息
if (achievement.getLevel() == null) {
logger.warn("成就没有等级信息: {}", achievement.getAchievementID());
return;
}
// 获取用户当前信息
TbSysUserInfo userInfo = userInfoMapper.selectById(userID);
if (userInfo == null) {
logger.warn("用户信息不存在: {}", userID);
return;
}
// 检查是否需要更新等级(只有当成就等级高于当前用户等级时才更新)
Integer currentLevel = userInfo.getLevel() != null ? userInfo.getLevel() : 0;
Integer achievementLevel = achievement.getLevel();
if (achievementLevel > currentLevel) {
userInfo.setLevel(achievementLevel);
int updateResult = userInfoMapper.updateUserInfo(userInfo);
if (updateResult > 0) {
logger.info("用户 {} 通过成就 {} 等级从 {} 提升到 {}",
userID, achievement.getAchievementID(), currentLevel, achievementLevel);
} else {
logger.error("更新用户等级失败: userID={}, achievementID={}", userID, achievement.getAchievementID());
}
} else {
logger.debug("用户 {} 当前等级 {} 已达到或超过成就等级 {},无需更新",
userID, currentLevel, achievementLevel);
}
} catch (Exception e) {
logger.error("更新用户等级时发生异常: userID={}, achievementID={}, error={}",
userID, achievement.getAchievementID(), e.getMessage(), e);
}
}
}