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 | 185 ++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 161 insertions(+), 24 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 0eb0337..5f56ef0 100644 --- a/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java +++ b/backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerDetailService.java @@ -8,14 +8,20 @@ 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; /** @@ -31,6 +37,9 @@ private final MediaRepository mediaRepository; private final RatingSchemeRepository ratingSchemeRepository; + + @Value("${app.media-url}") + private String mediaBaseUrl; public ActivityPlayerDetailService(MediaRepository mediaRepository, RatingSchemeRepository ratingSchemeRepository) { @@ -48,60 +57,141 @@ // 鏌ヨ鍩烘湰淇℃伅锛屽寘鍚尯鍩熶俊鎭� String sql = """ - SELECT ap.id, ap.description, ap.activity_id, ap.region_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, + 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 r_id, r.name as region_name, r.full_path as region_path + 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[8] != null ? row[8].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[4] != null ? ((Number) row[4]).longValue() : null); - playerInfo.setName(row[5] != null ? row[5].toString() : ""); - playerInfo.setPhone(row[6] != null ? row[6].toString() : ""); - playerInfo.setDescription(row[7] != null ? row[7].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() : ""); // 鏋勫缓鍖哄煙淇℃伅 - RegionInfoResponse regionInfo = new RegionInfoResponse(); - if (row[10] != null) { - regionInfo.setId(((Number) row[10]).longValue()); - regionInfo.setName(row[11] != null ? row[11].toString() : ""); - regionInfo.setFullPath(row[12] != null ? row[12].toString() : ""); + 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()); } - // 鏌ヨ瀛﹀憳澶村儚锛堜娇鐢ㄦ灇涓惧父閲忚〃绀哄鍛樺ご鍍忕被鍨嬶級 - if (playerInfo.getId() != null) { + // 鏌ヨ鐢ㄦ埛澶村儚锛堜娇鐢║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); @@ -115,7 +205,8 @@ log.info("鎵惧埌鎻愪氦璧勬枡 {} 涓�", submissionFiles.size()); // 鏌ヨ璇勫垎妯℃澘 - Long ratingSchemeId = row[9] != null ? ((Number) row[9]).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); @@ -131,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; } @@ -168,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