[add] 部门、角色、用户关联

This commit is contained in:
lcj
2025-07-11 11:41:15 +08:00
parent 888af08666
commit 67fa422218
17 changed files with 310 additions and 98 deletions

View File

@ -188,12 +188,6 @@ api-decrypt:
privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
springdoc: springdoc:
external-docs:
url: /doc.html
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs: api-docs:
# 是否开启接口文档 # 是否开启接口文档
enabled: true enabled: true

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -9,6 +9,7 @@ import org.dromara.facility.service.IFacMatrixService;
import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService; import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService;
import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.project.service.IBusProjectService; import org.dromara.project.service.IBusProjectService;
import org.dromara.system.service.ISysDeptService;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
@ -38,6 +39,9 @@ public class DemoTest {
@Resource @Resource
private IDesTechnicalStandardService desTechnicalStandardService; private IDesTechnicalStandardService desTechnicalStandardService;
@Resource
private ISysDeptService deptService;
@Test @Test
void test() { void test() {
Boolean result = photovoltaicPanelPartsService Boolean result = photovoltaicPanelPartsService
@ -79,4 +83,10 @@ public class DemoTest {
.list(); .list();
Boolean result = progressCategoryService.insertByTemplate(1906557369562726402L, matrixList, null); Boolean result = progressCategoryService.insertByTemplate(1906557369562726402L, matrixList, null);
} }
@Test
void testDeptProject() {
deptService.selectProjectIdById(100L);
deptService.selectProjectIdById(1937478258803171329L);
}
} }

View File

@ -57,6 +57,22 @@ public interface IBusUserProjectRelevancyService extends IService<BusUserProject
*/ */
Long insertByBo(BusUserProjectRelevancyCreateReq req); 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); 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);
/** /**
* 获取当前登录用户项目列表 * 获取当前登录用户项目列表
* *

View File

@ -50,9 +50,6 @@ import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusUserProjectRelevancyService; import org.dromara.project.service.IBusUserProjectRelevancyService;
import org.dromara.quality.service.IQltKnowledgeDocumentService; import org.dromara.quality.service.IQltKnowledgeDocumentService;
import org.dromara.safety.service.IHseKnowledgeDocumentService; 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.dromara.workflow.service.IFlwDefinitionService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
@ -100,9 +97,6 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
@Resource @Resource
private IFacMatrixService matrixService; private IFacMatrixService matrixService;
@Resource
private ISysDeptService deptService;
@Lazy @Lazy
@Resource @Resource
private IHseKnowledgeDocumentService hseKnowledgeDocumentService; private IHseKnowledgeDocumentService hseKnowledgeDocumentService;
@ -323,26 +317,6 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
if (this.lambdaQuery().eq(BusProject::getShortName, req.getShortName()).count() > 0) { if (this.lambdaQuery().eq(BusProject::getShortName, req.getShortName()).count() > 0) {
throw new ServiceException("项目简称已存在", HttpStatus.BAD_REQUEST); 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); boolean save = this.save(project);
if (!save) { if (!save) {

View File

@ -27,6 +27,7 @@ import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusUserProjectRelevancyService; import org.dromara.project.service.IBusUserProjectRelevancyService;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -46,6 +47,7 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProje
@Resource @Resource
private IBusProjectService projectService; private IBusProjectService projectService;
@Lazy
@Resource @Resource
private ISysUserService userService; private ISysUserService userService;
@ -120,6 +122,54 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProje
return userProjectRelevancy.getId(); 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); 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);
}
}
}
/** /**
* 获取当前登录用户项目列表 * 获取当前登录用户项目列表
* *

View File

@ -15,6 +15,7 @@ import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysRoleBo; import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.DeptTreeSelectVo; 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.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysDeptService;
@ -50,12 +51,12 @@ public class SysRoleController extends BaseController {
} }
/** /**
* 获取角色列表 * 获取角色信息列表(不分页)
*/ */
@SaCheckPermission("system:role:list") @SaCheckPermission("system:role:list")
@GetMapping("/listNoPage/isSubsetDept") @GetMapping("/listNoPage")
public List<SysRoleVo> listNoPageByIsSubsetDept(SysRoleBo roleBo) { public List<SysRoleVo> listNoPage(SysRoleBo role) {
return roleService.selectRoleListByIsSubsetDept(roleBo); return roleService.selectRoleList(role);
} }
/** /**
@ -94,8 +95,15 @@ public class SysRoleController extends BaseController {
} else if (!roleService.checkRoleKeyUnique(role)) { } else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); 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)); return toAjax(roleService.insertRole(role));
} }
/** /**

View File

@ -34,6 +34,11 @@ public class SysDept extends TenantEntity {
*/ */
private Long parentId; private Long parentId;
/**
* 项目ID
*/
private Long projectId;
/** /**
* 部门名称 * 部门名称
*/ */
@ -90,9 +95,4 @@ public class SysDept extends TenantEntity {
*/ */
private String isSubset; private String isSubset;
/**
* 角色ID
*/
private Long roleId;
} }

