SysDeptServiceImpl.java 41 KB

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