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 00000000..3f919d85 Binary files /dev/null and b/xinnengyuan/ruoyi-admin/src/main/resources/favicon.ico differ diff --git a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java index 67feee62..f4b5d2e6 100644 --- a/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java +++ b/xinnengyuan/ruoyi-admin/src/test/java/org/dromara/test/DemoTest.java @@ -9,6 +9,7 @@ import org.dromara.facility.service.IFacMatrixService; import org.dromara.facility.service.IFacPhotovoltaicPanelPartsService; import org.dromara.progress.service.IPgsProgressCategoryService; import org.dromara.project.service.IBusProjectService; +import org.dromara.system.service.ISysDeptService; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -38,6 +39,9 @@ public class DemoTest { @Resource private IDesTechnicalStandardService desTechnicalStandardService; + @Resource + private ISysDeptService deptService; + @Test void test() { Boolean result = photovoltaicPanelPartsService @@ -79,4 +83,10 @@ public class DemoTest { .list(); Boolean result = progressCategoryService.insertByTemplate(1906557369562726402L, matrixList, null); } + + @Test + void testDeptProject() { + deptService.selectProjectIdById(100L); + deptService.selectProjectIdById(1937478258803171329L); + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusUserProjectRelevancyService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusUserProjectRelevancyService.java index 5a23bed9..2f5e4696 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusUserProjectRelevancyService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusUserProjectRelevancyService.java @@ -57,6 +57,22 @@ public interface IBusUserProjectRelevancyService extends IService 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; }