This commit is contained in:
2025-11-25 18:57:39 +08:00
parent b5d4f0f6ba
commit 780ed31a1d
9 changed files with 247 additions and 113 deletions

View File

@@ -101,6 +101,22 @@ public class AchievementController {
return achievementService.getMyAchievementsWithProgress(type);
}
/**
* 获取当前用户的等级成就状态(当前等级 + 下一等级)
*/
@GetMapping("/my/level-status")
public ResultDomain<Map<String, Object>> getMyLevelStatus() {
return achievementService.getMyLevelStatus();
}
/**
* 获取当前用户“已获得”的成就(不含未获得,支持按类型筛选)
*/
@GetMapping("/my/obtained")
public ResultDomain<TbUserAchievement> getMyObtainedAchievements(@RequestParam(required = false, value = "type") Integer type) {
return achievementService.getMyAchievements(type);
}
/**
* 检查用户是否已获得成就
*/

View File

@@ -274,6 +274,86 @@ public class ACHAchievementServiceImpl implements AchievementService {
// ==================== 用户成就管理 ====================
@Override
public ResultDomain<Map<String, Object>> getMyLevelStatus() {
ResultDomain<Map<String, Object>> rd = new ResultDomain<>();
try {
// 获取当前登录用户
TbSysUser user = LoginUtil.getCurrentUser();
if (user == null) {
rd.fail("请先登录");
return rd;
}
String userID = user.getID();
// 仅查询等级类成就
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<AchievementVO> levels = achievementMapper.selectUserAchievementsWithProgress(
userID,
2,
userDeptRoles
);
if (levels == null || levels.isEmpty()) {
Map<String, Object> payload = new HashMap<>();
payload.put("current", null);
payload.put("next", null);
rd.success("无等级成就", payload);
return rd;
}
// 调试日志:查看查询到的等级成就数量和详情
logger.info("查询到等级成就数量: {}", levels.size());
for (AchievementVO vo : levels) {
logger.info("等级成就: id={}, name={}, level={}, obtained={}",
vo.getAchievementID(), vo.getName(), vo.getLevel(), vo.getObtained());
}
// Float 等级排序器
Comparator<AchievementVO> byLevelAsc = Comparator.comparing(
AchievementVO::getLevel,
Comparator.nullsFirst(Comparator.naturalOrder())
);
// 当前:已获得的最高等级,否则取最低等级
List<AchievementVO> obtained = levels.stream()
.filter(a -> Boolean.TRUE.equals(a.getObtained()))
.sorted(byLevelAsc.reversed())
.collect(Collectors.toList());
AchievementVO current;
if (!obtained.isEmpty()) {
current = obtained.get(0);
} else {
current = levels.stream()
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
}
// 下一等级:比当前等级大的最小等级
AchievementVO next = null;
if (current != null && current.getLevel() != null) {
float curLevel = current.getLevel();
next = levels.stream()
.filter(a -> (a.getLevel() != null) && a.getLevel() > curLevel)
.sorted(byLevelAsc)
.findFirst()
.orElse(null);
}
Map<String, Object> payload = new HashMap<>();
payload.put("current", current);
payload.put("next", next);
rd.success("获取等级状态成功", payload);
return rd;
} catch (Exception e) {
logger.error("获取等级状态异常: {}", e.getMessage(), e);
rd.fail("获取等级状态失败: " + e.getMessage());
return rd;
}
}
@Override
public ResultDomain<TbUserAchievement> getUserAchievements(String userID, Integer type) {
ResultDomain<TbUserAchievement> resultDomain = new ResultDomain<>();
@@ -283,14 +363,23 @@ public class ACHAchievementServiceImpl implements AchievementService {
return resultDomain;
}
List<TbUserAchievement> list;
if (type != null) {
list = userAchievementMapper.selectByUserIdAndType(userID, type);
} else {
list = userAchievementMapper.selectByUserId(userID);
// 通过联表查询(带权限与进度信息),只取“已获得”的记录
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
List<AchievementVO> voList = achievementMapper.selectUserAchievementsWithProgress(userID, type, userDeptRoles);
List<TbUserAchievement> obtainedList = new ArrayList<>();
for (AchievementVO vo : voList) {
if (Boolean.TRUE.equals(vo.getObtained())) {
TbUserAchievement ua = new TbUserAchievement();
ua.setID(vo.getUserAchievementID());
ua.setUserID(userID);
ua.setAchievementID(vo.getAchievementID());
ua.setObtainTime(vo.getObtainTime());
obtainedList.add(ua);
}
}
resultDomain.success("获取用户成就成功", list);
resultDomain.success("获取用户成就成功", obtainedList);
return resultDomain;
} catch (Exception e) {
logger.error("获取用户成就异常: {}", e.getMessage(), e);
@@ -861,8 +950,8 @@ public class ACHAchievementServiceImpl implements AchievementService {
}
// 检查是否需要更新等级(只有当成就等级高于当前用户等级时才更新)
Integer currentLevel = userInfo.getLevel() != null ? userInfo.getLevel() : 0;
Integer achievementLevel = achievement.getLevel();
Float currentLevel = userInfo.getLevel() != null ? userInfo.getLevel() : 0;
Float achievementLevel = achievement.getLevel();
if (achievementLevel > currentLevel) {
userInfo.setLevel(achievementLevel);

View File

@@ -363,7 +363,7 @@
<!-- 联表查询用户成就列表(包含进度信息)- 带权限过滤 -->
<select id="selectUserAchievementsWithProgress" resultMap="AchievementVOResultMap">
SELECT
SELECT DISTINCT
a.id,
a.achievement_id,
a.name,
@@ -398,6 +398,7 @@
<if test="type != null">
AND a.type = #{type}
</if>
ORDER BY a.order_num ASC, a.create_time DESC
</select>

View File

@@ -91,6 +91,12 @@ public interface AchievementService {
* @return ResultDomain<AchievementVO> 成就视图对象列表
*/
ResultDomain<AchievementVO> getMyAchievementsWithProgress(Integer type);
/**
* @description 获取当前用户的等级成就状态(包含“当前等级成就”和“下一等级成就”)
* @return ResultDomain<Map<String, Object>> { current: AchievementVO|null, next: AchievementVO|null }
*/
ResultDomain<Map<String, Object>> getMyLevelStatus();
/**
* @description 检查用户是否已获得成就