【SpringBoot+MySQL】后台管理系统——机构管理

一、机构表

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;

/**
 * (Organization)实体类
 *
 */
@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;
    /**
     * 上级部门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;

/**
 * (Organization)表数据库访问层
 *
 */
@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 {
    /**
     * 上级部门Id
     */
    @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;
    /**
     * 上级部门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;

/**
 * (Organization)表服务接口
 */
public interface IOrganizationService {

    /**
     * 通过ID查询单条数据
     */
    Organization queryById(String id) throws Exception;

    /**
     * 查询机构树 根据id
     */
    OrgTreeDto queryOrgTree(String id) throws Exception;

    /**
     * 查询机构树 根据name
     */
    OrgTreeDto queryOrgTreeByName(String name, Boolean contextmenu) throws Exception;

    /**
     * 根据id 获取父级的id
     * @param orgId orgId
     * @return
     * @throws Exception
     */
    List<String> getParentId(String orgId) throws Exception;

    /**
     * 查询当前及以下机构的id
     */
    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;

/**
 * (Organization)表服务实现类
 */
@Service
@Slf4j
public class OrganizationService extends ServiceImpl<OrganizationDao, Organization> implements IOrganizationService {


    @Autowired
    private CurrentRequest currentRequest;

    @Autowired
    private OrgCovert orgCovert;

    @Autowired
    private PrimaryKeyGenerator primaryKeyGenerator;


    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @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;
    }

    /**
     * 查询机构树 ,根据id
     *
     * @param id id
     * @return return
     */
    @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;
    }

    /**
     * 查询机构树 根据name
     *
     * @param name name
     * @return re
     * @throws Exception e
     */
    @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;
    }

    /**
     * 新建机构
     *
     * @param organization 实例对象
     * @return 实例对象
     */
    @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;
    }


    /**
     * 删除当前部门以及下属部门
     *
     * @param id 主键
     * @return 是否成功
     */
    @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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值