From d158eb66602278d6f02b767b6639463ec4b671cb Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 23 Jan 2026 10:43:59 +0800
Subject: [PATCH] fix(ai): 解决会员学习数据转换中的空指针异常

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java |  122 +++++++++++++++++++++++++++++++---------
 1 files changed, 94 insertions(+), 28 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 34518f5..7d97403 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
@@ -132,7 +132,7 @@
 
             //判断mallMemberMap中是否存在该会员
             apiMemberTeamPageVo.setNickName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : "");
-            apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : "");
+            apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getRealName() : "");
             Integer practiceCnt = 0;
             if (memberIdToCntMapTalk.containsKey(aiMemberId)){
                 practiceCnt = memberIdToCntMapTalk.get(aiMemberId);
@@ -241,8 +241,6 @@
         String companyId = LoginUserUtil.getLoginUser().getCompanyId();
         String memberUuid = dto.getMemberUuid();
 
-
-
         // 创建分页对象,传入当前页和每页大小
         Page<AiMemberPoint> page = new Page<>(dto.getPageNow(), dto.getPageSize());
         LambdaQueryWrapper<AiMemberPoint> queryWrapper = Wrappers.lambdaQuery(AiMemberPoint.class);
@@ -251,45 +249,47 @@
         Page<AiMemberPoint> pageListByQuery = aiMemberPointService.getBaseMapper().selectPage(page, queryWrapper);
         List<AiMemberPoint> aiMemberPoints = pageListByQuery.getRecords();
 
-//        List<AiMemberPoint> aiMemberPoints = aiMemberPointService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
         if (CollUtil.isEmpty(aiMemberPoints)){
             return new FebsResponse().success().data(vos);
         }
-        Map<String, List<AiMemberPoint>> aiMemberPointMap = new HashMap<>();
-        if (CollUtil.isNotEmpty(aiMemberPoints)){
-            //stream操作aiMemberPoints,返回一个Map<productPointId,List<AiMemberPoint>>
-            aiMemberPointMap = aiMemberPoints.stream().collect(Collectors.groupingBy(AiMemberPoint::getProductPointId));
-        }
 
-        //stream流操作aiMemberPoints,返回一个productPointId的set集合
-        Set<String> productPointIdSet = aiMemberPoints.stream().map(AiMemberPoint::getProductPointId).collect(Collectors.toSet());
+        // stream流操作aiMemberPoints,返回一个productPointId的set集合
+        Set<String> productPointIdSet = aiMemberPoints.stream()
+                .map(AiMemberPoint::getProductPointId)
+                .collect(Collectors.toSet());
 
         List<AiProductPoint> aiProductPoints = aiProductPointService.getBaseMapper().selectList(
                 Wrappers.lambdaQuery(AiProductPoint.class)
-                        .select(AiProductPoint::getId,AiProductPoint::getTitle)
+                        .select(AiProductPoint::getId, AiProductPoint::getTitle)
                         .in(AiProductPoint::getId, productPointIdSet)
         );
+        //stream操作aiProductPoints,返回一个根据Map<id,AiProductPoint>
+        Map<String, AiProductPoint> productPointMap = aiProductPoints.stream().collect(Collectors.toMap(AiProductPoint::getId, aiProductPoint -> aiProductPoint));
+
         if (CollUtil.isEmpty(aiProductPoints)){
             return new FebsResponse().success().data(vos);
         }
 
-        for (AiProductPoint aiProductPoint : aiProductPoints){
-            ApiMemberTeamStudyVo vo = new ApiMemberTeamStudyVo();
-            vo.setTitle(aiProductPoint.getTitle());
-            Integer totalTime = 0;
-            if (aiMemberPointMap.containsKey(aiProductPoint.getId())){
-                List<AiMemberPoint> memberPoints = aiMemberPointMap.get(aiProductPoint.getId());
-                for (AiMemberPoint memberPoint : memberPoints){
-                    totalTime += memberPoint.getTotalTime();
-                }
-            }
-            vo.setTotalTime(DateUtil.secondToTime(totalTime));
+        for (AiMemberPoint aiMemberPoint : aiMemberPoints) {
+            String productPointId = aiMemberPoint.getProductPointId();
+            AiProductPoint productPoint = productPointMap.get(productPointId);
 
-            vos.add(vo);
+            // 检查 productPoint 是否存在
+            if (productPoint != null) {
+                ApiMemberTeamStudyVo vo = new ApiMemberTeamStudyVo();
+                vo.setTitle(productPoint.getTitle());
+
+                // 检查 totalTime 是否为 null
+                Integer totalTime = aiMemberPoint.getTotalTime();
+                vo.setTotalTime(DateUtil.secondToTime(totalTime != null ? totalTime : 0));
+
+                vos.add(vo);
+            }
         }
 
         return new FebsResponse().success().data(vos);
     }
+
 
     @Override
     public FebsResponse talkPage(ApiMemberTalkPageDto dto) {
@@ -378,7 +378,6 @@
 
     @Override
     public FebsResponse studyList(ApiCompanyStudyDto dto) {
-        List<ApiCompanyStudyVo> objects = new ArrayList<>();
 
         String companyId = LoginUserUtil.getLoginUser().getCompanyId();
         String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
@@ -393,6 +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)){
+            // 安全地获取 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);
     }
 
@@ -432,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 =
@@ -479,27 +524,48 @@
         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);
         }
+
+        LambdaQueryWrapper<AiProductQuestionItem> answerQuery = Wrappers.lambdaQuery(AiProductQuestionItem.class);
+        answerQuery.select( AiProductQuestionItem::getId,AiProductQuestionItem::getAnswer);
+        answerQuery.eq(AiProductQuestionItem::getProductQuestionId,productQuestionId);
+        answerQuery.eq(AiProductQuestionItem::getCompanyId,companyId);
+        List<AiProductQuestionItem> answerQueryList = aiProductQuestionItemService.getListByQuery(answerQuery);
+        Map<String, AiProductQuestionItem> answerMap = answerQueryList.stream().collect(Collectors.toMap(AiProductQuestionItem::getId, aiProductQuestionItem -> aiProductQuestionItem));
 
         Set<String> memberIdSet = memberAnswerItemList.stream().map(AiMemberAnswerItem::getMemberId).collect(Collectors.toSet());
         List<MallMember> mallMembers = mallMemberMapper.selectList(
                 Wrappers.lambdaQuery(MallMember.class)
                         .select(MallMember::getMemberUuid, MallMember::getName, MallMember::getRealName)
                         .in(MallMember::getMemberUuid, memberIdSet)
-                        .eq(MallMember::getCompanyId, companyId)
         );
         //Stream流操作mallMembers,获取一个map<memberUuid,mallMember>的对象
         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.getMemberAnswerQuestionId()).getAnswer());
             objects.add(vo);
         }
         return  new FebsResponse().success().data(objects);
     }
+
+    @Override
+    public FebsResponse studyRecordList(ApiCompanyStudyRecordDto dto) {
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        dto.setCompanyId( companyId);
+
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiCompanyStudyRecordVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        IPage<ApiCompanyStudyRecordVo> result = aiMemberAnswerService.getStudyRecordList(page,dto);
+        return new FebsResponse().success().data(result);
+    }
 }

--
Gitblit v1.9.1