package com.emotion.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.emotion.common.PageResult; import com.emotion.dto.request.userprofile.UserProfileCreateRequest; import com.emotion.dto.request.userprofile.UserProfilePageRequest; import com.emotion.dto.request.userprofile.UserProfileUpdateRequest; import com.emotion.dto.response.userprofile.UserProfileResponse; import com.emotion.entity.User; import com.emotion.entity.UserProfile; import com.emotion.mapper.UserProfileMapper; import com.emotion.service.UserProfileService; import com.emotion.service.UserService; import com.emotion.util.UserContextHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; import java.util.stream.Collectors; /** * 用户档案服务实现类 * * @author huazhongmin * @date 2025-12-21 */ @Slf4j @Service public class UserProfileServiceImpl extends ServiceImpl implements UserProfileService { @Autowired private UserService userService; @Override public UserProfileResponse createProfile(UserProfileCreateRequest request) { log.info("Creating user profile: {}", request); // 获取当前登录用户ID String currentUserId = UserContextHolder.getCurrentUserId(); if (!StringUtils.hasText(currentUserId)) { throw new RuntimeException("用户未登录"); } // 检查是否已存在档案 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserProfile::getUserId, currentUserId); if (count(queryWrapper) > 0) { throw new RuntimeException("当前用户已存在档案信息"); } UserProfile userProfile = new UserProfile(); BeanUtils.copyProperties(request, userProfile); userProfile.setUserId(currentUserId); userProfile.setStatus(1); // 默认正常 save(userProfile); log.info("User profile created with ID: {}", userProfile.getId()); return convertToResponse(userProfile); } @Override public UserProfileResponse updateProfile(UserProfileUpdateRequest request) { log.info("Updating user profile: {}", request); // 获取当前登录用户ID String currentUserId = UserContextHolder.getCurrentUserId(); if (!StringUtils.hasText(currentUserId)) { throw new RuntimeException("用户未登录"); } UserProfile userProfile = null; // 先根据请求ID查询 if (StringUtils.hasText(request.getId())) { userProfile = getById(request.getId()); } // 如果没有查到,根据当前用户ID查询 if (userProfile == null) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserProfile::getUserId, currentUserId); userProfile = getOne(queryWrapper); } // 如果还是没有,则创建新档案 if (userProfile == null) { log.info("User profile not found, creating new profile for user: {}", currentUserId); UserProfileCreateRequest createRequest = new UserProfileCreateRequest(); BeanUtils.copyProperties(request, createRequest); return createProfile(createRequest); } // 权限校验:只能修改自己的档案 if (!userProfile.getUserId().equals(currentUserId)) { throw new RuntimeException("无权修改他人档案"); } // 使用Hutool的BeanUtil进行部分更新,忽略null值 BeanUtil.copyProperties(request, userProfile, CopyOptions.create().setIgnoreNullValue(true)); updateById(userProfile); log.info("User profile updated: {}", userProfile.getId()); return convertToResponse(userProfile); } @Override public UserProfileResponse getCurrentUserProfile() { String currentUserId = UserContextHolder.getCurrentUserId(); if (!StringUtils.hasText(currentUserId)) { throw new RuntimeException("用户未登录"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserProfile::getUserId, currentUserId); // 获取最新的一条(理论上应该只有一条) List list = list(queryWrapper); if (list.isEmpty()) { return null; } return convertToResponse(list.get(0)); } @Override public UserProfileResponse getProfileById(String id) { UserProfile userProfile = getById(id); if (userProfile == null) { return null; } return convertToResponse(userProfile); } @Override public PageResult getProfilePage(UserProfilePageRequest request) { Page page = new Page<>(request.getCurrent(), request.getSize()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 构建查询条件 if (StringUtils.hasText(request.getUserId())) { queryWrapper.eq(UserProfile::getUserId, request.getUserId()); } if (StringUtils.hasText(request.getNickname())) { queryWrapper.like(UserProfile::getNickname, request.getNickname()); } if (StringUtils.hasText(request.getMbti())) { queryWrapper.eq(UserProfile::getMbti, request.getMbti()); } if (request.getStatus() != null) { queryWrapper.eq(UserProfile::getStatus, request.getStatus()); } queryWrapper.orderByDesc(UserProfile::getCreateTime); IPage userProfilePage = page(page, queryWrapper); List list = userProfilePage.getRecords().stream() .map(this::convertToResponse) .collect(Collectors.toList()); PageResult result = new PageResult<>(); result.setCurrent(userProfilePage.getCurrent()); result.setSize(userProfilePage.getSize()); result.setTotal(userProfilePage.getTotal()); result.setPages(userProfilePage.getPages()); result.setRecords(list); return result; } @Override public List getProfileList(UserProfilePageRequest request) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 构建查询条件 if (StringUtils.hasText(request.getUserId())) { queryWrapper.eq(UserProfile::getUserId, request.getUserId()); } if (StringUtils.hasText(request.getNickname())) { queryWrapper.like(UserProfile::getNickname, request.getNickname()); } if (StringUtils.hasText(request.getMbti())) { queryWrapper.eq(UserProfile::getMbti, request.getMbti()); } if (request.getStatus() != null) { queryWrapper.eq(UserProfile::getStatus, request.getStatus()); } queryWrapper.orderByDesc(UserProfile::getCreateTime); List list = list(queryWrapper); return list.stream() .map(this::convertToResponse) .collect(Collectors.toList()); } @Override public boolean deleteProfile(String id) { log.info("Deleting user profile: {}", id); return removeById(id); } private UserProfileResponse convertToResponse(UserProfile userProfile) { if (userProfile == null) { return null; } UserProfileResponse response = new UserProfileResponse(); BeanUtils.copyProperties(userProfile, response); return response; } }