package com.jcdm.system.service.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.jcdm.common.annotation.DataScope; import com.jcdm.common.constant.UserConstants; import com.jcdm.common.core.domain.TreeSelect; import com.jcdm.common.core.domain.entity.SysDept; import com.jcdm.common.core.domain.entity.SysRole; import com.jcdm.common.core.domain.entity.SysUser; import com.jcdm.common.core.text.Convert; import com.jcdm.common.exception.ServiceException; import com.jcdm.common.utils.SecurityUtils; import com.jcdm.common.utils.StringUtils; import com.jcdm.common.utils.spring.SpringUtils; import com.jcdm.system.mapper.SysDeptMapper; import com.jcdm.system.mapper.SysRoleMapper; import com.jcdm.system.service.ISysDeptService; /** * éƒ¨é—¨ç®¡ç† æœåŠ¡å®žçŽ° * * @author jc */ @Service public class SysDeptServiceImpl implements ISysDeptService { @Autowired private SysDeptMapper deptMapper; @Autowired private SysRoleMapper roleMapper; /** * 查询部门管ç†æ•°æ® * * @param dept éƒ¨é—¨ä¿¡æ¯ * @return 部门信æ¯é›†åˆ */ @Override @DataScope(deptAlias = "d") public List<SysDept> selectDeptList(SysDept dept) { return deptMapper.selectDeptList(dept); } /** * æŸ¥è¯¢éƒ¨é—¨æ ‘ç»“æž„ä¿¡æ¯ * * @param dept éƒ¨é—¨ä¿¡æ¯ * @return éƒ¨é—¨æ ‘ä¿¡æ¯é›†åˆ */ @Override public List<TreeSelect> selectDeptTreeList(SysDept dept) { List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); return buildDeptTreeSelect(depts); } /** * 构建å‰ç«¯æ‰€éœ€è¦æ ‘结构 * * @param depts 部门列表 * @return æ ‘ç»“æž„åˆ—è¡¨ */ @Override 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) { // 如果是顶级节点, é历该父节点的所有å节点 if (!tempList.contains(dept.getParentId())) { recursionFn(depts, dept); returnList.add(dept); } } if (returnList.isEmpty()) { returnList = depts; } return returnList; } /** * 构建å‰ç«¯æ‰€éœ€è¦ä¸‹æ‹‰æ ‘结构 * * @param depts 部门列表 * @return ä¸‹æ‹‰æ ‘ç»“æž„åˆ—è¡¨ */ @Override public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) { List<SysDept> deptTrees = buildDeptTree(depts); return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); } /** * æ ¹æ®è§’色IDæŸ¥è¯¢éƒ¨é—¨æ ‘ä¿¡æ¯ * * @param roleId 角色ID * @return 选ä¸éƒ¨é—¨åˆ—表 */ @Override public List<Long> selectDeptListByRoleId(Long roleId) { SysRole role = roleMapper.selectRoleById(roleId); return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); } /** * æ ¹æ®éƒ¨é—¨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 deptId 部门ID * @return 结果 */ @Override public boolean hasChildByDeptId(Long deptId) { int result = deptMapper.hasChildByDeptId(deptId); return result > 0; } /** * 查询部门是å¦å˜åœ¨ç”¨æˆ· * * @param deptId 部门ID * @return 结果 true å˜åœ¨ false ä¸å˜åœ¨ */ @Override public boolean checkDeptExistUser(Long deptId) { int result = deptMapper.checkDeptExistUser(deptId); return result > 0; } /** * æ ¡éªŒéƒ¨é—¨å称是å¦å”¯ä¸€ * * @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(SecurityUtils.getUserId())) { SysDept dept = new SysDept(); dept.setDeptId(deptId); List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept); if (StringUtils.isEmpty(depts)) { throw new ServiceException("没有æƒé™è®¿é—®éƒ¨é—¨æ•°æ®ï¼"); } } } /** * 新增ä¿å˜éƒ¨é—¨ä¿¡æ¯ * * @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 public int updateDept(SysDept dept) { SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); SysDept oldDept = deptMapper.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<SysDept> children = deptMapper.selectChildrenDeptById(deptId); for (SysDept child : children) { child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); } if (children.size() > 0) { deptMapper.updateDeptChildren(children); } } /** * åˆ é™¤éƒ¨é—¨ç®¡ç†ä¿¡æ¯ * * @param deptId 部门ID * @return 结果 */ @Override public int deleteDeptById(Long deptId) { return deptMapper.deleteDeptById(deptId); } /** * 递归列表 */ 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)) { recursionFn(list, tChild); } } } /** * 得到å节点列表 */ private List<SysDept> getChildList(List<SysDept> list, SysDept t) { List<SysDept> tlist = new ArrayList<SysDept>(); Iterator<SysDept> it = list.iterator(); while (it.hasNext()) { SysDept n = (SysDept) it.next(); if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { tlist.add(n); } } return tlist; } /** * 判æ–是å¦æœ‰å节点 */ private boolean hasChild(List<SysDept> list, SysDept t) { return getChildList(list, t).size() > 0; } }