[add] 部门、角色、用户关联
This commit is contained in:
		@ -57,6 +57,22 @@ public interface IBusUserProjectRelevancyService extends IService<BusUserProject
 | 
			
		||||
     */
 | 
			
		||||
    Long insertByBo(BusUserProjectRelevancyCreateReq req);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增用户和项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param projectId  项目ID
 | 
			
		||||
     * @param userIdList 用户ID列表
 | 
			
		||||
     */
 | 
			
		||||
    void saveBatchByUserList(Long projectId, List<Long> userIdList);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增用户和项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param projectIdList 项目ID列表
 | 
			
		||||
     * @param userId        用户ID
 | 
			
		||||
     */
 | 
			
		||||
    void saveBatchByProjectList(List<Long> projectIdList, Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 修改系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
@ -74,6 +90,21 @@ public interface IBusUserProjectRelevancyService extends IService<BusUserProject
 | 
			
		||||
     */
 | 
			
		||||
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户ID删除系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     */
 | 
			
		||||
    void deleteByUserId(Long userId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据项目ID和用户ID列表删除系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param oldProjectId 项目ID
 | 
			
		||||
     * @param userIds      用户ID列表
 | 
			
		||||
     */
 | 
			
		||||
    void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取当前登录用户项目列表
 | 
			
		||||
     *
 | 
			
		||||
 | 
			
		||||
@ -50,9 +50,6 @@ import org.dromara.project.service.IBusProjectService;
 | 
			
		||||
import org.dromara.project.service.IBusUserProjectRelevancyService;
 | 
			
		||||
import org.dromara.quality.service.IQltKnowledgeDocumentService;
 | 
			
		||||
import org.dromara.safety.service.IHseKnowledgeDocumentService;
 | 
			
		||||
import org.dromara.system.domain.bo.SysDeptBo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysDeptVo;
 | 
			
		||||
import org.dromara.system.service.ISysDeptService;
 | 
			
		||||
import org.dromara.workflow.service.IFlwDefinitionService;
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.context.annotation.Lazy;
 | 
			
		||||
@ -100,9 +97,6 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
 | 
			
		||||
    @Resource
 | 
			
		||||
    private IFacMatrixService matrixService;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ISysDeptService deptService;
 | 
			
		||||
 | 
			
		||||
    @Lazy
 | 
			
		||||
    @Resource
 | 
			
		||||
    private IHseKnowledgeDocumentService hseKnowledgeDocumentService;
 | 
			
		||||
@ -323,26 +317,6 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
 | 
			
		||||
        if (this.lambdaQuery().eq(BusProject::getShortName, req.getShortName()).count() > 0) {
 | 
			
		||||
            throw new ServiceException("项目简称已存在", HttpStatus.BAD_REQUEST);
 | 
			
		||||
        }
 | 
			
		||||
        // 添加新部门
 | 
			
		||||
        SysDeptBo queryBo = new SysDeptBo();
 | 
			
		||||
        queryBo.setParentId(BusProjectConstant.PARENT_ID);
 | 
			
		||||
        // 查询父节点部门
 | 
			
		||||
        SysDeptVo deptVo = deptService.selectDeptList(queryBo).getFirst();
 | 
			
		||||
        Long deptId = deptVo.getDeptId();
 | 
			
		||||
        SysDeptBo createBo = new SysDeptBo();
 | 
			
		||||
        createBo.setParentId(deptId);
 | 
			
		||||
        String shortName = req.getShortName();
 | 
			
		||||
        createBo.setDeptName(shortName != null ? shortName : req.getProjectName());
 | 
			
		||||
        if (!deptService.checkDeptNameUnique(createBo)) {
 | 
			
		||||
            throw new ServiceException("新增项目部门'" + createBo.getDeptName() + "'失败,项目名称已存在");
 | 
			
		||||
        }
 | 
			
		||||
        // 新增部门
 | 
			
		||||
        int dept = deptService.insertDept(createBo);
 | 
			
		||||
        if (dept <= 0) {
 | 
			
		||||
            throw new ServiceException("新增项目部门'" + createBo.getDeptName() + "'失败");
 | 
			
		||||
        }
 | 
			
		||||
        Long newDeptId = deptService.selectIdByDeptName(createBo.getDeptName());
 | 
			
		||||
        project.setDeptId(newDeptId);
 | 
			
		||||
        // 写入数据库
 | 
			
		||||
        boolean save = this.save(project);
 | 
			
		||||
        if (!save) {
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import org.dromara.project.service.IBusProjectService;
 | 
			
		||||
import org.dromara.project.service.IBusUserProjectRelevancyService;
 | 
			
		||||
import org.dromara.system.service.ISysUserService;
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.context.annotation.Lazy;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
 | 
			
		||||
@ -46,6 +47,7 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProje
 | 
			
		||||
    @Resource
 | 
			
		||||
    private IBusProjectService projectService;
 | 
			
		||||
 | 
			
		||||
    @Lazy
 | 
			
		||||
    @Resource
 | 
			
		||||
    private ISysUserService userService;
 | 
			
		||||
 | 
			
		||||
@ -120,6 +122,54 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProje
 | 
			
		||||
        return userProjectRelevancy.getId();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增用户和项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param projectId  项目ID
 | 
			
		||||
     * @param userIdList 用户ID列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void saveBatchByUserList(Long projectId, List<Long> userIdList) {
 | 
			
		||||
        if (ObjectUtils.isEmpty(projectId) || ObjectUtils.isEmpty(userIdList)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        List<BusUserProjectRelevancy> userProjectRelevancyList = userIdList.stream().map(userId -> {
 | 
			
		||||
            BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
 | 
			
		||||
            userProjectRelevancy.setUserId(userId);
 | 
			
		||||
            userProjectRelevancy.setProjectId(projectId);
 | 
			
		||||
            return userProjectRelevancy;
 | 
			
		||||
        }).toList();
 | 
			
		||||
        boolean saveRelevancy = this.saveBatch(userProjectRelevancyList);
 | 
			
		||||
        if (!saveRelevancy) {
 | 
			
		||||
            throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 批量新增用户和项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param projectIdList 项目ID列表
 | 
			
		||||
     * @param userId        用户ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void saveBatchByProjectList(List<Long> projectIdList, Long userId) {
 | 
			
		||||
        if (ObjectUtils.isEmpty(projectIdList) || ObjectUtils.isEmpty(userId)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        List<BusUserProjectRelevancy> userProjectRelevancyList = projectIdList.stream().map(projectId -> {
 | 
			
		||||
            BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
 | 
			
		||||
            userProjectRelevancy.setUserId(userId);
 | 
			
		||||
            userProjectRelevancy.setProjectId(projectId);
 | 
			
		||||
            return userProjectRelevancy;
 | 
			
		||||
        }).toList();
 | 
			
		||||
        boolean saveRelevancy = this.saveBatch(userProjectRelevancyList);
 | 
			
		||||
        if (!saveRelevancy) {
 | 
			
		||||
            throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 修改系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
@ -195,6 +245,46 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProje
 | 
			
		||||
        return this.removeBatchByIds(ids);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户ID删除系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId 用户ID
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void deleteByUserId(Long userId) {
 | 
			
		||||
        List<BusUserProjectRelevancy> relevancyList = this.lambdaQuery()
 | 
			
		||||
            .eq(BusUserProjectRelevancy::getUserId, userId)
 | 
			
		||||
            .list();
 | 
			
		||||
        if (CollUtil.isNotEmpty(relevancyList)) {
 | 
			
		||||
            boolean result = this.removeBatchByIds(relevancyList);
 | 
			
		||||
            if (!result) {
 | 
			
		||||
                throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据项目ID和用户ID列表删除系统用户与项目关联
 | 
			
		||||
     *
 | 
			
		||||
     * @param oldProjectId 项目ID
 | 
			
		||||
     * @param userIds      用户ID列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds) {
 | 
			
		||||
        List<BusUserProjectRelevancy> relevancyList = this.lambdaQuery()
 | 
			
		||||
            .eq(BusUserProjectRelevancy::getProjectId, oldProjectId)
 | 
			
		||||
            .in(BusUserProjectRelevancy::getUserId, userIds)
 | 
			
		||||
            .list();
 | 
			
		||||
        if (CollUtil.isNotEmpty(relevancyList)) {
 | 
			
		||||
            boolean result = this.removeBatchByIds(relevancyList);
 | 
			
		||||
            if (!result) {
 | 
			
		||||
                throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取当前登录用户项目列表
 | 
			
		||||
     *
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ import org.dromara.system.domain.bo.SysDeptBo;
 | 
			
		||||
import org.dromara.system.domain.bo.SysRoleBo;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.DeptTreeSelectVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysDeptVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysRoleVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.system.service.ISysDeptService;
 | 
			
		||||
@ -50,12 +51,12 @@ public class SysRoleController extends BaseController {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取角色列表
 | 
			
		||||
     * 获取角色信息列表(不分页)
 | 
			
		||||
     */
 | 
			
		||||
    @SaCheckPermission("system:role:list")
 | 
			
		||||
    @GetMapping("/listNoPage/isSubsetDept")
 | 
			
		||||
    public List<SysRoleVo> listNoPageByIsSubsetDept(SysRoleBo roleBo) {
 | 
			
		||||
        return roleService.selectRoleListByIsSubsetDept(roleBo);
 | 
			
		||||
    @GetMapping("/listNoPage")
 | 
			
		||||
    public List<SysRoleVo> listNoPage(SysRoleBo role) {
 | 
			
		||||
        return roleService.selectRoleList(role);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -94,8 +95,15 @@ public class SysRoleController extends BaseController {
 | 
			
		||||
        } else if (!roleService.checkRoleKeyUnique(role)) {
 | 
			
		||||
            return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
 | 
			
		||||
        }
 | 
			
		||||
        Long deptId = role.getDeptId();
 | 
			
		||||
        if (deptId == null) {
 | 
			
		||||
            return R.fail("新增角色'" + role.getRoleName() + "'失败,请选择关联的部门");
 | 
			
		||||
        }
 | 
			
		||||
        SysDeptVo deptVo = deptService.selectDeptById(deptId);
 | 
			
		||||
        if (deptVo == null) {
 | 
			
		||||
            return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不存在");
 | 
			
		||||
        }
 | 
			
		||||
        return toAjax(roleService.insertRole(role));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,11 @@ public class SysDept extends TenantEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private Long parentId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 项目ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long projectId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 部门名称
 | 
			
		||||
     */
 | 
			
		||||
@ -90,9 +95,4 @@ public class SysDept extends TenantEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private String isSubset;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 角色ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long roleId;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,10 +3,10 @@ package org.dromara.system.domain;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableId;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableLogic;
 | 
			
		||||
import com.baomidou.mybatisplus.annotation.TableName;
 | 
			
		||||
import org.dromara.common.tenant.core.TenantEntity;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.NoArgsConstructor;
 | 
			
		||||
import org.dromara.common.tenant.core.TenantEntity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 角色表 sys_role
 | 
			
		||||
@ -26,6 +26,11 @@ public class SysRole extends TenantEntity {
 | 
			
		||||
    @TableId(value = "role_id")
 | 
			
		||||
    private Long roleId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 部门ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long deptId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 角色名称
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,6 @@ import io.github.linpeilie.annotations.AutoMapper;
 | 
			
		||||
import jakarta.validation.constraints.*;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import org.dromara.common.core.constant.SystemConstants;
 | 
			
		||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
 | 
			
		||||
import org.dromara.system.domain.SysDept;
 | 
			
		||||
 | 
			
		||||
@ -29,6 +28,11 @@ public class SysDeptBo extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private Long parentId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 项目id
 | 
			
		||||
     */
 | 
			
		||||
    private Long projectId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 部门名称
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,11 @@ public class SysRoleBo extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private Long roleId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 部门ID
 | 
			
		||||
     */
 | 
			
		||||
    private Long deptId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 角色名称
 | 
			
		||||
     */
 | 
			
		||||
@ -88,11 +93,6 @@ public class SysRoleBo extends BaseEntity {
 | 
			
		||||
     */
 | 
			
		||||
    private String isSpecial;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否有子部门
 | 
			
		||||
     */
 | 
			
		||||
    private String isSubsetDept;
 | 
			
		||||
 | 
			
		||||
    public SysRoleBo(Long roleId) {
 | 
			
		||||
        this.roleId = roleId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import org.apache.ibatis.annotations.Param;
 | 
			
		||||
import org.apache.ibatis.annotations.Select;
 | 
			
		||||
import org.dromara.common.mybatis.annotation.DataColumn;
 | 
			
		||||
import org.dromara.common.mybatis.annotation.DataPermission;
 | 
			
		||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 | 
			
		||||
@ -75,4 +76,22 @@ public interface SysDeptMapper extends BaseMapperPlus<SysDept, SysDeptVo> {
 | 
			
		||||
     */
 | 
			
		||||
    List<Long> selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly);
 | 
			
		||||
 | 
			
		||||
    @Select("""
 | 
			
		||||
        WITH RECURSIVE dept_tree AS (
 | 
			
		||||
            SELECT dept_id, parent_id, project_id, is_subset
 | 
			
		||||
            FROM sys_dept
 | 
			
		||||
            WHERE dept_id = #{deptId}
 | 
			
		||||
 | 
			
		||||
            UNION ALL
 | 
			
		||||
 | 
			
		||||
            SELECT d.dept_id, d.parent_id, d.project_id, d.is_subset
 | 
			
		||||
            FROM sys_dept d
 | 
			
		||||
            INNER JOIN dept_tree dt ON d.parent_id = dt.dept_id
 | 
			
		||||
        )
 | 
			
		||||
        SELECT DISTINCT project_id
 | 
			
		||||
        FROM dept_tree
 | 
			
		||||
        WHERE is_subset = '0' AND project_id IS NOT NULL
 | 
			
		||||
    """)
 | 
			
		||||
    List<Long> getProjectIdsByDept(@Param("deptId") Long deptId);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,14 @@ public interface ISysDeptService {
 | 
			
		||||
//     */
 | 
			
		||||
//    SysDeptBo selectDeptByIdBo(SysDeptBo dept);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据部门ID查询所属项目ID列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param deptId 部门id
 | 
			
		||||
     * @return 项目id列表
 | 
			
		||||
     */
 | 
			
		||||
    List<Long> selectProjectIdById(Long deptId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过部门名称查询部门ID
 | 
			
		||||
 | 
			
		||||
@ -27,14 +27,6 @@ public interface ISysRoleService {
 | 
			
		||||
     */
 | 
			
		||||
    List<SysRoleVo> selectRoleList(SysRoleBo role);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据条件分页查询角色数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param role 角色信息
 | 
			
		||||
     * @return 角色数据集合信息
 | 
			
		||||
     */
 | 
			
		||||
    List<SysRoleVo> selectRoleListByIsSubsetDept(SysRoleBo role);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据用户ID查询角色列表
 | 
			
		||||
     *
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.dromara.common.core.constant.CacheNames;
 | 
			
		||||
import org.dromara.common.core.constant.HttpStatus;
 | 
			
		||||
import org.dromara.common.core.constant.SystemConstants;
 | 
			
		||||
import org.dromara.common.core.domain.R;
 | 
			
		||||
import org.dromara.common.core.domain.dto.DeptDTO;
 | 
			
		||||
import org.dromara.common.core.exception.ServiceException;
 | 
			
		||||
import org.dromara.common.core.service.DeptService;
 | 
			
		||||
@ -20,22 +20,19 @@ import org.dromara.common.core.utils.*;
 | 
			
		||||
import org.dromara.common.mybatis.helper.DataBaseHelper;
 | 
			
		||||
import org.dromara.common.redis.utils.CacheUtils;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
import org.dromara.project.domain.BusProject;
 | 
			
		||||
import org.dromara.project.service.IBusProjectService;
 | 
			
		||||
import org.dromara.project.service.IBusUserProjectRelevancyService;
 | 
			
		||||
import org.dromara.system.domain.SysDept;
 | 
			
		||||
import org.dromara.system.domain.SysRole;
 | 
			
		||||
import org.dromara.system.domain.SysUser;
 | 
			
		||||
import org.dromara.system.domain.bo.SysDeptBo;
 | 
			
		||||
import org.dromara.system.domain.bo.SysRoleBo;
 | 
			
		||||
import org.dromara.system.domain.enums.SysDeptIsSubsetEnum;
 | 
			
		||||
import org.dromara.system.domain.enums.SysRoleIsSpecialEnum;
 | 
			
		||||
import org.dromara.system.domain.vo.SysDeptVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysRoleVo;
 | 
			
		||||
import org.dromara.system.mapper.SysDeptMapper;
 | 
			
		||||
import org.dromara.system.mapper.SysRoleMapper;
 | 
			
		||||
import org.dromara.system.mapper.SysUserMapper;
 | 
			
		||||
import org.dromara.system.service.ISysDeptService;
 | 
			
		||||
import org.dromara.system.service.ISysRoleService;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
import org.springframework.beans.BeanUtils;
 | 
			
		||||
import org.springframework.cache.annotation.CacheEvict;
 | 
			
		||||
import org.springframework.cache.annotation.Cacheable;
 | 
			
		||||
import org.springframework.cache.annotation.Caching;
 | 
			
		||||
@ -45,12 +42,14 @@ import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 部门管理 服务实现
 | 
			
		||||
 *
 | 
			
		||||
 * @author Lion Li
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
@RequiredArgsConstructor
 | 
			
		||||
@Service
 | 
			
		||||
public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
@ -58,7 +57,8 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
    private final SysDeptMapper baseMapper;
 | 
			
		||||
    private final SysRoleMapper roleMapper;
 | 
			
		||||
    private final SysUserMapper userMapper;
 | 
			
		||||
    private final ISysRoleService roleService;
 | 
			
		||||
    private final IBusProjectService projectService;
 | 
			
		||||
    private final IBusUserProjectRelevancyService userProjectRelevancyService;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 查询部门管理数据
 | 
			
		||||
@ -167,6 +167,17 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
        return dept;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据部门ID查询所属项目ID列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param deptId 部门id
 | 
			
		||||
     * @return 项目id列表
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Long> selectProjectIdById(Long deptId) {
 | 
			
		||||
        return baseMapper.getProjectIdsByDept(deptId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//    /**
 | 
			
		||||
//     * 根据部门ID查询信息
 | 
			
		||||
//     *
 | 
			
		||||
@ -342,16 +353,13 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
        if (LoginHelper.isSuperAdmin()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        SysDept dept = baseMapper.selectById(deptId);
 | 
			
		||||
        if (dept.getIsSubset().equals(SysDeptIsSubsetEnum.YES.getCode()) && CollUtil.isNotEmpty(roleIds)) {
 | 
			
		||||
            List<SysRole> roleList = roleMapper.selectByIds(roleIds);
 | 
			
		||||
            for (SysRole role : roleList) {
 | 
			
		||||
                if (!role.getStatus().equals(SystemConstants.NORMAL)) {
 | 
			
		||||
                    throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST);
 | 
			
		||||
                }
 | 
			
		||||
                if (role.getIsSpecial().equals(SysRoleIsSpecialEnum.NO.getCode())) {
 | 
			
		||||
                    throw new ServiceException("当前部门与角色不匹配,请重新选择", HttpStatus.BAD_REQUEST);
 | 
			
		||||
                }
 | 
			
		||||
        List<SysRole> roleList = roleMapper.selectByIds(roleIds);
 | 
			
		||||
        for (SysRole role : roleList) {
 | 
			
		||||
            if (!role.getStatus().equals(SystemConstants.NORMAL)) {
 | 
			
		||||
                throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST);
 | 
			
		||||
            }
 | 
			
		||||
            if (!role.getDeptId().equals(deptId)) {
 | 
			
		||||
                throw new ServiceException("角色部门与部门不匹配", HttpStatus.BAD_REQUEST);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -371,12 +379,35 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
        if (!SystemConstants.NORMAL.equals(info.getStatus())) {
 | 
			
		||||
            throw new ServiceException("部门停用,不允许新增");
 | 
			
		||||
        }
 | 
			
		||||
        if (!"0".equals(info.getIsSubset())){
 | 
			
		||||
        if (SysDeptIsSubsetEnum.NO.getCode().equals(info.getIsSubset())) {
 | 
			
		||||
            throw new ServiceException("当前部门不允许有子部门");
 | 
			
		||||
        }
 | 
			
		||||
        SysDept dept = MapstructUtils.convert(bo, SysDept.class);
 | 
			
		||||
        if (dept == null) {
 | 
			
		||||
            throw new ServiceException("新增部门参数异常", HttpStatus.BAD_REQUEST);
 | 
			
		||||
        }
 | 
			
		||||
        dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId());
 | 
			
		||||
        return  baseMapper.insert(dept);
 | 
			
		||||
        String isSubset = bo.getIsSubset();
 | 
			
		||||
        if (SysDeptIsSubsetEnum.NO.getCode().equals(isSubset)) {
 | 
			
		||||
            Long projectId = bo.getProjectId();
 | 
			
		||||
            if (projectId != null) {
 | 
			
		||||
                BusProject project = projectService.getById(projectId);
 | 
			
		||||
                if (project == null) {
 | 
			
		||||
                    throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
 | 
			
		||||
                }
 | 
			
		||||
                dept.setProjectId(projectId);
 | 
			
		||||
                // 判断是否有需要新增项目关联的用户
 | 
			
		||||
                List<Long> deptIds = this.getParentDeptIds(dept);
 | 
			
		||||
                LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<>();
 | 
			
		||||
                lqw.select(SysUser::getUserId);
 | 
			
		||||
                lqw.in(SysUser::getDeptId, deptIds);
 | 
			
		||||
                List<Long> userIds = userMapper.selectList(lqw).stream().map(SysUser::getUserId).toList();
 | 
			
		||||
                if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
                    userProjectRelevancyService.saveBatchByUserList(projectId, userIds);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return baseMapper.insert(dept);
 | 
			
		||||
//        // cory 判断是否需要直接新增角色
 | 
			
		||||
//        SysRoleBo role = getSysRoleBo(bo);
 | 
			
		||||
//        roleService.checkRoleAllowed(role);
 | 
			
		||||
@ -444,6 +475,37 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
        } else {
 | 
			
		||||
            dept.setAncestors(oldDept.getAncestors());
 | 
			
		||||
        }
 | 
			
		||||
        // 新增逻辑:判断是否需要更新用户与项目的关联
 | 
			
		||||
        String isSubset = dept.getIsSubset();
 | 
			
		||||
        Long oldProjectId = oldDept.getProjectId();
 | 
			
		||||
        Long newProjectId = dept.getProjectId();
 | 
			
		||||
        if (SysDeptIsSubsetEnum.NO.getCode().equals(isSubset) && newProjectId != null) {
 | 
			
		||||
            // 检查新项目是否存在
 | 
			
		||||
            BusProject project = projectService.getById(newProjectId);
 | 
			
		||||
            if (project == null) {
 | 
			
		||||
                throw new ServiceException("关联项目不存在", HttpStatus.NOT_FOUND);
 | 
			
		||||
            }
 | 
			
		||||
            // 获取当前部门及其上级部门 ID 列表
 | 
			
		||||
            List<Long> deptIds = this.getParentDeptIds(dept);
 | 
			
		||||
            // 获取部门用户 ID
 | 
			
		||||
            LambdaQueryWrapper<SysUser> lqw = new LambdaQueryWrapper<>();
 | 
			
		||||
            lqw.select(SysUser::getUserId);
 | 
			
		||||
            lqw.in(SysUser::getDeptId, deptIds);
 | 
			
		||||
            List<Long> userIds = userMapper.selectList(lqw).stream()
 | 
			
		||||
                .map(SysUser::getUserId)
 | 
			
		||||
                .toList();
 | 
			
		||||
            if (CollUtil.isNotEmpty(userIds)) {
 | 
			
		||||
                // 情况 1:原本有项目,且项目 ID 改变 → 删除旧的,添加新的
 | 
			
		||||
                if (oldProjectId != null && !Objects.equals(oldProjectId, newProjectId)) {
 | 
			
		||||
                    userProjectRelevancyService.deleteByProjectAndUserIds(oldProjectId, userIds);
 | 
			
		||||
                    userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds);
 | 
			
		||||
                }
 | 
			
		||||
                // 情况 2:原本没有项目,现在新增了 → 直接添加
 | 
			
		||||
                if (oldProjectId == null) {
 | 
			
		||||
                    userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        int result = baseMapper.updateById(dept);
 | 
			
		||||
        if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
 | 
			
		||||
            && !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) {
 | 
			
		||||
@ -522,4 +584,27 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
 | 
			
		||||
        return baseMapper.deleteById(deptId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取部门以及父部门ID列表
 | 
			
		||||
     *
 | 
			
		||||
     * @param dept 部门
 | 
			
		||||
     * @return 部门ID列表
 | 
			
		||||
     */
 | 
			
		||||
    public List<Long> getParentDeptIds(SysDept dept) {
 | 
			
		||||
        List<Long> deptIds = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        if (StringUtils.isNotBlank(dept.getAncestors())) {
 | 
			
		||||
            String[] ids = dept.getAncestors().split(",");
 | 
			
		||||
            for (String id : ids) {
 | 
			
		||||
                if (!"0".equals(id)) {
 | 
			
		||||
                    deptIds.add(Long.parseLong(id));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 加上自己
 | 
			
		||||
        deptIds.add(dept.getDeptId());
 | 
			
		||||
        return deptIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -29,8 +29,6 @@ import org.dromara.system.domain.SysRoleDept;
 | 
			
		||||
import org.dromara.system.domain.SysRoleMenu;
 | 
			
		||||
import org.dromara.system.domain.SysUserRole;
 | 
			
		||||
import org.dromara.system.domain.bo.SysRoleBo;
 | 
			
		||||
import org.dromara.system.domain.enums.SysDeptIsSubsetEnum;
 | 
			
		||||
import org.dromara.system.domain.enums.SysRoleIsSpecialEnum;
 | 
			
		||||
import org.dromara.system.domain.vo.SysRoleVo;
 | 
			
		||||
import org.dromara.system.mapper.SysRoleDeptMapper;
 | 
			
		||||
import org.dromara.system.mapper.SysRoleMapper;
 | 
			
		||||
@ -74,29 +72,11 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
 | 
			
		||||
        return baseMapper.selectRoleList(this.buildQueryWrapper(role));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据条件分页查询角色数据
 | 
			
		||||
     *
 | 
			
		||||
     * @param role 角色信息
 | 
			
		||||
     * @return 角色数据集合信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<SysRoleVo> selectRoleListByIsSubsetDept(SysRoleBo role) {
 | 
			
		||||
        LambdaQueryWrapper<SysRole> lqw = new LambdaQueryWrapper<>();
 | 
			
		||||
        String isSubsetDept = role.getIsSubsetDept();
 | 
			
		||||
        if (StringUtils.isNotBlank(isSubsetDept)) {
 | 
			
		||||
            if (isSubsetDept.equals(SysDeptIsSubsetEnum.YES.getCode())) {
 | 
			
		||||
                lqw.eq(SysRole::getIsSpecial, SysRoleIsSpecialEnum.NO.getCode());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        lqw.eq(SysRole::getIsSpecial, true);
 | 
			
		||||
        return List.of();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Wrapper<SysRole> buildQueryWrapper(SysRoleBo bo) {
 | 
			
		||||
        Map<String, Object> params = bo.getParams();
 | 
			
		||||
        QueryWrapper<SysRole> wrapper = Wrappers.query();
 | 
			
		||||
        wrapper.eq("r.del_flag", SystemConstants.NORMAL)
 | 
			
		||||
            .eq(ObjectUtil.isNotNull(bo.getDeptId()), "r.dept_id", bo.getDeptId())
 | 
			
		||||
            .eq(ObjectUtil.isNotNull(bo.getIsSpecial()), "r.is_special", bo.getIsSpecial())
 | 
			
		||||
            .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId())
 | 
			
		||||
            .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName())
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ import org.dromara.common.core.utils.*;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.PageQuery;
 | 
			
		||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
 | 
			
		||||
import org.dromara.common.satoken.utils.LoginHelper;
 | 
			
		||||
import org.dromara.project.service.IBusUserProjectRelevancyService;
 | 
			
		||||
import org.dromara.system.domain.*;
 | 
			
		||||
import org.dromara.system.domain.bo.SysUserBo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysPostVo;
 | 
			
		||||
@ -30,6 +31,7 @@ import org.dromara.system.domain.vo.SysRoleVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserExportVo;
 | 
			
		||||
import org.dromara.system.domain.vo.SysUserVo;
 | 
			
		||||
import org.dromara.system.mapper.*;
 | 
			
		||||
import org.dromara.system.service.ISysDeptService;
 | 
			
		||||
import org.dromara.system.service.ISysUserFileService;
 | 
			
		||||
import org.dromara.system.service.ISysUserService;
 | 
			
		||||
import org.springframework.cache.annotation.CacheEvict;
 | 
			
		||||
@ -57,6 +59,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 | 
			
		||||
    private final SysPostMapper postMapper;
 | 
			
		||||
    private final SysUserRoleMapper userRoleMapper;
 | 
			
		||||
    private final SysUserPostMapper userPostMapper;
 | 
			
		||||
    private final ISysDeptService deptService;
 | 
			
		||||
    private final IBusUserProjectRelevancyService userProjectRelevancyService;
 | 
			
		||||
 | 
			
		||||
    @Lazy
 | 
			
		||||
    @Resource
 | 
			
		||||
@ -330,6 +334,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 | 
			
		||||
        insertUserPost(user, false);
 | 
			
		||||
        // 新增用户与角色管理
 | 
			
		||||
        insertUserRole(user, false);
 | 
			
		||||
        // 关联部门所属项目
 | 
			
		||||
        List<Long> projectIds = deptService.selectProjectIdById(user.getDeptId());
 | 
			
		||||
        userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId());
 | 
			
		||||
        return rows;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -368,6 +375,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 | 
			
		||||
        if (flag < 1) {
 | 
			
		||||
            throw new ServiceException("修改用户" + user.getUserName() + "信息失败");
 | 
			
		||||
        }
 | 
			
		||||
        // 先删除旧关联
 | 
			
		||||
        userProjectRelevancyService.deleteByUserId(user.getUserId());
 | 
			
		||||
        // 添加新关联
 | 
			
		||||
        List<Long> projectIds = deptService.selectProjectIdById(user.getDeptId());
 | 
			
		||||
        userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId());
 | 
			
		||||
        return flag;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user