package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.enums.StatusEnum; import com.youlai.system.converter.DeptConverter; import com.youlai.system.mapper.SysDeptMapper; import com.youlai.system.model.entity.SysDept; import com.youlai.system.model.form.DeptForm; import com.youlai.system.model.query.DeptQuery; import com.youlai.system.model.vo.DeptVO; import com.youlai.system.common.model.Option; import com.youlai.system.service.SysDeptService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 部门 业务实现类 * * @author Ray * @since 2021/08/22 */ @Service @RequiredArgsConstructor public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { private final DeptConverter deptConverter; /** * 获取部门列表 */ @Override public List getDeptList(DeptQuery queryParams) { // 查询参数 String keywords = queryParams.getKeywords(); Integer status = queryParams.getStatus(); // 查询数据 List deptList = this.list( new LambdaQueryWrapper() .like(StrUtil.isNotBlank(keywords), SysDept::getName, keywords) .eq(status != null, SysDept::getStatus, status) .orderByAsc(SysDept::getSort) ); if (CollectionUtil.isEmpty(deptList)) { return Collections.EMPTY_LIST; } // 获取所有部门ID Set deptIds = deptList.stream() .map(SysDept::getId) .collect(Collectors.toSet()); // 获取父节点ID Set parentIds = deptList.stream() .map(SysDept::getParentId) .collect(Collectors.toSet()); // 获取根节点ID(递归的起点),即父节点ID中不包含在部门ID中的节点,注意这里不能拿顶级部门 O 作为根节点,因为部门筛选的时候 O 会被过滤掉 List rootIds = CollectionUtil.subtractToList(parentIds, deptIds); // 递归生成部门树形列表 return rootIds.stream() .flatMap(rootId -> recurDeptList(rootId, deptList).stream()) .toList(); } /** * 递归生成部门树形列表 * * @param parentId 父ID * @param deptList 部门列表 * @return 部门树形列表 */ public List recurDeptList(Long parentId, List deptList) { return deptList.stream() .filter(dept -> dept.getParentId().equals(parentId)) .map(dept -> { DeptVO deptVO = deptConverter.convertToVo(dept); List children = recurDeptList(dept.getId(), deptList); deptVO.setChildren(children); return deptVO; }).toList(); } /** * 部门下拉选项 * * @return 部门下拉List集合 */ @Override public List