From 9f8395fab13ca4b230a0f7d62636e209745c91d4 Mon Sep 17 00:00:00 2001
From: lrj <owen.stl@gmail.com>
Date: 星期日, 28 九月 2025 14:16:18 +0800
Subject: [PATCH] feat: 完善注册流程的文件上传功能

---
 backend/src/main/java/com/rongyichuang/user/service/UserService.java |  112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/backend/src/main/java/com/rongyichuang/user/service/UserService.java b/backend/src/main/java/com/rongyichuang/user/service/UserService.java
index ad01ab3..8ee3be7 100644
--- a/backend/src/main/java/com/rongyichuang/user/service/UserService.java
+++ b/backend/src/main/java/com/rongyichuang/user/service/UserService.java
@@ -2,10 +2,15 @@
 
 import com.rongyichuang.user.entity.User;
 import com.rongyichuang.user.repository.UserRepository;
+import com.rongyichuang.employee.repository.EmployeeRepository;
+import com.rongyichuang.judge.repository.JudgeRepository;
+import com.rongyichuang.player.repository.PlayerRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Optional;
 
@@ -16,8 +21,19 @@
 @Transactional
 public class UserService {
 
+    private static final Logger logger = LoggerFactory.getLogger(UserService.class);
+
     @Autowired
     private UserRepository userRepository;
+    
+    @Autowired
+    private EmployeeRepository employeeRepository;
+    
+    @Autowired
+    private JudgeRepository judgeRepository;
+    
+    @Autowired
+    private PlayerRepository playerRepository;
     
     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
 
@@ -77,4 +93,100 @@
     public Optional<User> findById(Long id) {
         return userRepository.findById(id);
     }
+
+    /**
+     * 淇濆瓨鐢ㄦ埛鎵嬫満鍙风爜
+     * 鏍稿績閫昏緫锛�
+     * 1. 鏌ヨ褰撳墠t_user閲岄潰鏄惁瀛樺湪鐩稿悓鐨勭數璇濆彿鐮侊紝濡傛灉娌℃湁锛屽氨鏇存柊鍒板綋鍓島ser閲岄潰
+     * 2. 濡傛灉瀛樺湪鐩稿悓鐨勭數璇濆彿鐮侊紝骞朵笖瀵瑰簲user鐨刼penid鏄痭ull锛岄偅涔堟竻绌哄師鏉ser鐨刾hone璁剧疆涓簄ull锛�
+     *    鎶婃柊鐨勭數璇濆彿鐮佹洿鏂板埌褰撳墠鐢ㄦ埛鐨刾hone瀛楁锛屽悓鏃舵洿鏂皌_player銆乼_judge銆乼_employee鍏宠仈鐨剈ser_id鍒版柊鐨剈ser_id
+     * 
+     * @param currentUserId 褰撳墠鐢ㄦ埛ID
+     * @param phone 瑕佷繚瀛樼殑鎵嬫満鍙风爜
+     * @return 鏇存柊鍚庣殑鐢ㄦ埛瀹炰綋
+     */
+    @Transactional
+    public User saveUserPhone(Long currentUserId, String phone) {
+        logger.info("寮�濮嬪鐞嗙敤鎴锋墜鏈哄彿鐮佷繚瀛橈紝鐢ㄦ埛ID: {}, 鎵嬫満鍙�: {}", currentUserId, phone);
+        
+        // 鑾峰彇褰撳墠鐢ㄦ埛
+        User currentUser = userRepository.findById(currentUserId)
+                .orElseThrow(() -> new RuntimeException("鐢ㄦ埛涓嶅瓨鍦紝ID: " + currentUserId));
+        
+        // 妫�鏌ユ槸鍚﹀瓨鍦ㄧ浉鍚屾墜鏈哄彿鐨勭敤鎴�
+        Optional<User> existingPhoneUser = userRepository.findByPhone(phone);
+        
+        if (existingPhoneUser.isEmpty()) {
+            // 鎯呭喌1锛氭病鏈夊叾浠栫敤鎴蜂娇鐢ㄨ繖涓墜鏈哄彿锛岀洿鎺ユ洿鏂板綋鍓嶇敤鎴�
+            logger.info("鎵嬫満鍙� {} 鏈浣跨敤锛岀洿鎺ユ洿鏂板埌鐢ㄦ埛 {}", phone, currentUserId);
+            currentUser.setPhone(phone);
+            return userRepository.save(currentUser);
+        } else {
+            User phoneUser = existingPhoneUser.get();
+            
+            // 濡傛灉鏄悓涓�涓敤鎴凤紝鏃犻渶澶勭悊
+            if (phoneUser.getId().equals(currentUserId)) {
+                logger.info("鎵嬫満鍙� {} 宸插睘浜庡綋鍓嶇敤鎴� {}锛屾棤闇�鏇存柊", phone, currentUserId);
+                return currentUser;
+            }
+            
+            // 鎯呭喌2锛氬瓨鍦ㄧ浉鍚屾墜鏈哄彿鐨勭敤鎴凤紝涓旇鐢ㄦ埛鐨刼penid涓簄ull
+            if (phoneUser.getWxOpenid() == null || phoneUser.getWxOpenid().trim().isEmpty()) {
+                logger.info("鍙戠幇鎵嬫満鍙� {} 琚敤鎴� {} 浣跨敤锛屼絾璇ョ敤鎴锋棤openid锛屽紑濮嬫暟鎹縼绉�", phone, phoneUser.getId());
+                
+                // 杩佺Щ鍏宠仈鏁版嵁
+                migrateUserRelatedData(phoneUser.getId(), currentUserId);
+                
+                // 娓呯┖鍘熺敤鎴风殑鎵嬫満鍙�
+                phoneUser.setPhone(null);
+                userRepository.save(phoneUser);
+                logger.info("宸叉竻绌哄師鐢ㄦ埛 {} 鐨勬墜鏈哄彿", phoneUser.getId());
+                
+                // 鏇存柊褰撳墠鐢ㄦ埛鐨勬墜鏈哄彿
+                currentUser.setPhone(phone);
+                User savedUser = userRepository.save(currentUser);
+                logger.info("宸插皢鎵嬫満鍙� {} 鏇存柊鍒板綋鍓嶇敤鎴� {}", phone, currentUserId);
+                
+                return savedUser;
+            } else {
+                // 鎯呭喌3锛氬瓨鍦ㄧ浉鍚屾墜鏈哄彿鐨勭敤鎴凤紝涓旇鐢ㄦ埛鏈塷penid锛屼笉鑳借鐩�
+                logger.warn("鎵嬫満鍙� {} 宸茶鐢ㄦ埛 {} 浣跨敤锛屼笖璇ョ敤鎴锋湁openid锛屾棤娉曟洿鏂�", phone, phoneUser.getId());
+                throw new RuntimeException("鎵嬫満鍙峰凡琚叾浠栧井淇$敤鎴蜂娇鐢紝鏃犳硶鏇存柊");
+            }
+        }
+    }
+
+    /**
+     * 杩佺Щ鐢ㄦ埛鍏宠仈鏁版嵁
+     * 灏嗗師鐢ㄦ埛鐨勫憳宸ャ�佽瘎濮斻�佸鍛樹俊鎭縼绉诲埌鏂扮敤鎴�
+     * 
+     * @param fromUserId 鍘熺敤鎴稩D
+     * @param toUserId 鐩爣鐢ㄦ埛ID
+     */
+    private void migrateUserRelatedData(Long fromUserId, Long toUserId) {
+        logger.info("寮�濮嬭縼绉荤敤鎴峰叧鑱旀暟鎹紝浠庣敤鎴� {} 鍒扮敤鎴� {}", fromUserId, toUserId);
+        
+        // 杩佺Щ鍛樺伐淇℃伅
+        employeeRepository.findByUserId(fromUserId).ifPresent(employee -> {
+            logger.info("杩佺Щ鍛樺伐淇℃伅锛屽憳宸D: {}, 濮撳悕: {}", employee.getId(), employee.getName());
+            employee.setUserId(toUserId);
+            employeeRepository.save(employee);
+        });
+        
+        // 杩佺Щ璇勫淇℃伅
+        judgeRepository.findByUserId(fromUserId).ifPresent(judge -> {
+            logger.info("杩佺Щ璇勫淇℃伅锛岃瘎濮擨D: {}, 濮撳悕: {}", judge.getId(), judge.getName());
+            judge.setUserId(toUserId);
+            judgeRepository.save(judge);
+        });
+        
+        // 杩佺Щ瀛﹀憳淇℃伅
+        playerRepository.findByUserId(fromUserId).ifPresent(player -> {
+            logger.info("杩佺Щ瀛﹀憳淇℃伅锛屽鍛業D: {}, 濮撳悕: {}", player.getId(), player.getName());
+            player.setUserId(toUserId);
+            playerRepository.save(player);
+        });
+        
+        logger.info("鐢ㄦ埛鍏宠仈鏁版嵁杩佺Щ瀹屾垚");
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0