package cn.exrick.xboot.base.controller.manage; import cn.exrick.xboot.core.common.constant.CommonConstant; import cn.exrick.xboot.core.common.exception.XbootException; import cn.exrick.xboot.core.common.redis.RedisTemplateHelper; import cn.exrick.xboot.core.common.utils.CommonUtil; import cn.exrick.xboot.core.common.utils.HibernateProxyTypeAdapter; import cn.exrick.xboot.core.common.utils.ResultUtil; import cn.exrick.xboot.core.common.utils.SecurityUtil; import cn.exrick.xboot.core.common.vo.Result; import cn.exrick.xboot.core.dao.mapper.DeleteMapper; import cn.exrick.xboot.core.entity.Department; import cn.exrick.xboot.core.entity.DepartmentHeader; import cn.exrick.xboot.core.entity.User; import cn.exrick.xboot.core.service.DepartmentHeaderService; import cn.exrick.xboot.core.service.DepartmentService; import cn.exrick.xboot.core.service.RoleDepartmentService; import cn.exrick.xboot.core.service.UserService; import cn.hutool.core.util.StrUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * @author Exrick */ @Slf4j @RestController @Api(tags = "部门管理接口") @RequestMapping("/xboot/department") @CacheConfig(cacheNames = "department") @Transactional public class DepartmentController { @Autowired private DepartmentService departmentService; @Autowired private UserService userService; @Autowired private RoleDepartmentService roleDepartmentService; @Autowired private DepartmentHeaderService departmentHeaderService; @Autowired private DeleteMapper deleteMapper; @Autowired private RedisTemplateHelper redisTemplate; @Autowired private SecurityUtil securityUtil; @RequestMapping(value = "/getByParentId/{parentId}", method = RequestMethod.GET) @ApiOperation(value = "通过parentId获取") public Result> getByParentId(@PathVariable String parentId, @ApiParam("是否开始数据权限过滤") @RequestParam(required = false, defaultValue = "true") Boolean openDataFilter) { List list; User u = securityUtil.getCurrUser(); String key = "department::" + parentId + ":" + u.getId() + "_" + openDataFilter; String v = redisTemplate.get(key); if (StrUtil.isNotBlank(v)) { list = new Gson().fromJson(v, new TypeToken>() { }.getType()); return new ResultUtil>().setData(list); } list = departmentService.findByParentIdOrderBySortOrder(parentId, openDataFilter); setInfo(list); redisTemplate.set(key, new GsonBuilder().registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY).create().toJson(list), 15L, TimeUnit.DAYS); return new ResultUtil>().setData(list); } @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "添加") public Result add(Department department) { Department d = departmentService.save(department); // 如果不是添加的一级 判断设置上级为父节点标识 if (!CommonConstant.PARENT_ID.equals(department.getParentId())) { Department parent = departmentService.get(department.getParentId()); if (parent.getIsParent() == null || !parent.getIsParent()) { parent.setIsParent(true); departmentService.update(parent); } } // 更新缓存 redisTemplate.deleteByPattern("department::*"); return ResultUtil.success("添加成功"); } @RequestMapping(value = "/edit", method = RequestMethod.POST) @ApiOperation(value = "编辑") public Result edit(Department department, @RequestParam(required = false) String[] mainHeader, @RequestParam(required = false) String[] viceHeader) { Department old = departmentService.get(department.getId()); String oldParentId = old.getParentId(); Department d = departmentService.update(department); // 先删除原数据 departmentHeaderService.deleteByDepartmentId(department.getId()); List headers = new ArrayList<>(); if (mainHeader != null) { for (String id : mainHeader) { DepartmentHeader dh = new DepartmentHeader().setUserId(id).setDepartmentId(d.getId()) .setType(CommonConstant.HEADER_TYPE_MAIN); headers.add(dh); } } if (viceHeader != null) { for (String id : viceHeader) { DepartmentHeader dh = new DepartmentHeader().setUserId(id).setDepartmentId(d.getId()) .setType(CommonConstant.HEADER_TYPE_VICE); headers.add(dh); } } // 批量保存 departmentHeaderService.saveOrUpdateAll(headers); // 如果该节点不是一级节点 且修改了级别 判断上级还有无子节点 if (!"0".equals(oldParentId) && !oldParentId.equals(department.getParentId())) { Department parent = departmentService.get(oldParentId); List children = departmentService.findByParentIdOrderBySortOrder(parent.getId(), false); if (parent != null && (children == null || children.isEmpty())) { parent.setIsParent(false); departmentService.update(parent); } } // 若修改了部门名称 if (!old.getTitle().equals(department.getTitle())) { userService.updateDepartmentTitle(department.getId(), department.getTitle()); // 删除所有用户缓存 redisTemplate.deleteByPattern("user:*"); } // 手动删除所有部门缓存 redisTemplate.deleteByPattern("department:*"); return ResultUtil.success("编辑成功"); } @RequestMapping(value = "/delByIds", method = RequestMethod.POST) @ApiOperation(value = "批量通过id删除") public Result delByIds(@RequestParam String[] ids) { for (String id : ids) { deleteRecursion(id, ids); } // 手动删除所有部门缓存 redisTemplate.deleteByPattern("department:*"); // 删除数据权限缓存 redisTemplate.deleteByPattern("userRole::depIds:*"); return ResultUtil.success("批量通过id删除数据成功"); } public void deleteRecursion(String id, String[] ids) { List list = userService.findByDepartmentId(id); if (list != null && list.size() > 0) { throw new XbootException("删除失败,包含正被用户使用关联的部门"); } // 获得其父节点 Department dep = departmentService.get(id); Department parent = null; if (dep != null && StrUtil.isNotBlank(dep.getParentId())) { parent = departmentService.get(dep.getParentId()); } departmentService.delete(id); // 删除关联数据权限 roleDepartmentService.deleteByDepartmentId(id); // 删除关联部门负责人 departmentHeaderService.deleteByDepartmentId(id); // 删除流程关联节点 deleteMapper.deleteActNode(id); // 判断父节点是否还有子节点 if (parent != null) { List childrenDeps = departmentService.findByParentIdOrderBySortOrder(parent.getId(), false); if (childrenDeps == null || childrenDeps.isEmpty()) { parent.setIsParent(false); departmentService.update(parent); } } // 递归删除 List departments = departmentService.findByParentIdOrderBySortOrder(id, false); for (Department d : departments) { if (!CommonUtil.judgeIds(d.getId(), ids)) { deleteRecursion(d.getId(), ids); } } } @RequestMapping(value = "/search", method = RequestMethod.GET) @ApiOperation(value = "部门名模糊搜索") public Result> searchByTitle(@RequestParam String title, @ApiParam("是否开始数据权限过滤") @RequestParam(required = false, defaultValue = "true") Boolean openDataFilter) { List list = departmentService.findByTitleLikeOrderBySortOrder("%" + title + "%", openDataFilter); setInfo(list); return new ResultUtil>().setData(list); } public void setInfo(List list) { // lambda表达式 list.forEach(item -> { if (!CommonConstant.PARENT_ID.equals(item.getParentId())) { Department parent = departmentService.get(item.getParentId()); item.setParentTitle(parent.getTitle()); } else { item.setParentTitle("一级部门"); } // 设置负责人 item.setMainHeaders(departmentHeaderService.findHeaderByDepartmentId(item.getId(), CommonConstant.HEADER_TYPE_MAIN)); item.setViceHeaders(departmentHeaderService.findHeaderByDepartmentId(item.getId(), CommonConstant.HEADER_TYPE_VICE)); }); } }