From afeeed281e60466b576fbe74d339634cc5d07b82 Mon Sep 17 00:00:00 2001
From: Codex Assistant <codex@example.com>
Date: 星期三, 08 十月 2025 08:56:42 +0800
Subject: [PATCH] 修复评审功能和用户认证问题

---
 backend/src/main/java/com/rongyichuang/user/resolver/UserResolver.java |  224 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 203 insertions(+), 21 deletions(-)

diff --git a/backend/src/main/java/com/rongyichuang/user/resolver/UserResolver.java b/backend/src/main/java/com/rongyichuang/user/resolver/UserResolver.java
index dff7fd5..7381c53 100644
--- a/backend/src/main/java/com/rongyichuang/user/resolver/UserResolver.java
+++ b/backend/src/main/java/com/rongyichuang/user/resolver/UserResolver.java
@@ -4,6 +4,7 @@
 import com.rongyichuang.auth.dto.LoginResponse.JudgeInfo;
 import com.rongyichuang.auth.dto.LoginResponse.PlayerInfo;
 import com.rongyichuang.common.util.UserContextUtil;
+import com.rongyichuang.auth.util.JwtUtil;
 import com.rongyichuang.employee.entity.Employee;
 import com.rongyichuang.employee.service.EmployeeService;
 import com.rongyichuang.judge.entity.Judge;
@@ -14,6 +15,9 @@
 import com.rongyichuang.common.repository.MediaRepository;
 import com.rongyichuang.common.entity.Media;
 import com.rongyichuang.common.enums.MediaTargetType;
+import com.rongyichuang.media.service.MediaV2Service;
+import com.rongyichuang.media.dto.MediaSaveInput;
+import com.rongyichuang.media.dto.MediaSaveResponse;
 import com.rongyichuang.user.dto.response.UserProfile;
 import com.rongyichuang.user.dto.response.UserStats;
 import com.rongyichuang.user.dto.response.UserRegistration;
@@ -73,6 +77,12 @@
     @Autowired
     private UserContextUtil userContextUtil;
 
+    @Autowired
+    private JwtUtil jwtUtil;
+
+    @Autowired
+    private MediaV2Service mediaV2Service;
+
     @Value("${app.media-url}")
     private String mediaBaseUrl;
 
