成就
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户是否已获得成就
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user