SysDeptServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. package com.ydtech.modules.admin.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.ydtech.core.page.HttpResult;
  9. import com.ydtech.core.page.PageRequest;
  10. import com.ydtech.core.page.PageResult;
  11. import com.ydtech.exception.SystemException;
  12. import com.ydtech.modules.admin.dao.SysAreaMapper;
  13. import com.ydtech.modules.admin.dao.SysDeptMapper;
  14. import com.ydtech.modules.admin.dao.SysUserDeptRelationshipMapper;
  15. import com.ydtech.modules.admin.dao.SysUserMapper;
  16. import com.ydtech.modules.admin.model.SysArea;
  17. import com.ydtech.modules.admin.model.SysDept;
  18. import com.ydtech.modules.admin.model.po.SysUserDeptRelationship;
  19. import com.ydtech.modules.admin.model.report.financialReceivables.FinancialReceivablesMonthVo;
  20. import com.ydtech.modules.admin.model.vo.*;
  21. import com.ydtech.modules.admin.model.SysUser;
  22. import com.ydtech.modules.admin.model.po.SysUserTreeShowLevel;
  23. import com.ydtech.modules.admin.service.SysAreaService;
  24. import com.ydtech.modules.admin.service.SysDeptService;
  25. import com.ydtech.modules.admin.service.SysUserTreeShowLevelService;
  26. import com.ydtech.modules.base.controller.BaseController;
  27. import com.ydtech.modules.protocol.utils.AssertionUtils;
  28. import com.ydtech.utils.StringUtils;
  29. import org.springframework.beans.BeanUtils;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.util.ObjectUtils;
  34. import java.util.*;
  35. import java.util.function.Function;
  36. import java.util.stream.Collectors;
  37. @Service
  38. public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept>
  39. implements SysDeptService {
  40. @Autowired
  41. private SysDeptMapper sysDeptMapper;
  42. @Autowired
  43. private SysAreaService sysAreaService;
  44. @Autowired
  45. private SysAreaMapper sysAreaMapper;
  46. @Autowired
  47. private SysUserTreeShowLevelService sysUserTreeShowLevelService;
  48. @Autowired
  49. private SysUserMapper sysUserMapper;
  50. @Autowired
  51. private SysUserDeptRelationshipMapper sysUserDeptRelationshipMapper;
  52. /**
  53. * 根据用户权限和指定部门ID,查询并构建部门树。
  54. *
  55. * @param deptId 部门ID,用于查询特定部门及其子部门,如果为空或特定值,则查询用户所在部门及其子部门。
  56. * @param managementSource 管理范围来源标识,用于不同场景下的部门树构建。
  57. * @return 返回符合用户权限和管理范围的部门树列表。
  58. */
  59. @Override
  60. public List<SysDept> findTree(String deptId, String managementSource) {
  61. // 获取当前操作用户
  62. SysUser user = BaseController.getUser();
  63. String userId = user.getId();
  64. // 根据用户ID查询用户的部门树展示级别
  65. LambdaQueryWrapper<SysUserTreeShowLevel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  66. lambdaQueryWrapper.eq(SysUserTreeShowLevel::getUserId, userId);
  67. SysUserTreeShowLevel treeShowLevel = sysUserTreeShowLevelService.getOne(lambdaQueryWrapper);
  68. List<SysDept> treeByShowLevel = new ArrayList<>();
  69. //如果当前用户未配置树展示等级,则默认为查询全部
  70. if (Objects.isNull(treeShowLevel)) {
  71. treeShowLevel = new SysUserTreeShowLevel();
  72. treeShowLevel.setShowLevel("subordinate");
  73. }
  74. // 如果指定的部门ID为空或特定值,则使用当前用户所在部门ID
  75. if (null == deptId || "".equals(deptId) || "undefined".equals(deptId)) {
  76. if (!treeShowLevel.getShowLevel().equals("all")) {
  77. deptId = user.getDeptId();
  78. } else {
  79. deptId = "9";
  80. }
  81. }
  82. // 根据用户的部门树展示级别查询相应的部门树
  83. switch (treeShowLevel.getShowLevel()) {
  84. case "all":
  85. treeByShowLevel = findTreeByShowLevel(deptId, managementSource, "all");
  86. break;
  87. case "same":
  88. treeByShowLevel = findTreeByShowLevel(deptId, managementSource, "same");
  89. break;
  90. case "subordinate":
  91. treeByShowLevel = findTreeByShowLevel(deptId, managementSource, "subordinate");
  92. break;
  93. }
  94. return treeByShowLevel;
  95. }
  96. private List<SysDept> findTreeByShowLevel(String deptId, String managementSource, String showLevel) {
  97. SysDept sysDept = getById(deptId);
  98. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  99. lqw.eq(SysDept::getDelFlag, 0);
  100. lqw.likeRight(SysDept::getId, deptId);
  101. lqw.orderByAsc(SysDept::getOrderNum);
  102. List<SysDept> sysDeptList = list(lqw);
  103. //判断机构来源条件 进行遍历
  104. if (null != managementSource && !"undefined".equals(managementSource) && !"".equals(managementSource)) {
  105. lqw.eq(SysDept::getManagementSource, managementSource);
  106. //条件
  107. List<SysDept> conditionList = list(lqw);
  108. Map<String, List<SysDept>> conditionMap = conditionList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  109. Map<String, List<SysDept>> map = conditionList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  110. //先查第6层
  111. conditionList.forEach(i ->
  112. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()))
  113. );
  114. List<SysDept> result = new ArrayList<>();
  115. //再查前4层
  116. int level = 5;
  117. while (level > 0) {
  118. List<SysDept> resultTmp = recursion(sysDeptList, conditionMap);
  119. if (resultTmp.size() == 0) {
  120. break;
  121. } else {
  122. int finalLevel = level;
  123. resultTmp = resultTmp.stream().filter(x -> x.getComlevel().equals(String.valueOf(finalLevel))).collect(Collectors.toList());
  124. result.clear();
  125. result.addAll(resultTmp);
  126. }
  127. conditionMap = result.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  128. level--;
  129. }
  130. sysDeptList = result;
  131. } else {
  132. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  133. sysDeptList.forEach(i -> {
  134. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  135. i.setDeptCount(i.getChildren().size());
  136. });
  137. sysDeptList = map.get(sysDept.getParentId());
  138. }
  139. if (showLevel.equals("same")) {
  140. if (null != managementSource && !"undefined".equals(managementSource) && !"".equals(managementSource)) {
  141. if (sysDept.getManagementSource().equals(managementSource)) {
  142. sysDeptList.clear();
  143. sysDeptList.add(sysDept);
  144. } else {
  145. return new ArrayList<>();
  146. }
  147. } else {
  148. sysDeptList.clear();
  149. sysDeptList.add(sysDept);
  150. }
  151. }
  152. return sysDeptList;
  153. }
  154. private List<SysDept> recursion(List<SysDept> sysDeptList, Map<String, List<SysDept>> conditionMap) {
  155. List<SysDept> result = new ArrayList<>();
  156. sysDeptList.forEach(i ->
  157. conditionMap.forEach((key, value) -> {
  158. if (i.getId().equals(key)) {
  159. if (i.getChildren() == null) {
  160. i.setChildren(new ArrayList<>());
  161. }
  162. i.getChildren().addAll(value);
  163. //处理总部的排序为空造成的空指针报错处理 add by hxl
  164. i.setOrderNum(i.getOrderNum() == null ? 0 : i.getOrderNum());
  165. result.add(i);
  166. }
  167. })
  168. );
  169. result.sort(Comparator.comparing(SysDept::getOrderNum));
  170. return result;
  171. }
  172. @Override
  173. public List<SysDept> getUserList(String deptId) {
  174. SysDept sysDept = getById(deptId);
  175. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  176. lqw.eq(SysDept::getDelFlag, 0);
  177. lqw.likeRight(SysDept::getId, deptId);
  178. List<SysDept> sysDeptList = list(lqw);
  179. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  180. return map.get(sysDept.getParentId());
  181. }
  182. @Override
  183. @Transactional
  184. public void addDept(SysDeptVo sysDeptVo) {
  185. SysDept sysDept = new SysDept();
  186. BeanUtils.copyProperties(sysDeptVo, sysDept);
  187. String comlevel = ObjectUtils.isEmpty(sysDept.getComlevel()) ? "" : sysDept.getComlevel();
  188. String parentId = sysDept.getParentId();
  189. String number;
  190. if (comlevel.equals("2")) {
  191. AssertionUtils.isStringEmpty(sysDept.getProvince(), "二级机构份必填");
  192. number = sysDept.getProvince().substring(0, 2);
  193. } else if (comlevel.equals("3")) {
  194. AssertionUtils.isStringEmpty(sysDept.getCity(), "三级机构市必填");
  195. number = sysDept.getCity().substring(0, 4);
  196. } else if (comlevel.equals("4")) {
  197. AssertionUtils.isStringEmpty(sysDept.getArea(), "四级机构区必填");
  198. number = sysDept.getArea().substring(0, 6);
  199. } else {
  200. String deptType = "";
  201. if ("C".equals(sysDept.getDeptType()) && comlevel.equals("5")) {
  202. sysDeptVo.setDeptType("M");
  203. } else if ("D".equals(sysDept.getDeptType())) {
  204. sysDeptVo.setDeptType("D");
  205. deptType = "M";
  206. }
  207. String maxId = baseMapper.getMaxId(sysDept.getParentId(), deptType);
  208. if (!maxId.equals("0")) {
  209. String substring = maxId.substring(sysDept.getParentId().length() + 1);
  210. int i = Integer.parseInt("1" + substring) + 1;
  211. number = String.valueOf(i);
  212. } else {
  213. number = "101";
  214. }
  215. }
  216. String substring = number.substring(number.length() - 2);
  217. String serialNumber;
  218. if ("M,D".contains(sysDeptVo.getDeptType())) {
  219. serialNumber = parentId + sysDeptVo.getDeptType() + substring;
  220. } else {
  221. serialNumber = parentId + substring;
  222. }
  223. sysDept.setId(serialNumber);
  224. SysDept dept = getById(sysDept.getId());
  225. if (!ObjectUtils.isEmpty(dept)) {
  226. throw new SystemException("机构编号为:" + dept.getId() + " " + dept.getName() + "已被占用");
  227. }
  228. SysDept parentDept = baseMapper.selectById(sysDept.getParentId());
  229. if (parentDept.getComlevel().equals("5")) {
  230. sysDept.setManagementSource(parentDept.getManagementSource());
  231. }
  232. // 查询当前部门序号是否存在
  233. LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
  234. qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  235. qw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
  236. qw.eq(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号相同
  237. boolean exists = baseMapper.exists(qw);
  238. if (exists) {
  239. // 如果存在,查询该父级部门下排序号大于当前部门的部门列表
  240. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  241. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  242. lqw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
  243. lqw.ge(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号大于等于当前部门
  244. List<SysDept> sysDeptList = list(lqw);
  245. // 更新这些部门的排序号
  246. sysDeptList.forEach(i -> {
  247. i.setOrderNum(i.getOrderNum() + 1);
  248. updateById(i);
  249. });
  250. }
  251. boolean b = save(sysDept);
  252. AssertionUtils.isSucceed(b, "删除失败");
  253. }
  254. @Override
  255. @Transactional
  256. public HttpResult updateDept(SysDept record) {
  257. // 查询修改的序号是否存在
  258. LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
  259. qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  260. qw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  261. qw.eq(SysDept::getOrderNum, record.getOrderNum()); // 排序号相同
  262. boolean exists = baseMapper.exists(qw);
  263. //不存在则直接修改
  264. if (!exists) {
  265. baseMapper.updateById(record);
  266. return HttpResult.ok();
  267. }
  268. //查询机构
  269. SysDept sysDept = getById(record.getId());
  270. //原本的序号
  271. Integer orderNum = sysDept.getOrderNum();
  272. //本次修改的序号
  273. Integer newOrderNum = record.getOrderNum();
  274. // 向上换位
  275. if (newOrderNum < orderNum) {
  276. // 查询该父级部门下排序号大于当前部门的部门列表
  277. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  278. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  279. lqw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  280. lqw.ge(SysDept::getOrderNum, record.getOrderNum()); // 排序号大于等于当前部门
  281. List<SysDept> sysDeptList = list(lqw);
  282. sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum));
  283. for (SysDept dept : sysDeptList) {
  284. dept.setOrderNum(dept.getOrderNum() + 1);
  285. updateById(dept);
  286. if (dept.getOrderNum().equals(orderNum)) {
  287. break;
  288. }
  289. }
  290. baseMapper.updateById(record);
  291. }
  292. //向下换位
  293. if (newOrderNum > orderNum) {
  294. // 查询该父级部门下排序号小于当前部门的部门列表
  295. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  296. lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
  297. lqw.eq(SysDept::getParentId, record.getParentId()); // 父级部门ID相同
  298. lqw.le(SysDept::getOrderNum, record.getOrderNum()); // 排序号大于等于当前部门
  299. List<SysDept> sysDeptList = list(lqw);
  300. sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum).reversed());
  301. for (SysDept dept : sysDeptList) {
  302. dept.setOrderNum(dept.getOrderNum() - 1);
  303. updateById(dept);
  304. if (dept.getOrderNum().equals(orderNum)) {
  305. break;
  306. }
  307. }
  308. baseMapper.updateById(record);
  309. }
  310. if (newOrderNum.equals(orderNum)) {
  311. baseMapper.updateById(record);
  312. }
  313. return HttpResult.ok();
  314. }
  315. @Override
  316. public void deleteDept(SysDeptRemoveVo sysDeptRemoveVo) {
  317. SysDept sysDept = getById(sysDeptRemoveVo.getDeptId());
  318. List<SysDept> list = lambdaQuery().eq(SysDept::getParentId, sysDept.getId()).list();
  319. if (list.isEmpty()) {
  320. boolean b = removeById(sysDeptRemoveVo.getDeptId());
  321. AssertionUtils.isSucceed(b, "删除失败");
  322. } else {
  323. throw new SystemException(sysDept.getName() + "下还有其他隶属机构");
  324. }
  325. }
  326. @Override
  327. public PageResult<SysDept> findSubDepts(PageRequest pageRequest) {
  328. String id = pageRequest.getColumnFilterValue(pageRequest, "id");
  329. String managementSource = pageRequest.getColumnFilterValue(pageRequest, "managementSource");
  330. Page<SysDept> p = PageRequest.buildPageRequest(pageRequest);
  331. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  332. lqw.eq(StringUtils.isNotEmpty(id), SysDept::getParentId, id);
  333. lqw.eq(StringUtils.isNotEmpty(managementSource), SysDept::getManagementSource, managementSource);
  334. IPage<SysDept> pResult = page(p, lqw);
  335. //传入查询条件
  336. return PageResult.buildPageResult(pResult);
  337. }
  338. public String findMaxDeptId(String deptId) {
  339. if (deptId == null) return "";
  340. String result = "00";
  341. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  342. qw.likeRight(StringUtils.isNotEmpty(deptId), "id", deptId + "D%");
  343. qw.select("IFNULL(MAX(id),0) maxid");
  344. Map<String, Object> m = getMap(qw);
  345. String maxId = m.get("maxid").toString();
  346. if (!maxId.equalsIgnoreCase("0") && !maxId.equalsIgnoreCase(deptId)) {
  347. result = maxId.substring(deptId.length() + 1);
  348. }
  349. return result;
  350. }
  351. public String findMaxHouseId(String deptId) {
  352. if (deptId == null) {
  353. return "";
  354. }
  355. String result = "00";
  356. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  357. qw.like(StringUtils.isNotEmpty(deptId), "id", deptId + "M%");
  358. qw.select("IFNULL(MAX(id),0) maxid");
  359. Map<String, Object> m = getMap(qw);
  360. String maxId = m.get("maxid").toString();
  361. if (!maxId.equalsIgnoreCase("0") && !maxId.equalsIgnoreCase(deptId)) {
  362. result = maxId.substring(deptId.length() + 1);
  363. }
  364. return result;
  365. }
  366. //
  367. @Override
  368. public List<TreeSysDeptVO> selectListWhere(String where, Object[] paramValues) {
  369. 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 " +
  370. "where del_flag='0' " + where;
  371. QueryWrapper<SysDept> qw = new QueryWrapper<>();
  372. qw.select(sql);
  373. List<SysDept> sysDeptList = list(qw);
  374. List<TreeSysDeptVO> recordList = new ArrayList<TreeSysDeptVO>();
  375. sysDeptList.forEach(a -> {
  376. TreeSysDeptVO model = new TreeSysDeptVO();
  377. model.setId(a.getId());
  378. model.setName(a.getName());
  379. model.setParentId(a.getParentId());
  380. model.setDeptCode(a.getDeptCode());
  381. model.setProvince(a.getProvince());
  382. model.setCity(a.getCity());
  383. model.setArea(a.getArea());
  384. model.setComlevel(a.getComlevel());
  385. recordList.add(model);
  386. });
  387. return recordList;
  388. }
  389. /**
  390. * 获取机构树(不包含团队 dept_type=C)
  391. */
  392. @Override
  393. public List<SysDept> findCompanyTree(String deptId) {
  394. SysDept sysDept = getById(deptId);
  395. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  396. lqw.eq(SysDept::getDelFlag, 0);
  397. lqw.likeRight(SysDept::getId, deptId);
  398. lqw.and((wrapper) -> {
  399. wrapper.eq(SysDept::getDeptType, 'C').or().eq(SysDept::getId, '9');
  400. });
  401. List<SysDept> sysDeptList = list(lqw);
  402. Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
  403. sysDeptList.forEach(i -> i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>())));
  404. return map.get(sysDept.getParentId());
  405. }
  406. /**
  407. * 根据传入机构,查询归属所有团队
  408. */
  409. @Override
  410. public List<SysDept> findTeamList(String deptId) {
  411. SysDept sysDept = getById(deptId);
  412. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  413. lqw.eq(SysDept::getDelFlag, 0);
  414. lqw.likeRight(SysDept::getId, deptId);
  415. lqw.eq(SysDept::getDeptType, 'D');
  416. lqw.apply(" exists (SELECT 1 FROM `sys_dept` b WHERE sys_dept.parent_id = b.`id` AND b.`comlevel`='5') ");
  417. List<SysDept> sysDeptList = list(lqw);
  418. return sysDeptList;
  419. }
  420. /**
  421. * @version
  422. * @author: hxl
  423. * @Date: 2024/4/28 10:24
  424. * @Description: 查询省、市、县 、门店的列表
  425. */
  426. @Override
  427. public List<SysDept> queryListByParentId(String level, String parentId) {
  428. return sysDeptMapper.queryListByParentId(level, parentId);
  429. }
  430. @Override
  431. public String queryBelongArea(String deptId) {
  432. //长度大于8的话 进行切割
  433. StringBuilder result = new StringBuilder();
  434. if (deptId.length() >= 8) {
  435. String area = deptId.substring(2, 8);
  436. SysArea sysArea = sysAreaMapper.selectOne(new LambdaQueryWrapper<SysArea>().eq(SysArea::getAreaCode, area));
  437. if (sysArea == null) {
  438. return "";
  439. }
  440. List<SysArea> sysAreas = sysAreaService.queryAllParent(sysArea);
  441. result.append(sysAreas.get(2).getAreaCname());
  442. result.append(sysAreas.get(1).getAreaCname());
  443. result.append(sysAreas.get(0).getAreaCname());
  444. }
  445. return result.toString();
  446. }
  447. @Override
  448. public List<SysArea> getListQueryBelongArea(String deptId) {
  449. //长度大于8的话 进行切割
  450. List<SysArea> sysAreas = new ArrayList<>();
  451. if (deptId.length() >= 8) {
  452. String area = deptId.substring(2, 8);
  453. SysArea sysArea = sysAreaMapper.selectOne(new LambdaQueryWrapper<SysArea>().eq(SysArea::getAreaCode, area));
  454. if (sysArea == null) {
  455. return null;
  456. }
  457. sysAreas = sysAreaService.queryAllParent(sysArea);
  458. }
  459. return sysAreas;
  460. }
  461. /**
  462. * @version
  463. * @author: hxl
  464. * @Date: 2024/6/28 8:43
  465. * @Description: 查询后线机构树
  466. */
  467. @Override
  468. public List<SysDept> queryHXDeptTree() {
  469. //所有的后线机构
  470. List<SysDept> sysDeptsHX = sysDeptMapper.queryHXDeptTree();
  471. //查询后线中顶级的数据
  472. List<SysDept> resultList = new ArrayList<SysDept>();
  473. List<SysDept> sysDeptTop = sysDeptsHX.stream().filter(item -> "99".equals(item.getId())).collect(Collectors.toList());
  474. for (SysDept dept : sysDeptTop) {
  475. resultList.add(buildDeptTree(dept, sysDeptsHX));
  476. }
  477. return resultList;
  478. }
  479. /**
  480. * 递归构建树形结构
  481. */
  482. private SysDept buildDeptTree(SysDept dept, List<SysDept> deptList) {
  483. for (SysDept d : deptList) {
  484. if (dept.getId().equals(d.getParentId())) {
  485. if (null == dept.getChildren()) {
  486. dept.setChildren(new ArrayList<SysDept>());
  487. }
  488. //递归调用
  489. dept.getChildren().add(buildDeptTree(d, deptList));
  490. }
  491. }
  492. return dept;
  493. }
  494. /**
  495. * @version
  496. * @author: hxl
  497. * @Date: 2024/6/28 8:42
  498. * @Description: 查询前线机构树
  499. */
  500. @Override
  501. public List<SysDept> queryQXDeptTree() {
  502. List<SysDept> sysDeptAll = sysDeptMapper.queryListByQXDept();
  503. //查询后线中顶级的数据
  504. List<SysDept> resultList = new ArrayList<SysDept>();
  505. List<SysDept> sysDeptTop = sysDeptAll.stream().filter(item -> "3".equals(item.getComlevel())).collect(Collectors.toList());
  506. for (SysDept dept : sysDeptTop) {
  507. resultList.add(buildDeptTree(dept, sysDeptAll));
  508. }
  509. return sysDeptMapper.queryListByQXDept();
  510. }
  511. @Override
  512. public List<SysDeptTreeVo> getSysDeptTree() {
  513. SysDept sysDept = getById("9");
  514. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  515. lqw.eq(SysDept::getDelFlag, 0);
  516. lqw.isNotNull(SysDept::getComlevel);
  517. lqw.likeRight(SysDept::getId, "9");
  518. lqw.orderByAsc(SysDept::getOrderNum);
  519. List<SysDept> sysDeptList = list(lqw);
  520. SysDeptTreeVo sysDeptTreeVo = BeanUtil.copyProperties(sysDept, SysDeptTreeVo.class);
  521. List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
  522. sysDeptTreeVos.add(sysDeptTreeVo);
  523. Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream().sorted(Comparator.comparing(SysDeptTreeVo::getId)).collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
  524. sysDeptTreeVos.forEach(i -> {
  525. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  526. i.setDeptCount(i.getChildren().size());
  527. });
  528. sysDeptTreeVos = map.get(sysDept.getParentId());
  529. return sysDeptTreeVos;
  530. }
  531. @Override
  532. public List<SysDeptTreeVo> getPartnerDeptTree() {
  533. SysDept sysDept = getById("9");
  534. LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
  535. lqw.eq(SysDept::getDelFlag, 0);
  536. lqw.likeRight(SysDept::getId, "9");
  537. lqw.orderByAsc(SysDept::getOrderNum);
  538. List<SysDept> sysDeptList = list(lqw);
  539. List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
  540. Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream().sorted(Comparator.comparing(SysDeptTreeVo::getId))
  541. .collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
  542. sysDeptTreeVos.forEach(i -> {
  543. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  544. i.setDeptCount(i.getChildren().size());
  545. });
  546. sysDeptTreeVos = map.get(sysDept.getParentId());
  547. //合伙人机构树
  548. for (SysDeptTreeVo deptTreeVo : sysDeptTreeVos) {//1
  549. List<SysDeptTreeVo> children2 = deptTreeVo.getChildren();
  550. for (SysDeptTreeVo children : children2) {//2
  551. List<SysDeptTreeVo> children3 = children.getChildren();
  552. if (children3.size()>0) {
  553. children3=children3.stream().filter(SysDeptTreeVo -> SysDeptTreeVo.getComlevel() != null).collect(Collectors.toList());
  554. children.setChildren(children3);
  555. for (SysDeptTreeVo child4 : children3) {//3
  556. List<SysDeptTreeVo> children4 = child4.getChildren();
  557. if (children4.size()>0) {
  558. children4=children4.stream().filter(SysDeptTreeVo -> SysDeptTreeVo.getComlevel() != null).collect(Collectors.toList());
  559. child4.setChildren(children4);
  560. for (SysDeptTreeVo child : children4) {//4
  561. List<SysDeptTreeVo> children5 = child.getChildren();
  562. children5 = children5.stream().filter(SysDeptTreeVo ->SysDeptTreeVo.getComlevel() != null).collect(Collectors.toList());
  563. child.setChildren(children5);
  564. if (children5.size()>0) {
  565. for (SysDeptTreeVo treeVo : children5) {
  566. List<SysDeptTreeVo> childrenEnd = treeVo.getChildren();
  567. if (childrenEnd.size()>0) {
  568. childrenEnd=childrenEnd.stream().filter(SysDeptTreeVo ->SysDeptTreeVo.getComlevel() == null).collect(Collectors.toList());
  569. treeVo.setChildren(childrenEnd);
  570. }
  571. }
  572. }
  573. }
  574. }
  575. }
  576. }
  577. }
  578. }
  579. return sysDeptTreeVos;
  580. }
  581. @Override
  582. public boolean contrastiveManagementSource(String orderNo, String managementSource) {
  583. String managementSourceDept = sysDeptMapper.getByOrderNoQueryManagementSource(orderNo);
  584. return managementSource.equals(managementSourceDept);
  585. }
  586. /**
  587. * 数据权限机构数
  588. * @return
  589. */
  590. @Override
  591. public List<SysDept> getDataDeptTree(List<String> deptIds) {
  592. String name = BaseController.getUser().getName();
  593. List<SysDept> result = new ArrayList<>();
  594. if(!deptIds.isEmpty()){
  595. List<SysDept> deptList = sysDeptMapper.getListByIds(deptIds);
  596. // 使用一个Map来快速查找部门节点
  597. Map<String, SysDept> deptMap = new HashMap<>();
  598. for (SysDept dept : deptList) {
  599. deptMap.put(dept.getId(), dept);
  600. }
  601. // 找出顶级部门(即没有父部门的部门)
  602. for (SysDept dept : deptList) {
  603. if (dept.getParentId() == null || deptMap.get(dept.getParentId()) == null) {
  604. // 添加到结果列表并构建其子树
  605. buildDeptTree(dept, deptMap);
  606. result.add(dept);
  607. }
  608. }
  609. } else if ("admin".equals(name)) {
  610. String deptId ="9";
  611. if(deptId==null || "".equals(deptId)){
  612. deptId="9";
  613. }else{
  614. //如果是平台下判断包含D的查询上级id
  615. if(deptId.contains("D")){
  616. SysDept dept = baseMapper.selectById(deptId);
  617. deptId =dept==null?"":dept.getParentId();
  618. }
  619. }
  620. LambdaQueryWrapper<SysDept> queryWrapper = new LambdaQueryWrapper<>();
  621. queryWrapper.eq(SysDept::getDelFlag, 0);
  622. // 获取当前操作用户
  623. SysUser user = BaseController.getUser();
  624. String userId = user.getId();
  625. // 根据用户ID查询用户的部门树展示级别
  626. LambdaQueryWrapper<SysUserTreeShowLevel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  627. lambdaQueryWrapper.eq(SysUserTreeShowLevel::getUserId, userId);
  628. SysUserTreeShowLevel treeShowLevel = sysUserTreeShowLevelService.getOne(lambdaQueryWrapper);
  629. List<SysDept> treeByShowLevel = new ArrayList<>();
  630. //如果当前用户未配置树展示等级,则默认为查询全部
  631. if (Objects.isNull(treeShowLevel)) {
  632. treeShowLevel = new SysUserTreeShowLevel();
  633. treeShowLevel.setShowLevel("subordinate");
  634. }
  635. // 如果指定的部门ID为空或特定值,则使用当前用户所在部门ID
  636. if (null == deptId || "".equals(deptId) || "undefined".equals(deptId)) {
  637. if (!treeShowLevel.getShowLevel().equals("all")) {
  638. deptId = user.getDeptId();
  639. } else {
  640. deptId = "9";
  641. }
  642. }
  643. // 根据用户的部门树展示级别查询相应的部门树
  644. switch (treeShowLevel.getShowLevel()) {
  645. case "all":
  646. treeByShowLevel = findTreeByShowLevel(deptId, null, "all");
  647. break;
  648. case "same":
  649. treeByShowLevel = findTreeByShowLevel(deptId, null, "same");
  650. break;
  651. case "subordinate":
  652. treeByShowLevel = findTreeByShowLevel(deptId, null, "subordinate");
  653. break;
  654. }
  655. return treeByShowLevel;
  656. }
  657. return result;
  658. }
  659. @Override
  660. public List<SysDeptTreeVo> getFiveLevelDept(SysDeptVo sysDeptVo) {
  661. SysDept sysDept = getById("9");
  662. List<SysDept> sysDeptList = baseMapper.getFiveLevelDept(sysDeptVo);
  663. sysDeptList.add(sysDept);//添加总部 总部没有等级机构
  664. List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
  665. Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream().sorted(Comparator.comparing(SysDeptTreeVo::getId))
  666. .collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
  667. sysDeptTreeVos.forEach(i -> {
  668. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  669. i.setDeptCount(i.getChildren().size());
  670. });
  671. return map.get(sysDept.getParentId());
  672. }
  673. private void buildDeptTree(SysDept dept, Map<String, SysDept> deptMap) {
  674. List<SysDept> children = new ArrayList<>();
  675. dept.setChildren(children);
  676. // 查找并添加子部门
  677. for (SysDept potentialChild : deptMap.values()) {
  678. if (potentialChild.getParentId() != null && potentialChild.getParentId().equals(dept.getId())) {
  679. children.add(potentialChild);
  680. buildDeptTree(potentialChild, deptMap); // 递归构建子部门的子树
  681. }
  682. }
  683. }
  684. /**
  685. * 前线只要机构 后线人员(按照领导人) 机构
  686. * @param sysDeptVo
  687. * @return
  688. */
  689. @Override
  690. public KztUserDeptTreeDto getUserDeptTree(SysDeptVo sysDeptVo) {
  691. KztUserDeptTreeDto kztUserDeptTreeDto = new KztUserDeptTreeDto();
  692. String userId = BaseController.getUserId();
  693. if (userId.contains("M")) {
  694. kztUserDeptTreeDto.setType("1"); //前线
  695. } else {
  696. kztUserDeptTreeDto.setType("2"); //代理
  697. }
  698. SysUser byUserId = sysUserMapper.getByUserId(userId);
  699. List<SysDeptTreeVo> resultDeptList = this.getFiveLevelDeptKzt(byUserId);
  700. kztUserDeptTreeDto.setDeptList(resultDeptList);
  701. if (!userId.contains("M")) {
  702. List<SysUser> resultList =this.getUserTreeHx(byUserId);
  703. kztUserDeptTreeDto.setUserList(resultList);
  704. }
  705. return kztUserDeptTreeDto;
  706. }
  707. private List<SysUser> getUserTreeHx(SysUser sysUser) {
  708. //获取领导字段不为空的人的ID
  709. QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
  710. queryWrapper.isNotNull("leader_id");
  711. List<SysUser> users = sysUserMapper.selectList(queryWrapper);
  712. if (users == null || users.size() == 0) {
  713. return new ArrayList<>();
  714. }
  715. List<SysUser> topUsers = new ArrayList<>(); //存放1级用户,即没有直接上级的用户
  716. // 根据组织结构展示级别,筛选顶层节点并构建组织结构树
  717. if("admin".equals(sysUser.getName())){
  718. topUsers.add(sysUserMapper.selectById("99D1501"));
  719. }else {
  720. topUsers.add(sysUser);
  721. }
  722. // 递归构建用户树结构
  723. buildUserTree(topUsers, users);
  724. return topUsers;
  725. }
  726. private List<SysDeptTreeVo> getFiveLevelDeptKzt(SysUser byUserId) {
  727. SysDept sysDept = getById("9");
  728. SysDeptVo sysDeptVo = new SysDeptVo();
  729. String id = byUserId.getId();
  730. List<String> deptIds = new ArrayList<>();
  731. if("admin".equals(byUserId.getId())){
  732. List<SysDept> sysDeptList = baseMapper.getFiveLevelDept(sysDeptVo);
  733. deptIds.addAll(sysDeptList.stream().map(SysDept::getId).collect(Collectors.toList()));
  734. }else {
  735. List<SysUserDeptRelationship> relationships = sysUserDeptRelationshipMapper.selectList(new QueryWrapper<SysUserDeptRelationship>().eq("user_id", id));
  736. deptIds.addAll(relationships.stream().map(SysUserDeptRelationship::getDeptId).collect(Collectors.toList()));
  737. }
  738. List<SysDept> sysDeptList = baseMapper.getFiveLevelDept(sysDeptVo);
  739. sysDept.setComlevel("1");
  740. sysDeptList.add(sysDept);
  741. List<SysDeptTreeVo> sysDeptTreeVos = BeanUtil.copyToList(sysDeptList, SysDeptTreeVo.class);
  742. Map<String, List<SysDeptTreeVo>> map = sysDeptTreeVos.stream().sorted(Comparator.comparing(SysDeptTreeVo::getId))
  743. .collect(Collectors.groupingBy(SysDeptTreeVo::getParentId));
  744. sysDeptTreeVos.forEach(i -> {
  745. if(Integer.parseInt(i.getComlevel())<=5){
  746. i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>()));
  747. i.setDeptCount(i.getChildren().size());
  748. }
  749. });
  750. return map.get(sysDept.getParentId());
  751. }
  752. private void buildUserTree(List<SysUser> topUsers, List<SysUser> users) {
  753. for (SysUser user : topUsers) {
  754. List<SysUser> children = new ArrayList<>();
  755. for (SysUser childUser : users) {
  756. if (user.getId().equals(childUser.getLeaderId())) {
  757. children.add(childUser);
  758. // 递归查找下一级
  759. buildUserTree(children, users);
  760. }
  761. }
  762. user.setChildren(children);
  763. }
  764. }
  765. }