SysDeptServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. package com.ozs.system.service.impl;
  2. import java.math.BigDecimal;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.stream.Collectors;
  9. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10. import com.ozs.common.core.domain.AjaxResult;
  11. import com.ozs.common.core.domain.entity.SysProcurementStandard;
  12. import com.ozs.common.core.domain.model.LoginUser;
  13. import com.ozs.common.exception.base.BaseException;
  14. import com.ozs.pm.service.IPmDemandService;
  15. import com.ozs.system.domain.vo.responseVo.SysDeptResponseVo;
  16. import com.ozs.system.mapper.SysDeptMapper;
  17. import com.ozs.system.mapper.SysProcurementStandardMapper;
  18. import com.ozs.system.mapper.SysRoleMapper;
  19. import com.ozs.system.service.ISysDeptService;
  20. import org.springframework.beans.BeanUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import com.ozs.common.annotation.DataScope;
  24. import com.ozs.common.constant.UserConstants;
  25. import com.ozs.common.core.domain.TreeSelect;
  26. import com.ozs.common.core.domain.entity.SysDept;
  27. import com.ozs.common.core.domain.entity.SysRole;
  28. import com.ozs.common.core.domain.entity.SysUser;
  29. import com.ozs.common.core.text.Convert;
  30. import com.ozs.common.exception.ServiceException;
  31. import com.ozs.common.utils.SecurityUtils;
  32. import com.ozs.common.utils.StringUtils;
  33. import com.ozs.common.utils.spring.SpringUtils;
  34. import org.springframework.util.ObjectUtils;
  35. import javax.annotation.Resource;
  36. /**
  37. * 部门管理 服务实现
  38. *
  39. * @author ruoyi
  40. */
  41. @Service
  42. public class SysDeptServiceImpl implements ISysDeptService {
  43. @Autowired
  44. private SysDeptMapper deptMapper;
  45. @Autowired
  46. private ISysDeptService deptService;
  47. @Autowired
  48. private SysRoleMapper roleMapper;
  49. @Resource
  50. private SysProcurementStandardMapper sysProcurementStandardMapper;
  51. /**
  52. * 查询部门管理数据
  53. *
  54. * @param dept 部门信息
  55. * @return 部门信息集合
  56. */
  57. @Override
  58. @DataScope(deptAlias = "d")
  59. public List<SysDept> selectDeptList(SysDept dept) {
  60. LoginUser loginUser = SecurityUtils.getLoginUser();
  61. if (!String.valueOf(loginUser.getUserId()).equals("1")) {
  62. List<Long> deptList = new ArrayList<>();
  63. //获取到子孙级部门id
  64. Long deptId = loginUser.getDeptId();
  65. if (deptService.hasChildByDeptId(deptId)) {
  66. List<Long> children = deptService.getDeptChildren(deptId);
  67. System.err.println(children.size());
  68. deptList.addAll(children);
  69. }
  70. deptList.add(deptId);
  71. dept.setDeptList(deptList);
  72. }
  73. return deptMapper.selectDeptList(dept);
  74. }
  75. /**
  76. * 查询部门管理数据
  77. *
  78. * @param dept 部门信息
  79. * @return 部门信息集合
  80. */
  81. @Override
  82. @DataScope(deptAlias = "d")
  83. public List<SysDept> selectDeptListAndF(SysDept dept) {
  84. LoginUser loginUser = SecurityUtils.getLoginUser();
  85. Long deptId = loginUser.getDeptId();
  86. if (!String.valueOf(loginUser.getUserId()).equals("1")) {
  87. List<Long> deptList = new ArrayList<>();
  88. //获取到子孙级部门id
  89. if (deptService.hasChildByDeptId(deptId)) {
  90. List<Long> children = deptService.getDeptChildren(deptId);
  91. System.err.println(children.size());
  92. deptList.addAll(children);
  93. }
  94. //查询上一级到顶级
  95. SysDept sysDept = deptService.selectById(deptId);
  96. String[] split = sysDept.getAncestors().split(",");
  97. if (split.length > 1) {
  98. for (String s : split) {
  99. deptList.add(Long.valueOf(s));
  100. }
  101. }
  102. deptList.add(deptId);
  103. dept.setDeptList(deptList);
  104. }
  105. return deptMapper.selectDeptList(dept);
  106. }
  107. /**
  108. * 查询部门管理数据
  109. *
  110. * @param dept 部门信息
  111. * @return 部门信息集合
  112. */
  113. @Override
  114. @DataScope(deptAlias = "d")
  115. public List<SysDept> selectDeptListAndUp(SysDept dept) {
  116. LoginUser loginUser = SecurityUtils.getLoginUser();
  117. if (!String.valueOf(loginUser.getUserId()).equals("1")) {
  118. List<Long> deptList = new ArrayList<>();
  119. //获取到子孙级部门id
  120. Long deptId = loginUser.getDeptId();
  121. if (deptService.hasChildByDeptId(deptId)) {
  122. List<Long> children = deptService.getDeptChildren(deptId);
  123. System.err.println(children.size());
  124. deptList.addAll(children);
  125. }
  126. //查询上一级
  127. SysDept sysDept = deptService.selectByCid(loginUser.getDeptId());
  128. if (!ObjectUtils.isEmpty(sysDept)) {
  129. deptList.add(sysDept.getDeptId());
  130. }
  131. deptList.add(deptId);
  132. dept.setDeptList(deptList);
  133. }
  134. return deptMapper.selectDeptList(dept);
  135. }
  136. /**
  137. * 查询部门树结构信息
  138. *
  139. * @param dept 部门信息
  140. * @return 部门树信息集合
  141. */
  142. @Override
  143. public List<TreeSelect> selectDeptTreeList(SysDept dept) {
  144. List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
  145. return buildDeptTreeSelect(depts);
  146. }
  147. /**
  148. * 查询部门树结构信息
  149. *
  150. * @param dept 部门信息
  151. * @return 部门树信息集合
  152. */
  153. @Override
  154. public List<TreeSelect> selectDeptTreeListF(SysDept dept) {
  155. List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptListAndF(dept);
  156. return buildDeptTreeSelect(depts);
  157. }
  158. /**
  159. * 构建前端所需要树结构
  160. *
  161. * @param depts 部门列表
  162. * @return 树结构列表
  163. */
  164. @Override
  165. public List<SysDept> buildDeptTree(List<SysDept> depts) {
  166. List<SysDept> returnList = new ArrayList<SysDept>();
  167. List<Long> tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList());
  168. for (SysDept dept : depts) {
  169. // 如果是顶级节点, 遍历该父节点的所有子节点
  170. if (!tempList.contains(dept.getParentId())) {
  171. recursionFn(depts, dept);
  172. returnList.add(dept);
  173. }
  174. }
  175. if (returnList.isEmpty()) {
  176. returnList = depts;
  177. }
  178. return returnList;
  179. }
  180. /**
  181. * 构建前端所需要下拉树结构
  182. *
  183. * @param depts 部门列表
  184. * @return 下拉树结构列表
  185. */
  186. @Override
  187. public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) {
  188. List<SysDept> deptTrees = buildDeptTree(depts);
  189. return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
  190. }
  191. /**
  192. * 根据角色ID查询部门树信息
  193. *
  194. * @param roleId 角色ID
  195. * @return 选中部门列表
  196. */
  197. @Override
  198. public List<Long> selectDeptListByRoleId(Long roleId) {
  199. SysRole role = roleMapper.selectRoleById(roleId);
  200. return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
  201. }
  202. /**
  203. * 根据部门ID查询信息
  204. *
  205. * @param deptId 部门ID
  206. * @return 部门信息
  207. */
  208. @Override
  209. public Map<String, Object> selectDeptById(Long deptId) {
  210. Map<String, Object> returnMap = new HashMap<>();
  211. SysDept sysDept = deptMapper.selectDeptById(deptId);
  212. SysDeptResponseVo sysDeptResponseVo = new SysDeptResponseVo();
  213. if (ObjectUtils.isEmpty(sysDept)) {
  214. throw new BaseException("deptId为" + deptId + "的单位不存在");
  215. }
  216. BeanUtils.copyProperties(sysDept, sysDeptResponseVo);
  217. QueryWrapper<SysProcurementStandard> queryWrapper = new QueryWrapper<>();
  218. queryWrapper.eq("dept_id", deptId);
  219. List<SysProcurementStandard> sysProcurementStandardsList = sysProcurementStandardMapper.selectList(queryWrapper);
  220. returnMap.put("sysDept", sysDeptResponseVo);
  221. returnMap.put("sysProcurementStandardsList", sysProcurementStandardsList);
  222. returnMap.put("dto", sysDept);
  223. return returnMap;
  224. }
  225. /**
  226. * 根据ID查询所有子部门(正常状态)
  227. *
  228. * @param deptId 部门ID
  229. * @return 子部门数
  230. */
  231. @Override
  232. public int selectNormalChildrenDeptById(Long deptId) {
  233. return deptMapper.selectNormalChildrenDeptById(deptId);
  234. }
  235. /**
  236. * 是否存在子节点
  237. *
  238. * @param deptId 部门ID
  239. * @return 结果
  240. */
  241. @Override
  242. public boolean hasChildByDeptId(Long deptId) {
  243. int result = deptMapper.hasChildByDeptId(deptId);
  244. return result > 0;
  245. }
  246. /**
  247. * 获取所有子节点id
  248. *
  249. * @param deptId 部门ID
  250. * @return 结果
  251. */
  252. @Override
  253. public List<Long> getChildIdByDeptId(Long deptId) {
  254. return deptMapper.getChildIdByDeptId(deptId);
  255. }
  256. /**
  257. * 查询部门是否存在用户
  258. *
  259. * @param deptId 部门ID
  260. * @return 结果 true 存在 false 不存在
  261. */
  262. @Override
  263. public boolean checkDeptExistUser(Long deptId) {
  264. int result = deptMapper.checkDeptExistUser(deptId);
  265. return result > 0;
  266. }
  267. /**
  268. * 校验部门名称是否唯一
  269. *
  270. * @param dept 部门信息
  271. * @return 结果
  272. */
  273. @Override
  274. public String checkDeptNameUnique(SysDept dept) {
  275. Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
  276. SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
  277. if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
  278. return UserConstants.NOT_UNIQUE;
  279. }
  280. return UserConstants.UNIQUE;
  281. }
  282. /**
  283. * 校验部门是否有数据权限
  284. *
  285. * @param deptId 部门id
  286. */
  287. @Override
  288. public void checkDeptDataScope(Long deptId) {
  289. if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
  290. SysDept dept = new SysDept();
  291. dept.setDeptId(deptId);
  292. List<SysDept> depts = SpringUtils.getAopProxy(this).selectDeptList(dept);
  293. if (StringUtils.isEmpty(depts)) {
  294. throw new ServiceException("没有权限访问部门数据!");
  295. }
  296. }
  297. }
  298. /**
  299. * 新增保存部门信息
  300. *
  301. * @param dept 部门信息
  302. * @return 结果
  303. */
  304. @Override
  305. public AjaxResult insertDept(SysDept dept) {
  306. SysDept info = deptMapper.selectDeptById(dept.getParentId());
  307. // 如果父节点不为正常状态,则不允许新增子节点
  308. if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
  309. throw new ServiceException("部门停用,不允许新增");
  310. }
  311. //授权到5级单位,创建6级单位时提示:只允许创建5级单位
  312. String[] ancestors = info.getAncestors().split(",");
  313. if (ancestors.length >= 6) {
  314. return AjaxResult.error("只允许创建5级单位");
  315. }
  316. dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
  317. Integer dept1 = deptMapper.insertDept(dept);
  318. return AjaxResult.success(dept.getDeptId());
  319. }
  320. /**
  321. * 修改保存部门信息
  322. *
  323. * @param dept 部门信息
  324. * @return 结果
  325. */
  326. @Override
  327. public int updateDept(SysDept dept) {
  328. SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
  329. SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
  330. if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) {
  331. String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
  332. String oldAncestors = oldDept.getAncestors();
  333. dept.setAncestors(newAncestors);
  334. updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
  335. }
  336. int result = deptMapper.updateDept(dept);
  337. if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
  338. && !StringUtils.equals("0", dept.getAncestors())) {
  339. // 如果该部门是启用状态,则启用该部门的所有上级部门
  340. updateParentDeptStatusNormal(dept);
  341. }
  342. return result;
  343. }
  344. /**
  345. * 修改该部门的父级部门状态
  346. *
  347. * @param dept 当前部门
  348. */
  349. private void updateParentDeptStatusNormal(SysDept dept) {
  350. String ancestors = dept.getAncestors();
  351. Long[] deptIds = Convert.toLongArray(ancestors);
  352. deptMapper.updateDeptStatusNormal(deptIds);
  353. }
  354. /**
  355. * 修改子元素关系
  356. *
  357. * @param deptId 被修改的部门ID
  358. * @param newAncestors 新的父ID集合
  359. * @param oldAncestors 旧的父ID集合
  360. */
  361. public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
  362. List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
  363. for (SysDept child : children) {
  364. child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
  365. }
  366. if (children.size() > 0) {
  367. deptMapper.updateDeptChildren(children);
  368. }
  369. }
  370. /**
  371. * 删除部门管理信息
  372. *
  373. * @param deptId 部门ID
  374. * @return 结果
  375. */
  376. @Override
  377. public int deleteDeptById(Long deptId) {
  378. return deptMapper.deleteDeptById(deptId);
  379. }
  380. /**
  381. * 递归列表
  382. */
  383. private void recursionFn(List<SysDept> list, SysDept t) {
  384. // 得到子节点列表
  385. List<SysDept> childList = getChildList(list, t);
  386. t.setChildren(childList);
  387. for (SysDept tChild : childList) {
  388. if (hasChild(list, tChild)) {
  389. recursionFn(list, tChild);
  390. }
  391. }
  392. }
  393. /**
  394. * 得到子节点列表
  395. */
  396. private List<SysDept> getChildList(List<SysDept> list, SysDept t) {
  397. List<SysDept> tlist = new ArrayList<SysDept>();
  398. Iterator<SysDept> it = list.iterator();
  399. while (it.hasNext()) {
  400. SysDept n = (SysDept) it.next();
  401. if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
  402. tlist.add(n);
  403. }
  404. }
  405. return tlist;
  406. }
  407. /**
  408. * 判断是否有子节点
  409. */
  410. private boolean hasChild(List<SysDept> list, SysDept t) {
  411. return getChildList(list, t).size() > 0;
  412. }
  413. //判断是否为超额计划
  414. @Override
  415. public String isExcessOrNo(String projectType, BigDecimal evaluation, Long deptId) {
  416. String result = "0";
  417. BigDecimal threshold = new BigDecimal(0);
  418. //获取各个项目类型设定的概算金额阈值
  419. QueryWrapper<SysProcurementStandard> queryWrapper = new QueryWrapper<>();
  420. queryWrapper.eq("dept_id", deptId);
  421. queryWrapper.eq("category", projectType.equals("2") ? "1" : projectType.equals("1") ? "2" : projectType);
  422. List<SysProcurementStandard> sysProcurementStandardsList = sysProcurementStandardMapper.selectList(queryWrapper);
  423. if (!ObjectUtils.isEmpty(sysProcurementStandardsList)) {
  424. BigDecimal maximum = sysProcurementStandardsList.get(0).getMaximum();
  425. if (ObjectUtils.isEmpty(maximum)) {
  426. return "0";
  427. }
  428. if (evaluation.compareTo(maximum) == 1) {
  429. //是超额计划
  430. result = "1";
  431. } else {
  432. result = "0";
  433. }
  434. }
  435. return result;
  436. }
  437. //获取到子孙级部门id
  438. public List<Long> getDeptChildren(Long deptId) {
  439. List<Long> deptList = new ArrayList<>();
  440. List<Long> childByDeptId = getChildIdByDeptId(deptId);
  441. for (Long cid : childByDeptId) {
  442. deptList.add(cid);
  443. if (hasChildByDeptId(cid)) {
  444. deptList.addAll(getDeptChildren(cid));
  445. }
  446. }
  447. return deptList;
  448. }
  449. @Override
  450. public SysDept selectById(Long deptId) {
  451. return deptMapper.selectDeptById(deptId);
  452. }
  453. @Override
  454. public List<SysDept> selectChildrenDeptById(Long deptId) {
  455. return deptMapper.selectChildrenDeptById(deptId);
  456. }
  457. @Override
  458. public List<SysDept> selectMaxDeptByParentId(Long deptId) {
  459. return deptMapper.selectMaxDeptByParentId(deptId);
  460. }
  461. @Override
  462. public SysDept selectByCid(Long deptId) {
  463. return deptMapper.selectByCid(deptId);
  464. }
  465. }