Эх сурвалжийг харах

fix(service): 修复员工服务中的空指针异常问题

- 添加 ObjectUtils 导入以增强安全检查
- 使用 Optional 和安全过滤避免空值导致的 NPE
- 为部门、岗位和角色查询添加非空验证
- 当 ID 集合为空时返回空映射避免数据库查询
- 添加合并函数防止重复键值冲突
hurx 2 долоо хоног өмнө
parent
commit
105dc4fdd0

+ 43 - 12
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ComStaffServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.ObjectUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -64,23 +65,53 @@ public class ComStaffServiceImpl extends ServiceImpl<ComStaffMapper, ComStaff> i
         Page<ComStaffVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<ComStaffVo> records = result.getRecords();
         if (CollUtil.isNotEmpty(records)) {
-            Set<Long> deptIds = records.stream().map(ComStaffVo::getDeptId).collect(Collectors.toSet());
-            Map<Long, String> deptMap = sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>()
-                    .select(SysDept::getDeptId, SysDept::getDeptName).in(SysDept::getDeptId, deptIds)).stream()
-                .collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
-            Set<Long> postIds = records.stream().map(ComStaffVo::getPostId).collect(Collectors.toSet());
-            Map<Long, String> postMap = sysPostMapper.selectList(new LambdaQueryWrapper<SysPost>()
-                    .select(SysPost::getPostId, SysPost::getPostName).in(SysPost::getPostId, postIds)).stream()
-                .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName));
-            Set<Long> roleIds = records.stream().map(ComStaffVo::getRoleId).filter(Objects::nonNull).collect(Collectors.toSet());
-            Map<Long, String> roleMap = sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>().select(SysRole::getRoleId, SysRole::getRoleName).in(SysRole::getRoleId, roleIds)).stream()
-                .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName));
-
+            // 1. 安全提取 DeptId
+            Set<Long> deptIds = Optional.ofNullable(records).orElse(Collections.emptyList()).stream()
+                .map(ComStaffVo::getDeptId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            Map<Long, String> deptMap = !deptIds.isEmpty() ?
+                sysDeptMapper.selectList(new LambdaQueryWrapper<SysDept>()
+                        .select(SysDept::getDeptId, SysDept::getDeptName)
+                        .in(SysDept::getDeptId, deptIds))
+                    .stream()
+                    .collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName, (v1, v2) -> v1))
+                : Collections.emptyMap();
+
+            // 2. 安全提取 PostId
+            Set<Long> postIds = Optional.ofNullable(records).orElse(Collections.emptyList()).stream()
+                .map(ComStaffVo::getPostId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            Map<Long, String> postMap = !postIds.isEmpty() ?
+                sysPostMapper.selectList(new LambdaQueryWrapper<SysPost>()
+                        .select(SysPost::getPostId, SysPost::getPostName)
+                        .in(SysPost::getPostId, postIds))
+                    .stream()
+                    .collect(Collectors.toMap(SysPost::getPostId, SysPost::getPostName, (v1, v2) -> v1))
+                : Collections.emptyMap();
+
+            // 3. 安全提取 RoleId
+            Set<Long> roleIds = Optional.ofNullable(records).orElse(Collections.emptyList()).stream()
+                .map(ComStaffVo::getRoleId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+            Map<Long, String> roleMap = !roleIds.isEmpty() ?
+                sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>()
+                        .select(SysRole::getRoleId, SysRole::getRoleName)
+                        .in(SysRole::getRoleId, roleIds))
+                    .stream()
+                    .collect(Collectors.toMap(SysRole::getRoleId, SysRole::getRoleName, (v1, v2) -> v1))
+                : Collections.emptyMap();
 
             records.forEach(item -> {
                 item.setDeptName(deptMap.get(item.getDeptId()));
                 item.setPostName(postMap.get(item.getPostId()));
                 item.setRoleName(roleMap.get(item.getRoleId()));
+
             });
         }
         return TableDataInfo.build(result);