From 67fa4222181d4cb1b2d1063dc5ce6b92f361889e Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 11 Jul 2025 11:41:15 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E9=83=A8=E9=97=A8=E3=80=81=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E3=80=81=E7=94=A8=E6=88=B7=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 6 - .../src/main/resources/favicon.ico | Bin 0 -> 8131 bytes .../test/java/org/dromara/test/DemoTest.java | 10 ++ .../IBusUserProjectRelevancyService.java | 31 +++++ .../service/impl/BusProjectServiceImpl.java | 26 ---- .../BusUserProjectRelevancyServiceImpl.java | 90 +++++++++++++ .../controller/system/SysRoleController.java | 18 ++- .../org/dromara/system/domain/SysDept.java | 10 +- .../org/dromara/system/domain/SysRole.java | 7 +- .../dromara/system/domain/bo/SysDeptBo.java | 6 +- .../dromara/system/domain/bo/SysRoleBo.java | 10 +- .../dromara/system/mapper/SysDeptMapper.java | 19 +++ .../system/service/ISysDeptService.java | 8 ++ .../system/service/ISysRoleService.java | 8 -- .../service/impl/SysDeptServiceImpl.java | 125 +++++++++++++++--- .../service/impl/SysRoleServiceImpl.java | 22 +-- .../service/impl/SysUserServiceImpl.java | 12 ++ 17 files changed, 310 insertions(+), 98 deletions(-) create mode 100644 xinnengyuan/ruoyi-admin/src/main/resources/favicon.ico diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml index 103582a1..a873a5c6 100644 --- a/xinnengyuan/ruoyi-admin/src/main/resources/application.yml +++ b/xinnengyuan/ruoyi-admin/src/main/resources/application.yml @@ -188,12 +188,6 @@ api-decrypt: privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= springdoc: - external-docs: - url: /doc.html - swagger-ui: - path: /swagger-ui.html - tags-sorter: alpha - operations-sorter: alpha api-docs: # 是否开启接口文档 enabled: true diff --git a/xinnengyuan/ruoyi-admin/src/main/resources/favicon.ico b/xinnengyuan/ruoyi-admin/src/main/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3f919d85a5d1e093fd8d80ebcbe9987a3bdbb54f GIT binary patch literal 8131 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 d+2AD?_zza userIdList); + + /** + * 批量新增用户和项目关联 + * + * @param projectIdList 项目ID列表 + * @param userId 用户ID + */ + void saveBatchByProjectList(List projectIdList, Long userId); + /** * 修改系统用户与项目关联 * @@ -74,6 +90,21 @@ public interface IBusUserProjectRelevancyService extends IService ids, Boolean isValid); + /** + * 根据用户ID删除系统用户与项目关联 + * + * @param userId 用户ID + */ + void deleteByUserId(Long userId); + + /** + * 根据项目ID和用户ID列表删除系统用户与项目关联 + * + * @param oldProjectId 项目ID + * @param userIds 用户ID列表 + */ + void deleteByProjectAndUserIds(Long oldProjectId, List userIds); + /** * 获取当前登录用户项目列表 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index 1dc86e59..45c42961 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -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 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) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java index a6d62312..0b14e671 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java @@ -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 userIdList) { + if (ObjectUtils.isEmpty(projectId) || ObjectUtils.isEmpty(userIdList)) { + return; + } + List 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 projectIdList, Long userId) { + if (ObjectUtils.isEmpty(projectIdList) || ObjectUtils.isEmpty(userId)) { + return; + } + List 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 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 userIds) { + List 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); + } + } + } + /** * 获取当前登录用户项目列表 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index 640f34bd..e770db08 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -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 listNoPageByIsSubsetDept(SysRoleBo roleBo) { - return roleService.selectRoleListByIsSubsetDept(roleBo); + @GetMapping("/listNoPage") + public List 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)); - } /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index 60e31a9b..551111f3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -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; - } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java index ee2acb6c..363dd91b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -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; + /** * 角色名称 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index fe22434c..440abeb3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -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; + /** * 部门名称 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java index 23d2c0d4..8d839ae3 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -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; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index b69624cf..ff89df77 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -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 { */ List 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 getProjectIdsByDept(@Param("deptId") Long deptId); + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index f3984226..ade4c745 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -59,6 +59,14 @@ public interface ISysDeptService { // */ // SysDeptBo selectDeptByIdBo(SysDeptBo dept); + /** + * 根据部门ID查询所属项目ID列表 + * + * @param deptId 部门id + * @return 项目id列表 + */ + List selectProjectIdById(Long deptId); + /** * 通过部门名称查询部门ID diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java index e89ef5e0..cec4bf77 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -27,14 +27,6 @@ public interface ISysRoleService { */ List selectRoleList(SysRoleBo role); - /** - * 根据条件分页查询角色数据 - * - * @param role 角色信息 - * @return 角色数据集合信息 - */ - List selectRoleListByIsSubsetDept(SysRoleBo role); - /** * 根据用户ID查询角色列表 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index e5354c4f..9e2c0e2e 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -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 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 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 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 deptIds = this.getParentDeptIds(dept); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SysUser::getUserId); + lqw.in(SysUser::getDeptId, deptIds); + List 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 deptIds = this.getParentDeptIds(dept); + // 获取部门用户 ID + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SysUser::getUserId); + lqw.in(SysUser::getDeptId, deptIds); + List 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 getParentDeptIds(SysDept dept) { + List 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; + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 41503966..505d8953 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -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 selectRoleListByIsSubsetDept(SysRoleBo role) { - LambdaQueryWrapper 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 buildQueryWrapper(SysRoleBo bo) { Map params = bo.getParams(); QueryWrapper 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()) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 0237e5be..2ef5bd94 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -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 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 projectIds = deptService.selectProjectIdById(user.getDeptId()); + userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId()); return flag; }