View File

@ -3,10 +3,10 @@ package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import org.dromara.common.tenant.core.TenantEntity;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.tenant.core.TenantEntity;
/** /**
* 角色表 sys_role * 角色表 sys_role
@ -26,6 +26,11 @@ public class SysRole extends TenantEntity {
@TableId(value = "role_id") @TableId(value = "role_id")
private Long roleId; private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/** /**
* 角色名称 * 角色名称
*/ */

View File

@ -4,7 +4,6 @@ import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysDept;
@ -29,6 +28,11 @@ public class SysDeptBo extends BaseEntity {
*/ */
private Long parentId; private Long parentId;
/**
* 项目id
*/
private Long projectId;
/** /**
* 部门名称 * 部门名称
*/ */

View File

@ -28,6 +28,11 @@ public class SysRoleBo extends BaseEntity {
*/ */
private Long roleId; private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/** /**
* 角色名称 * 角色名称
*/ */
@ -88,11 +93,6 @@ public class SysRoleBo extends BaseEntity {
*/ */
private String isSpecial; private String isSpecial;
/**
* 是否有子部门
*/
private String isSubsetDept;
public SysRoleBo(Long roleId) { public SysRoleBo(Long roleId) {
this.roleId = roleId; this.roleId = roleId;
} }

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param; 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.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; 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); 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);
} }

View File

@ -59,6 +59,14 @@ public interface ISysDeptService {
// */ // */
// SysDeptBo selectDeptByIdBo(SysDeptBo dept); // SysDeptBo selectDeptByIdBo(SysDeptBo dept);
/**
* 根据部门ID查询所属项目ID列表
*
* @param deptId 部门id
* @return 项目id列表
*/
List<Long> selectProjectIdById(Long deptId);
/** /**
* 通过部门名称查询部门ID * 通过部门名称查询部门ID

View File

@ -27,14 +27,6 @@ public interface ISysRoleService {
*/ */
List<SysRoleVo> selectRoleList(SysRoleBo role); List<SysRoleVo> selectRoleList(SysRoleBo role);
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
List<SysRoleVo> selectRoleListByIsSubsetDept(SysRoleBo role);
/** /**
* 根据用户ID查询角色列表 * 根据用户ID查询角色列表
* *

View File

@ -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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants; 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.domain.dto.DeptDTO;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.DeptService; 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.mybatis.helper.DataBaseHelper;
import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.redis.utils.CacheUtils;
import org.dromara.common.satoken.utils.LoginHelper; 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.SysDept;
import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysDeptBo; 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.SysDeptIsSubsetEnum;
import org.dromara.system.domain.enums.SysRoleIsSpecialEnum;
import org.dromara.system.domain.vo.SysDeptVo; 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.SysDeptMapper;
import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysDeptService; 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.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
@ -45,12 +42,14 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* 部门管理 服务实现 * 部门管理 服务实现
* *
* @author Lion Li * @author Lion Li
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class SysDeptServiceImpl implements ISysDeptService, DeptService { public class SysDeptServiceImpl implements ISysDeptService, DeptService {
@ -58,7 +57,8 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
private final SysDeptMapper baseMapper; private final SysDeptMapper baseMapper;
private final SysRoleMapper roleMapper; private final SysRoleMapper roleMapper;
private final SysUserMapper userMapper; 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; return dept;
} }
/**
* 根据部门ID查询所属项目ID列表
*
* @param deptId 部门id
* @return 项目id列表
*/
@Override
public List<Long> selectProjectIdById(Long deptId) {
return baseMapper.getProjectIdsByDept(deptId);
}
// /** // /**
// * 根据部门ID查询信息 // * 根据部门ID查询信息
// * // *
@ -342,16 +353,13 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
if (LoginHelper.isSuperAdmin()) { if (LoginHelper.isSuperAdmin()) {
return; return;
} }
SysDept dept = baseMapper.selectById(deptId); List<SysRole> roleList = roleMapper.selectByIds(roleIds);
if (dept.getIsSubset().equals(SysDeptIsSubsetEnum.YES.getCode()) && CollUtil.isNotEmpty(roleIds)) { for (SysRole role : roleList) {
List<SysRole> roleList = roleMapper.selectByIds(roleIds); if (!role.getStatus().equals(SystemConstants.NORMAL)) {
for (SysRole role : roleList) { throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST);
if (!role.getStatus().equals(SystemConstants.NORMAL)) { }
throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST); if (!role.getDeptId().equals(deptId)) {
} throw new ServiceException("角色部门与部门不匹配", HttpStatus.BAD_REQUEST);
if (role.getIsSpecial().equals(SysRoleIsSpecialEnum.NO.getCode())) {
throw new ServiceException("当前部门与角色不匹配,请重新选择", HttpStatus.BAD_REQUEST);
}
} }
} }
} }
@ -371,12 +379,35 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
if (!SystemConstants.NORMAL.equals(info.getStatus())) { if (!SystemConstants.NORMAL.equals(info.getStatus())) {
throw new ServiceException("部门停用,不允许新增"); throw new ServiceException("部门停用,不允许新增");
} }
if (!"0".equals(info.getIsSubset())){ if (SysDeptIsSubsetEnum.NO.getCode().equals(info.getIsSubset())) {
throw new ServiceException("当前部门不允许有子部门"); throw new ServiceException("当前部门不允许有子部门");
} }
SysDept dept = MapstructUtils.convert(bo, SysDept.class); SysDept dept = MapstructUtils.convert(bo, SysDept.class);
if (dept == null) {
throw new ServiceException("新增部门参数异常", HttpStatus.BAD_REQUEST);
}
dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); 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 判断是否需要直接新增角色 // // cory 判断是否需要直接新增角色
// SysRoleBo role = getSysRoleBo(bo); // SysRoleBo role = getSysRoleBo(bo);
// roleService.checkRoleAllowed(role); // roleService.checkRoleAllowed(role);
@ -444,6 +475,37 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
} else { } else {
dept.setAncestors(oldDept.getAncestors()); 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); int result = baseMapper.updateById(dept);
if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) if (SystemConstants.NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors())
&& !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) { && !StringUtils.equals(SystemConstants.NORMAL, dept.getAncestors())) {
@ -522,4 +584,27 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return baseMapper.deleteById(deptId); 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;
}
} }

