接口修正、成就修正、学习记录修正
This commit is contained in:
@@ -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);
|
||||
|
||||
// 筛选支持该事件类型的成就
|
||||
|
||||
Reference in New Issue
Block a user