package com.youlai.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Validator; 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.common.enums.StatusEnum; import com.youlai.system.pojo.vo.Option; import com.youlai.system.converter.DeptConverter; import com.youlai.system.mapper.SysDeptMapper; import com.youlai.system.pojo.entity.SysDept; import com.youlai.system.pojo.form.DeptForm; import com.youlai.system.pojo.query.DeptQuery; import com.youlai.system.pojo.vo.DeptVO; import com.youlai.system.service.SysDeptService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 部门业务实现类 * * @author haoxr * @date 2021-08-22 */ @Service @RequiredArgsConstructor public class SysDeptServiceImpl extends ServiceImpl implements SysDeptService { private final DeptConverter deptConverter; /** * 部门列表 */ @Override public List listDepartments(DeptQuery queryParams) { // 查询参数 String keywords = queryParams.getKeywords(); Integer status = queryParams.getStatus(); // 查询数据 List deptList = this.list( new LambdaQueryWrapper() .like(StrUtil.isNotBlank(keywords), SysDept::getName, keywords) .eq(Validator.isNotNull(status), SysDept::getStatus, status) .orderByAsc(SysDept::getSort) ); List list = new ArrayList<>(); if (CollectionUtil.isNotEmpty(deptList)) { Set cacheDeptIds = deptList.stream() .map(SysDept::getId) .collect(Collectors.toSet()); for (SysDept dept : deptList) { Long parentId = dept.getParentId(); // 不在缓存ID列表的parentId是顶级节点ID,以此作为递归开始 if (cacheDeptIds.contains(parentId) == false) { list.addAll(recurDeptList(parentId, deptList)); cacheDeptIds.add(parentId); // 避免重复递归 } } } // 列表为空说明所有的节点都是独立的 if (list.isEmpty()) { return deptList.stream().map(item -> { DeptVO deptVO = new DeptVO(); BeanUtil.copyProperties(item, deptVO); return deptVO; }) .collect(Collectors.toList()); } return list; } /** * 递归生成部门树形列表 * * @param parentId * @param deptList * @return */ public List recurDeptList(Long parentId, List deptList) { List list = deptList.stream() .filter(dept -> dept.getParentId().equals(parentId)) .map(dept -> { DeptVO deptVO = deptConverter.entity2Vo(dept); List children = recurDeptList(dept.getId(), deptList); deptVO.setChildren(children); return deptVO; }).collect(Collectors.toList()); return list; } /** * 部门下拉选项 * * @return */ @Override public List