SysDeptServiceImpl.java 41 KB

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