|  |  | 
 |  |  | package com.ruoyi.system.service.impl; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Iterator; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | 
 |  |  |  * @author ruoyi | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | public class SysDeptServiceImpl implements ISysDeptService | 
 |  |  | { | 
 |  |  | public class SysDeptServiceImpl implements ISysDeptService { | 
 |  |  |     @Autowired | 
 |  |  |     private SysDeptMapper deptMapper; | 
 |  |  |  | 
 |  |  | 
 |  |  |     private SysRoleMapper roleMapper; | 
 |  |  |  | 
 |  |  |     @Value("${isAdmin}") | 
 |  |  |     private  List<Long> isAdmin; | 
 |  |  |     private List<Long> isAdmin; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 查询部门管理数据 | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     @DataScope(deptAlias = "d") | 
 |  |  |     public List<SysDept> selectDeptList(SysDept dept) | 
 |  |  |     { | 
 |  |  |     public List<SysDept> selectDeptList(SysDept dept) { | 
 |  |  |         return deptMapper.selectDeptList(dept); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, String> selectDept(String orgid) { | 
 |  |  |         SysDept sysDept = new SysDept(); | 
 |  |  |         sysDept.setOrgid(orgid); | 
 |  |  |         List<SysDept> sysDepts = deptMapper.selectDeptList(sysDept); | 
 |  |  |         Map<String, String> map = new HashMap<>(); | 
 |  |  |         for (SysDept sd : sysDepts) { | 
 |  |  |             map.put(sd.getDeptCode(), sd.getDeptName()); | 
 |  |  |         } | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |      * @return 部门树信息集合 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<TreeSelect> selectDeptTreeList(SysDept dept) | 
 |  |  |     { | 
 |  |  |     public List<TreeSelect> selectDeptTreeList(SysDept dept) { | 
 |  |  |         List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); | 
 |  |  |         return buildDeptTreeSelect(depts); | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 树结构列表 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<SysDept> buildDeptTree(List<SysDept> depts) | 
 |  |  |     { | 
 |  |  |     public List<SysDept> buildDeptTree(List<SysDept> depts) { | 
 |  |  |         List<SysDept> returnList = new ArrayList<SysDept>(); | 
 |  |  |         List<Long> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); | 
 |  |  |         for (SysDept dept : depts) | 
 |  |  |         { | 
 |  |  |         for (SysDept dept : depts) { | 
 |  |  |             // 如果是顶级节点, 遍历该父节点的所有子节点 | 
 |  |  |             if (!tempList.contains(dept.getParentId())) | 
 |  |  |             { | 
 |  |  |             if (!tempList.contains(dept.getParentId())) { | 
 |  |  |                 recursionFn(depts, dept); | 
 |  |  |                 returnList.add(dept); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (returnList.isEmpty()) | 
 |  |  |         { | 
 |  |  |         if (returnList.isEmpty()) { | 
 |  |  |             returnList = depts; | 
 |  |  |         } | 
 |  |  |         return returnList; | 
 |  |  | 
 |  |  |      * @return 下拉树结构列表 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) | 
 |  |  |     { | 
 |  |  |     public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) { | 
 |  |  |         List<SysDept> deptTrees = buildDeptTree(depts); | 
 |  |  |         return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 选中部门列表 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public List<Long> selectDeptListByRoleId(Long roleId) | 
 |  |  |     { | 
 |  |  |     public List<Long> selectDeptListByRoleId(Long roleId) { | 
 |  |  |         SysRole role = roleMapper.selectRoleById(roleId); | 
 |  |  |         return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 部门信息 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public SysDept selectDeptById(Long deptId) | 
 |  |  |     { | 
 |  |  |     public SysDept selectDeptById(Long deptId) { | 
 |  |  |         return deptMapper.selectDeptById(deptId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |      * @return 子部门数 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int selectNormalChildrenDeptById(Long deptId) | 
 |  |  |     { | 
 |  |  |     public int selectNormalChildrenDeptById(Long deptId) { | 
 |  |  |         return deptMapper.selectNormalChildrenDeptById(deptId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public boolean hasChildByDeptId(Long deptId) | 
 |  |  |     { | 
 |  |  |     public boolean hasChildByDeptId(Long deptId) { | 
 |  |  |         int result = deptMapper.hasChildByDeptId(deptId); | 
 |  |  |         return result > 0; | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 结果 true 存在 false 不存在 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public boolean checkDeptExistUser(Long deptId) | 
 |  |  |     { | 
 |  |  |     public boolean checkDeptExistUser(Long deptId) { | 
 |  |  |         int result = deptMapper.checkDeptExistUser(deptId); | 
 |  |  |         return result > 0; | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public String checkDeptNameUnique(SysDept dept) | 
 |  |  |     { | 
 |  |  |     public String checkDeptNameUnique(SysDept dept) { | 
 |  |  |         Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); | 
 |  |  |         SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); | 
 |  |  |         if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) | 
 |  |  |         { | 
 |  |  |         if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) { | 
 |  |  |             return UserConstants.NOT_UNIQUE; | 
 |  |  |         } | 
 |  |  |         return UserConstants.UNIQUE; | 
 |  |  | 
 |  |  |      * @param deptId 部门id | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public void checkDeptDataScope(Long deptId) | 
 |  |  |     { | 
 |  |  |     public void checkDeptDataScope(Long deptId) { | 
 |  |  | //        if (!SysUser.isAdmin(SecurityUtils.getUserId())) | 
 |  |  |         if (!isAdmin.contains(SecurityUtils.getUserId())) | 
 |  |  |         { | 
 |  |  |         if (!isAdmin.contains(SecurityUtils.getUserId())) { | 
 |  |  |             SysDept dept = new SysDept(); | 
 |  |  |             dept.setDeptId(deptId); | 
 |  |  |             List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); | 
 |  |  |             if (StringUtils.isEmpty(depts)) | 
 |  |  |             { | 
 |  |  |             if (StringUtils.isEmpty(depts)) { | 
 |  |  |                 throw new ServiceException("没有权限访问部门数据!"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int insertDept(SysDept dept) | 
 |  |  |     { | 
 |  |  |     public int insertDept(SysDept dept) { | 
 |  |  |         SysDept info = deptMapper.selectDeptById(dept.getParentId()); | 
 |  |  |         // 如果父节点不为正常状态,则不允许新增子节点 | 
 |  |  |         if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) | 
 |  |  |         { | 
 |  |  |         if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { | 
 |  |  |             throw new ServiceException("部门停用,不允许新增"); | 
 |  |  |         } | 
 |  |  |         dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); | 
 |  |  | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int updateDept(SysDept dept) | 
 |  |  |     { | 
 |  |  |     public int updateDept(SysDept dept) { | 
 |  |  |         SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); | 
 |  |  |         SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); | 
 |  |  |         if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) | 
 |  |  |         { | 
 |  |  |         if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) { | 
 |  |  |             String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); | 
 |  |  |             String oldAncestors = oldDept.getAncestors(); | 
 |  |  |             dept.setAncestors(newAncestors); | 
 |  |  |             updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); | 
 |  |  |         } | 
 |  |  |         int result = deptMapper.updateDept(dept); | 
 |  |  |         if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) | 
 |  |  |                 && !StringUtils.equals("0", dept.getAncestors())) | 
 |  |  |         { | 
 |  |  |         if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) && !StringUtils.equals("0", dept.getAncestors())) { | 
 |  |  |             // 如果该部门是启用状态,则启用该部门的所有上级部门 | 
 |  |  |             updateParentDeptStatusNormal(dept); | 
 |  |  |         } | 
 |  |  | 
 |  |  |      * | 
 |  |  |      * @param dept 当前部门 | 
 |  |  |      */ | 
 |  |  |     private void updateParentDeptStatusNormal(SysDept dept) | 
 |  |  |     { | 
 |  |  |     private void updateParentDeptStatusNormal(SysDept dept) { | 
 |  |  |         String ancestors = dept.getAncestors(); | 
 |  |  |         Long[] deptIds = Convert.toLongArray(ancestors); | 
 |  |  |         deptMapper.updateDeptStatusNormal(deptIds); | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 修改子元素关系 | 
 |  |  |      * | 
 |  |  |      * @param deptId 被修改的部门ID | 
 |  |  |      * @param deptId       被修改的部门ID | 
 |  |  |      * @param newAncestors 新的父ID集合 | 
 |  |  |      * @param oldAncestors 旧的父ID集合 | 
 |  |  |      */ | 
 |  |  |     public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) | 
 |  |  |     { | 
 |  |  |     public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { | 
 |  |  |         List<SysDept> children = deptMapper.selectChildrenDeptById(deptId); | 
 |  |  |         for (SysDept child : children) | 
 |  |  |         { | 
 |  |  |         for (SysDept child : children) { | 
 |  |  |             child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); | 
 |  |  |         } | 
 |  |  |         if (children.size() > 0) | 
 |  |  |         { | 
 |  |  |         if (children.size() > 0) { | 
 |  |  |             deptMapper.updateDeptChildren(children); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public int deleteDeptById(Long deptId) | 
 |  |  |     { | 
 |  |  |     public int deleteDeptById(Long deptId) { | 
 |  |  |         return deptMapper.deleteDeptById(deptId); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 递归列表 | 
 |  |  |      */ | 
 |  |  |     private void recursionFn(List<SysDept> list, SysDept t) | 
 |  |  |     { | 
 |  |  |     private void recursionFn(List<SysDept> list, SysDept t) { | 
 |  |  |         // 得到子节点列表 | 
 |  |  |         List<SysDept> childList = getChildList(list, t); | 
 |  |  |         t.setChildren(childList); | 
 |  |  |         for (SysDept tChild : childList) | 
 |  |  |         { | 
 |  |  |             if (hasChild(list, tChild)) | 
 |  |  |             { | 
 |  |  |         for (SysDept tChild : childList) { | 
 |  |  |             if (hasChild(list, tChild)) { | 
 |  |  |                 recursionFn(list, tChild); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 得到子节点列表 | 
 |  |  |      */ | 
 |  |  |     private List<SysDept> getChildList(List<SysDept> list, SysDept t) | 
 |  |  |     { | 
 |  |  |     private List<SysDept> getChildList(List<SysDept> list, SysDept t) { | 
 |  |  |         List<SysDept> tlist = new ArrayList<SysDept>(); | 
 |  |  |         Iterator<SysDept> it = list.iterator(); | 
 |  |  |         while (it.hasNext()) | 
 |  |  |         { | 
 |  |  |         while (it.hasNext()) { | 
 |  |  |             SysDept n = (SysDept) it.next(); | 
 |  |  |             if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) | 
 |  |  |             { | 
 |  |  |             if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { | 
 |  |  |                 tlist.add(n); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 判断是否有子节点 | 
 |  |  |      */ | 
 |  |  |     private boolean hasChild(List<SysDept> list, SysDept t) | 
 |  |  |     { | 
 |  |  |     private boolean hasChild(List<SysDept> list, SysDept t) { | 
 |  |  |         return getChildList(list, t).size() > 0; | 
 |  |  |     } | 
 |  |  | } |