一、机构表
sql 建表语句
CREATE TABLE `t_organization` (
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
`parentId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '上级部门Id',
`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门编号',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门名称',
`levelCode` int(0) NULL DEFAULT NULL COMMENT '部门等级',
`createdAt` date NULL DEFAULT NULL COMMENT '创建时间',
`createdById` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建操作人',
`deleted` tinyint(0) NULL DEFAULT NULL COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
数据库对应java 实体类
package com.management.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
import java.io.Serializable;
@Data
@TableName(value = "t_organization")
public class Organization implements Serializable {
private static final long serialVersionUID = 903679346923294871L;
@TableId(value = "id", type = IdType.INPUT)
private String id;
private String parentId;
private String code;
private String name;
private int levelCode;
private Date createdAt;
private String createdById;
private boolean deleted;
public boolean getDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}
dao接口
package com.management.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.management.entity.Organization;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@Mapper
public interface OrganizationDao extends BaseMapper<Organization> {
@Update({"<script>" +
"update organization set deleted= 1 " +
"where"+
"<foreach collection='organizations' item='item' index='index' open='(' separator='or' close=')'> " +
" id = #{item} " +
"</foreach>" +
"</script>"})
int updateBatchIds(@Param("organizations") List<String> organizations);
}
Organization 相关dto 类
package com.management.dto.organization;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("新建机构")
public class CreateOrganizationDto {
@ApiModelProperty("父级机构id")
private String parentId;
@ApiModelProperty("部门名称")
private String name;
}
package com.management.dto.organization;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("机构树")
public class OrgTreeDto {
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("上级部门Id")
private String parentId;
@ApiModelProperty("部门编号")
private String code;
@ApiModelProperty("部门名称")
private String title;
@ApiModelProperty("部门等级")
private int levelCode;
@ApiModelProperty("创建时间")
private Date createdAt;
@ApiModelProperty("创建操作人")
private String createdById;
@ApiModelProperty("是否删除")
private boolean deleted;
@ApiModelProperty("子级机构")
private List<OrgTreeDto> children;
private boolean contextmenu ;
}
package com.management.dto.organization;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("编辑机构")
public class UpdateOrgDto {
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("部门名称")
private String name;
}
service 接口
package com.management.service;
import com.management.dto.organization.CreateOrganizationDto;
import com.management.dto.organization.OrgTreeDto;
import com.management.dto.organization.UpdateOrgDto;
import com.management.entity.Organization;
import java.util.List;
public interface IOrganizationService {
Organization queryById(String id) throws Exception;
OrgTreeDto queryOrgTree(String id) throws Exception;
OrgTreeDto queryOrgTreeByName(String name, Boolean contextmenu) throws Exception;
List<String> getParentId(String orgId) throws Exception;
List<String> queryOrgList(String id) throws Exception;
Organization createOrg(CreateOrganizationDto organization) throws Exception;
boolean updateOrg(UpdateOrgDto orgDto) throws Exception;
boolean deleteOrg(String id) throws Exception;
}
service 业务是实现类接口
package com.management.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.management.common.enums.PrefixEnum;
import com.management.common.exception.LogicException;
import com.management.common.mapstruct.OrgCovert;
import com.management.common.primaryKey.PrimaryKeyGenerator;
import com.management.common.request.CurrentRequest;
import com.management.dao.OrganizationDao;
import com.management.dto.organization.CreateOrganizationDto;
import com.management.dto.organization.OrgTreeDto;
import com.management.dto.organization.UpdateOrgDto;
import com.management.entity.Organization;
import com.management.service.IOrganizationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class OrganizationService extends ServiceImpl<OrganizationDao, Organization> implements IOrganizationService {
@Autowired
private CurrentRequest currentRequest;
@Autowired
private OrgCovert orgCovert;
@Autowired
private PrimaryKeyGenerator primaryKeyGenerator;
@Transactional(rollbackFor = Exception.class)
@Override
public Organization queryById(String id) throws Exception {
if (StringUtils.isEmpty(id)) {
throw new LogicException("id为空!");
}
Organization organization = this.baseMapper.selectById(id);
if (organization == null) {
throw new LogicException("organization 查询失败!");
}
log.info("[组织机构]-[queryById]-organization: {} ", JSONUtil.toJsonStr(organization));
return organization;
}
@Transactional(rollbackFor = Exception.class)
@Override
public OrgTreeDto queryOrgTree(String id) throws Exception {
if (StringUtils.isEmpty(id)) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("deleted", false).andNew().eq("parentId", "").or().isNull("parentId");
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations != null && organizations.size() != 0) {
id = organizations.get(0).getId();
} else {
throw new LogicException("id为空!");
}
}
log.info("[组织机构]-[查询机构树]-id: {} ", id);
List<OrgTreeDto> organizationList = new ArrayList<>();
Organization organization = baseMapper.selectById(id);
if (organization == null) {
throw new LogicException("父级机构不存在");
}
OrgTreeDto result = orgCovert.daoTodto(organization);
organizationList.add(result);
while (true) {
List<OrgTreeDto> temp = new ArrayList<>();
for (OrgTreeDto orgTreeDto :
organizationList) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("parentId", orgTreeDto.getId());
wrapper.eq("deleted", 0);
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations.size() != 0) {
List<OrgTreeDto> orgTreeDtos = orgCovert.daoTodto(organizations);
temp.addAll(orgTreeDtos);
orgTreeDto.setChildren(orgTreeDtos);
}
}
if (temp.size() == 0) {
break;
}
organizationList.clear();
organizationList.addAll(temp);
}
log.info("[组织机构]-[查询机构树]-result: {} ", JSONUtil.toJsonStr(result));
return result;
}
@Transactional(rollbackFor = Exception.class)
@Override
public OrgTreeDto queryOrgTreeByName(String name, Boolean contextmenu) throws Exception {
List<String> parentIds = new ArrayList<>();
List<String> orgIds = new ArrayList<>();
if (!StringUtils.isEmpty(name)) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.like("name", name);
wrapper.eq("deleted", false);
List<Organization> organizationList = baseMapper.selectList(wrapper);
if (organizationList == null || organizationList.size() == 0) {
return null;
}
List<String> parentIdAll = new ArrayList<>();
for (Organization temp : organizationList) {
List<String> parentId = getParentId(temp.getId());
parentIdAll.add(temp.getId());
parentIdAll.addAll(parentId);
orgIds.add(temp.getId());
}
parentIds.addAll(parentIdAll.stream().distinct().collect(Collectors.toList()));
}
EntityWrapper<Organization> wrapperParent = new EntityWrapper<>();
if (!parentIds.isEmpty()) {
wrapperParent.in("id", parentIds);
}
wrapperParent.eq("deleted", false).andNew().eq("parentId", "").or().isNull("parentId");
List<Organization> parentOrg = baseMapper.selectList(wrapperParent);
List<OrgTreeDto> organizationList = new ArrayList<>();
List<OrgTreeDto> orgTreeDtoList = new ArrayList<>();
OrgTreeDto result = orgCovert.daoTodto(parentOrg.get(0));
result.setContextmenu(contextmenu);
organizationList.add(result);
while (true) {
List<OrgTreeDto> temp = new ArrayList<>();
for (OrgTreeDto orgTreeDto :
organizationList) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("parentId", orgTreeDto.getId());
wrapper.eq("deleted", 0);
if (!parentIds.isEmpty()) {
wrapper.in("id", parentIds);
}
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations.size() != 0) {
List<OrgTreeDto> orgTreeDtos = orgCovert.daoTodto(organizations);
for (OrgTreeDto temp1 : orgTreeDtos) {
temp1.setContextmenu(contextmenu);
if (orgIds.lastIndexOf(temp1.getId()) > -1) {
orgTreeDtoList.add(temp1);
}
}
temp.addAll(orgTreeDtos);
orgTreeDto.setChildren(orgTreeDtos);
}
}
if (temp.size() == 0) {
break;
}
organizationList.clear();
organizationList.addAll(temp);
}
while (true) {
List<OrgTreeDto> temp = new ArrayList<>();
for (OrgTreeDto orgTreeDto :
orgTreeDtoList) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("parentId", orgTreeDto.getId());
wrapper.eq("deleted", 0);
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations.size() != 0) {
List<OrgTreeDto> orgTreeDtos = orgCovert.daoTodto(organizations);
for (OrgTreeDto temp1 : orgTreeDtos) {
temp1.setContextmenu(contextmenu);
}
temp.addAll(orgTreeDtos);
orgTreeDto.setChildren(orgTreeDtos);
}
}
if (temp.size() == 0) {
break;
}
orgTreeDtoList.clear();
orgTreeDtoList.addAll(temp);
}
log.info("[组织机构]-[查询机构树]-result: {} ", JSONUtil.toJsonStr(result));
return result;
}
@Override
public List<String> getParentId(String orgId) throws Exception {
List<String> result = new ArrayList<>();
if (StringUtils.isEmpty(orgId)) {
throw new LogicException("orgId 为空!");
}
Organization organization = baseMapper.selectById(orgId);
String parentId = organization.getParentId();
while (true) {
if (StringUtils.isEmpty(parentId)) {
break;
}
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("id", parentId);
wrapper.eq("deleted", 0);
List<Organization> parentOrganizations = baseMapper.selectList(wrapper);
if (parentOrganizations.isEmpty()) {
throw new LogicException("查询父级机构失败!");
}
parentId = parentOrganizations.get(0).getParentId();
result.add(parentOrganizations.get(0).getId());
}
return result;
}
@Transactional(rollbackFor = Exception.class)
@Override
public List<String> queryOrgList(String id) throws Exception {
log.info("[组织机构]-[查询当前及以下机构的id]-id: {} ", id);
List<Organization> organizationList = new ArrayList<>();
Organization organization = baseMapper.selectById(id);
if (organization == null) {
throw new LogicException("父级机构不存在");
}
List<String> result = new ArrayList<>();
result.add(organization.getId());
organizationList.add(organization);
while (true) {
List<Organization> temp = new ArrayList<>();
for (Organization org :
organizationList) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.eq("parentId", org.getId());
wrapper.eq("deleted", 0);
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations.size() != 0) {
List<String> idList = organizations.stream().map(Organization::getId).collect(Collectors.toList());
result.addAll(idList);
temp.addAll(organizations);
}
}
if (temp.size() == 0) {
break;
}
organizationList.clear();
organizationList.addAll(temp);
}
log.info("[组织机构]-[查询当前及以下机构的id]-result: {} ", JSONUtil.toJsonStr(result));
return result;
}
@Transactional(rollbackFor = Exception.class)
@Override
public Organization createOrg(CreateOrganizationDto organization) throws Exception {
log.info("[组织机构]-[新建机构]-organization: {} ", JSONUtil.toJsonStr(organization));
Organization parentOrg = baseMapper.selectById(organization.getParentId());
log.info("[组织机构]-[新建机构]-parentOrg: {} ", JSONUtil.toJsonStr(parentOrg));
int newLevel = parentOrg.getLevelCode() + 1;
Organization newOrg = new Organization();
String primaryKey = primaryKeyGenerator.generateKey(PrefixEnum.t_organization.getPriFix(), PrefixEnum.t_organization);
newOrg.setId(primaryKey);
newOrg.setName(organization.getName());
newOrg.setParentId(organization.getParentId());
newOrg.setCreatedAt(new Date());
newOrg.setCreatedById(currentRequest.getUserInfo().getId());
newOrg.setDeleted(false);
newOrg.setLevelCode(newLevel);
log.info("[组织机构]-[新建机构]-newOrg: {} ", JSONUtil.toJsonStr(newOrg));
Integer result = baseMapper.insert(newOrg);
log.info("[组织机构]-[新建机构]-newOrg: {} ", JSONUtil.toJsonStr(newOrg));
newOrg.setCode(String.valueOf(newOrg.getId()));
int update = baseMapper.updateById(newOrg);
log.info("[组织机构]-[新建机构]-result: {} ", result);
log.info("[组织机构]-[新建机构]-update: {} ", update);
if (result > 0 && update > 0) {
return newOrg;
}
return null;
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateOrg(UpdateOrgDto orgDto) throws Exception {
log.info("[组织机构]-[编辑机构]-orgDto: {} ", JSONUtil.toJsonStr(orgDto));
Organization organization = baseMapper.selectById(orgDto.getId());
if (organization == null) {
throw new LogicException("机构信息不存在");
}
log.info("[组织机构]-[编辑机构]-organization: {} ", JSONUtil.toJsonStr(organization));
organization.setName(orgDto.getName());
baseMapper.updateById(organization);
return true;
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean deleteOrg(String id) throws Exception {
if (StringUtils.isEmpty(id)) {
throw new LogicException("id为空!");
}
log.info("[组织机构]-[删除当前部门以及下属部门]-id: {} ", id);
List<String> idList = new ArrayList<>();
List<String> parentIdList = new ArrayList<>();
idList.add(id);
parentIdList.add(id);
while (parentIdList.size() != 0) {
EntityWrapper<Organization> wrapper = new EntityWrapper<>();
wrapper.in("parentId", parentIdList);
wrapper.eq("deleted", 0);
List<Organization> organizations = baseMapper.selectList(wrapper);
if (organizations.size() != 0) {
idList.addAll(organizations.stream().map(Organization::getId).collect(Collectors.toList()));
parentIdList.clear();
parentIdList = organizations.stream().map(Organization::getId).collect(Collectors.toList());
} else {
parentIdList.clear();
}
}
log.info("[组织机构]-[删除当前部门以及下属部门]-idList: {} ", idList);
return baseMapper.updateBatchIds(idList) > 0;
}
}