Administrator
yesterday 001da1169ce18233a46bf22abd352cf8fa979f2c
refactor(ai): 优化会员学习记录查询逻辑

- 简化代码结构,移除冗余的空行和注释
- 使用 Stream API 重构按产品点分组的逻辑,提高性能
- 将学习时间计算合并到分组操作中,减少循环遍历
- 添加空值保护机制,避免可能的空指针异常
- 优化数据处理流程,提升代码可读性
1 files modified
37 ■■■■ changed files
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java 37 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java
@@ -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,24 +249,28 @@
        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());
        // 按 productPointId 分组并计算每个分组的总学习时间
        Map<String, Integer> productPointTimeMap = aiMemberPoints.stream()
                .collect(Collectors.groupingBy(
                        AiMemberPoint::getProductPointId,
                        Collectors.summingInt(AiMemberPoint::getTotalTime)
                ));
        // 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)
        );
        if (CollUtil.isEmpty(aiProductPoints)){
            return new FebsResponse().success().data(vos);
        }
@@ -276,21 +278,16 @@
        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));
            Integer totalTime = productPointTimeMap.get(aiProductPoint.getId());
            // 添加 null 值保护,避免 NPE
            vo.setTotalTime(DateUtil.secondToTime(totalTime != null ? totalTime : 0));
            vos.add(vo);
        }
        return new FebsResponse().success().data(vos);
    }
    @Override
    public FebsResponse talkPage(ApiMemberTalkPageDto dto) {