@@ -84,8 +94,17 @@
         try {
             Long userId = userContextUtil.getCurrentUserId();
             logger.debug("杩涘叆userProfile锛岃В鏋愬埌鐢ㄦ埛ID: {}", userId);
+            
+            // 濡傛灉鏄尶鍚嶇敤鎴凤紝杩斿洖鍩烘湰鐨勭敤鎴锋。妗�
             if (userId == null) {
-                throw new RuntimeException("鐢ㄦ埛鏈櫥褰�");
+                logger.debug("鍖垮悕鐢ㄦ埛璁块棶userProfile锛岃繑鍥炲熀鏈。妗�");
+                UserProfile profile = new UserProfile();
+                profile.setId("0"); // 鍖垮悕鐢ㄦ埛ID璁句负0
+                profile.setName("鍖垮悕鐢ㄦ埛");
+                profile.setRoles(new ArrayList<>());
+                profile.setUserType("user"); // 鍖垮悕鐢ㄦ埛绫诲瀷涓烘櫘閫氱敤鎴�
+                profile.setCreatedAt(java.time.LocalDateTime.now().toString());
+                return profile;
             }
 
             UserProfile profile = new UserProfile();
@@ -96,6 +115,9 @@
             User user = null;
             if (userOpt.isPresent()) {
                 user = userOpt.get();
+                // 璁剧疆鍩烘湰淇℃伅锛堝鍚嶅拰鐢佃瘽鍙风爜锛�
+                profile.setName(user.getName());
+                profile.setPhone(user.getPhone());
                 // 璁剧疆鎬у埆
                 if (user.getGender() != null) {
                     profile.setGender(user.getGender() == 1 ? "MALE" : "FEMALE");
@@ -113,8 +135,13 @@
             Employee employee = employeeService.findByUserId(userId);
             logger.debug("鍛樺伐鏌ヨ缁撴灉: {}", employee != null ? ("id=" + employee.getId() + ", name=" + employee.getName()) : "鏃�");
             if (employee != null) {
-                profile.setName(employee.getName());
-                profile.setPhone(employee.getPhone());
+                // 濡傛灉鍛樺伐淇℃伅瀛樺湪锛屽垯瑕嗙洊鍩烘湰淇℃伅
+                if (employee.getName() != null) {
+                    profile.setName(employee.getName());
+                }
+                if (employee.getPhone() != null) {
+                    profile.setPhone(employee.getPhone());
+                }
                 roles.add("EMPLOYEE");
                 
                 EmployeeInfo employeeInfo = new EmployeeInfo(
@@ -131,8 +158,11 @@
             Judge judge = judgeService.findByUserId(userId);
             logger.debug("璇勫鏌ヨ缁撴灉: {}", judge != null ? ("id=" + judge.getId() + ", name=" + judge.getName()) : "鏃�");
             if (judge != null) {
-                if (profile.getName() == null) {
+                // 濡傛灉璇勫淇℃伅瀛樺湪涓斿熀鏈俊鎭负绌猴紝鍒欒缃瘎濮斾俊鎭�
+                if (profile.getName() == null && judge.getName() != null) {
                     profile.setName(judge.getName());
+                }
+                if (profile.getPhone() == null && judge.getPhone() != null) {
                     profile.setPhone(judge.getPhone());
                 }
                 roles.add("JUDGE");
@@ -152,8 +182,11 @@
             Player player = playerService.findByUserId(userId);
             logger.debug("瀛﹀憳鏌ヨ缁撴灉: {}", player != null ? ("id=" + player.getId() + ", name=" + player.getName()) : "鏃�");
             if (player != null) {
-                if (profile.getName() == null) {
+                // 濡傛灉瀛﹀憳淇℃伅瀛樺湪涓斿熀鏈俊鎭负绌猴紝鍒欒缃鍛樹俊鎭�
+                if (profile.getName() == null && player.getName() != null) {
                     profile.setName(player.getName());
+                }
+                if (profile.getPhone() == null && player.getPhone() != null) {
                     profile.setPhone(player.getPhone());
                 }
                 roles.add("PLAYER");
@@ -168,6 +201,20 @@
             }
             
             profile.setRoles(roles);
+            
+            // 纭畾涓昏瑙掕壊绫诲瀷锛堜紭鍏堢骇锛歟mployee > judge > player锛�
+            String userType;
+            if (employee != null) {
+                userType = "employee";
+            } else if (judge != null) {
+                userType = "judge";
+            } else if (player != null) {
+                userType = "player";
+            } else {
+                userType = "user"; // 鏅�氱敤鎴�
+            }
+            profile.setUserType(userType);
+            logger.debug("璁剧疆鐢ㄦ埛绫诲瀷: {}", userType);
             
             // 鑾峰彇鐢ㄦ埛澶村儚
             try {
@@ -429,30 +476,99 @@
     @MutationMapping
     public UserProfileInfo saveUserInfo(@Argument UserInput input) {
         try {
-            Long userId = userContextUtil.getCurrentUserId();
-            logger.debug("杩涘叆saveUserInfo锛岃В鏋愬埌鐢ㄦ埛ID: {}", userId);
+            Long userId = userContextUtil.getCurrentUserIdIncludingAnonymous();
+            logger.debug("杩涘叆saveUserInfo锛岃В鏋愬埌鐢ㄦ埛ID锛堝寘鎷尶鍚嶇敤鎴凤級: {}", userId);
             if (userId == null) {
                 throw new RuntimeException("鐢ㄦ埛鏈櫥褰�");
             }
 
-            // 鏌ユ壘鐜版湁鐢ㄦ埛
-            Optional<User> userOpt = userRepository.findById(userId);
             User user;
+            boolean isNewUser = false;
             
-            if (userOpt.isPresent()) {
-                // 鐢ㄦ埛瀛樺湪锛屾洿鏂颁俊鎭�
-                user = userOpt.get();
-                logger.debug("鏇存柊鐜版湁鐢ㄦ埛淇℃伅锛岀敤鎴稩D: {}", userId);
+            // 妫�鏌ユ墜鏈哄彿鏄惁瀛樺湪
+            if (StringUtils.hasText(input.getPhone())) {
+                Optional<User> existingUserByPhone = userRepository.findByPhone(input.getPhone());
+                if (existingUserByPhone.isPresent()) {
+                    // 鎵嬫満鍙峰凡瀛樺湪锛屾洿鏂扮幇鏈夌敤鎴�
+                    user = existingUserByPhone.get();
+                    logger.debug("鎵嬫満鍙穥}宸插瓨鍦紝鏇存柊鐜版湁鐢ㄦ埛锛岀敤鎴稩D: {}", input.getPhone(), user.getId());
+                    
+                    // 濡傛灉褰撳墠鐢ㄦ埛ID涓庢墜鏈哄彿瀵瑰簲鐨勭敤鎴稩D涓嶅悓锛岄渶瑕佸鐞嗗尶鍚嶇敤鎴疯浆姝g殑鎯呭喌
+                    if (!user.getId().equals(userId)) {
+                        logger.debug("鍖垮悕鐢ㄦ埛{}杞涓烘寮忕敤鎴穥}", userId, user.getId());
+                        
+                        // 妫�鏌ュ尶鍚嶇敤鎴锋槸鍚︽湁闇�瑕佸悎骞剁殑淇℃伅
+                        if (userId < 0) {
+                            // 杩欐槸鍖垮悕鐢ㄦ埛杞锛屾鏌ユ槸鍚︽湁涓存椂淇℃伅闇�瑕佸悎骞�
+                            Optional<User> anonymousUserOpt = userRepository.findById(userId);
+                            if (anonymousUserOpt.isPresent()) {
+                                User anonymousUser = anonymousUserOpt.get();
+                                logger.debug("鍙戠幇鍖垮悕鐢ㄦ埛璁板綍锛屽噯澶囧悎骞朵俊鎭�");
+                                
+                                // 鍚堝苟鍖垮悕鐢ㄦ埛鐨勪俊鎭埌姝e紡鐢ㄦ埛锛堝鏋滄寮忕敤鎴锋病鏈夎繖浜涗俊鎭級
+                                if (!StringUtils.hasText(user.getName()) && StringUtils.hasText(anonymousUser.getName())) {
+                                    user.setName(anonymousUser.getName());
+                                    logger.debug("鍚堝苟鍖垮悕鐢ㄦ埛鐨勫鍚�: {}", anonymousUser.getName());
+                                }
+                                
+                                if (user.getGender() == null && anonymousUser.getGender() != null) {
+                                    user.setGender(anonymousUser.getGender());
+                                    logger.debug("鍚堝苟鍖垮悕鐢ㄦ埛鐨勬�у埆: {}", anonymousUser.getGender());
+                                }
+                                
+                                if (user.getBirthday() == null && anonymousUser.getBirthday() != null) {
+                                    user.setBirthday(anonymousUser.getBirthday());
+                                    logger.debug("鍚堝苟鍖垮悕鐢ㄦ埛鐨勭敓鏃�: {}", anonymousUser.getBirthday());
+                                }
+                                
+                                // 鍒犻櫎鍖垮悕鐢ㄦ埛璁板綍锛堝彲閫夛紝閬垮厤鏁版嵁鍐椾綑锛�
+                                try {
+                                    userRepository.delete(anonymousUser);
+                                    logger.debug("鍒犻櫎鍖垮悕鐢ㄦ埛璁板綍: {}", userId);
+                                } catch (Exception e) {
+                                    logger.warn("鍒犻櫎鍖垮悕鐢ㄦ埛璁板綍澶辫触: {}", e.getMessage());
+                                }
+                            }
+                        }
+                        
+                        userId = user.getId(); // 浣跨敤姝e紡鐢ㄦ埛ID
+                    }
+                } else {
+                    // 鎵嬫満鍙蜂笉瀛樺湪锛屾鏌ュ綋鍓嶇敤鎴稩D鏄惁瀛樺湪
+                    Optional<User> userOpt = userRepository.findById(userId);
+                    if (userOpt.isPresent()) {
+                        // 鐢ㄦ埛ID瀛樺湪锛屾洿鏂颁俊鎭�
+                        user = userOpt.get();
+                        logger.debug("鏇存柊鐜版湁鐢ㄦ埛淇℃伅锛岀敤鎴稩D: {}", userId);
+                    } else {
+                        // 鐢ㄦ埛ID涓嶅瓨鍦紝鍒涘缓鏂扮敤鎴�
+                        user = new User();
+                        user.setId(userId);
+                        isNewUser = true;
+                        logger.debug("鍒涘缓鏂扮敤鎴凤紝鐢ㄦ埛ID: {}", userId);
+                    }
+                }
             } else {
-                // 鐢ㄦ埛涓嶅瓨鍦紝鍒涘缓鏂扮敤鎴�
-                user = new User();
-                user.setId(userId);
-                logger.debug("鍒涘缓鏂扮敤鎴凤紝鐢ㄦ埛ID: {}", userId);
+                // 娌℃湁鎻愪緵鎵嬫満鍙凤紝鐩存帴鏍规嵁鐢ㄦ埛ID鏌ユ壘鎴栧垱寤�
+                Optional<User> userOpt = userRepository.findById(userId);
+                if (userOpt.isPresent()) {
+                    user = userOpt.get();
+                    logger.debug("鏇存柊鐜版湁鐢ㄦ埛淇℃伅锛岀敤鎴稩D: {}", userId);
+                } else {
+                    user = new User();
+                    user.setId(userId);
+                    isNewUser = true;
+                    logger.debug("鍒涘缓鏂扮敤鎴凤紝鐢ㄦ埛ID: {}", userId);
+                }
             }
 
             // 鏇存柊鐢ㄦ埛鍩烘湰淇℃伅锛堜笉鍖呭惈澶村儚锛�
-            user.setName(input.getName());
-            user.setPhone(input.getPhone());
+            if (StringUtils.hasText(input.getName())) {
+                user.setName(input.getName());
+            }
+            if (StringUtils.hasText(input.getPhone())) {
+                user.setPhone(input.getPhone());
+            }
             
             // 澶勭悊鎬у埆杞崲锛歁ALE -> 1, FEMALE -> 0
             if ("MALE".equals(input.getGender())) {
@@ -470,10 +586,75 @@
                     logger.warn("鐢熸棩鏍煎紡瑙f瀽澶辫触: {}", input.getBirthday(), e);
                 }
             }
+            
+            // 澶勭悊wxopenid鏇存柊锛氫粠JWT token涓幏鍙栧綋鍓嶇敤鎴风殑wxopenid
+            try {
+                String token = userContextUtil.getTokenFromRequest();
+                if (token != null && jwtUtil.validateToken(token)) {
+                    Long currentUserId = jwtUtil.getUserIdFromToken(token);
+                    String wxopenidFromToken = jwtUtil.getWxOpenidFromToken(token);
+                    
+                    // 濡傛灉token涓寘鍚玾xopenid锛屽垯鏇存柊鐢ㄦ埛鐨剋xopenid
+                    if (StringUtils.hasText(wxopenidFromToken)) {
+                        logger.debug("浠巘oken涓幏鍙栧埌wxopenid: {}", wxopenidFromToken);
+                        
+                        // 妫�鏌ヨ繖涓猳penid鏄惁宸茬粡琚叾浠栫敤鎴蜂娇鐢�
+                        Optional<User> existingUserWithOpenid = userRepository.findByWxOpenid(wxopenidFromToken);
+                        if (existingUserWithOpenid.isEmpty() || existingUserWithOpenid.get().getId().equals(user.getId())) {
+                            user.setWxOpenid(wxopenidFromToken);
+                            logger.debug("璁剧疆鐢ㄦ埛wxopenid: {}", wxopenidFromToken);
+                        } else {
+                            logger.warn("wxopenid {} 宸茶鍏朵粬鐢ㄦ埛浣跨敤锛岀敤鎴稩D: {}", wxopenidFromToken, existingUserWithOpenid.get().getId());
+                        }
+                    } else {
+                        logger.debug("token涓湭鍖呭惈wxopenid淇℃伅");
+                    }
+                }
+            } catch (Exception e) {
+                logger.warn("澶勭悊wxopenid鏇存柊鏃跺彂鐢熷紓甯�: {}", e.getMessage(), e);
+            }
 
             // 淇濆瓨鐢ㄦ埛鍩烘湰淇℃伅
             user = userRepository.save(user);
-            logger.debug("鐢ㄦ埛淇℃伅淇濆瓨鎴愬姛锛岀敤鎴稩D: {}", user.getId());
+            logger.debug("鐢ㄦ埛淇℃伅淇濆瓨鎴愬姛锛岀敤鎴稩D: {}, 鏄惁鏂扮敤鎴�: {}", user.getId(), isNewUser);
+
+            // 澶勭悊澶村儚淇濆瓨
+            if (StringUtils.hasText(input.getAvatar())) {
+                try {
+                    logger.debug("寮�濮嬩繚瀛樼敤鎴峰ご鍍忥紝璺緞: {}", input.getAvatar());
+                    
+                    // 鏋勫缓MediaSaveInput
+                    MediaSaveInput mediaSaveInput = new MediaSaveInput();
+                    mediaSaveInput.setTargetType("player"); // 浣跨敤"player"浣滀负鐩爣绫诲瀷
+                    mediaSaveInput.setTargetId(user.getId());
+                    mediaSaveInput.setPath(input.getAvatar());
+                    mediaSaveInput.setMediaType(1); // 1琛ㄧず鍥剧墖
+                    mediaSaveInput.setFileSize(0L); // 璁剧疆榛樿鏂囦欢澶у皬涓�0锛岄伩鍏嶆暟鎹簱绾︽潫閿欒
+                    
+                    // 浠庤矾寰勪腑鎻愬彇鏂囦欢鍚嶅拰鎵╁睍鍚�
+                    String fileName = input.getAvatar();
+                    if (fileName.contains("/")) {
+                        fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
+                    }
+                    mediaSaveInput.setFileName(fileName);
+                    
+                    if (fileName.contains(".")) {
+                        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
+                        mediaSaveInput.setFileExt(fileExt);
+                    }
+                    
+                    // 淇濆瓨澶村儚濯掍綋璁板綍
+                    MediaSaveResponse saveResponse = mediaV2Service.saveMedia(mediaSaveInput);
+                    if (saveResponse.getSuccess()) {
+                        logger.debug("澶村儚淇濆瓨鎴愬姛锛屽獟浣揑D: {}", saveResponse.getMediaId());
+                    } else {
+                        logger.warn("澶村儚淇濆瓨澶辫触: {}", saveResponse.getMessage());
+                    }
+                } catch (Exception e) {
+                    logger.error("淇濆瓨澶村儚鏃跺彂鐢熼敊璇�", e);
+                    // 澶村儚淇濆瓨澶辫触涓嶅奖鍝嶇敤鎴蜂俊鎭繚瀛�
+                }
+            }
 
             // 鏋勫缓杩斿洖缁撴灉
             UserProfileInfo result = new UserProfileInfo();
@@ -494,12 +675,13 @@
             try {
                 List<Media> avatarMedias = mediaRepository.findByTargetTypeAndTargetIdAndState(
                     MediaTargetType.USER_AVATAR.getValue(), 
-                    userId, 
+                    user.getId(), 
                     1
                 );
                 if (!avatarMedias.isEmpty()) {
                     Media avatarMedia = avatarMedias.get(0);
                     result.setAvatar(buildFullMediaUrl(avatarMedia.getPath()));
+                    logger.debug("璁剧疆澶村儚URL: {}", result.getAvatar());
                 }
             } catch (Exception e) {
                 logger.warn("鑾峰彇澶村儚澶辫触: {}", e.getMessage(), e);

--
Gitblit v1.8.0