Przeglądaj źródła

fix(game): 解决运动员删除时成绩数据未清理的问题

- 在删除运动员时添加了对相关成绩数据的删除操作
- 为删除方法添加事务注解确保数据一致性
- 将移除运动员队伍关联的方法改为公共方法并添加事务注解
- 在GameScoreMapper中新增根据运动员ID删除成绩的方法
- 修改成绩排序逻辑,使用BigDecimal进行精确比较
- 注释掉原有的按积分排序代码,统一使用成绩排序逻辑
zhou 3 miesięcy temu
rodzic
commit
89b1e3a0b3

+ 4 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/GameScoreMapper.java

@@ -8,6 +8,7 @@ import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -47,4 +48,7 @@ public interface GameScoreMapper extends BaseMapperPlus<GameScore, GameScoreVo>
     // 查询运动员在指定项目中的成绩
     List<GameScore> selectByAthleteAndProjects(@Param("athleteId") Long athleteId,
                                                @Param("projectIds") List<Long> projectIds);
+
+    // 根据运动员ID删除运动员成绩
+    int deleteByAthleteIds(@Param("athleteIds") Collection<Long> athleteIds);
 }

+ 6 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameAthleteServiceImpl.java

@@ -35,6 +35,7 @@ import org.dromara.system.service.IGameEventService;
 import org.dromara.system.service.IGameTeamService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -570,12 +571,15 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
      * @return 是否删除成功
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         //批量删除前,删除队伍中的关联数据
         removeAthleteFromTeams(ids);
+        //批量删除前,删除运动员的相关成绩
+        gameScoreMapper.deleteByAthleteIds(ids);
         return baseMapper.deleteByIds(ids) > 0;
     }
 
@@ -584,7 +588,8 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
      *
      * @param athleteIds 要移除的项目ID列表
      */
-    private void removeAthleteFromTeams(Collection<Long> athleteIds) {
+    @Transactional(rollbackFor = Exception.class)
+    public void removeAthleteFromTeams(Collection<Long> athleteIds) {
         try {
             if (CollectionUtils.isEmpty(athleteIds)) {
                 return;

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

@@ -724,31 +724,31 @@ public class GameScoreServiceImpl implements IGameScoreService {
         }
 
         // 然后按积分重新排序确定排名
-        List<GameScoreVo> scoresWithPoints = queryList(new GameScoreBo() {{
-            setEventId(eventId);
-            setProjectId(projectId);
-        }});
+//        List<GameScoreVo> scoresWithPoints = queryList(new GameScoreBo() {{
+//            setEventId(eventId);
+//            setProjectId(projectId);
+//        }});
 
         // 按积分排序(降序,积分越高排名越靠前)
-        List<GameScoreVo> sortedByPoints = scoresWithPoints.stream()
-            .sorted((a, b) -> {
-                Integer aPoints = a.getScorePoint() != null ? a.getScorePoint() : 0;
-                Integer bPoints = b.getScorePoint() != null ? b.getScorePoint() : 0;
-                return Integer.compare(bPoints, aPoints);
-            })
-            .toList();
+//        List<GameScoreVo> sortedByPoints = scoresWithPoints.stream()
+//            .sorted((a, b) -> {
+//                Integer aPoints = a.getScorePoint() != null ? a.getScorePoint() : 0;
+//                Integer bPoints = b.getScorePoint() != null ? b.getScorePoint() : 0;
+//                return Integer.compare(bPoints, aPoints);
+//            })
+//            .toList();
 
         // 更新排名(支持并列排名)
         int currentRank = 1;
-        for (int i = 0; i < sortedByPoints.size(); i++) {
-            GameScoreVo score = sortedByPoints.get(i);
-            int currentPoints = score.getScorePoint() != null ? score.getScorePoint() : 0;
+        for (int i = 0; i < sortedScores.size(); i++) {
+            GameScoreVo score = sortedScores.get(i);
+            BigDecimal currentPoints = score.getIndividualPerformance() != null ? score.getIndividualPerformance() : BigDecimal.ZERO;
 
-            // 如果不是第一个,检查是否与前一个积分相同
+            // 如果不是第一个,检查是否与前一个成绩相同
             if (i > 0) {
-                int previousPoints = sortedByPoints.get(i - 1).getScorePoint() != null ?
-                    sortedByPoints.get(i - 1).getScorePoint() : 0;
-                if (currentPoints != previousPoints) {
+                BigDecimal previousPoints = sortedScores.get(i - 1).getIndividualPerformance() != null ?
+                    sortedScores.get(i - 1).getIndividualPerformance() : BigDecimal.ZERO;
+                if (!currentPoints.equals(previousPoints)) {
                     currentRank = i + 1;
                 }
             }

+ 7 - 0
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/GameScoreMapper.xml

@@ -41,4 +41,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           </if>
         AND del_flag = '0'
     </select>
+
+    <select id="deleteByAthleteIds" resultType="int">
+        DELETE FROM game_score WHERE athlete_id IN
+        <foreach item="athleteId" collection="athleteIds" separator="," open="(" close=")">
+            #{athleteId}
+        </foreach>
+    </select>
 </mapper>