package edu.whut.smilepicturebackend.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import edu.whut.smilepicturebackend.exception.BusinessException; import edu.whut.smilepicturebackend.exception.ErrorCode; import edu.whut.smilepicturebackend.exception.ThrowUtils; import edu.whut.smilepicturebackend.mapper.SpaceUserMapper; import edu.whut.smilepicturebackend.model.dto.spaceuser.SpaceUserAddRequest; import edu.whut.smilepicturebackend.model.dto.spaceuser.SpaceUserQueryRequest; import edu.whut.smilepicturebackend.model.entity.Space; import edu.whut.smilepicturebackend.model.entity.SpaceUser; import edu.whut.smilepicturebackend.model.entity.User; import edu.whut.smilepicturebackend.model.enums.SpaceRoleEnum; import edu.whut.smilepicturebackend.model.vo.SpaceUserVO; import edu.whut.smilepicturebackend.model.vo.SpaceVO; import edu.whut.smilepicturebackend.model.vo.UserVO; import edu.whut.smilepicturebackend.service.SpaceService; import edu.whut.smilepicturebackend.service.SpaceUserService; import edu.whut.smilepicturebackend.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * @author 张三 * @description 针对表【space_user(空间用户关联)】的数据库操作Service实现 */ @Service @RequiredArgsConstructor public class SpaceUserServiceImpl extends ServiceImpl implements SpaceUserService { private final UserService userService; @Lazy private final SpaceService spaceService; @Override public long addSpaceUser(SpaceUserAddRequest spaceUserAddRequest) { // 参数校验 ThrowUtils.throwIf(spaceUserAddRequest == null, ErrorCode.PARAMS_ERROR); SpaceUser spaceUser = new SpaceUser(); BeanUtils.copyProperties(spaceUserAddRequest, spaceUser); validSpaceUser(spaceUser, true); // 数据库操作 boolean result = this.save(spaceUser); ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); return spaceUser.getId(); } @Override public void validSpaceUser(SpaceUser spaceUser, boolean add) { ThrowUtils.throwIf(spaceUser == null, ErrorCode.PARAMS_ERROR); // 创建时,空间 id 和用户 id 必填 Long spaceId = spaceUser.getSpaceId(); Long userId = spaceUser.getUserId(); if (add) { ThrowUtils.throwIf(ObjectUtil.hasEmpty(spaceId, userId), ErrorCode.PARAMS_ERROR); User user = userService.getById(userId); ThrowUtils.throwIf(user == null, ErrorCode.NOT_FOUND_ERROR, "用户不存在"); Space space = spaceService.getById(spaceId); ThrowUtils.throwIf(space == null, ErrorCode.NOT_FOUND_ERROR, "空间不存在"); } // 校验空间角色 String spaceRole = spaceUser.getSpaceRole(); SpaceRoleEnum spaceRoleEnum = SpaceRoleEnum.getEnumByValue(spaceRole); if (spaceRole != null && spaceRoleEnum == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "空间角色不存在"); } } @Override public SpaceUserVO getSpaceUserVO(SpaceUser spaceUser, HttpServletRequest request) { // 对象转封装类 SpaceUserVO spaceUserVO = SpaceUserVO.objToVo(spaceUser); // 关联查询用户信息 Long userId = spaceUser.getUserId(); if (userId != null && userId > 0) { User user = userService.getById(userId); UserVO userVO = userService.getUserVO(user); spaceUserVO.setUser(userVO); } // 关联查询空间信息 Long spaceId = spaceUser.getSpaceId(); if (spaceId != null && spaceId > 0) { Space space = spaceService.getById(spaceId); SpaceVO spaceVO = spaceService.getSpaceVO(space, request); spaceUserVO.setSpace(spaceVO); } return spaceUserVO; } @Override public List getSpaceUserVOList(List spaceUserList) { // 判断输入列表是否为空 if (CollUtil.isEmpty(spaceUserList)) { return Collections.emptyList(); } // 对象列表 => 封装对象列表 List spaceUserVOList = spaceUserList.stream().map(SpaceUserVO::objToVo).collect(Collectors.toList()); // 1. 收集需要关联查询的用户 ID 和空间 ID Set userIdSet = spaceUserList.stream().map(SpaceUser::getUserId).collect(Collectors.toSet()); Set spaceIdSet = spaceUserList.stream().map(SpaceUser::getSpaceId).collect(Collectors.toSet()); // 2. 批量查询用户和空间 Map> userIdUserListMap = userService.listByIds(userIdSet).stream() .collect(Collectors.groupingBy(User::getId)); Map> spaceIdSpaceListMap = spaceService.listByIds(spaceIdSet).stream() .collect(Collectors.groupingBy(Space::getId)); // 3. 填充 SpaceUserVO 的用户和空间信息 spaceUserVOList.forEach(spaceUserVO -> { Long userId = spaceUserVO.getUserId(); Long spaceId = spaceUserVO.getSpaceId(); // 填充用户信息 User user = null; if (userIdUserListMap.containsKey(userId)) { user = userIdUserListMap.get(userId).get(0); } spaceUserVO.setUser(userService.getUserVO(user)); // 填充空间信息 Space space = null; if (spaceIdSpaceListMap.containsKey(spaceId)) { space = spaceIdSpaceListMap.get(spaceId).get(0); } spaceUserVO.setSpace(SpaceVO.objToVo(space)); }); return spaceUserVOList; } @Override public LambdaQueryWrapper getQueryWrapper(SpaceUserQueryRequest req) { if (req == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); } LambdaQueryWrapper qw = Wrappers.lambdaQuery(SpaceUser.class); qw.eq(ObjUtil.isNotEmpty(req.getId()), SpaceUser::getId, req.getId()) .eq(ObjUtil.isNotEmpty(req.getSpaceId()), SpaceUser::getSpaceId, req.getSpaceId()) .eq(ObjUtil.isNotEmpty(req.getUserId()), SpaceUser::getUserId, req.getUserId()) .eq(ObjUtil.isNotEmpty(req.getSpaceRole()),SpaceUser::getSpaceRole, req.getSpaceRole()); return qw; } }