View File

@ -29,8 +29,6 @@ import org.dromara.system.domain.SysRoleDept;
import org.dromara.system.domain.SysRoleMenu; import org.dromara.system.domain.SysRoleMenu;
import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysRoleBo; 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.domain.vo.SysRoleVo;
import org.dromara.system.mapper.SysRoleDeptMapper; import org.dromara.system.mapper.SysRoleDeptMapper;
import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMapper;
@ -74,29 +72,11 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
return baseMapper.selectRoleList(this.buildQueryWrapper(role)); 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) { private Wrapper<SysRole> buildQueryWrapper(SysRoleBo bo) {
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
QueryWrapper<SysRole> wrapper = Wrappers.query(); QueryWrapper<SysRole> wrapper = Wrappers.query();
wrapper.eq("r.del_flag", SystemConstants.NORMAL) 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.getIsSpecial()), "r.is_special", bo.getIsSpecial())
.eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId())
.like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName())

View File

@ -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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.project.service.IBusUserProjectRelevancyService;
import org.dromara.system.domain.*; import org.dromara.system.domain.*;
import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysPostVo; 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.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.*; import org.dromara.system.mapper.*;
import org.dromara.system.service.ISysDeptService;
import org.dromara.system.service.ISysUserFileService; import org.dromara.system.service.ISysUserFileService;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
@ -57,6 +59,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysPostMapper postMapper; private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper; private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper; private final SysUserPostMapper userPostMapper;
private final ISysDeptService deptService;
private final IBusUserProjectRelevancyService userProjectRelevancyService;
@Lazy @Lazy
@Resource @Resource
@ -330,6 +334,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
insertUserPost(user, false); insertUserPost(user, false);
// 新增用户与角色管理 // 新增用户与角色管理
insertUserRole(user, false); insertUserRole(user, false);
// 关联部门所属项目
List<Long> projectIds = deptService.selectProjectIdById(user.getDeptId());
userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId());
return rows; return rows;
} }
@ -368,6 +375,11 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
if (flag < 1) { if (flag < 1) {
throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); throw new ServiceException("修改用户" + user.getUserName() + "信息失败");
} }
// 先删除旧关联
userProjectRelevancyService.deleteByUserId(user.getUserId());
// 添加新关联
List<Long> projectIds = deptService.selectProjectIdById(user.getDeptId());
userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId());
return flag; return flag;
} }