From 93eb6b470773bc49ea6e1a9d4cbd914eb95d525b Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期二, 30 九月 2025 17:38:04 +0800
Subject: [PATCH] feat: 完善比赛晋级功能并清理测试文件

---
 backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java |  190 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 170 insertions(+), 20 deletions(-)

diff --git a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java
index 00413de..5f56ef0 100644
--- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java
+++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java
@@ -1,20 +1,27 @@
 package com.rongyichuang.player.service;
 
 import com.rongyichuang.player.dto.response.*;
+import com.rongyichuang.player.dto.response.RegionInfoResponse;
 import com.rongyichuang.rating.dto.response.RatingItemResponse;
 import com.rongyichuang.rating.entity.RatingScheme;
 import com.rongyichuang.rating.repository.RatingSchemeRepository;
 import com.rongyichuang.common.entity.Media;
 import com.rongyichuang.common.enums.MediaTargetType;
 import com.rongyichuang.common.repository.MediaRepository;
+import com.rongyichuang.common.dto.response.MediaResponse;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -30,6 +37,9 @@
 
     private final MediaRepository mediaRepository;
     private final RatingSchemeRepository ratingSchemeRepository;
+    
+    @Value("${app.media-url}")
+    private String mediaBaseUrl;
 
     public ActivityPlayerDetailService(MediaRepository mediaRepository, 
                                      RatingSchemeRepository ratingSchemeRepository) {
@@ -45,50 +55,143 @@
     public ActivityPlayerDetailResponse getDetailForRating(Long activityPlayerId) {
         log.info("鑾峰彇鎶ュ悕璇︽儏鐢ㄤ簬璇勫垎锛宎ctivityPlayerId: {}", activityPlayerId);
 
-        // 鏌ヨ鍩烘湰淇℃伅
+        // 鏌ヨ鍩烘湰淇℃伅锛屽寘鍚尯鍩熶俊鎭�
         String sql = """
-            SELECT ap.id, ap.description, ap.activity_id,
+            SELECT ap.id as ap_id, ap.description as ap_description, ap.activity_id, ap.region_id,
+                   ap.project_name, ap.feedback, ap.state as ap_state,
                    p.id as player_id, p.name as player_name, p.phone, p.description as player_desc,
-                   a.name as activity_name, a.rating_scheme_id
+                   p.gender, u.birthday, p.education, p.introduction, u.id as user_id,
+                   a.name as activity_name, a.rating_scheme_id,
+                   r.id as region_id, r.name as region_name, r.full_path as region_path
             FROM t_activity_player ap
             JOIN t_player p ON p.id = ap.player_id
+            JOIN t_user u ON u.id = p.user_id
             JOIN t_activity a ON a.id = ap.activity_id
+            LEFT JOIN t_region r ON r.id = ap.region_id
             WHERE ap.id = ?
             """;
 
         @SuppressWarnings("unchecked")
-        List<Object[]> results = em.createNativeQuery(sql)
-                .setParameter(1, activityPlayerId)
-                .getResultList();
+        Query query = em.createNativeQuery(sql);
+        query.setParameter(1, activityPlayerId);
+        
+        // 浣跨敤 Tuple 鏉ヨ幏鍙栧懡鍚嶅瓧娈�
+        query.unwrap(org.hibernate.query.NativeQuery.class).setTupleTransformer(
+            (tuple, aliases) -> {
+                Map<String, Object> result = new HashMap<>();
+                for (int i = 0; i < aliases.length; i++) {
+                    result.put(aliases[i], tuple[i]);
+                }
+                return result;
+            }
+        );
+        
+        @SuppressWarnings("unchecked")
+        List<Map<String, Object>> results = query.getResultList();
 
         if (results.isEmpty()) {
             log.warn("鏈壘鍒版姤鍚嶈褰曪紝activityPlayerId: {}", activityPlayerId);
             return null;
         }
 
-        Object[] row = results.get(0);
+        Map<String, Object> row = results.get(0);
         ActivityPlayerDetailResponse response = new ActivityPlayerDetailResponse();
         response.setId(activityPlayerId);
-        response.setDescription(row[1] != null ? row[1].toString() : "");
-        response.setActivityName(row[7] != null ? row[7].toString() : "");
+        response.setDescription(row.get("ap_description") != null ? row.get("ap_description").toString() : "");
+        response.setProjectName(row.get("project_name") != null ? row.get("project_name").toString() : "");
+        response.setFeedback(row.get("feedback") != null ? row.get("feedback").toString() : "");
+        
+        Object stateObj = row.get("ap_state");
+        if (stateObj != null) {
+            if (stateObj instanceof Number) {
+                response.setState(((Number) stateObj).intValue());
+            } else {
+                log.warn("鐘舵�佺被鍨嬩笉鍖归厤: {}, 绫诲瀷: {}", stateObj, stateObj.getClass().getName());
+                response.setState(Integer.valueOf(stateObj.toString()));
+            }
+        } else {
+            response.setState(0);
+        }
+        response.setActivityName(row.get("activity_name") != null ? row.get("activity_name").toString() : "");
 
         // 鏋勫缓瀛﹀憳淇℃伅
         PlayerInfoResponse playerInfo = new PlayerInfoResponse();
-        playerInfo.setId(row[3] != null ? ((Number) row[3]).longValue() : null);
-        playerInfo.setName(row[4] != null ? row[4].toString() : "");
-        playerInfo.setPhone(row[5] != null ? row[5].toString() : "");
-        playerInfo.setDescription(row[6] != null ? row[6].toString() : "");
+        Object playerIdObj = row.get("player_id");
+        if (playerIdObj != null) {
+            if (playerIdObj instanceof Number) {
+                playerInfo.setId(((Number) playerIdObj).longValue());
+            } else {
+                log.warn("瀛﹀憳ID绫诲瀷涓嶅尮閰�: {}, 绫诲瀷: {}", playerIdObj, playerIdObj.getClass().getName());
+                playerInfo.setId(Long.valueOf(playerIdObj.toString()));
+            }
+        } else {
+            playerInfo.setId(null);
+        }
+        playerInfo.setName(row.get("player_name") != null ? row.get("player_name").toString() : "");
+        playerInfo.setPhone(row.get("phone") != null ? row.get("phone").toString() : "");
+        playerInfo.setDescription(row.get("player_desc") != null ? row.get("player_desc").toString() : "");
+        
+        Object genderObj = row.get("gender");
+        if (genderObj != null) {
+            if (genderObj instanceof Number) {
+                playerInfo.setGender(((Number) genderObj).intValue());
+            } else {
+                log.warn("鎬у埆绫诲瀷涓嶅尮閰�: {}, 绫诲瀷: {}", genderObj, genderObj.getClass().getName());
+                playerInfo.setGender(Integer.valueOf(genderObj.toString()));
+            }
+        } else {
+            playerInfo.setGender(null);
+        }
+        
+        Object birthdayObj = row.get("birthday");
+        playerInfo.setBirthday(birthdayObj != null ? 
+            (birthdayObj instanceof java.sql.Date ? ((java.sql.Date) birthdayObj).toString() : birthdayObj.toString()) : null);
+        playerInfo.setEducation(row.get("education") != null ? row.get("education").toString() : "");
+        playerInfo.setIntroduction(row.get("introduction") != null ? row.get("introduction").toString() : "");
 
-        // 鏌ヨ瀛﹀憳澶村儚锛堜娇鐢ㄦ灇涓惧父閲忚〃绀哄鍛樺ご鍍忕被鍨嬶級
-        if (playerInfo.getId() != null) {
+        // 鏋勫缓鍖哄煙淇℃伅
+        Object regionIdObj = row.get("region_id");
+        if (regionIdObj != null) {
+            RegionInfoResponse regionInfo = new RegionInfoResponse();
+            if (regionIdObj instanceof Number) {
+                regionInfo.setId(((Number) regionIdObj).longValue());
+            } else {
+                log.warn("鍖哄煙ID绫诲瀷涓嶅尮閰�: {}, 绫诲瀷: {}", regionIdObj, regionIdObj.getClass().getName());
+                regionInfo.setId(Long.valueOf(regionIdObj.toString()));
+            }
+            regionInfo.setName(row.get("region_name") != null ? row.get("region_name").toString() : "");
+            regionInfo.setFullPath(row.get("region_path") != null ? row.get("region_path").toString() : "");
+            response.setRegionInfo(regionInfo);
+            log.info("鎵惧埌鍖哄煙淇℃伅: {}", regionInfo.getName());
+        }
+
+        // 鏌ヨ鐢ㄦ埛澶村儚锛堜娇鐢║SER_AVATAR鍏宠仈鍒扮敤鎴凤級
+        Object userIdObj = row.get("user_id");
+        log.info("璋冭瘯锛氫粠鏌ヨ缁撴灉涓幏鍙栫殑user_id: {}", userIdObj);
+        if (userIdObj != null) {
+            Long userId;
+            if (userIdObj instanceof Number) {
+                userId = ((Number) userIdObj).longValue();
+            } else {
+                userId = Long.valueOf(userIdObj.toString());
+            }
+            log.info("璋冭瘯锛氳В鏋愬悗鐨剈serId: {}", userId);
+            
             List<Media> avatarMedias = mediaRepository.findByTargetTypeAndTargetIdAndState(
-                MediaTargetType.STUDENT_AVATAR.getValue(), playerInfo.getId(), 1);
+                MediaTargetType.USER_AVATAR.getValue(), userId, 1);
+            log.info("璋冭瘯锛氭煡璇㈠埌鐨勫ご鍍忓獟浣撴暟閲�: {}", avatarMedias.size());
             if (!avatarMedias.isEmpty()) {
                 Media avatar = avatarMedias.get(0);
-                String avatarUrl = avatar.getPath();
+                String avatarUrl = buildFullMediaUrl(avatar.getPath());
                 playerInfo.setAvatarUrl(avatarUrl);
-                log.info("鎵惧埌瀛﹀憳澶村儚: {}", avatarUrl);
+                // 璁剧疆avatar瀵硅薄
+                playerInfo.setAvatar(convertToMediaResponse(avatar));
+                log.info("鎵惧埌鐢ㄦ埛澶村儚: {}", avatarUrl);
+            } else {
+                log.info("璋冭瘯锛氭湭鎵惧埌鐢ㄦ埛澶村儚锛寀serId: {}, targetType: {}", userId, MediaTargetType.USER_AVATAR.getValue());
             }
+        } else {
+            log.warn("璋冭瘯锛歶ser_id涓簄ull");
         }
         response.setPlayerInfo(playerInfo);
 
@@ -102,7 +205,8 @@
         log.info("鎵惧埌鎻愪氦璧勬枡 {} 涓�", submissionFiles.size());
 
         // 鏌ヨ璇勫垎妯℃澘
-        Long ratingSchemeId = row[8] != null ? ((Number) row[8]).longValue() : null;
+        Object ratingSchemeIdObj = row.get("rating_scheme_id");
+        Long ratingSchemeId = ratingSchemeIdObj != null ? ((Number) ratingSchemeIdObj).longValue() : null;
         if (ratingSchemeId != null) {
             RatingFormResponse ratingForm = buildRatingForm(ratingSchemeId);
             response.setRatingForm(ratingForm);
@@ -118,10 +222,11 @@
         SubmissionMediaResponse response = new SubmissionMediaResponse();
         response.setId(media.getId());
         response.setName(media.getName());
-        response.setUrl(media.getPath());
+        response.setUrl(buildFullMediaUrl(media.getPath()));
         response.setFileExt(media.getFileExt());
         response.setFileSize(media.getFileSize() != null ? media.getFileSize().longValue() : null);
         response.setMediaType(media.getMediaType());
+        response.setThumbUrl(buildFullMediaUrl(media.getThumbPath()));
         return response;
     }
 
@@ -155,4 +260,49 @@
 
         return response;
     }
+
+    /**
+     * 杞崲濯掍綋鏂囦欢涓篗ediaResponse
+     */
+    private MediaResponse convertToMediaResponse(Media media) {
+        MediaResponse response = new MediaResponse();
+        response.setId(media.getId());
+        response.setName(media.getName());
+        response.setPath(media.getPath());
+        response.setFileSize(media.getFileSize());
+        response.setFileExt(media.getFileExt());
+        response.setThumbPath(media.getThumbPath());
+        response.setDuration(media.getDuration());
+        response.setDescription(media.getDescription());
+        response.setTargetType(media.getTargetType());
+        response.setTargetId(media.getTargetId());
+        response.setMediaType(media.getMediaType());
+        
+        // 璁剧疆瀹屾暣URL
+        response.setFullUrl(buildFullMediaUrl(media.getPath()));
+        response.setFullThumbUrl(buildFullMediaUrl(media.getThumbPath()));
+        
+        return response;
+    }
+    
+    private String buildFullMediaUrl(String path) {
+        if (!StringUtils.hasText(path)) {
+            return null;
+        }
+        
+        // 濡傛灉宸茬粡鏄畬鏁碪RL锛岀洿鎺ヨ繑鍥�
+        if (path.startsWith("http://") || path.startsWith("https://")) {
+            return path;
+        }
+        
+        // 濡傛灉娌℃湁閰嶇疆mediaBaseUrl锛岃繑鍥炲師璺緞
+        if (!StringUtils.hasText(mediaBaseUrl)) {
+            return path;
+        }
+        
+        // 鎷兼帴瀹屾暣URL
+        String baseUrl = mediaBaseUrl.endsWith("/") ? mediaBaseUrl : mediaBaseUrl + "/";
+        String relativePath = path.startsWith("/") ? path.substring(1) : path;
+        return baseUrl + relativePath;
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0