SysDeptServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. package com.ydtech.modules.admin.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.ydtech.core.page.HttpResult;
  8. import com.ydtech.core.page.PageRequest;
  9. import com.ydtech.core.page.PageResult;
  10. import com.ydtech.exception.SystemException;
  11. import com.ydtech.modules.admin.dao.SysAreaMapper;
  12. import com.ydtech.modules.admin.dao.SysDeptMapper;
  13. import com.ydtech.modules.admin.model.SysArea;
  14. import com.ydtech.modules.admin.model.SysDept;
  15. import com.ydtech.modules.admin.model.vo.SysDeptRemoveVo;
  16. import com.ydtech.modules.admin.model.SysUser;
  17. import com.ydtech.modules.admin.model.po.SysUserTreeShowLevel;
  18. import com.ydtech.modules.admin.model.vo.SysDeptVo;
  19. import com.ydtech.modules.admin.model.vo.TreeSysDeptVO;
  20. import com.ydtech.modules.admin.service.SysAreaService;
  21. import com.ydtech.modules.admin.service.SysDeptService;
  22. import com.ydtech.modules.admin.service.SysUserTreeShowLevelService;
  23. import com.ydtech.modules.base.controller.BaseController;
  24. import com.ydtech.modules.protocol.utils.AssertionUtils;
  25. import com.ydtech.utils.StringUtils;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Service;
  29. import org.springframework.transaction.annotation.Transactional;
  30. import org.springframework.util.ObjectUtils;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. @Service
  34. public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept>
  35. implements SysDeptService {
  36. @Autowired
  37. private SysDeptMapper sysDeptMapper;
  38. @Autowired
  39. private SysAreaService sysAreaService;
  40. @Autowired
  41. private SysAreaMapper sysAreaMapper;
  42. @Autowired
  43. private SysUserTreeShowLevelService sysUserTreeShowLevelService;
  44. /**
  45. * 根据用户权限和指定部门ID,查询并构建部门树。
  46. *
  47. * @param deptId 部门ID,用于查询特定部门及其子部门,如果为空或特定值,则查询用户所在部门及其子部门。
  48. * @param managementSource 管理范围来源标识,用于不同场景下的部门树构建。
  49. * @return 返回符合用户权限和管理范围的部门树列表。
  50. */
  51. @Override
  52. public List<SysDept> findTree(String deptId, String managementSource) {
  53. // 获取当前操作用户
  54. SysUser user = BaseController.getUser();
  55. String userId = user.getId();
  56. // 根据用户ID查询用户的部门树展示级别
  57. LambdaQueryWrapper<SysUserTreeShowLevel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  58. lambdaQueryWrapper.eq(SysUserTreeShowLevel::getUserId, userId);
  59. SysUserTreeShowLevel treeShowLevel = sysUserTreeShowLevelService.getOne(lambdaQueryWrapper);
  60. List<SysDept> treeByShowLevel = new ArrayList<>();
  61. //如果当前用户未配置树展示等级,则默认为查询全部
  62. if (Objects.isNull(treeShowLevel)) {
  63. treeShowLevel = new SysUserTreeShowLevel();
  64. treeShowLevel.setShowLevel("subordinate");
  65. }
  66. // 如果指定的部门ID为空或特定值,则使用当前用户所在部门ID
  67. if (null == deptId || "".equals(deptId) || "undefined".equals(deptId)) {
  68. deptId = user.getDeptId();
  69. }
  70. // 根据用户的部门树展示级别查询相应的部门树
  71. switch (treeShowLevel.getShowLevel()) {
  72. case "all":
  73. treeByShowLevel = findTreeByShowLevel("9", managementSource, "all");
  74. break;
  75. case "same":
  76. treeByShowLevel = findTreeByShowLevel(deptId, managementSource, "same");
  77. break;
  78. case "subordinate":
  79. treeByShowLevel = findTreeByShowLevel(deptId, managementSource, "subordinate");
  80. break;
  81. }
  82. return treeByShowLevel;
  83. }
  84. private List<SysDept> findTreeByShowLevel(String deptId, String managementSource, String showLevel) {
  85. SysDept sysDept = getById(deptId);
  86. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  87. lqw.eq(SysDept::getDelFlag, 0);
  88. lqw.likeRight(SysDept::getId, deptId);
  89. lqw.orderByAsc(SysDept::getOrderNum);
  90. List<SysDept> sysDeptList = list(lqw);
  91. //判断机构来源条件 进行遍历
  92. if (null != managementSource && !"undefined".equals(managementSource) && !"".equals(managementSource)) {
  93. lqw.eq(SysDept::getManagementSource, managementSource);
  94. //条件
  95. List<SysDept> conditionList = list(lqw);
  96. Map<String, List<SysDept>> conditionMap = conditionList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  97. Map<String, List<SysDept>> map = conditionList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  98. //先查第6层
  99. conditionList.forEach(i ->
  100. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()))
  101. );
  102. List<SysDept> result = new ArrayList<>();
  103. //再查前4层
  104. int level = 5;
  105. while (level > 0) {
  106. List<SysDept> resultTmp = recursion(sysDeptList, conditionMap);
  107. if (resultTmp.size() == 0) {
  108. break;
  109. } else {
  110. result.clear();
  111. result.addAll(resultTmp);
  112. }
  113. conditionMap = result.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  114. level--;
  115. }
  116. sysDeptList = result;
  117. } else {
  118. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  119. sysDeptList.forEach(i -> {
  120. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  121. i.setDeptCount(i.getChildren().size());
  122. });
  123. sysDeptList = map.get(sysDept.getParentId());
  124. }
  125. if (showLevel.equals("same")) {
  126. if (null != managementSource && !"undefined".equals(managementSource) && !"".equals(managementSource)) {
  127. if (sysDept.getManagementSource().equals(managementSource)){
  128. sysDeptList.clear();
  129. sysDeptList.add(sysDept);
  130. }else {
  131. return new ArrayList<>();
  132. }
  133. }else {
  134. sysDeptList.clear();
  135. sysDeptList.add(sysDept);
  136. }
  137. }
  138. return sysDeptList;
  139. }
  140. private List<SysDept> recursion(List<SysDept> sysDeptList, Map<String, List<SysDept>> conditionMap) {
  141. List<SysDept> result = new ArrayList<>();
  142. sysDeptList.forEach(i ->
  143. conditionMap.forEach((key, value) -> {
  144. if (i.getId().equals(key)) {
  145. if (i.getChildren() == null) {
  146. i.setChildren(new ArrayList<>());
  147. }
  148. i.getChildren().addAll(value);
  149. result.add(i);
  150. }
  151. })
  152. );
  153. result.sort(Comparator.comparing(SysDept::getOrderNum));
  154. return result;
  155. }
  156. @Override
  157. public List<SysDept> getUserList(String deptId) {
  158. SysDept sysDept = getById(deptId);
  159. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  160. lqw.eq(SysDept::getDelFlag, 0);
  161. lqw.likeRight(SysDept::getId, deptId);
  162. List<SysDept> sysDeptList = list(lqw);
  163. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  164. return map.get(sysDept.getParentId());
  165. }
  166. @Override
  167. @Transactional
  168. public void addDept(SysDeptVo sysDeptVo) {
  169. SysDept sysDept = new SysDept();
  170. BeanUtils.copyProperties(sysDeptVo, sysDept);
  171. String comlevel = ObjectUtils.isEmpty(sysDept.getComlevel()) ? "" : sysDept.getComlevel();
  172. String parentId = sysDept.getParentId();
  173. String number;
  174. if (comlevel.equals("2")) {
  175. AssertionUtils.isStringEmpty(sysDept.getProvince(), "二级机构份必填");
  176. number = sysDept.getProvince().substring(0, 2);
  177. } else if (comlevel.equals("3")) {
  178. AssertionUtils.isStringEmpty(sysDept.getCity(), "三级机构市必填");
  179. number = sysDept.getCity().substring(0, 4);
  180. } else if (comlevel.equals("4")) {
  181. AssertionUtils.isStringEmpty(sysDept.getArea(), "四级机构区必填");
  182. number = sysDept.getArea().substring(0, 6);
  183. } else {
  184. if (comlevel.equals("5")) {
  185. sysDeptVo.setDeptType("M");
  186. }
  187. String maxId = baseMapper.getMaxId(sysDept.getParentId());
  188. if (!maxId.equals("0")) {
  189. String substring = maxId.substring(sysDept.getParentId().length() + 1);
  190. int i = Integer.parseInt("1" + substring) + 1;
  191. number = String.valueOf(i);
  192. } else {
  193. number = "101";
  194. }
  195. }
  196. String substring = number.substring(number.length() - 2);
  197. String serialNumber;
  198. if ("M,D".contains(sysDeptVo.getDeptType())) {
  199. serialNumber = parentId + sysDeptVo.getDeptType() + substring;
  200. } else {
  201. serialNumber = parentId + substring;
  202. }
  203. sysDept.setId(serialNumber);
  204. SysDept dept = getById(sysDept.getId());
  205. if (!ObjectUtils.isEmpty(dept)) {
  206. throw new SystemException("机构编号为:" + dept.getId() + " " + dept.getName() + "已被占用");
  207. }
  208. SysDept parentDept = baseMapper.selectById(sysDept.getParentId());
  209. if (parentDept.getComlevel().equals("5")){
  210. sysDept.setManagementSource(parentDept.getManagementSource());
  211. }
  212. // 查询当前部门序号是否存在
  213. LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
  214. qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  215. qw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
  216. qw.eq(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号相同
  217. boolean exists = baseMapper.exists(qw);
  218. if (exists) {
  219. // 如果存在,查询该父级部门下排序号大于当前部门的部门列表
  220. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  221. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  222. lqw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
  223. lqw.ge(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号大于等于当前部门
  224. List<SysDept> sysDeptList = list(lqw);
  225. // 更新这些部门的排序号
  226. sysDeptList.forEach(i -> {
  227. i.setOrderNum(i.getOrderNum() + 1);
  228. updateById(i);
  229. });
  230. }
  231. boolean b = save(sysDept);
  232. AssertionUtils.isSucceed(b, "删除失败");
  233. }
  234. @Override
  235. @Transactional
  236. public HttpResult updateDept(SysDept record) {
  237. // 查询修改的序号是否存在
  238. LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
  239. qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  240. qw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  241. qw.eq(SysDept::getOrderNum, record.getOrderNum()); // 排序号相同
  242. boolean exists = baseMapper.exists(qw);
  243. //不存在则直接修改
  244. if (!exists) {
  245. baseMapper.updateById(record);
  246. return HttpResult.ok();
  247. }
  248. //查询机构
  249. SysDept sysDept = getById(record.getId());
  250. //原本的序号
  251. Integer orderNum = sysDept.getOrderNum();
  252. //本次修改的序号
  253. Integer newOrderNum = record.getOrderNum();
  254. // 向上换位
  255. if (newOrderNum < orderNum) {
  256. // 查询该父级部门下排序号大于当前部门的部门列表
  257. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  258. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  259. lqw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  260. lqw.ge(SysDept::getOrderNum, record.getOrderNum()); // 排序号大于等于当前部门
  261. List<SysDept> sysDeptList = list(lqw);
  262. sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum));
  263. for (SysDept dept : sysDeptList) {
  264. dept.setOrderNum(dept.getOrderNum() + 1);
  265. updateById(dept);
  266. if (dept.getOrderNum().equals(orderNum)) {
  267. break;
  268. }
  269. }
  270. baseMapper.updateById(record);
  271. }
  272. //向下换位
  273. if (newOrderNum > orderNum) {
  274. // 查询该父级部门下排序号小于当前部门的部门列表
  275. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  276. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  277. lqw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  278. lqw.le(SysDept::getOrderNum, record.getOrderNum()); // 排序号大于等于当前部门
  279. List<SysDept> sysDeptList = list(lqw);
  280. sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum).reversed());
  281. for (SysDept dept : sysDeptList) {
  282. dept.setOrderNum(dept.getOrderNum() - 1);
  283. updateById(dept);
  284. if (dept.getOrderNum().equals(orderNum)) {
  285. break;
  286. }
  287. }
  288. baseMapper.updateById(record);
  289. }
  290. if (newOrderNum.equals(orderNum)) {
  291. baseMapper.updateById(record);
  292. }
  293. return HttpResult.ok();
  294. }
  295. @Override
  296. public void deleteDept(SysDeptRemoveVo sysDeptRemoveVo) {
  297. SysDept sysDept = getById(sysDeptRemoveVo.getDeptId());
  298. List<SysDept> list = lambdaQuery().eq(SysDept::getParentId, sysDept.getId()).list();
  299. if (list.isEmpty()) {
  300. boolean b = removeById(sysDeptRemoveVo.getDeptId());
  301. AssertionUtils.isSucceed(b, "删除失败");
  302. } else {
  303. throw new SystemException(sysDept.getName() + "下还有其他隶属机构");
  304. }
  305. }
  306. @Override
  307. public PageResult<SysDept> findSubDepts(PageRequest pageRequest) {
  308. String id = pageRequest.getColumnFilterValue(pageRequest, "id");
  309. String managementSource = pageRequest.getColumnFilterValue(pageRequest, "managementSource");
  310. Page<SysDept> p = PageRequest.buildPageRequest(pageRequest);
  311. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  312. lqw.eq(StringUtils.isNotEmpty(id), SysDept::getParentId, id);
  313. lqw.eq(StringUtils.isNotEmpty(managementSource), SysDept::getManagementSource, managementSource);
  314. IPage<SysDept> pResult = page(p, lqw);
  315. //传入查询条件
  316. return PageResult.buildPageResult(pResult);
  317. }
  318. public String findMaxDeptId(String deptId) {
  319. if (deptId == null) return "";
  320. String result = "00";
  321. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  322. qw.likeRight(StringUtils.isNotEmpty(deptId), "id", deptId + "D%");
  323. qw.select("IFNULL(MAX(id),0) maxid");
  324. Map<String, Object> m = getMap(qw);
  325. String maxId = m.get("maxid").toString();
  326. if (!maxId.equalsIgnoreCase("0") && !maxId.equalsIgnoreCase(deptId)) {
  327. result = maxId.substring(deptId.length() + 1);
  328. }
  329. return result;
  330. }
  331. public String findMaxHouseId(String deptId) {
  332. if (deptId == null) {
  333. return "";
  334. }
  335. String result = "00";
  336. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  337. qw.like(StringUtils.isNotEmpty(deptId), "id", deptId + "M%");
  338. qw.select("IFNULL(MAX(id),0) maxid");
  339. Map<String, Object> m = getMap(qw);
  340. String maxId = m.get("maxid").toString();
  341. if (!maxId.equalsIgnoreCase("0") && !maxId.equalsIgnoreCase(deptId)) {
  342. result = maxId.substring(deptId.length() + 1);
  343. }
  344. return result;
  345. }
  346. //
  347. @Override
  348. public List<TreeSysDeptVO> selectListWhere(String where, Object[] paramValues) {
  349. String sql = "select t1.id, t1.name, t1.parent_id, t1.dept_code, t1.province, t1.city, t1.area, t1.comlevel from sys_dept t1 " +
  350. "where del_flag='0' " + where;
  351. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  352. qw.select(sql);
  353. List<SysDept> sysDeptList = list(qw);
  354. List<TreeSysDeptVO> recordList = new ArrayList<TreeSysDeptVO>();
  355. sysDeptList.forEach(a -> {
  356. TreeSysDeptVO model = new TreeSysDeptVO();
  357. model.setId(a.getId());
  358. model.setName(a.getName());
  359. model.setParentId(a.getParentId());
  360. model.setDeptCode(a.getDeptCode());
  361. model.setProvince(a.getProvince());
  362. model.setCity(a.getCity());
  363. model.setArea(a.getArea());
  364. model.setComlevel(a.getComlevel());
  365. recordList.add(model);
  366. });
  367. return recordList;
  368. }
  369. /**
  370. * 获取机构树(不包含团队 dept_type=C)
  371. */
  372. @Override
  373. public List<SysDept> findCompanyTree(String deptId) {
  374. SysDept sysDept = getById(deptId);
  375. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  376. lqw.eq(SysDept::getDelFlag, 0);
  377. lqw.likeRight(SysDept::getId, deptId);
  378. lqw.and((wrapper)->{wrapper.eq(SysDept::getDeptType,'C').or().eq(SysDept::getId,'9');});
  379. List<SysDept> sysDeptList = list(lqw);
  380. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  381. sysDeptList.forEach(i -> i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>())));
  382. return map.get(sysDept.getParentId());
  383. }
  384. /**
  385. * 根据传入机构,查询归属所有团队
  386. */
  387. @Override
  388. public List<SysDept> findTeamList(String deptId) {
  389. SysDept sysDept = getById(deptId);
  390. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  391. lqw.eq(SysDept::getDelFlag, 0);
  392. lqw.likeRight(SysDept::getId, deptId);
  393. lqw.eq(SysDept::getDeptType,'D');
  394. lqw.apply(" exists (SELECT 1 FROM `sys_dept` b WHERE sys_dept.parent_id = b.`id` AND b.`comlevel`='5') ");
  395. List<SysDept> sysDeptList = list(lqw);
  396. return sysDeptList;
  397. }
  398. /**
  399. * @version
  400. * @author: hxl
  401. * @Date: 2024/4/28 10:24
  402. * @Description: 查询省、市、县 、门店的列表
  403. */
  404. @Override
  405. public List<SysDept> queryListByParentId(String level, String parentId) {
  406. return sysDeptMapper.queryListByParentId(level,parentId);
  407. }
  408. @Override
  409. public String queryBelongArea(String deptId){
  410. //长度大于8的话 进行切割
  411. StringBuilder result = new StringBuilder();
  412. if(deptId.length() >= 8)
  413. {
  414. String area = deptId.substring(2,8);
  415. SysArea sysArea = sysAreaMapper.selectOne(new LambdaQueryWrapper<SysArea>().eq(SysArea::getAreaCode, area));
  416. if(sysArea == null){
  417. return "";
  418. }
  419. List<SysArea> sysAreas = sysAreaService.queryAllParent(sysArea);
  420. result.append(sysAreas.get(2).getAreaCname());
  421. result.append(sysAreas.get(1).getAreaCname());
  422. result.append(sysAreas.get(0).getAreaCname());
  423. }
  424. return result.toString();
  425. }
  426. }