From 8a2d6564e22c28ec357a8c702ffe67d6d790c459 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 22 Jan 2026 16:37:51 +0800
Subject: [PATCH] fix(ai): 修复会员学习记录查询中的空指针异常

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java |   60 +++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
index 8d90370..62f0eb8 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -392,23 +392,51 @@
         // 创建分页对象,传入当前页和每页大小
         Page<ApiCompanyStudyVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
         IPage<ApiCompanyStudyVo> result = aiMemberAnswerService.selectListPage(dto, page);
+//        List<ApiCompanyStudyVo> records = result.getRecords();
+//        if (CollUtil.isNotEmpty(records)){
+//            //stream流获取re cords集合中的元素productId的set集合
+//            Set<String> collect = records.stream().map(ApiCompanyStudyVo::getProductId).collect(Collectors.toSet());
+//            List<AiMemberAnswer>  list = aiMemberAnswerService.getIdListByCompanyIdAndProductId(companyId,  collect);
+//            if (CollUtil.isNotEmpty(list)){
+//                //利用stream流,操作集合list,返回一个map对象,key为productId,value为按照productId分组的集合的大小,默认值为0
+//                Map<String, Long> memberAnswerItemCountMap =
+//                        list.stream().collect(Collectors.groupingBy(
+//                                        AiMemberAnswer::getProductId,
+//                                        Collectors.counting()
+//                                ));
+//                for ( ApiCompanyStudyVo record : records){
+//                     record.setPracticeCnt(memberAnswerItemCountMap.getOrDefault(record.getProductId(), 0L).intValue());
+//                }
+//            }
+//        }
+
         List<ApiCompanyStudyVo> records = result.getRecords();
         if (CollUtil.isNotEmpty(records)){
-            //stream流获取re cords集合中的元素productId的set集合
-            Set<String> collect = records.stream().map(ApiCompanyStudyVo::getProductId).collect(Collectors.toSet());
-            List<AiMemberAnswer>  list = aiMemberAnswerService.getIdListByCompanyIdAndProductId(companyId,  collect);
-            if (CollUtil.isNotEmpty(list)){
-                //利用stream流,操作集合list,返回一个map对象,key为productId,value为按照productId分组的集合的大小,默认值为0
-                Map<String, Long> memberAnswerItemCountMap =
-                        list.stream().collect(Collectors.groupingBy(
-                                        AiMemberAnswer::getProductId,
-                                        Collectors.counting()
-                                ));
-                for ( ApiCompanyStudyVo record : records){
-                     record.setPracticeCnt(memberAnswerItemCountMap.getOrDefault(record.getProductId(), 0L).intValue());
+            // 安全地获取 productId 集合,过滤掉 null 值
+            Set<String> collect = records.stream()
+                    .filter(Objects::nonNull)
+                    .map(ApiCompanyStudyVo::getProductId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            if (CollUtil.isNotEmpty(collect)) {  // 确保 collect 不为空
+                List<AiMemberAnswer> list = aiMemberAnswerService.getIdListByCompanyIdAndProductId(companyId, collect);
+                if (CollUtil.isNotEmpty(list)){
+                    Map<String, Long> memberAnswerItemCountMap = list.stream()
+                            .collect(Collectors.groupingBy(
+                                    AiMemberAnswer::getProductId,
+                                    Collectors.counting()
+                            ));
+
+                    for (ApiCompanyStudyVo record : records){
+                        if (record != null && record.getProductId() != null) {
+                            record.setPracticeCnt(memberAnswerItemCountMap.getOrDefault(record.getProductId(), 0L).intValue());
+                        }
+                    }
                 }
             }
         }
+
         return new FebsResponse().success().data(result);
     }
 
@@ -448,6 +476,7 @@
         LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class);
         memberAnswerItemLambdaQueryWrapper.in(AiMemberAnswerItem::getMemberAnswerQuestionId,questionItemIdSet);
         memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId);
+        memberAnswerItemLambdaQueryWrapper.isNotNull(AiMemberAnswerItem::getAnswer);
         List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper);
         //利用stream流,操作集合memberAnswerItemList,返回一个map对象,key为memberAnswerQuestionId,value为按照memberAnswerQuestionId分组的集合的大小,默认值为0
         Map<String, Long> memberAnswerItemCountMap =
@@ -495,6 +524,7 @@
         LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class);
         memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getProductQuestionId,productQuestionId);
         memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId);
+        memberAnswerItemLambdaQueryWrapper.isNotNull(AiMemberAnswerItem::getAnswer);
         List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper);
         if ( CollUtil.isEmpty(memberAnswerItemList)){
             return  new FebsResponse().success().data(objects);
@@ -517,11 +547,11 @@
         Map<String, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember));
         for (AiMemberAnswerItem memberAnswerItem : memberAnswerItemList){
             ApiCompanyStudyInfoVo vo = new ApiCompanyStudyInfoVo();
-            vo.setMemberName(mallMemberMap.get(memberAnswerItem.getMemberId()).getName());
-            vo.setNickName(mallMemberMap.get(memberAnswerItem.getMemberId()).getRealName());
+            vo.setMemberName(mallMemberMap.get(memberAnswerItem.getMemberId()).getRealName());
+            vo.setNickName(mallMemberMap.get(memberAnswerItem.getMemberId()).getName());
 
             vo.setMemberAnswerState(memberAnswerItem.getMemberAnswerState());
-            vo.setAnswer(answerMap.get(memberAnswerItem.getAnswer()).getAnswer());
+            vo.setAnswer(answerMap.get(memberAnswerItem.getMemberAnswerQuestionId()).getAnswer());
             objects.add(vo);
         }
         return  new FebsResponse().success().data(objects);

--
Gitblit v1.9.1