Ver código fonte

fix(game): 修复成绩排名和积分计算中的空值处理问题

- 在数据库查询条件中添加score_rank非空且大于0的过滤条件
- 将成绩为0或负数时的排名和积分设置从0改为null
- 修改数据类型从int改为Integer以支持空值处理
- 更新buildUpdateScore方法参数类型以匹配新的空值逻辑
zhou 2 semanas atrás
pai
commit
5eecec1af4

+ 11 - 11
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameScoreServiceImpl.java

@@ -749,14 +749,14 @@ public class GameScoreServiceImpl implements IGameScoreService {
                     currentRank = i + 1;
                 }
                 
-                int points = (currentRank <= pointConfig.size()) ? pointConfig.get(currentRank - 1) : 0;
-                int finalRank = currentRank;
-                
-                // 成绩为0的处理:积分和名次均设为0
+                Integer points = (currentRank <= pointConfig.size()) ? pointConfig.get(currentRank - 1) : 0;
+                Integer finalRank = currentRank;
+
+                // 成绩为0的处理:积分和名次均设为
                 BigDecimal perf = current.getIndividualPerformance();
                 if (perf == null || perf.compareTo(BigDecimal.ZERO) <= 0) {
-                    points = 0;
-                    finalRank = 0;
+                    points = null;
+                    finalRank = null;
                 }
 
                 updateList.add(buildUpdateScore(current.getScoreId(), finalRank, points));
@@ -790,15 +790,15 @@ public class GameScoreServiceImpl implements IGameScoreService {
                 }
 
                 // 团体积分通常有加成(此处可根据需求调整,默认取配置)
-                int points = (currentRank <= pointConfig.size()) ? pointConfig.get(currentRank - 1) : 0;
-                int finalRank = currentRank;
+                Integer points = (currentRank <= pointConfig.size()) ? pointConfig.get(currentRank - 1) : 0;
+                Integer finalRank = currentRank;
 
                 // 成绩为0的处理
                 GameScoreVo representative = teamGroups.get(teamId).get(0);
                 BigDecimal teamPerf = representative.getTeamPerformance();
                 if (teamPerf == null || teamPerf.compareTo(BigDecimal.ZERO) <= 0) {
-                    points = 0;
-                    finalRank = 0;
+                    points = null;
+                    finalRank = null;
                 }
 
                 // 将该队的名次和积分应用给该项目下该队的所有人
@@ -816,7 +816,7 @@ public class GameScoreServiceImpl implements IGameScoreService {
         return true;
     }
 
-    private GameScore buildUpdateScore(Long scoreId, int rank, int points) {
+    private GameScore buildUpdateScore(Long scoreId, Integer rank, Integer points) {
         GameScore update = new GameScore();
         update.setScoreId(scoreId);
         update.setScoreRank(rank);

+ 2 - 1
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/GameScoreMapper.xml

@@ -129,6 +129,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 WHERE s.event_id = #{eventId}
                   AND s.project_id = #{projectId}
                   AND s.del_flag = '0'
+                  AND s.score_rank IS NOT NULL AND s.score_rank > 0
                   <if test="rgId != null">
                     AND (rg.rg_id = #{rgId} OR FIND_IN_SET(#{rgId}, rg.ancestors))
                   </if>
@@ -151,7 +152,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 ) s
                 LEFT JOIN game_team t ON s.team_id = t.team_id
                 LEFT JOIN game_rank_group rg ON t.rg_id = rg.rg_id
-                WHERE 1=1
+                WHERE s.score_rank IS NOT NULL AND s.score_rank > 0
                   <if test="rgId != null">
                     AND (rg.rg_id = #{rgId} OR FIND_IN_SET(#{rgId}, rg.ancestors))
                   </if>