| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | @Autowired |
| | | private UserContextUtil userContextUtil; |
| | | |
| | | @Autowired |
| | | private JwtUtil jwtUtil; |
| | | |
| | | @Autowired |
| | | private MediaV2Service mediaV2Service; |
| | | |
| | | @Value("${app.media-url}") |
| | | private String mediaBaseUrl; |
| | | |
| | |
| | | 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(); |
| | |
| | | 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"); |
| | |
| | | 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( |
| | |
| | | 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"); |
| | |
| | | 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"); |
| | |
| | | } |
| | | |
| | | profile.setRoles(roles); |
| | | |
| | | // 确定主要角色类型(优先级:employee > 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 { |
| | |
| | | @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("更新现有用户信息,用户ID: {}", userId); |
| | | // 检查手机号是否存在 |
| | | if (StringUtils.hasText(input.getPhone())) { |
| | | Optional<User> existingUserByPhone = userRepository.findByPhone(input.getPhone()); |
| | | if (existingUserByPhone.isPresent()) { |
| | | // 手机号已存在,更新现有用户 |
| | | user = existingUserByPhone.get(); |
| | | logger.debug("手机号{}已存在,更新现有用户,用户ID: {}", input.getPhone(), user.getId()); |
| | | |
| | | // 如果当前用户ID与手机号对应的用户ID不同,需要处理匿名用户转正的情况 |
| | | 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("发现匿名用户记录,准备合并信息"); |
| | | |
| | | // 合并匿名用户的信息到正式用户(如果正式用户没有这些信息) |
| | | 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(); // 使用正式用户ID |
| | | } |
| | | } else { |
| | | // 手机号不存在,检查当前用户ID是否存在 |
| | | Optional<User> userOpt = userRepository.findById(userId); |
| | | if (userOpt.isPresent()) { |
| | | // 用户ID存在,更新信息 |
| | | user = userOpt.get(); |
| | | logger.debug("更新现有用户信息,用户ID: {}", 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("更新现有用户信息,用户ID: {}", 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()); |
| | | } |
| | | |
| | | // 处理性别转换:MALE -> 1, FEMALE -> 0 |
| | | if ("MALE".equals(input.getGender())) { |
| | |
| | | logger.warn("生日格式解析失败: {}", 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中包含wxopenid,则更新用户的wxopenid |
| | | if (StringUtils.hasText(wxopenidFromToken)) { |
| | | logger.debug("从token中获取到wxopenid: {}", wxopenidFromToken); |
| | | |
| | | // 检查这个openid是否已经被其他用户使用 |
| | | 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 {} 已被其他用户使用,用户ID: {}", wxopenidFromToken, existingUserWithOpenid.get().getId()); |
| | | } |
| | | } else { |
| | | logger.debug("token中未包含wxopenid信息"); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | logger.warn("处理wxopenid更新时发生异常: {}", e.getMessage(), e); |
| | | } |
| | | |
| | | // 保存用户基本信息 |
| | | user = userRepository.save(user); |
| | | logger.debug("用户信息保存成功,用户ID: {}", user.getId()); |
| | | logger.debug("用户信息保存成功,用户ID: {}, 是否新用户: {}", 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("头像保存成功,媒体ID: {}", saveResponse.getMediaId()); |
| | | } else { |
| | | logger.warn("头像保存失败: {}", saveResponse.getMessage()); |
| | | } |
| | | } catch (Exception e) { |
| | | logger.error("保存头像时发生错误", e); |
| | | // 头像保存失败不影响用户信息保存 |
| | | } |
| | | } |
| | | |
| | | // 构建返回结果 |
| | | UserProfileInfo result = new UserProfileInfo(); |
| | |
| | | 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); |