|
|
@@ -0,0 +1,256 @@
|
|
|
+package com.jzg.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.jzg.core.page.HttpResult;
|
|
|
+import com.jzg.entity.po.SysDept;
|
|
|
+import com.jzg.entity.vo.SysDeptVo;
|
|
|
+import com.jzg.exception.SystemException;
|
|
|
+import com.jzg.mapper.SysDeptMapper;
|
|
|
+import com.jzg.service.DeptService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.ObjectUtils;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class DeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements DeptService {
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public SysDeptVo addDept(SysDeptVo sysDeptVo) {
|
|
|
+ SysDept sysDept = new SysDept();
|
|
|
+ BeanUtils.copyProperties(sysDeptVo, sysDept);
|
|
|
+ String comlevel = ObjectUtils.isEmpty(sysDept.getComLevel()) ? "" : sysDept.getComLevel();
|
|
|
+ String parentId = sysDept.getParentId();
|
|
|
+
|
|
|
+ String number;
|
|
|
+ if (comlevel.equals("2")) {
|
|
|
+ AssertionUtils.isStringEmpty(sysDept.getProvince(), "二级机构省份必填");
|
|
|
+ number = sysDept.getProvince().substring(0, 2);
|
|
|
+ } else if (comlevel.equals("3")) {
|
|
|
+ AssertionUtils.isStringEmpty(sysDept.getCity(), "三级机构市必填");
|
|
|
+ number = sysDept.getCity().substring(0, 4);
|
|
|
+ String maxId = baseMapper.getMaxId(parentId, sysDeptVo.getDeptType(), comlevel);
|
|
|
+ if (!maxId.equals("0")) {
|
|
|
+ String substring = maxId.substring(sysDept.getParentId().length() + 1);
|
|
|
+ int i = Integer.parseInt("1" + substring) + 1;
|
|
|
+ number = String.valueOf(i);
|
|
|
+ } else {
|
|
|
+ number = "101";
|
|
|
+ }
|
|
|
+ } else if (comlevel.equals("4")) {
|
|
|
+ AssertionUtils.isStringEmpty(sysDept.getArea(), "四级机构区必填");
|
|
|
+ number = sysDept.getArea().substring(0, 6);
|
|
|
+ String maxId = baseMapper.getMaxId(parentId, sysDeptVo.getDeptType(), comlevel);
|
|
|
+ if (!maxId.equals("0")) {
|
|
|
+ String substring = maxId.substring(sysDept.getParentId().length() + 1);
|
|
|
+ int i = Integer.parseInt("1" + substring) + 1;
|
|
|
+ number = String.valueOf(i);
|
|
|
+ } else {
|
|
|
+ number = "101";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String deptType = sysDeptVo.getDeptType();
|
|
|
+
|
|
|
+ if ("C".equals(sysDept.getDeptType()) && comlevel.equals("5")) {
|
|
|
+ sysDeptVo.setDeptType("M");
|
|
|
+ } else if ("D".equals(sysDept.getDeptType())) {
|
|
|
+ sysDeptVo.setDeptType("D");
|
|
|
+ deptType = "M";
|
|
|
+ }
|
|
|
+
|
|
|
+ String maxId = baseMapper.getMaxId(parentId, deptType, comlevel);
|
|
|
+ if (!maxId.equals("0")) {
|
|
|
+ String substring = maxId.substring(sysDept.getParentId().length() + 1);
|
|
|
+ int i = Integer.parseInt("1" + substring) + 1;
|
|
|
+ number = String.valueOf(i);
|
|
|
+ } else {
|
|
|
+ number = "101";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String substring = number.substring(number.length() - 2);
|
|
|
+ String serialNumber;
|
|
|
+ if ("M,D".contains(sysDeptVo.getDeptType())) {
|
|
|
+ serialNumber = parentId + sysDeptVo.getDeptType() + substring;
|
|
|
+ } else {
|
|
|
+ serialNumber = parentId + substring;
|
|
|
+ }
|
|
|
+
|
|
|
+ sysDept.setId(serialNumber);
|
|
|
+
|
|
|
+ SysDept dept = getById(sysDept.getId());
|
|
|
+ if (!ObjectUtils.isEmpty(dept)) {
|
|
|
+ throw new SystemException("机构编号为:" + dept.getId() + " " + dept.getName() + "已被占用");
|
|
|
+ }
|
|
|
+ SysDept parentDept = baseMapper.selectById(sysDept.getParentId());
|
|
|
+
|
|
|
+ if (parentDept.getComLevel().equals("5")) {
|
|
|
+ sysDept.setManagementSource(parentDept.getManagementSource());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询当前部门序号是否存在
|
|
|
+ LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
|
|
|
+ qw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
|
|
|
+ qw.eq(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号相同
|
|
|
+ boolean exists = baseMapper.exists(qw);
|
|
|
+
|
|
|
+ if (exists) {
|
|
|
+ // 如果存在,查询该父级部门下排序号大于当前部门的部门列表
|
|
|
+ LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
|
|
|
+ lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
|
|
|
+ lqw.eq(SysDept::getParentId, sysDept.getParentId()); // 父级部门ID相同
|
|
|
+ lqw.ge(SysDept::getOrderNum, sysDept.getOrderNum()); // 排序号大于等于当前部门
|
|
|
+ List<SysDept> sysDeptList = list(lqw);
|
|
|
+ // 更新这些部门的排序号
|
|
|
+ sysDeptList.forEach(i -> {
|
|
|
+ i.setOrderNum(i.getOrderNum() + 1);
|
|
|
+ updateById(i);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ boolean b = save(sysDept);
|
|
|
+ log.info("------------------添加部门成功-----------------------");
|
|
|
+ AssertionUtils.isSucceed(b, "删除失败");
|
|
|
+ sysDeptVo.setId(sysDept.getId());
|
|
|
+ return sysDeptVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public HttpResult updateDept(SysDept sysDeptVo) {
|
|
|
+ // 查询修改的序号是否存在
|
|
|
+ LambdaQueryWrapper<SysDept> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
|
|
|
+ qw.eq(SysDept::getParentId, sysDeptVo.getParentId()); // 父级部门ID相同
|
|
|
+ qw.eq(SysDept::getOrderNum, sysDeptVo.getOrderNum()); // 排序号相同
|
|
|
+ boolean exists = baseMapper.exists(qw);
|
|
|
+ //不存在则直接修改
|
|
|
+ if (!exists) {
|
|
|
+ baseMapper.updateById(sysDeptVo);
|
|
|
+ return HttpResult.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询机构
|
|
|
+ SysDept sysDept = getById(sysDeptVo.getId());
|
|
|
+ //原本的序号
|
|
|
+ Integer orderNum = sysDept.getOrderNum();
|
|
|
+ //本次修改的序号
|
|
|
+ Integer newOrderNum = sysDeptVo.getOrderNum();
|
|
|
+ // 向上换位
|
|
|
+ if (newOrderNum < orderNum) {
|
|
|
+ // 查询该父级部门下排序号大于当前部门的部门列表
|
|
|
+ LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
|
|
|
+ lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
|
|
|
+ lqw.eq(SysDept::getParentId, sysDeptVo.getParentId()); // 父级部门ID相同
|
|
|
+ lqw.ge(SysDept::getOrderNum, sysDeptVo.getOrderNum()); // 排序号大于等于当前部门
|
|
|
+ List<SysDept> sysDeptList = list(lqw);
|
|
|
+ sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum));
|
|
|
+ for (SysDept dept : sysDeptList) {
|
|
|
+ dept.setOrderNum(dept.getOrderNum() + 1);
|
|
|
+ updateById(dept);
|
|
|
+ if (dept.getOrderNum().equals(orderNum)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ baseMapper.updateById(sysDeptVo);
|
|
|
+ }
|
|
|
+ //向下换位
|
|
|
+ if (newOrderNum > orderNum) {
|
|
|
+ // 查询该父级部门下排序号小于当前部门的部门列表
|
|
|
+ LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
|
|
|
+ lqw.eq(SysDept::getDelFlag, 0); // 删除标志为未删除
|
|
|
+ lqw.eq(SysDept::getParentId, sysDeptVo.getParentId()); // 父级部门ID相同
|
|
|
+ lqw.le(SysDept::getOrderNum, sysDeptVo.getOrderNum()); // 排序号大于等于当前部门
|
|
|
+ List<SysDept> sysDeptList = list(lqw);
|
|
|
+ sysDeptList.sort(Comparator.comparing(SysDept::getOrderNum).reversed());
|
|
|
+ for (SysDept dept : sysDeptList) {
|
|
|
+ dept.setOrderNum(dept.getOrderNum() - 1);
|
|
|
+ updateById(dept);
|
|
|
+ if (dept.getOrderNum().equals(orderNum)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ baseMapper.updateById(sysDeptVo);
|
|
|
+ }
|
|
|
+ if (newOrderNum.equals(orderNum)) {
|
|
|
+ baseMapper.updateById(sysDeptVo);
|
|
|
+ }
|
|
|
+ return HttpResult.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public HttpResult batchLeader(SysDeptVo sysDeptVo) {
|
|
|
+ // 更新每个部门的负责人
|
|
|
+ for (String id : sysDeptVo.getDeptIds()) {
|
|
|
+ SysDept sysDept = getById(id);
|
|
|
+ if (sysDept == null) {
|
|
|
+ throw new SystemException("机构不存在");
|
|
|
+ }
|
|
|
+ sysDept.setLeaderId(sysDeptVo.getLeaderId());
|
|
|
+ baseMapper.updateById(sysDept);
|
|
|
+ }
|
|
|
+ return HttpResult.ok("批量设置负责人成功。");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public HttpResult deleteDept(SysDeptVo sysDeptVo) {
|
|
|
+ SysDept sysDept = getById(sysDeptVo.getId());
|
|
|
+ if (sysDept == null) {
|
|
|
+ throw new SystemException("机构不存在");
|
|
|
+ }
|
|
|
+ List<SysDept> deptList = lambdaQuery().eq(SysDept::getParentId, sysDept.getId()).list();
|
|
|
+// List<SysUser> userList = userService.lambdaQuery().eq(SysUser::getDeptId, sysDept.getId()).list();
|
|
|
+ if (!deptList.isEmpty()) {
|
|
|
+ throw new SystemException(sysDept.getName() + "机构下还有其他隶属机构请将这些子机构删除后,再进行删除");
|
|
|
+ }
|
|
|
+// if (!userList.isEmpty()) {
|
|
|
+// throw new SystemException(sysDept.getName() + "机构下还有其他用户请将这些用户删除后,再进行删除");
|
|
|
+// }
|
|
|
+ sysDept.setDelFlag(1);
|
|
|
+ baseMapper.updateById(sysDept);
|
|
|
+ return HttpResult.ok("删除机构成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public HttpResult batchDeleteDept(SysDeptVo sysDeptVo) {
|
|
|
+ // 更新每个部门的负责人
|
|
|
+ for (String id : sysDeptVo.getDeptIds()) {
|
|
|
+ SysDept sysDept = getById(id);
|
|
|
+ if (sysDept == null) {
|
|
|
+ throw new SystemException("机构不存在");
|
|
|
+ }
|
|
|
+ List<SysDept> deptList = lambdaQuery().eq(SysDept::getParentId, sysDept.getId()).list();
|
|
|
+// List<SysUser> userList = userService.lambdaQuery().eq(SysUser::getDeptId, sysDept.getId()).list();
|
|
|
+ if (!deptList.isEmpty()) {
|
|
|
+ throw new SystemException(sysDept.getName() + "机构下还有其他隶属机构请将这些子机构删除后,再进行删除");
|
|
|
+ }
|
|
|
+// if (!userList.isEmpty()) {
|
|
|
+// throw new SystemException(sysDept.getName() + "机构下还有其他用户请将这些用户删除后,再进行删除");
|
|
|
+// }
|
|
|
+ sysDept.setDelFlag(1);
|
|
|
+ baseMapper.updateById(sysDept);
|
|
|
+ }
|
|
|
+ return HttpResult.ok("批量删除机构成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SysDept> getDeptTree(String deptId) {
|
|
|
+ SysDept sysDept = getById(deptId);
|
|
|
+ LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
|
|
|
+ lqw.eq(SysDept::getDelFlag, 0);
|
|
|
+ lqw.likeRight(SysDept::getId, deptId);
|
|
|
+ List<SysDept> sysDeptList = list(lqw);
|
|
|
+ Map<String, List<SysDept>> map = sysDeptList.stream().collect(Collectors.groupingBy(SysDept::getParentId));
|
|
|
+ sysDeptList.forEach(i -> i.setChildren(map.getOrDefault(i.getId(), new ArrayList<>())));
|
|
|
+ return map.get(sysDept.getParentId());
|
|
|
+ }
|
|
|
+}
|