接口修正、成就修正、学习记录修正

This commit is contained in:
2025-11-03 17:12:40 +08:00
parent 35aee59178
commit b95fff224b
28 changed files with 730 additions and 302 deletions

View File

@@ -11,6 +11,7 @@ import org.xyzh.achievement.mapper.AchievementMapper;
import org.xyzh.achievement.mapper.UserAchievementMapper;
import org.xyzh.achievement.mapper.UserAchievementProgressMapper;
import org.xyzh.api.achievement.AchievementService;
import org.xyzh.common.core.domain.LoginDomain;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.enums.AchievementEventType;
import org.xyzh.common.core.event.AchievementEvent;
@@ -20,6 +21,7 @@ import org.xyzh.common.dto.user.TbSysUser;
import org.xyzh.common.dto.usercenter.TbAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievement;
import org.xyzh.common.dto.usercenter.TbUserAchievementProgress;
import org.xyzh.common.redis.service.RedisService;
import org.xyzh.common.utils.IDUtils;
import org.xyzh.common.vo.AchievementVO;
import org.xyzh.system.utils.LoginUtil;
@@ -41,6 +43,7 @@ import java.util.stream.Collectors;
public class ACHAchievementServiceImpl implements AchievementService {
private static final Logger logger = LoggerFactory.getLogger(ACHAchievementServiceImpl.class);
private static final String REDIS_LOGIN_PREFIX = "login:token:";
@Autowired
private AchievementMapper achievementMapper;
@@ -56,6 +59,9 @@ public class ACHAchievementServiceImpl implements AchievementService {
@Autowired
private ResourcePermissionService resourcePermissionService;
@Autowired
private RedisService redisService;
// ==================== 成就定义管理 ====================
@@ -510,7 +516,8 @@ public class ACHAchievementServiceImpl implements AchievementService {
logger.debug("处理成就事件: {}", event);
// 获取该事件类型相关的所有成就
List<TbAchievement> achievements = getAchievementsByEventType(event.getEventType());
// 传入 userID在异步线程中根据 userID 查询用户部门角色
List<TbAchievement> achievements = getAchievementsByEventType(event.getEventType(), event.getUserID());
if (achievements.isEmpty()) {
resultDomain.success("无相关成就", newAchievements);
return resultDomain;
@@ -763,12 +770,38 @@ public class ACHAchievementServiceImpl implements AchievementService {
/**
* 根据事件类型获取相关成就
* @param eventType 事件类型
* @param userID 用户ID用于在异步线程中从Redis获取用户登录信息
*/
private List<TbAchievement> getAchievementsByEventType(AchievementEventType eventType) {
private List<TbAchievement> getAchievementsByEventType(AchievementEventType eventType, String userID) {
// 获取所有成就
TbAchievement filter = new TbAchievement();
filter.setDeleted(false);
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
// 【关键优化】在异步线程中从Redis缓存获取用户的LoginDomain
// 避免数据库查询,性能更好
List<UserDeptRoleVO> userDeptRoles = new ArrayList<>();
if (StringUtils.hasText(userID)) {
try {
// 从Redis获取用户登录信息
String redisKey = REDIS_LOGIN_PREFIX + userID;
LoginDomain loginDomain = (LoginDomain) redisService.get(redisKey);
if (loginDomain != null && loginDomain.getRoles() != null) {
userDeptRoles = loginDomain.getRoles();
logger.debug("从Redis缓存获取用户部门角色成功userID: {}, 角色数: {}",
userID, userDeptRoles.size());
} else {
logger.warn("Redis缓存中未找到用户登录信息或角色为空userID: {}", userID);
}
} catch (Exception e) {
logger.error("从Redis获取用户部门角色异常userID: {}", userID, e);
}
} else {
logger.warn("userID为空无法获取用户部门角色");
}
List<TbAchievement> allAchievements = achievementMapper.selectAchievements(filter, userDeptRoles);
// 筛选支持该事件类型的成就