SysDeptServiceImpl.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package com.ruoyi.system.service.impl;
  2. import cn.hutool.core.lang.Validator;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.ruoyi.common.annotation.DataScope;
  8. import com.ruoyi.common.constant.UserConstants;
  9. import com.ruoyi.common.core.domain.TreeSelect;
  10. import com.ruoyi.common.core.domain.entity.SysDept;
  11. import com.ruoyi.common.core.domain.entity.SysRole;
  12. import com.ruoyi.common.core.domain.entity.SysUser;
  13. import com.ruoyi.common.exception.CustomException;
  14. import com.ruoyi.system.mapper.SysDeptMapper;
  15. import com.ruoyi.system.mapper.SysRoleMapper;
  16. import com.ruoyi.system.mapper.SysUserMapper;
  17. import com.ruoyi.system.service.ISysDeptService;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import java.util.ArrayList;
  21. import java.util.Arrays;
  22. import java.util.Iterator;
  23. import java.util.List;
  24. import java.util.stream.Collectors;
  25. /**
  26. * 部门管理 服务实现
  27. *
  28. * @author ruoyi
  29. */
  30. @Service
  31. public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements ISysDeptService {
  32. @Autowired
  33. private SysRoleMapper roleMapper;
  34. @Autowired
  35. private SysUserMapper userMapper;
  36. /**
  37. * 查询部门管理数据
  38. *
  39. * @param dept 部门信息
  40. * @return 部门信息集合
  41. */
  42. @Override
  43. @DataScope(deptAlias = "d")
  44. public List<SysDept> selectDeptList(SysDept dept) {
  45. Object dataScope = dept.getParams().get("dataScope");
  46. return list(new LambdaQueryWrapper<SysDept>()
  47. .eq(dept.getParentId() != null && dept.getParentId() != 0,
  48. SysDept::getParentId, dept.getParentId())
  49. .like(StrUtil.isNotBlank(dept.getDeptName()), SysDept::getDeptName, dept.getDeptName())
  50. .eq(StrUtil.isNotBlank(dept.getStatus()), SysDept::getStatus, dept.getStatus())
  51. .apply(dataScope != null, dataScope != null ? dataScope.toString() : null)
  52. .orderByAsc(SysDept::getParentId)
  53. .orderByAsc(SysDept::getOrderNum));
  54. }
  55. /**
  56. * 构建前端所需要树结构
  57. *
  58. * @param depts 部门列表
  59. * @return 树结构列表
  60. */
  61. @Override
  62. public List<SysDept> buildDeptTree(List<SysDept> depts) {
  63. List<SysDept> returnList = new ArrayList<SysDept>();
  64. List<Long> tempList = new ArrayList<Long>();
  65. for (SysDept dept : depts) {
  66. tempList.add(dept.getDeptId());
  67. }
  68. for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext(); ) {
  69. SysDept dept = (SysDept) iterator.next();
  70. // 如果是顶级节点, 遍历该父节点的所有子节点
  71. if (!tempList.contains(dept.getParentId())) {
  72. recursionFn(depts, dept);
  73. returnList.add(dept);
  74. }
  75. }
  76. if (returnList.isEmpty()) {
  77. returnList = depts;
  78. }
  79. return returnList;
  80. }
  81. /**
  82. * 构建前端所需要下拉树结构
  83. *
  84. * @param depts 部门列表
  85. * @return 下拉树结构列表
  86. */
  87. @Override
  88. public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) {
  89. List<SysDept> deptTrees = buildDeptTree(depts);
  90. return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
  91. }
  92. /**
  93. * 根据角色ID查询部门树信息
  94. *
  95. * @param roleId 角色ID
  96. * @return 选中部门列表
  97. */
  98. @Override
  99. public List<Integer> selectDeptListByRoleId(Long roleId) {
  100. SysRole role = roleMapper.selectById(roleId);
  101. return baseMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
  102. }
  103. /**
  104. * 根据部门ID查询信息
  105. *
  106. * @param deptId 部门ID
  107. * @return 部门信息
  108. */
  109. @Override
  110. public SysDept selectDeptById(Long deptId) {
  111. return getById(deptId);
  112. }
  113. /**
  114. * 根据ID查询所有子部门(正常状态)
  115. *
  116. * @param deptId 部门ID
  117. * @return 子部门数
  118. */
  119. @Override
  120. public int selectNormalChildrenDeptById(Long deptId) {
  121. return count(new LambdaQueryWrapper<SysDept>()
  122. .eq(SysDept::getStatus, 0)
  123. .apply("find_in_set({0}, ancestors)", deptId));
  124. }
  125. /**
  126. * 是否存在子节点
  127. *
  128. * @param deptId 部门ID
  129. * @return 结果
  130. */
  131. @Override
  132. public boolean hasChildByDeptId(Long deptId) {
  133. int result = count(new LambdaQueryWrapper<SysDept>()
  134. .eq(SysDept::getParentId, deptId)
  135. .last("limit 1"));
  136. return result > 0 ? true : false;
  137. }
  138. /**
  139. * 查询部门是否存在用户
  140. *
  141. * @param deptId 部门ID
  142. * @return 结果 true 存在 false 不存在
  143. */
  144. @Override
  145. public boolean checkDeptExistUser(Long deptId) {
  146. int result = userMapper.selectCount(new LambdaQueryWrapper<SysUser>()
  147. .eq(SysUser::getDeptId, deptId));
  148. return result > 0 ? true : false;
  149. }
  150. /**
  151. * 校验部门名称是否唯一
  152. *
  153. * @param dept 部门信息
  154. * @return 结果
  155. */
  156. @Override
  157. public String checkDeptNameUnique(SysDept dept) {
  158. Long deptId = Validator.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
  159. SysDept info = getOne(new LambdaQueryWrapper<SysDept>()
  160. .eq(SysDept::getDeptName, dept.getDeptName())
  161. .eq(SysDept::getParentId, dept.getParentId())
  162. .last("limit 1"));
  163. if (Validator.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
  164. return UserConstants.NOT_UNIQUE;
  165. }
  166. return UserConstants.UNIQUE;
  167. }
  168. /**
  169. * 新增保存部门信息
  170. *
  171. * @param dept 部门信息
  172. * @return 结果
  173. */
  174. @Override
  175. public int insertDept(SysDept dept) {
  176. SysDept info = getById(dept.getParentId());
  177. // 如果父节点不为正常状态,则不允许新增子节点
  178. if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
  179. throw new CustomException("部门停用,不允许新增");
  180. }
  181. dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
  182. return baseMapper.insert(dept);
  183. }
  184. /**
  185. * 修改保存部门信息
  186. *
  187. * @param dept 部门信息
  188. * @return 结果
  189. */
  190. @Override
  191. public int updateDept(SysDept dept) {
  192. SysDept newParentDept = getById(dept.getParentId());
  193. SysDept oldDept = getById(dept.getDeptId());
  194. if (Validator.isNotNull(newParentDept) && Validator.isNotNull(oldDept)) {
  195. String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
  196. String oldAncestors = oldDept.getAncestors();
  197. dept.setAncestors(newAncestors);
  198. updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
  199. }
  200. int result = baseMapper.updateById(dept);
  201. if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) {
  202. // 如果该部门是启用状态,则启用该部门的所有上级部门
  203. updateParentDeptStatus(dept);
  204. }
  205. return result;
  206. }
  207. /**
  208. * 修改该部门的父级部门状态
  209. *
  210. * @param dept 当前部门
  211. */
  212. private void updateParentDeptStatus(SysDept dept) {
  213. String updateBy = dept.getUpdateBy();
  214. dept = getById(dept.getDeptId());
  215. dept.setUpdateBy(updateBy);
  216. update(null,new LambdaUpdateWrapper<SysDept>()
  217. .set(StrUtil.isNotBlank(dept.getStatus()),
  218. SysDept::getStatus,dept.getStatus())
  219. .set(StrUtil.isNotBlank(dept.getUpdateBy()),
  220. SysDept::getUpdateBy,dept.getUpdateBy())
  221. .in(SysDept::getDeptId, Arrays.asList(dept.getAncestors().split(","))));
  222. }
  223. /**
  224. * 修改子元素关系
  225. *
  226. * @param deptId 被修改的部门ID
  227. * @param newAncestors 新的父ID集合
  228. * @param oldAncestors 旧的父ID集合
  229. */
  230. public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
  231. List<SysDept> children = list(new LambdaQueryWrapper<SysDept>()
  232. .apply("find_in_set({0},ancestors)",deptId));
  233. for (SysDept child : children) {
  234. child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
  235. }
  236. if (children.size() > 0) {
  237. updateBatchById(children);
  238. }
  239. }
  240. /**
  241. * 删除部门管理信息
  242. *
  243. * @param deptId 部门ID
  244. * @return 结果
  245. */
  246. @Override
  247. public int deleteDeptById(Long deptId) {
  248. return baseMapper.deleteById(deptId);
  249. }
  250. /**
  251. * 递归列表
  252. */
  253. private void recursionFn(List<SysDept> list, SysDept t) {
  254. // 得到子节点列表
  255. List<SysDept> childList = getChildList(list, t);
  256. t.setChildren(childList);
  257. for (SysDept tChild : childList) {
  258. if (hasChild(list, tChild)) {
  259. recursionFn(list, tChild);
  260. }
  261. }
  262. }
  263. /**
  264. * 得到子节点列表
  265. */
  266. private List<SysDept> getChildList(List<SysDept> list, SysDept t) {
  267. List<SysDept> tlist = new ArrayList<SysDept>();
  268. Iterator<SysDept> it = list.iterator();
  269. while (it.hasNext()) {
  270. SysDept n = (SysDept) it.next();
  271. if (Validator.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
  272. tlist.add(n);
  273. }
  274. }
  275. return tlist;
  276. }
  277. /**
  278. * 判断是否有子节点
  279. */
  280. private boolean hasChild(List<SysDept> list, SysDept t) {
  281. return getChildList(list, t).size() > 0 ? true : false;
  282. }
  283. }