From 16b8941c5e450988c6d5ab27fb46416df5bd42ae Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 12 Jan 2026 17:23:38 +0800
Subject: [PATCH] feat(ai): 添加学习成果统计功能

---
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java              |    5 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java                    |    6 
 src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentVo.java        |   25 +++
 src/main/java/cc/mrbird/febs/ai/mapper/AiMemberMapper.java                      |    4 
 src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyPercentDto.java       |   16 ++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java |    5 
 src/main/resources/mapper/modules/AiMemberAnswerMapper.xml                      |   17 ++
 src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyInfoDto.java          |   19 ++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java           |  131 ++++++++++++++++++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java     |    8 +
 src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java      |   30 ++++
 src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyDto.java              |   27 +++
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java          |    6 
 src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java                |    5 
 src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentItemVo.java    |   28 ++++
 src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyVo.java               |   23 +++
 src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyInfoVo.java           |   19 ++
 17 files changed, 374 insertions(+), 0 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java b/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
index 61a9470..269307d 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java
@@ -88,4 +88,34 @@
 
         return aiMemberService.study(dto);
     }
+
+    @ApiOperation(value = "学习成果", notes = "学习成果")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiCompanyStudyVo.class)
+    })
+    @PostMapping(value = "/studyList")
+    public FebsResponse studyList(@RequestBody @Validated ApiCompanyStudyDto dto) {
+
+        return aiMemberService.studyList(dto);
+    }
+
+    @ApiOperation(value = "学习成果-题目正确率", notes = "学习成果-题目正确率")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiCompanyStudyPercentVo.class)
+    })
+    @PostMapping(value = "/studyPercentList")
+    public FebsResponse studyPercentList(@RequestBody @Validated ApiCompanyStudyPercentDto dto) {
+
+        return aiMemberService.studyPercentList(dto);
+    }
+
+    @ApiOperation(value = "学习成果-题目正确详情", notes = "学习成果-题目正确详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiCompanyStudyInfoVo.class)
+    })
+    @PostMapping(value = "/studyInfoList")
+    public FebsResponse studyInfoList(@RequestBody @Validated ApiCompanyStudyInfoDto dto) {
+
+        return aiMemberService.studyInfoList(dto);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java
index 625a112..44449ee 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberAnswerMapper.java
@@ -1,11 +1,14 @@
 package cc.mrbird.febs.ai.mapper;
 
 import cc.mrbird.febs.ai.entity.AiMemberAnswer;
+import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto;
 import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto;
 import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberProductWorkPageDto;
+import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo;
 import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo;
 import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberProductWorkVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 
@@ -20,4 +23,6 @@
     Page<ApiMemberProductWorkVo> getPageMyWorkListByQuery(Page<ApiMemberProductWorkVo> page,  @Param("record")ApiMemberProductWorkPageDto dto);
 
     Page<ApiMemberAnswerPageVo> getAnswerPage(Page<ApiMemberAnswerPageVo> page, @Param("record")ApiMemberAnswerPageDto dto);
+
+    IPage<ApiCompanyStudyVo> selectProductListPage(Page<ApiCompanyStudyVo> page, @Param("record")ApiCompanyStudyDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberMapper.java b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberMapper.java
index b3ab6c2..571d5d1 100644
--- a/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberMapper.java
+++ b/src/main/java/cc/mrbird/febs/ai/mapper/AiMemberMapper.java
@@ -1,7 +1,11 @@
 package cc.mrbird.febs.ai.mapper;
 
 import cc.mrbird.febs.ai.entity.AiMember;
+import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto;
+import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 public interface AiMemberMapper extends BaseMapper<AiMember> {
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyDto.java
new file mode 100644
index 0000000..e89eccb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.ai.req.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyDto", description = "参数")
+public class ApiCompanyStudyDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNow;
+
+    @NotNull(message = "每页数量不能为空")
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "用户ID")
+    private String memberUuid;
+
+    @ApiModelProperty(value = "公司ID")
+    private String companyId;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyInfoDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyInfoDto.java
new file mode 100644
index 0000000..4032d40
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyInfoDto.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.ai.req.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyInfoDto", description = "参数")
+public class ApiCompanyStudyInfoDto {
+
+    @NotBlank(message = "题目ID不能为空")
+    @ApiModelProperty(value = "题目ID")
+    private String productQuestionId;
+
+    @ApiModelProperty(hidden = true)
+    private String companyId;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyPercentDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyPercentDto.java
new file mode 100644
index 0000000..f6f3e47
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiCompanyStudyPercentDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.ai.req.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyPercentDto", description = "参数")
+public class ApiCompanyStudyPercentDto {
+
+    @NotBlank(message = "产品ID不能为空")
+    @ApiModelProperty(value = "产品ID")
+    private String productId;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyInfoVo.java
new file mode 100644
index 0000000..3dd6198
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyInfoVo.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyInfoVo", description = "参数")
+public class ApiCompanyStudyInfoVo {
+
+    @ApiModelProperty(value = "微信名")
+    private String nickName;
+
+    @ApiModelProperty(value = "用户姓名")
+    private String memberName;
+
+    @ApiModelProperty(value = "用户回答状态 0-未回答 1-答对了 2-答错了")
+    private Integer memberAnswerState;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentItemVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentItemVo.java
new file mode 100644
index 0000000..c10236d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentItemVo.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+@ApiModel(value = "ApiCompanyStudyPercentItemVo", description = "参数")
+public class ApiCompanyStudyPercentItemVo {
+
+    @ApiModelProperty(value = "选项ID")
+    private String id;
+
+    @ApiModelProperty(value = "答案")
+    private String answer;
+
+    @ApiModelProperty(value = "答案解析")
+    private String answerAnalysis;
+
+    @ApiModelProperty(value = "是否是正确答案 0-否 1-是")
+    private Integer correctAnswer;
+
+    @ApiModelProperty(value = "选择本项人数")
+    private Long memberCnt;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentVo.java
new file mode 100644
index 0000000..2d31493
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyPercentVo.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyPercentVo", description = "参数")
+public class ApiCompanyStudyPercentVo {
+
+    @ApiModelProperty(value = "题目")
+    private String title;
+
+    @ApiModelProperty(value = "难度:1-简单,2-中等,3-困难")
+    private Integer difficulty;
+
+    @ApiModelProperty(value = "题目ID")
+    private String productQuestionId;
+
+    @ApiModelProperty(value = "选项")
+    private List<ApiCompanyStudyPercentItemVo> answerList;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyVo.java
new file mode 100644
index 0000000..e66d6cf
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiCompanyStudyVo.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiCompanyStudyVo", description = "参数")
+public class ApiCompanyStudyVo {
+
+    @ApiModelProperty(value = "产品ID")
+    private String productId;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "目标")
+    private String target;
+
+    @ApiModelProperty(value = "练习人数")
+    private Integer practiceCnt;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
index 1743108..16a11ac 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerItemService.java
@@ -1,12 +1,16 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMemberAnswerItem;
+import cc.mrbird.febs.ai.entity.AiProductQuestionItem;
 import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerPreviousDto;
 import cc.mrbird.febs.ai.req.memberAnswer.ApiMemberAnswerWrongPageDto;
 import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerPreviousVo;
 import cc.mrbird.febs.common.entity.FebsResponse;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
 
 /**
  * AI用户答题记录子表 Service接口
@@ -19,5 +23,7 @@
 
     Page<ApiMemberAnswerPreviousVo> getPageListByQuery(Page<ApiMemberAnswerPreviousVo> page, ApiMemberAnswerPreviousDto dto);
 
+    List<AiMemberAnswerItem> getListByQuery(LambdaQueryWrapper<AiMemberAnswerItem> wrapper);
+
     FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
index 52659cf..7b0c798 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
@@ -1,11 +1,14 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMemberAnswer;
+import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto;
 import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto;
 import cc.mrbird.febs.ai.req.memberAnswer.*;
+import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo;
 import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -45,4 +48,6 @@
     List<AiMemberAnswer> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid);
 
     Page<ApiMemberAnswerPageVo> getAnswerPage(Page<ApiMemberAnswerPageVo> page, ApiMemberAnswerPageDto dto);
+
+    IPage<ApiCompanyStudyVo> selectListPage(ApiCompanyStudyDto dto, Page<ApiCompanyStudyVo> page);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
index 691156b..33e932b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
@@ -20,4 +20,10 @@
     FebsResponse answerPage(ApiMemberAnswerPageDto dto);
 
     FebsResponse answerInfo(ApiMemberAnswerInfoDto dto);
+
+    FebsResponse studyList(ApiCompanyStudyDto dto);
+
+    FebsResponse studyPercentList(ApiCompanyStudyPercentDto dto);
+
+    FebsResponse studyInfoList(ApiCompanyStudyInfoDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
index 47ccb3b..29cc034 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerItemServiceImpl.java
@@ -47,6 +47,11 @@
     }
 
     @Override
+    public List<AiMemberAnswerItem> getListByQuery(LambdaQueryWrapper<AiMemberAnswerItem> wrapper) {
+        return aiMemberAnswerItemMapper.selectList( wrapper);
+    }
+
+    @Override
     public FebsResponse wrongPage(ApiMemberAnswerWrongPageDto dto) {
         // 创建分页对象,传入当前页和每页大小
         Page<ApiMemberAnswerWrongVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
index 4ee4a14..d4fed26 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java
@@ -3,8 +3,10 @@
 import cc.mrbird.febs.ai.entity.*;
 import cc.mrbird.febs.ai.enumerates.AiTypeEnum;
 import cc.mrbird.febs.ai.mapper.AiMemberAnswerMapper;
+import cc.mrbird.febs.ai.req.member.ApiCompanyStudyDto;
 import cc.mrbird.febs.ai.req.member.ApiMemberAnswerPageDto;
 import cc.mrbird.febs.ai.req.memberAnswer.*;
+import cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo;
 import cc.mrbird.febs.ai.res.member.ApiMemberAnswerPageVo;
 import cc.mrbird.febs.ai.res.memberAnswer.*;
 import cc.mrbird.febs.ai.res.product.ApiProductVo;
@@ -19,6 +21,7 @@
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -455,4 +458,9 @@
 
         return aiMemberAnswerMapper.getAnswerPage(page,dto);
     }
+
+    @Override
+    public IPage<ApiCompanyStudyVo> selectListPage(ApiCompanyStudyDto dto, Page<ApiCompanyStudyVo> page) {
+        return aiMemberAnswerMapper.selectProductListPage(page,dto);
+    }
 }
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 1ea68f5..e957555 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
@@ -11,10 +11,12 @@
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallMemberCollection;
 import cc.mrbird.febs.mall.mapper.MallMemberMapper;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -41,7 +43,9 @@
     private final AiMemberPointService aiMemberPointService;
     private final AiProductService aiProductService;
     private final AiProductPointService aiProductPointService;
+    private final AiProductQuestionService aiProductQuestionService;
     private final AiProductQuestionItemService aiProductQuestionItemService;
+    private final AiProductQuestionLinkService aiProductQuestionLinkService;
     @Override
     public AiMember getById(String id) {
         return aiMemberMapper.selectById( id);
@@ -371,4 +375,131 @@
 
         return new FebsResponse().success().data(vos);
     }
+
+    @Override
+    public FebsResponse studyList(ApiCompanyStudyDto dto) {
+        List<ApiCompanyStudyVo> objects = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        Integer checkOrder = LoginUserUtil.getLoginUser().getCheckOrder();
+        if (1 != checkOrder){
+            throw new FebsException("非管理员,无权限查看");
+        }
+        dto.setMemberUuid( memberUuid);
+        dto.setCompanyId( companyId);
+
+
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiCompanyStudyVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        IPage<ApiCompanyStudyVo> result = aiMemberAnswerService.selectListPage(dto, page);
+        return new FebsResponse().success().data(objects);
+    }
+
+    @Override
+    public FebsResponse studyPercentList(ApiCompanyStudyPercentDto dto) {
+        List<ApiCompanyStudyPercentVo> objects = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String productId = dto.getProductId();
+        LambdaQueryWrapper<AiProductQuestionLink> aiProductQuestionLinkLambdaQueryWrapper = Wrappers.lambdaQuery(AiProductQuestionLink.class);
+        aiProductQuestionLinkLambdaQueryWrapper.eq(AiProductQuestionLink::getProductId, productId);
+        aiProductQuestionLinkLambdaQueryWrapper.eq(AiProductQuestionLink::getCompanyId, companyId);
+        List<AiProductQuestionLink> listByQuery = aiProductQuestionLinkService.getListByQuery(aiProductQuestionLinkLambdaQueryWrapper);
+        if ( CollUtil.isEmpty(listByQuery)){
+            return  new FebsResponse().success().data(objects);
+        }
+
+        Set<String> productQuestionIdSet = listByQuery.stream().map(AiProductQuestionLink::getProductQuestionId).collect(Collectors.toSet());
+
+        LambdaQueryWrapper<AiProductQuestion> questionQuery = Wrappers.lambdaQuery(AiProductQuestion.class);
+        questionQuery.in(AiProductQuestion::getId,productQuestionIdSet);
+        List<AiProductQuestion> aiProductQuestionList = aiProductQuestionService.getListByQuery(questionQuery);
+        //利用stream流,操作集合aiProductQuestionList,返回一个map对象,key为productQuestionId,valueAiProductQuestion对象
+         Map<String, AiProductQuestion> questionMap =
+                aiProductQuestionList.stream().collect(Collectors.toMap(AiProductQuestion::getId, AiProductQuestion -> AiProductQuestion));
+
+        LambdaQueryWrapper<AiProductQuestionItem> questionItemQuery = Wrappers.lambdaQuery(AiProductQuestionItem.class);
+        questionItemQuery.in(AiProductQuestionItem::getProductQuestionId,productQuestionIdSet);
+        questionItemQuery.eq(AiProductQuestionItem::getCompanyId,companyId);
+        List<AiProductQuestionItem> aiProductQuestionItemList = aiProductQuestionItemService.getListByQuery(questionItemQuery);
+        //利用stream流,操作集合listByQuery,返回一个map对象,key为productQuestionId,value为List<AiProductQuestionItem>对象
+        Map<String, List<AiProductQuestionItem>> questionItemMap =
+                aiProductQuestionItemList.stream().collect(Collectors.groupingBy(AiProductQuestionItem::getProductQuestionId));
+        //stream流,aiProductQuestionItemList返回ID的set集合
+         Set<String> questionItemIdSet = aiProductQuestionItemList.stream().map(AiProductQuestionItem::getId).collect(Collectors.toSet());
+
+        LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class);
+        memberAnswerItemLambdaQueryWrapper.in(AiMemberAnswerItem::getMemberAnswerQuestionId,questionItemIdSet);
+        memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId);
+        List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper);
+        //利用stream流,操作集合memberAnswerItemList,返回一个map对象,key为memberAnswerQuestionId,value为按照memberAnswerQuestionId分组的集合的大小,默认值为0
+        Map<String, Long> memberAnswerItemCountMap =
+                memberAnswerItemList
+                        .stream()
+                        .collect(Collectors.groupingBy(
+                                AiMemberAnswerItem::getMemberAnswerQuestionId,
+                                Collectors.counting()
+                        ));
+
+        for (String productQuestionId : productQuestionIdSet){
+            ApiCompanyStudyPercentVo vo = new ApiCompanyStudyPercentVo();
+            vo.setProductQuestionId(productQuestionId);
+            AiProductQuestion record = questionMap.get(productQuestionId);
+            vo.setTitle(record.getTitle());
+            vo.setDifficulty(record.getDifficulty());
+
+            List<AiProductQuestionItem> questionItemList = questionItemMap.get(productQuestionId);
+            List<ApiCompanyStudyPercentItemVo> answerList = new ArrayList<>();
+            if (CollUtil.isNotEmpty(questionItemList)){
+                for (AiProductQuestionItem questionItem : questionItemList){
+                    ApiCompanyStudyPercentItemVo itemVo = new ApiCompanyStudyPercentItemVo();
+                    itemVo.setId(questionItem.getId());
+                    itemVo.setAnswer(questionItem.getAnswer());
+                    itemVo.setAnswerAnalysis(questionItem.getAnswerAnalysis());
+                    itemVo.setCorrectAnswer(questionItem.getCorrectAnswer());
+                    itemVo.setMemberCnt(memberAnswerItemCountMap.getOrDefault(questionItem.getId(),0L));
+                    answerList.add(itemVo);
+                }
+            }
+            vo.setAnswerList(answerList);
+
+            objects.add( vo);
+        }
+        return  new FebsResponse().success().data(objects);
+    }
+
+    @Override
+    public FebsResponse studyInfoList(ApiCompanyStudyInfoDto dto) {
+
+        List<ApiCompanyStudyInfoVo> objects = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String productQuestionId = dto.getProductQuestionId();
+        LambdaQueryWrapper<AiMemberAnswerItem> memberAnswerItemLambdaQueryWrapper = Wrappers.lambdaQuery(AiMemberAnswerItem.class);
+        memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getProductQuestionId,productQuestionId);
+        memberAnswerItemLambdaQueryWrapper.eq(AiMemberAnswerItem::getCompanyId,companyId);
+        List<AiMemberAnswerItem> memberAnswerItemList = aiMemberAnswerItemService.getListByQuery(memberAnswerItemLambdaQueryWrapper);
+        if ( CollUtil.isEmpty(memberAnswerItemList)){
+            return  new FebsResponse().success().data(objects);
+        }
+
+        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.setMemberAnswerState(memberAnswerItem.getMemberAnswerState());
+            objects.add(vo);
+        }
+        return  new FebsResponse().success().data(objects);
+    }
 }
diff --git a/src/main/resources/mapper/modules/AiMemberAnswerMapper.xml b/src/main/resources/mapper/modules/AiMemberAnswerMapper.xml
index 5e1eb1c..492dab3 100644
--- a/src/main/resources/mapper/modules/AiMemberAnswerMapper.xml
+++ b/src/main/resources/mapper/modules/AiMemberAnswerMapper.xml
@@ -42,4 +42,21 @@
           and a.company_id = #{record.companyId}
         order by a.CREATED_TIME desc
     </select>
+
+
+
+    <select id="selectProductListPage" resultType="cc.mrbird.febs.ai.res.member.ApiCompanyStudyVo">
+        select
+            a.id as productId,
+            a.name as name,
+            a.target as target
+        from ai_member_answer b
+        left join ai_product a on b.product_id = a.id and a.state = 1
+        where b.member_id = #{record.memberUuid}
+          and b.company_id = #{record.companyId}
+          and b.state = 1
+          group by b.product_id
+        order by b.CREATED_TIME desc
+
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1