package com.ruoyi.web.server.impl.system; import java.util.ArrayList; import java.util.List; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.web.mapper.system.SysDeptMapper; import com.ruoyi.web.server.system.ISysDeptService; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; /** * 部门管理 服务实现 * * @author ruoyi */ @Service public class SysDeptServiceImpl extends ServiceImpl< SysDeptMapper, SysDept> implements ISysDeptService { @Autowired private SysDeptMapper deptMapper; /** * 查询部门管理数据 * * @param dept 部门信息 * @return 部门信息集合 */ @Override @DataScope(deptAlias = "d") public List selectDeptList(SysDept dept) { return deptMapper.selectDeptList(dept); } /** * 查询部门管理树 * * @param dept 部门信息 * @return 所有部门信息 */ @Override @DataScope(deptAlias = "d") public List selectDeptTree(SysDept dept) { List deptList = deptMapper.selectDeptList(dept); List ztrees = initZtree(deptList); return ztrees; } /** * 查询部门管理树(排除下级) * * @param deptId 部门ID * @return 所有部门信息 */ @Override @DataScope(deptAlias = "d") public List selectDeptTreeExcludeChild(SysDept dept) { Long excludeId = dept.getExcludeId(); List depts = deptMapper.selectDeptList(dept); if (excludeId.intValue() > 0) { depts.removeIf(d -> d.getDeptId().intValue() == excludeId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), excludeId + "")); } List ztrees = initZtree(depts); return ztrees; } /** * 根据角色ID查询部门(数据权限) * * @param role 角色对象 * @return 部门列表(数据权限) */ @Override public List roleDeptTreeData(SysRole role) { Long roleId = role.getRoleId(); List ztrees = new ArrayList(); List deptList = SpringUtils.getAopProxy(this).selectDeptList(new SysDept()); if (StringUtils.isNotNull(roleId)) { List roleDeptList = deptMapper.selectRoleDeptTree(roleId); ztrees = initZtree(deptList, roleDeptList); } else { ztrees = initZtree(deptList); } return ztrees; } /** * 对象转部门树 * * @param deptList 部门列表 * @return 树结构列表 */ public List initZtree(List deptList) { return initZtree(deptList, null); } /** * 对象转部门树 * * @param deptList 部门列表 * @param roleDeptList 角色已存在菜单列表 * @return 树结构列表 */ public List initZtree(List deptList, List roleDeptList) { List ztrees = new ArrayList(); boolean isCheck = StringUtils.isNotNull(roleDeptList); for (SysDept dept : deptList) { if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) { Ztree ztree = new Ztree(); ztree.setId(dept.getDeptId()); ztree.setpId(dept.getParentId()); ztree.setName(dept.getDeptName()); ztree.setTitle(dept.getDeptName()); if (isCheck) { ztree.setChecked(roleDeptList.contains(dept.getDeptId() + dept.getDeptName())); } ztrees.add(ztree); } } return ztrees; } /** * 根据父部门ID查询下级部门数量 * * @param parentId 部门ID * @return 结果 */ @Override public int selectDeptCount(Long parentId) { SysDept dept = new SysDept(); dept.setParentId(parentId); return deptMapper.selectDeptCount(dept); } /** * 查询部门是否存在用户 * * @param deptId 部门ID * @return 结果 true 存在 false 不存在 */ @Override public boolean checkDeptExistUser(Long deptId) { int result = deptMapper.checkDeptExistUser(deptId); return result > 0; } /** * 删除部门管理信息 * * @param deptId 部门ID * @return 结果 */ @Override public int deleteDeptById(Long deptId) { return deptMapper.deleteDeptById(deptId); } /** * 新增保存部门信息 * * @param dept 部门信息 * @return 结果 */ @Override public int insertDept(SysDept dept) { SysDept info = deptMapper.selectDeptById(dept.getParentId()); // 如果父节点不为"正常"状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { throw new ServiceException("部门停用,不允许新增"); } dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); return deptMapper.insertDept(dept); } /** * 修改保存部门信息 * * @param dept 部门信息 * @return 结果 */ @Override @Transactional public int updateDept(SysDept dept) { SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); SysDept oldDept = selectDeptById(dept.getDeptId()); 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())) { // 如果该部门是启用状态,则启用该部门的所有上级部门 updateParentDeptStatusNormal(dept); } return result; } /** * 修改该部门的父级部门状态 * * @param dept 当前部门 */ private void updateParentDeptStatusNormal(SysDept dept) { String ancestors = dept.getAncestors(); Long[] deptIds = Convert.toLongArray(ancestors); deptMapper.updateDeptStatusNormal(deptIds); } /** * 修改子元素关系 * * @param deptId 被修改的部门ID * @param newAncestors 新的父ID集合 * @param oldAncestors 旧的父ID集合 */ public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { List children = deptMapper.selectChildrenDeptById(deptId); for (SysDept child : children) { child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); } if (children.size() > 0) { deptMapper.updateDeptChildren(children); } } /** * 根据部门ID查询信息 * * @param deptId 部门ID * @return 部门信息 */ @Override public SysDept selectDeptById(Long deptId) { return deptMapper.selectDeptById(deptId); } /** * 根据ID查询所有子部门(正常状态) * * @param deptId 部门ID * @return 子部门数 */ @Override public int selectNormalChildrenDeptById(Long deptId) { return deptMapper.selectNormalChildrenDeptById(deptId); } /** * 校验部门名称是否唯一 * * @param dept 部门信息 * @return 结果 */ @Override public boolean 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()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验部门是否有数据权限 * * @param deptId 部门id */ @Override public void checkDeptDataScope(Long deptId) { if (!SysUser.isAdmin(ShiroUtils.getUserId()) && StringUtils.isNotNull(deptId)) { SysDept dept = new SysDept(); dept.setDeptId(deptId); List depts = SpringUtils.getAopProxy(this).selectDeptList(dept); if (StringUtils.isEmpty(depts)) { throw new ServiceException("没有权限访问部门数据!"); } } } }