From 0325d413502474062e1d400df319bfd390e94956 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 17 Sep 2025 16:12:40 +0800
Subject: [PATCH] feat(ai): 新增 AI 陪练相关功能

---
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java              |  115 ++++++++
 src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java |    2 
 src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamStudyDto.java                        |   16 +
 src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPracticeVo.java                      |   26 ++
 src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java                     |   17 -
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java                    |   24 +
 src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java         |   27 ++
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberServiceImpl.java                        |  205 ++++++++++++++-
 src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java                              |   18 
 src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiTalkAnswerStreamDto.java              |    4 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java                  |   20 +
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java                       |    4 
 src/main/java/cc/mrbird/febs/ai/controller/member/ApiMemberController.java                   |   34 ++
 src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPageVo.java                          |   11 
 src/main/java/cc/mrbird/febs/ai/strategy/param/LlmStrategyDto.java                           |    2 
 src/main/java/cc/mrbird/febs/ai/res/memberTalkStream/ApiMemberTalkStreamVo.java              |    6 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java                            |    7 
 src/main/java/cc/mrbird/febs/ai/controller/TestController.java                               |    8 
 src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java     |   16 +
 src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPageDto.java                         |    4 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java                           |    4 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java                                 |   10 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java                         |    4 
 src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java                             |    4 
 src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkMemberAnswerSavaVo.java          |   17 +
 src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java                        |    2 
 src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java           |    6 
 src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVoOld.java                 |    4 
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java                |    7 
 src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java                                       |    2 
 src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamStudyVo.java                         |   18 +
 src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java               |   23 +
 src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java                   |   20 +
 src/main/java/cc/mrbird/febs/ai/entity/AiMemberTalk.java                                     |   20 +
 src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPracticeDto.java                     |   16 +
 src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java      |   20 +
 src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java           |    9 
 src/main/java/cc/mrbird/febs/ai/enumerates/AiTypeEnum.java                                   |   11 
 38 files changed, 655 insertions(+), 108 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/controller/TestController.java b/src/main/java/cc/mrbird/febs/ai/controller/TestController.java
index d2f8204..d268747 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/TestController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/TestController.java
@@ -4,7 +4,7 @@
 import cc.mrbird.febs.ai.enumerates.AiPromptEnum;
 import cc.mrbird.febs.ai.mapper.AiMemberMapper;
 import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld;
 import cc.mrbird.febs.ai.service.AiService;
 import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
 import cc.mrbird.febs.ai.strategy.LlmStrategyFactory;
@@ -106,7 +106,7 @@
 
     @ApiOperation("提问AI(流式)V2")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answer-streamV2")
     public Flux<FebsResponse> answerStreamV2(@RequestBody @Validated AiTalkAnswerStream dto) {
@@ -146,7 +146,7 @@
 
     @ApiOperation("提问AI(流式)V3")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answerStreamV3")
     public Flux<FebsResponse> answerStreamV3(@RequestBody @Validated AiTalkAnswerStream dto) {
@@ -229,7 +229,7 @@
 
     @ApiOperation("提问AI(非流式响应)V4")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "非流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "非流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answerStreamV4")
     public FebsResponse answerStreamV4(@RequestBody @Validated AiTalkAnswerStream dto) {
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 4c90cad..6e58da0 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
@@ -1,9 +1,11 @@
 package cc.mrbird.febs.ai.controller.member;
 
-import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
-import cc.mrbird.febs.ai.req.memberPoint.ApiMemberPointDto;
-import cc.mrbird.febs.ai.res.member.ApiMemberPageVo;
-import cc.mrbird.febs.ai.res.memberAnswer.ApiMemberAnswerVoV2;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPageDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPracticeDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamStudyDto;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamPageVo;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamPracticeVo;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamStudyVo;
 import cc.mrbird.febs.ai.service.AiMemberService;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import io.swagger.annotations.Api;
@@ -33,11 +35,31 @@
 
     @ApiOperation(value = "我的团队", notes = "我的团队")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "success", response = ApiMemberPageVo.class)
+            @ApiResponse(code = 200, message = "success", response = ApiMemberTeamPageVo.class)
     })
     @PostMapping(value = "/myTeam")
-    public FebsResponse myTeam(@RequestBody @Validated ApiMemberPageDto dto) {
+    public FebsResponse myTeam(@RequestBody @Validated ApiMemberTeamPageDto dto) {
 
         return aiMemberService.myTeam(dto);
     }
+
+    @ApiOperation(value = "练习次数", notes = "练习次数")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMemberTeamPracticeVo.class)
+    })
+    @PostMapping(value = "/practice")
+    public FebsResponse practice(@RequestBody @Validated ApiMemberTeamPracticeDto dto) {
+
+        return aiMemberService.practice(dto);
+    }
+
+    @ApiOperation(value = "学习时长", notes = "学习时长")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMemberTeamStudyVo.class)
+    })
+    @PostMapping(value = "/study")
+    public FebsResponse study(@RequestBody @Validated ApiMemberTeamStudyDto dto) {
+
+        return aiMemberService.study(dto);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java
index 48488d4..86ef30e 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkController.java
@@ -3,7 +3,7 @@
 import cc.mrbird.febs.ai.req.memberTalk.*;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkReloadVo;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo;
 import cc.mrbird.febs.ai.service.AiMemberTalkService;
 import cc.mrbird.febs.common.entity.FebsResponse;
@@ -15,9 +15,7 @@
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 import reactor.core.publisher.Flux;
 
-import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
-import java.util.List;
 
 /**
  * @author Administrator
@@ -106,7 +104,7 @@
     // 修改接口定义
     @ApiOperation("开始AI对话(流式)")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @GetMapping("/answer-stream")
     public Flux<FebsResponse> answerStream(@RequestParam String question) {
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
index a0bca59..3eb6323 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/memberTalk/ApiMemberTalkStreamController.java
@@ -3,6 +3,8 @@
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
 import cc.mrbird.febs.ai.req.memberTalkStream.*;
 import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo;
 import cc.mrbird.febs.ai.service.AiMemberTalkStreamService;
@@ -58,6 +60,9 @@
     }
 
     @ApiOperation(value = "保存用户回答", notes = "保存答案")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiMemberTalkMemberAnswerSavaVo.class)
+    })
     @PostMapping(value = "/saveMemberAnswer")
     public FebsResponse saveMemberAnswer(@RequestBody @Validated ApiMemberTalkMemberAnswerSavaDto dto) {
 
@@ -66,7 +71,7 @@
 
     @ApiOperation("回答(流式)")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answer")
     public Flux<FebsResponse> answer(@RequestBody @Validated AiTalkAnswerStreamDto dto) {
@@ -78,7 +83,7 @@
 
     @ApiOperation("回答(流式)")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answerV2")
     public Flux<FebsResponse> answerV2(@RequestBody @Validated AiTalkAnswerStreamDto dto) {
@@ -95,4 +100,11 @@
         return aiMemberTalkStreamService.saveAnswer(dto);
     }
 
+    @ApiOperation(value = "保存AI陪练总结报告", notes = "保存AI陪练总结报告")
+    @PostMapping(value = "/saveReport")
+    public FebsResponse saveReport(@RequestBody @Validated ApiMemberTalkReportSavaDto dto) {
+
+        return aiMemberTalkStreamService.saveReport(dto);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java
index 669c5e1..5150204 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/productCategory/ApiProductCategoryController.java
@@ -73,6 +73,6 @@
     @PostMapping(value = "/list")
     public FebsResponse list(@RequestBody @Validated ApiProductCategoryPageDto dto) {
 
-        return aiProductCategoryService.categoryList(dto);
+        return aiProductCategoryService.categoryChildList(dto);
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
index ba73e90..2cf5a30 100644
--- a/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
+++ b/src/main/java/cc/mrbird/febs/ai/controller/talk/ApiAiTalkController.java
@@ -1,20 +1,14 @@
 package cc.mrbird.febs.ai.controller.talk;
 
-import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkAnswerDto;
-import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkDto;
-import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.AiTalkAnswerStream;
 import cc.mrbird.febs.ai.req.talk.ApiTalkDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkItemPageDto;
 import cc.mrbird.febs.ai.req.talk.ApiTalkPageDto;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkItemVo;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld;
 import cc.mrbird.febs.ai.res.talk.ApiTalkItemPageVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkPageVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkQuestionVo;
 import cc.mrbird.febs.ai.res.talk.ApiTalkVo;
-import cc.mrbird.febs.ai.service.AiMemberTalkService;
 import cc.mrbird.febs.ai.service.AiTalkService;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cn.hutool.core.util.StrUtil;
@@ -23,10 +17,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 import reactor.core.publisher.Flux;
-
-import java.io.IOException;
 
 /**
  * @author Administrator
@@ -83,7 +74,7 @@
 
     @ApiOperation("提问AI(流式)")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @GetMapping("/answer-stream")
     public Flux<FebsResponse> answerStream(@RequestParam String question) {
@@ -93,7 +84,7 @@
 
     @ApiOperation("提问AI(流式)V2")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answer-streamV2")
     public Flux<FebsResponse> answerStreamV2(@RequestBody @Validated AiTalkAnswerStream dto) {
@@ -105,7 +96,7 @@
 
     @ApiOperation("提问AI(流式带思考过程)V3")
     @ApiResponses({
-            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVo.class),
+            @ApiResponse(code = 200, message = "流式响应", response = ApiMemberTalkStreamVoOld.class),
     })
     @PostMapping("/answer-streamV3")
     public Flux<FebsResponse> answerStreamV3(@RequestBody @Validated AiTalkAnswerStream dto) {
diff --git a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberTalk.java b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberTalk.java
index a2cd905..b31ae8d 100644
--- a/src/main/java/cc/mrbird/febs/ai/entity/AiMemberTalk.java
+++ b/src/main/java/cc/mrbird/febs/ai/entity/AiMemberTalk.java
@@ -28,4 +28,24 @@
      * 用户ID (UUID)
      */
     private String memberId;
+
+    /**
+     * 状态 0-进行中 1-已结束
+     */
+    private Integer state;
+
+    /**
+     * 分析结果
+     */
+    private String analysis;
+
+    /**
+     * 题目数量
+     */
+    private Integer questionCnt;
+
+    /**
+     * 作答数量
+     */
+    private Integer doneCnt;
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/enumerates/AiTypeEnum.java b/src/main/java/cc/mrbird/febs/ai/enumerates/AiTypeEnum.java
index 18ae5fd..c9adbe6 100644
--- a/src/main/java/cc/mrbird/febs/ai/enumerates/AiTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/ai/enumerates/AiTypeEnum.java
@@ -10,6 +10,17 @@
 public enum AiTypeEnum {
 
     /**
+     * ai陪练的消息记录
+     */
+    MESSAGES(1,"MESSAGES"),
+
+    AI_MEMBER_ANSWER_STATE_ING(0,"题目练习进行中"),
+    AI_MEMBER_ANSWER_STATE_DONE(1,"题目练习已完成"),
+
+    AI_MEMBER_TALK_STATE_ING(0,"AI陪练进行中"),
+    AI_MEMBER_TALK_STATE_DONE(1,"AI陪练已完成"),
+
+    /**
      * 1:用户提问
      * 2:AI回答
      */
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPageDto.java
similarity index 84%
rename from src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java
rename to src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPageDto.java
index 2420d39..19efd72 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberPageDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPageDto.java
@@ -7,8 +7,8 @@
 import javax.validation.constraints.NotNull;
 
 @Data
-@ApiModel(value = "ApiMemberPageDto", description = "参数")
-public class ApiMemberPageDto {
+@ApiModel(value = "ApiMemberTeamPageDto", description = "参数")
+public class ApiMemberTeamPageDto {
 
     @NotNull(message = "页码不能为空")
     @ApiModelProperty(value = "页码", example = "1")
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPracticeDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPracticeDto.java
new file mode 100644
index 0000000..c67266c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamPracticeDto.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 = "ApiMemberTeamPracticeDto", description = "参数")
+public class ApiMemberTeamPracticeDto {
+
+    @NotBlank(message = "用户ID不能为空")
+    @ApiModelProperty(value = "用户ID")
+    private String memberUuid;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamStudyDto.java b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamStudyDto.java
new file mode 100644
index 0000000..079719b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/member/ApiMemberTeamStudyDto.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 = "ApiMemberTeamStudyDto", description = "参数")
+public class ApiMemberTeamStudyDto {
+
+    @NotBlank(message = "用户ID不能为空")
+    @ApiModelProperty(value = "用户ID")
+    private String memberUuid;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiTalkAnswerStreamDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiTalkAnswerStreamDto.java
index 378c1f7..aaa744e 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiTalkAnswerStreamDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/AiTalkAnswerStreamDto.java
@@ -12,6 +12,10 @@
 public class AiTalkAnswerStreamDto {
 
 
+    @ApiModelProperty(value = "状态:1-总结 0-回答问题", example = "10")
+    private Integer state;
+
+
     @ApiModelProperty(value = "类型 1:亮点 2:建议 3:参考答案 4:知识点总结", example = "10")
     private Integer type;
 
diff --git a/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java
new file mode 100644
index 0000000..1d712d2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/req/memberTalkStream/ApiMemberTalkReportSavaDto.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.ai.req.memberTalkStream;
+
+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 = "ApiMemberTalkReportSavaDto", description = "参数")
+public class ApiMemberTalkReportSavaDto {
+    /**
+     * 用户对话ID (UUID)
+     */
+    @NotBlank(message = "会话ID不能为空")
+    @ApiModelProperty(value = "会话ID", example = "10")
+    private String memberTalkId;
+
+    @NotBlank(message = "回复内容不能为空")
+    @ApiModelProperty(value = "回复内容", example = "10")
+    private String content;
+
+    @NotNull(message = "类型ID不能为空")
+    @ApiModelProperty(value = "类型 1:亮点 2:建议 3:参考答案 4:知识点总结", example = "10")
+    private Integer type;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java
index cffb9a9..459b92a 100644
--- a/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/req/productCategory/ApiProductCategoryPageDto.java
@@ -14,15 +14,6 @@
 @ApiModel(value = "ApiProductCategoryPageDto", description = "参数")
 public class ApiProductCategoryPageDto {
 
-    @NotNull(message = "页码不能为空")
-    @ApiModelProperty(value = "页码", example = "1")
-    private Integer pageNow;
-
-    @NotNull(message = "每页数量不能为空")
-    @ApiModelProperty(value = "每页数量", example = "10")
-    private Integer pageSize;
-
-
     @NotBlank(message = "父分类不能为空")
     @ApiModelProperty(value = "父分类ID", example = "123")
     private String parentId;
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPageVo.java
similarity index 62%
rename from src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java
rename to src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPageVo.java
index c107eab..4e10916 100644
--- a/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberPageVo.java
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPageVo.java
@@ -5,11 +5,14 @@
 import lombok.Data;
 
 @Data
-@ApiModel(value = "ApiMemberPageVo", description = "参数")
-public class ApiMemberPageVo {
+@ApiModel(value = "ApiMemberTeamPageVo", description = "参数")
+public class ApiMemberTeamPageVo {
 
     @ApiModelProperty(value = "用户ID")
     private String memberUuid;
+
+    @ApiModelProperty(value = "类型 1-本人 0-不是本人")
+    private Integer type;
 
     @ApiModelProperty(value = "微信名")
     private String nickName;
@@ -20,6 +23,6 @@
     @ApiModelProperty(value = "联系次数")
     private Integer practiceCnt;
 
-    @ApiModelProperty(value = "学习时长")
-    private Integer studyTime;
+    @ApiModelProperty(value = "学习时长(分钟)")
+    private String studyTime;
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPracticeVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPracticeVo.java
new file mode 100644
index 0000000..e43b4a2
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamPracticeVo.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.ai.res.member;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "ApiMemberTeamPracticeVo", description = "参数")
+public class ApiMemberTeamPracticeVo {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "目标")
+    private String target;
+
+    @ApiModelProperty(value = "题目练习次数")
+    private Integer answerCnt;
+
+    @ApiModelProperty(value = "AI陪练次数")
+    private Integer talkCnt;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamStudyVo.java b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamStudyVo.java
new file mode 100644
index 0000000..a412f13
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/member/ApiMemberTeamStudyVo.java
@@ -0,0 +1,18 @@
+package cc.mrbird.febs.ai.res.member;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiMemberTeamStudyVo", description = "参数")
+public class ApiMemberTeamStudyVo {
+
+
+    @ApiModelProperty(value = "名称")
+    private String title;
+
+
+    @ApiModelProperty(value = "总时长分钟")
+    private String totalTime;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkMemberAnswerSavaVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkMemberAnswerSavaVo.java
new file mode 100644
index 0000000..d2402cd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkMemberAnswerSavaVo.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.ai.res.memberTalk;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiMemberTalkMemberAnswerSavaVo", description = "参数")
+public class ApiMemberTalkMemberAnswerSavaVo {
+
+
+    @ApiModelProperty(value = "题目数量")
+    private Integer questionCnt;
+
+    @ApiModelProperty(value = "作答数量")
+    private Integer doneCnt;
+}
diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVoOld.java
similarity index 75%
rename from src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVo.java
rename to src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVoOld.java
index b6b2c54..3c7c9fa 100644
--- a/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVo.java
+++ b/src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVoOld.java
@@ -8,8 +8,8 @@
  * @author Administrator
  */
 @Data
-@ApiModel(value = "ApiMemberTalkStreamVo", description = "参数")
-public class ApiMemberTalkStreamVo {
+@ApiModel(value = "ApiMemberTalkStreamVoOld", description = "参数")
+public class ApiMemberTalkStreamVoOld {
 
     @ApiModelProperty(value = "消息")
     private String content;
diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberTalkStream/ApiMemberTalkStreamVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberTalkStream/ApiMemberTalkStreamVo.java
index 748cf4d..c6bbc7b 100644
--- a/src/main/java/cc/mrbird/febs/ai/res/memberTalkStream/ApiMemberTalkStreamVo.java
+++ b/src/main/java/cc/mrbird/febs/ai/res/memberTalkStream/ApiMemberTalkStreamVo.java
@@ -36,4 +36,10 @@
 
     @ApiModelProperty(value = "内容亮点、建议、参考答案、核心知识点雷达图表数据(数据对象)")
     private String report;
+
+    @ApiModelProperty(value = "题目数量")
+    private Integer questionCnt;
+
+    @ApiModelProperty(value = "作答数量")
+    private Integer doneCnt;
 }
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 474732c..5fe71c5 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberAnswerService.java
@@ -36,4 +36,8 @@
     FebsResponse myWork(ApiMemberProductWorkPageDto dto);
 
     void updateMemberAnswerUpdateTime(String memberAnswerId, Date updateTime);
+
+    List<AiMemberAnswer> getListByCompanyId(String companyId);
+
+    List<AiMemberAnswer> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java
index ba96321..09d4f5f 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberPointService.java
@@ -5,14 +5,17 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 public interface AiMemberPointService extends IService<AiMemberPoint> {
 
     AiMemberPoint getById(String id);
 
     AiMemberPoint add(String memberUuid, String productPointId, String companyId, Integer totalTime);
 
-
-
     FebsResponse saveTime(ApiMemberPointDto dto);
 
+    List<AiMemberPoint> getListByCompanyId(String companyId);
+
+    List<AiMemberPoint> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid);
 }
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 0edc3bd..b090753 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberService.java
@@ -1,7 +1,9 @@
 package cc.mrbird.febs.ai.service;
 
 import cc.mrbird.febs.ai.entity.AiMember;
-import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPageDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPracticeDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamStudyDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -9,5 +11,9 @@
 
     AiMember getById(String id);
 
-    FebsResponse myTeam(ApiMemberPageDto dto);
+    FebsResponse myTeam(ApiMemberTeamPageDto dto);
+
+    FebsResponse practice(ApiMemberTeamPracticeDto dto);
+
+    FebsResponse study(ApiMemberTeamStudyDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
index fe3dce3..9bd65d3 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkItemService.java
@@ -24,7 +24,9 @@
 
     AiMemberTalkItem add(String memberUuid, String id, String companyId, int type, String resContext, Date createdTime);
 
-    AiMemberTalkItem getByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery);
+    AiMemberTalkItem getOneByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery);
+
+    List<AiMemberTalkItem> getListByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery);
 
     IPage<ApiMemberTalkItemVo> historyPage(ApiMemberTalkItemPageDto dto);
 
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
index 736d13d..77f5c0e 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkService.java
@@ -35,11 +35,13 @@
 
     FebsResponse answer(ApiMemberTalkAnswerDto dto);
 
-    AiMemberTalk add(String memberUuid,String companyId, String productId, Date nowTime);
+    AiMemberTalk add(String memberUuid,String companyId, String productId, Date nowTime,Integer questionCount);
 
     FebsResponse historyPage(ApiMemberTalkItemPageDto dto);
 
     Flux<FebsResponse> answerStream(String question);
 
     List<AiMemberTalk> getListByCompanyId(String companyId);
+
+    List<AiMemberTalk> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
index b48361e..6ad2653 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiMemberTalkStreamService.java
@@ -29,5 +29,7 @@
 
     FebsResponse saveAnswer(ApiMemberTalkAnswerSavaDto dto);
 
-    void updateMemberTalkUpdateTime(String memberTalkId, Date updateTime);
+    void updateMemberTalkUpdateTime(Integer state,Integer doneCnt,String memberTalkId, Date updateTime);
+
+    FebsResponse saveReport(ApiMemberTalkReportSavaDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
index a709a69..1e44cf2 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/AiProductCategoryService.java
@@ -31,7 +31,7 @@
 
     FebsResponse hotV2(ApiProductCategoryHotDto dto);
 
-    FebsResponse categoryList(ApiProductCategoryPageDto dto);
+    FebsResponse categoryChildList(ApiProductCategoryPageDto dto);
 
     String getDefaultProductCategoryId();
 
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 2434673..faac604 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
@@ -1,6 +1,7 @@
 package cc.mrbird.febs.ai.service.impl;
 
 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.memberAnswer.*;
 import cc.mrbird.febs.ai.res.memberAnswer.*;
@@ -406,4 +407,23 @@
                 .eq(AiMemberAnswer::getId,memberAnswerId)
         );
     }
+
+    @Override
+    public List<AiMemberAnswer> getListByCompanyId(String companyId) {
+        return aiMemberAnswerMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberAnswer.class)
+                .eq(AiMemberAnswer::getCompanyId, companyId)
+                .eq(AiMemberAnswer::getState, AiTypeEnum.AI_MEMBER_ANSWER_STATE_DONE.getCode())
+        );
+    }
+
+    @Override
+    public List<AiMemberAnswer> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid) {
+        return aiMemberAnswerMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberAnswer.class)
+                        .eq(AiMemberAnswer::getCompanyId, companyId)
+                        .eq(AiMemberAnswer::getMemberId, memberUuid)
+                        .eq(AiMemberAnswer::getState, AiTypeEnum.AI_MEMBER_ANSWER_STATE_DONE.getCode())
+        );
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java
index eea26fd..123455d 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberPointServiceImpl.java
@@ -15,6 +15,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.List;
 
 @Slf4j
 @Service
@@ -51,7 +52,7 @@
 
         AiMemberPoint aiMemberPoint = this.getById(productPointId);
         if (ObjectUtil.isNull(aiMemberPoint)){
-            aiMemberPoint = this.add(memberUuid, productPointId, companyId, totalTime);
+            this.add(memberUuid, productPointId, companyId, totalTime);
         }else{
             Integer oldTotalTime = aiMemberPoint.getTotalTime();
             aiMemberPointMapper.update(
@@ -64,4 +65,21 @@
         }
         return new FebsResponse().success();
     }
+
+    @Override
+    public List<AiMemberPoint> getListByCompanyId(String companyId) {
+        return aiMemberPointMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberPoint.class)
+                .eq(AiMemberPoint::getCompanyId, companyId)
+        );
+    }
+
+    @Override
+    public List<AiMemberPoint> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid) {
+        return aiMemberPointMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberPoint.class)
+                        .eq(AiMemberPoint::getCompanyId, companyId)
+                        .eq(AiMemberPoint::getMemberId, memberUuid)
+        );
+    }
 }
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 f09837b..ac90ba3 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
@@ -1,17 +1,22 @@
 package cc.mrbird.febs.ai.service.impl;
 
-import cc.mrbird.febs.ai.entity.AiMember;
-import cc.mrbird.febs.ai.entity.AiMemberTalk;
+import cc.mrbird.febs.ai.entity.*;
 import cc.mrbird.febs.ai.mapper.AiMemberMapper;
-import cc.mrbird.febs.ai.req.member.ApiMemberPageDto;
-import cc.mrbird.febs.ai.res.member.ApiMemberPageVo;
-import cc.mrbird.febs.ai.service.AiMemberService;
-import cc.mrbird.febs.ai.service.AiMemberTalkService;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPageDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamPracticeDto;
+import cc.mrbird.febs.ai.req.member.ApiMemberTeamStudyDto;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamPageVo;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamPracticeVo;
+import cc.mrbird.febs.ai.res.member.ApiMemberTeamStudyVo;
+import cc.mrbird.febs.ai.res.productPoint.ApiProductPointListVo;
+import cc.mrbird.febs.ai.service.*;
 import cc.mrbird.febs.common.entity.FebsResponse;
+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.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.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -20,10 +25,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -37,16 +39,25 @@
     private final AiMemberMapper aiMemberMapper;
     private final MallMemberMapper mallMemberMapper;
     private final AiMemberTalkService aiMemberTalkService;
+    private final AiMemberAnswerService aiMemberAnswerService;
+    private final AiMemberPointService aiMemberPointService;
+    private final AiProductService aiProductService;
+    private final AiProductPointService aiProductPointService;
     @Override
     public AiMember getById(String id) {
         return aiMemberMapper.selectById( id);
     }
 
     @Override
-    public FebsResponse myTeam(ApiMemberPageDto dto) {
-        List<ApiMemberPageVo> objects = new ArrayList<>();
+    public FebsResponse myTeam(ApiMemberTeamPageDto dto) {
+        List<ApiMemberTeamPageVo> objects = new ArrayList<>();
 
         String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        Integer checkOrder = LoginUserUtil.getLoginUser().getCheckOrder();
+        if (1 != checkOrder){
+            throw new FebsException("非管理员,无权限查看");
+        }
 
         // 创建分页对象,传入当前页和每页大小
         Page<AiMember> page = new Page<>(dto.getPageNow(), dto.getPageSize());
@@ -56,12 +67,12 @@
         Page<AiMember> pageListByQuery = aiMemberMapper.selectPage(page, queryWrapper);
         List<AiMember> records = pageListByQuery.getRecords();
         if (CollUtil.isNotEmpty( records)){
-            objects = buildMemberPages(companyId,records,objects);
+            objects = buildMemberPages(memberUuid,companyId,records,objects);
         }
         return new FebsResponse().success().data(objects);
     }
 
-    private List<ApiMemberPageVo> buildMemberPages(String companyId,List<AiMember> records,List<ApiMemberPageVo> objects) {
+    private List<ApiMemberTeamPageVo> buildMemberPages(String memberUuid, String companyId, List<AiMember> records, List<ApiMemberTeamPageVo> objects) {
         /**
          * 获取用户信息
          */
@@ -78,24 +89,176 @@
         Map<String, MallMember> mallMemberMap = mallMembers.stream().collect(Collectors.toMap(MallMember::getMemberUuid, mallMember -> mallMember));
 
         /**
-         * 获取用户联系次数
+         * 获取用户练习次数
          *  ai陪练
          *  ai答题
          */
         List<AiMemberTalk> aiMemberTalks = aiMemberTalkService.getListByCompanyId(companyId);
-        //Stream流操作aiMemberTalks,获取一个map<memberUuid,aiMemberTalk>的对象
+        //stream流操作aiMemberTalks,获取一个Map<memberId,Integer>的对象,integer代表按照memberId分组的数量
+        Map<String, Integer> memberIdToCntMapTalk = aiMemberTalks.stream()
+                .collect(Collectors.groupingBy(
+                        AiMemberTalk::getMemberId,
+                        Collectors.summingInt(t -> 1)
+                ));
+
+        List<AiMemberAnswer> aiMemberAnswers = aiMemberAnswerService.getListByCompanyId(companyId);
+        //stream流操作aiMemberAnswers,获取一个Map<memberId,Integer>的对象,integer代表按照memberId分组的数量
+        Map<String, Integer> memberIdToCntMapAnswer = aiMemberAnswers.stream()
+                .collect(Collectors.groupingBy(
+                        AiMemberAnswer::getMemberId,
+                        Collectors.summingInt(a -> 1)
+                ));
+        /**
+         * 用户学习总时长
+         */
+        List<AiMemberPoint> aiMemberPoints = aiMemberPointService.getListByCompanyId(companyId);
+        Map<String, Integer> memberStudyTimeMap = aiMemberPoints.stream().collect(Collectors.groupingBy(
+                AiMemberPoint::getMemberId,
+                Collectors.summingInt(AiMemberPoint::getTotalTime)
+        ));
 
 
         for (AiMember aiMember : records){
-            ApiMemberPageVo apiMemberPageVo = new ApiMemberPageVo();
-            apiMemberPageVo.setMemberUuid(aiMember.getId());
+            String aiMemberId = aiMember.getId();
+            ApiMemberTeamPageVo apiMemberTeamPageVo = new ApiMemberTeamPageVo();
+            apiMemberTeamPageVo.setType(0);
+            apiMemberTeamPageVo.setMemberUuid(aiMemberId);
+            if (memberUuid.equals(aiMemberId)){
+                apiMemberTeamPageVo.setType(1);
+            }
 
             //判断mallMemberMap中是否存在该会员
-            apiMemberPageVo.setMemberName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
-            apiMemberPageVo.setNickName(mallMemberMap.containsKey(aiMember.getId()) ? mallMemberMap.get(aiMember.getId()).getName() : "");
+            apiMemberTeamPageVo.setNickName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : "");
+            apiMemberTeamPageVo.setMemberName(mallMemberMap.containsKey(aiMemberId) ? mallMemberMap.get(aiMemberId).getName() : "");
+            Integer practiceCnt = 0;
+            if (memberIdToCntMapTalk.containsKey(aiMemberId)){
+                practiceCnt = memberIdToCntMapTalk.get(aiMemberId);
+            }
+            if (memberIdToCntMapAnswer.containsKey(aiMemberId)){
+                practiceCnt = memberIdToCntMapAnswer.get(aiMemberId) + practiceCnt;
+            }
+            apiMemberTeamPageVo.setPracticeCnt(practiceCnt);
 
-            objects.add(apiMemberPageVo);
+            Integer studyTime = 0;
+            if (memberStudyTimeMap.containsKey(aiMemberId)){
+                studyTime = memberStudyTimeMap.get(aiMemberId);
+            }
+            apiMemberTeamPageVo.setStudyTime(DateUtil.secondToTime(studyTime));
+            objects.add(apiMemberTeamPageVo);
         }
         return objects;
     }
+
+
+
+    @Override
+    public FebsResponse practice(ApiMemberTeamPracticeDto dto) {
+        List<ApiMemberTeamPracticeVo> vos = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String memberUuid = dto.getMemberUuid();
+
+        List<AiMemberTalk> aiMemberTalks = aiMemberTalkService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+        Map<String, List<AiMemberTalk>> aiMemberTalkMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(aiMemberTalks)){
+            //stream操作aiMemberTalks,返回一个根据productId分组的集合
+            aiMemberTalkMap = aiMemberTalks.stream().collect(Collectors.groupingBy(AiMemberTalk::getProductId));
+        }
+
+        List<AiMemberAnswer> aiMemberAnswers = aiMemberAnswerService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+        Map<String, List<AiMemberAnswer>> aiMemberAnswerMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(aiMemberAnswers)){
+            aiMemberAnswerMap = aiMemberAnswers.stream().collect(Collectors.groupingBy(AiMemberAnswer::getProductId));
+        }
+
+        // 获取aiMemberTalkMap和aiMemberAnswerMap的全部的key,并且去重
+        Set<String> productIds = new HashSet<>();
+        if (aiMemberTalkMap != null) {
+            productIds.addAll(aiMemberTalkMap.keySet());
+        }
+        if (aiMemberAnswerMap != null) {
+            productIds.addAll(aiMemberAnswerMap.keySet());
+        }
+        if (CollUtil.isEmpty(productIds)){
+            return new FebsResponse().success().data(vos);
+        }
+
+        List<AiProduct> aiProducts = aiProductService.getProductListByQuery(
+                Wrappers.lambdaQuery(AiProduct.class)
+                        .select(AiProduct::getId,AiProduct::getName, AiProduct::getTarget)
+                .in(AiProduct::getId, productIds)
+        );
+        if (CollUtil.isEmpty(aiProducts)){
+            return new FebsResponse().success().data(vos);
+        }
+
+        for (AiProduct aiProduct : aiProducts){
+
+            String productId = aiProduct.getId();
+            ApiMemberTeamPracticeVo vo = new ApiMemberTeamPracticeVo();
+            vo.setName(aiProduct.getName());
+            vo.setTarget(aiProduct.getTarget());
+
+            Integer answerCnt = 0;
+            if (aiMemberAnswerMap.containsKey(productId)){
+                answerCnt = aiMemberAnswerMap.get(productId).size();
+            }
+            vo.setAnswerCnt(answerCnt);
+
+            Integer talkCnt = 0;
+            if (aiMemberTalkMap.containsKey(productId)){
+                talkCnt = aiMemberTalkMap.get(productId).size();
+            }
+            vo.setTalkCnt(talkCnt);
+
+            vos.add( vo);
+        }
+
+
+        return new FebsResponse().success().data(vos);
+    }
+
+    @Override
+    public FebsResponse study(ApiMemberTeamStudyDto dto) {
+
+        List<ApiMemberTeamStudyVo> vos = new ArrayList<>();
+
+        String companyId = LoginUserUtil.getLoginUser().getCompanyId();
+        String memberUuid = dto.getMemberUuid();
+
+        List<AiMemberPoint> aiMemberPoints = aiMemberPointService.getListByCompanyIdAndMemberUuid(companyId, memberUuid);
+        if (CollUtil.isEmpty(aiMemberPoints)){
+            return new FebsResponse().success().data(vos);
+        }
+        Map<String, AiMemberPoint> aiMemberPointMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(aiMemberPoints)){
+            aiMemberPoints.forEach(aiMemberPoint -> aiMemberPointMap.put(aiMemberPoint.getProductPointId(),aiMemberPoint));
+        }
+
+        //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)
+                        .in(AiProductPoint::getId, productPointIdSet)
+        );
+        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())){
+                totalTime = aiMemberPointMap.get(aiProductPoint.getId()).getTotalTime();
+            }
+            vo.setTotalTime(DateUtil.secondToTime(totalTime));
+
+            vos.add(vo);
+        }
+
+        return new FebsResponse().success().data(vos);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
index 552f8ef..2271a7b 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkItemServiceImpl.java
@@ -53,11 +53,16 @@
     }
 
     @Override
-    public AiMemberTalkItem getByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery) {
+    public AiMemberTalkItem getOneByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery) {
         return aiMemberTalkItemMapper.selectOne(memberTalkItemQuery);
     }
 
     @Override
+    public List<AiMemberTalkItem> getListByQuery(LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery) {
+        return aiMemberTalkItemMapper.selectList(memberTalkItemQuery);
+    }
+
+    @Override
     public IPage<ApiMemberTalkItemVo> historyPage(ApiMemberTalkItemPageDto dto) {
         // 创建分页对象,传入当前页和每页大小
         Page<ApiMemberTalkItemVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
index 5c725dd..1cb9cfe 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkServiceImpl.java
@@ -80,7 +80,7 @@
         query.last("limit 1");
         AiMemberTalk aiMemberTalk = this.getByQuery(query);
         if (ObjectUtil.isNull(aiMemberTalk)){
-            aiMemberTalk = this.add(memberUuid,companyId,productId,nowTime);
+            aiMemberTalk = this.add(memberUuid,companyId,productId,nowTime,5);
         }
 
         List<AiMessage> aiMessageDtoList = aiMemberTalkItemService.getQuestionUpDownContext(aiMemberTalk.getId(),AiTypeEnum.QUESTION.getCode());
@@ -112,7 +112,7 @@
         queryWrapper.eq(AiMemberTalkItem::getType,AiTypeEnum.QUESTION_ANSWER.getCode());
         queryWrapper.orderByDesc(AiMemberTalkItem::getCreatedTime);
         queryWrapper.last("limit 1");
-        AiMemberTalkItem byQuery = aiMemberTalkItemService.getByQuery(queryWrapper);
+        AiMemberTalkItem byQuery = aiMemberTalkItemService.getOneByQuery(queryWrapper);
         if (ObjectUtil.isNotNull(byQuery)){
             apiMemberTalkReloadVo.setContext(byQuery.getContext());
             apiMemberTalkReloadVo.setMemberTalkId(memberTalkId);
@@ -155,7 +155,7 @@
                 query.last("limit 1");
                 AiMemberTalk aiMemberTalk = this.getByQuery(query);
                 if (ObjectUtil.isNull(aiMemberTalk)) {
-                    aiMemberTalk = this.add(memberUuid,companyId, productId, nowTime);
+                    aiMemberTalk = this.add(memberUuid,companyId, productId, nowTime,5);
                 }
                 try {
                     if (aiResponse.getCode().equals("200")) {
@@ -236,7 +236,7 @@
         memberTalkItemQuery.eq(AiMemberTalkItem::getType,1);
         memberTalkItemQuery.orderByDesc(AiMemberTalkItem::getCreatedTime);
         memberTalkItemQuery.last("limit 1");
-        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getByQuery(memberTalkItemQuery);
+        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getOneByQuery(memberTalkItemQuery);
         aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),companyId,2,reqContext,new Date());
 
         String format = StrUtil.format(ANSWER_FORMAT, aiMemberTalkItem.getContext(), reqContext);
@@ -268,13 +268,16 @@
         return new FebsResponse().success().data(apiMemberTalkVo);
     }
     @Override
-    public AiMemberTalk add(String memberUuid,String companyId, String productId, Date nowTime) {
+    public AiMemberTalk add(String memberUuid,String companyId, String productId, Date nowTime,Integer questionCount) {
         AiMemberTalk aiMemberTalk = new AiMemberTalk();
         aiMemberTalk.setId(UUID.getSimpleUUIDString());
         aiMemberTalk.setCompanyId(companyId);
         aiMemberTalk.setCreatedTime(nowTime);
         aiMemberTalk.setMemberId(memberUuid);
         aiMemberTalk.setProductId(productId);
+        aiMemberTalk.setQuestionCnt(questionCount);
+        aiMemberTalk.setDoneCnt(0);
+        aiMemberTalk.setState(AiTypeEnum.AI_MEMBER_TALK_STATE_ING.getCode());
         aiMemberTalkMapper.insert(aiMemberTalk);
         return aiMemberTalk;
     }
@@ -298,6 +301,17 @@
         return aiMemberTalkMapper.selectList(
                 Wrappers.lambdaQuery(AiMemberTalk.class)
                 .eq(AiMemberTalk::getCompanyId, companyId)
+                .eq(AiMemberTalk::getState, AiTypeEnum.AI_MEMBER_TALK_STATE_DONE.getCode())
+        );
+    }
+
+    @Override
+    public List<AiMemberTalk> getListByCompanyIdAndMemberUuid(String companyId, String memberUuid) {
+        return aiMemberTalkMapper.selectList(
+                Wrappers.lambdaQuery(AiMemberTalk.class)
+                        .eq(AiMemberTalk::getCompanyId, companyId)
+                        .eq(AiMemberTalk::getMemberId, memberUuid)
+                        .eq(AiMemberTalk::getState, AiTypeEnum.AI_MEMBER_TALK_STATE_DONE.getCode())
         );
     }
 
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
index 00411bc..8b8d056 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java
@@ -6,6 +6,7 @@
 import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper;
 import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
 import cc.mrbird.febs.ai.req.memberTalkStream.*;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo;
 import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo;
 import cc.mrbird.febs.ai.service.*;
@@ -15,6 +16,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -25,6 +27,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import reactor.core.publisher.Flux;
 
 import java.util.ArrayList;
@@ -44,6 +47,7 @@
 public class AiMemberTalkStreamServiceImpl extends ServiceImpl<AiMemberTalkMapper, AiMemberTalk> implements AiMemberTalkStreamService {
 
     private final AiMemberTalkMapper aiMemberTalkMapper;
+    private final AiProductService aiProductService;
     private final AiProductRoleLinkService aiProductRoleLinkService;
     private final AiProductRoleService aiProductRoleService;
     private final AiMemberTalkService aiMemberTalkService;
@@ -54,6 +58,7 @@
 
 
     @Override
+    @Transactional
     public FebsResponse start(ApiMemberTalkStreamDto dto) {
 
         String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
@@ -66,16 +71,20 @@
             throw new FebsException("产品AI陪练不存在");
         }
 
+        AiProduct aiProduct = aiProductService.getById(productId);
+        Integer questionCount = aiProduct.getQuestionCount();
+
         String companyId = aiProductRoleLink.getCompanyId();
 
         Date nowTime = new Date();
         LambdaQueryWrapper<AiMemberTalk> query = Wrappers.lambdaQuery(AiMemberTalk.class);
         query.eq(AiMemberTalk::getMemberId,memberUuid);
         query.eq(AiMemberTalk::getProductId,productId);
+        query.eq(AiMemberTalk::getState,AiTypeEnum.AI_MEMBER_TALK_STATE_ING.getCode());
         query.last("limit 1");
         AiMemberTalk aiMemberTalk = aiMemberTalkService.getByQuery(query);
         if (ObjectUtil.isNull(aiMemberTalk)){
-            aiMemberTalk = aiMemberTalkService.add(memberUuid,companyId,productId,nowTime);
+            aiMemberTalk = aiMemberTalkService.add(memberUuid,companyId,productId,nowTime,questionCount);
         }
 
         ApiMemberTalkStreamVo apiMemberTalkVo = new ApiMemberTalkStreamVo();
@@ -90,6 +99,8 @@
         apiMemberTalkVo.setMemberTalkId(aiMemberTalk.getId());
         apiMemberTalkVo.setType(1);
         apiMemberTalkVo.setContext(title);
+        apiMemberTalkVo.setQuestionCnt(aiMemberTalk.getQuestionCnt());
+        apiMemberTalkVo.setDoneCnt(aiMemberTalk.getDoneCnt() + 1);
         return new FebsResponse().success().data(apiMemberTalkVo);
     }
 
@@ -104,7 +115,7 @@
         queryWrapper.eq(AiMemberTalkItem::getType,AiTypeEnum.QUESTION_ANSWER.getCode());
         queryWrapper.orderByDesc(AiMemberTalkItem::getCreatedTime);
         queryWrapper.last("limit 1");
-        AiMemberTalkItem byQuery = aiMemberTalkItemService.getByQuery(queryWrapper);
+        AiMemberTalkItem byQuery = aiMemberTalkItemService.getOneByQuery(queryWrapper);
         if (ObjectUtil.isNotNull(byQuery)){
             apiMemberTalkReloadVo.setContext(byQuery.getContext());
             apiMemberTalkReloadVo.setMemberTalkId(memberTalkId);
@@ -121,6 +132,7 @@
     }
 
     @Override
+    @Transactional
     public FebsResponse saveMemberAnswer(ApiMemberTalkMemberAnswerSavaDto dto) {
         String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
         String memberTalkId = dto.getMemberTalkId();
@@ -130,11 +142,18 @@
         if (ObjectUtil.isNull(aiMemberTalk)){
             throw new FebsException("对话不存在");
         }
-        this.updateMemberTalkUpdateTime(aiMemberTalk.getId(), new Date());
+        int doneCnt = aiMemberTalk.getDoneCnt() + 1;
+        Integer state = aiMemberTalk.getState();
+        Integer questionCnt = aiMemberTalk.getQuestionCnt();
+        this.updateMemberTalkUpdateTime(state,doneCnt,aiMemberTalk.getId(), new Date());
 
         String companyId = aiMemberTalk.getCompanyId();
         aiMemberTalkItemService.add(memberUuid,aiMemberTalk.getId(),companyId,2,content,new Date());
-        return new FebsResponse().success();
+
+        ApiMemberTalkMemberAnswerSavaVo apiMemberTalkMemberAnswerSavaVo = new ApiMemberTalkMemberAnswerSavaVo();
+        apiMemberTalkMemberAnswerSavaVo.setQuestionCnt(questionCnt);
+        apiMemberTalkMemberAnswerSavaVo.setDoneCnt(doneCnt);
+        return new FebsResponse().success().data(apiMemberTalkMemberAnswerSavaVo);
     }
 
     @Override
@@ -169,7 +188,7 @@
         memberTalkItemQuery.eq(AiMemberTalkItem::getType,1);
         memberTalkItemQuery.orderByDesc(AiMemberTalkItem::getCreatedTime);
         memberTalkItemQuery.last("limit 1");
-        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getByQuery(memberTalkItemQuery);
+        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getOneByQuery(memberTalkItemQuery);
         String question = aiMemberTalkItem.getContext();
 
         String prompt = this.buildPrompt(question,reqContext,aiProductRole.getPromptHead(), aiProductRole.getPromptTemplate(), type);
@@ -194,6 +213,7 @@
         String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
         Integer type = dto.getType();
         String memberTalkId = dto.getId();
+        Integer state = ObjectUtil.defaultIfNull(dto.getState(),0);
         AiMemberTalk aiMemberTalk = this.getById(memberTalkId);
         if (ObjectUtil.isNull(aiMemberTalk)){
             throw new FebsException("对话不存在");
@@ -218,7 +238,7 @@
         memberTalkItemQuery.eq(AiMemberTalkItem::getType,1);
         memberTalkItemQuery.orderByDesc(AiMemberTalkItem::getCreatedTime);
         memberTalkItemQuery.last("limit 1");
-        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getByQuery(memberTalkItemQuery);
+        AiMemberTalkItem aiMemberTalkItem = aiMemberTalkItemService.getOneByQuery(memberTalkItemQuery);
 
         String question = aiMemberTalkItem.getContext();
         String promptHead = aiProductRole.getPromptHead();
@@ -233,9 +253,48 @@
         llmStrategyDtoList.add(llmStrategyDto);
         llmStrategyDto = this.buildLlmStrategyDtoList(String.valueOf(type), 4);
         llmStrategyDtoList.add(llmStrategyDto);
+
+        LlmStrategyDto llmStrategyDtoMessage = buildMessages(state, memberTalkId);
+        llmStrategyDtoList.add(llmStrategyDtoMessage);
         String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType());
 
         return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList);
+    }
+
+    private LlmStrategyDto buildMessages(Integer state, String memberTalkId) {
+
+        LlmStrategyDto message = new LlmStrategyDto();
+        if (1!=  state){
+            return message;
+        }
+        LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery = Wrappers.lambdaQuery(AiMemberTalkItem.class);
+        memberTalkItemQuery.eq(AiMemberTalkItem::getMemberTalkId,memberTalkId);
+        memberTalkItemQuery.orderByAsc(AiMemberTalkItem::getCreatedTime);
+        List<AiMemberTalkItem> aiMemberTalkItems = aiMemberTalkItemService.getListByQuery(memberTalkItemQuery);
+        if (CollUtil.isEmpty(aiMemberTalkItems)){
+            return message;
+        }
+
+        List<LlmStrategyDto> messages = new ArrayList<>();
+        for (AiMemberTalkItem aiMemberTalkItem : aiMemberTalkItems){
+            LlmStrategyDto llmStrategyDto = new LlmStrategyDto();
+            if (aiMemberTalkItem.getType() == 1){
+                llmStrategyDto.setRole(Role.ASSISTANT.getValue());
+            }
+            if (aiMemberTalkItem.getType() == 2){
+                llmStrategyDto.setRole(Role.USER.getValue());
+            }
+            if (aiMemberTalkItem.getType() == 3){
+                llmStrategyDto.setRole(Role.ASSISTANT.getValue());
+            }
+            llmStrategyDto.setContent(aiMemberTalkItem.getContext());
+            messages.add(llmStrategyDto);
+        }
+
+        message.setRole(AiTypeEnum.MESSAGES.getName());
+        message.setMessages(messages);
+
+        return message;
     }
 
     private String buildPrompt(String question,String answer,String promptHead, String promptTemplate,Integer type){
@@ -280,7 +339,7 @@
             throw new FebsException("对话不存在");
         }
 
-        this.updateMemberTalkUpdateTime(aiMemberTalk.getId(), new Date());
+        this.updateMemberTalkUpdateTime(aiMemberTalk.getState(),aiMemberTalk.getDoneCnt(),aiMemberTalk.getId(), new Date());
 
         String companyId = aiMemberTalk.getCompanyId();
         Integer type = dto.getType();
@@ -312,12 +371,48 @@
     }
 
     @Override
-    public void updateMemberTalkUpdateTime(String memberTalkId, Date updateTime) {
+    public void updateMemberTalkUpdateTime(Integer state,Integer doneCnt,String memberTalkId, Date updateTime) {
         aiMemberTalkMapper.update(null,
                 Wrappers.lambdaUpdate(AiMemberTalk.class)
-                .set(AiMemberTalk::getUpdatedTime,updateTime)
-                .eq(AiMemberTalk::getId,memberTalkId)
+                        .set(AiMemberTalk::getUpdatedTime,updateTime)
+                        .set(AiMemberTalk::getDoneCnt,doneCnt)
+                        .set(AiMemberTalk::getState,state)
+                        .eq(AiMemberTalk::getId,memberTalkId)
                 );
     }
 
+    @Override
+    public FebsResponse saveReport(ApiMemberTalkReportSavaDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+        String memberTalkId = dto.getMemberTalkId();
+        String content = dto.getContent();
+
+        AiMemberTalk aiMemberTalk = this.getById(memberTalkId);
+        if (ObjectUtil.isNull(aiMemberTalk)){
+            throw new FebsException("对话不存在");
+        }
+
+        this.updateMemberTalkUpdateTime(AiTypeEnum.AI_MEMBER_TALK_STATE_DONE.getCode(), aiMemberTalk.getDoneCnt(),aiMemberTalk.getId(), new Date());
+
+        Integer type = dto.getType();
+        String contentByCode = AiTalkOutputEnum.HIGH_LIGHT.getCodeByType(type);
+        String analysis = aiMemberTalk.getAnalysis();
+        HashMap<String, String> stringStringHashMap = new HashMap<>();
+        if(StrUtil.isEmpty(analysis)){
+            stringStringHashMap.put(contentByCode,content);
+        }else{
+            stringStringHashMap = JSONUtil.toBean(analysis, HashMap.class);
+            stringStringHashMap.put(contentByCode,content);
+        }
+
+        aiMemberTalkMapper.update(
+                null,
+                Wrappers.lambdaUpdate(AiMemberTalk.class)
+                        .set(AiMemberTalk::getAnalysis,JSONUtil.toJsonStr(stringStringHashMap))
+                        .eq(AiMemberTalk::getId,aiMemberTalk.getId())
+        );
+
+        return new FebsResponse().success();
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
index 7baeb7a..f59f046 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java
@@ -132,11 +132,24 @@
     }
 
     @Override
-    public FebsResponse categoryList(ApiProductCategoryPageDto dto) {
-        // 创建分页对象,传入当前页和每页大小
-        Page<ApiProductCategoryVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
-        Page<ApiProductCategoryVo> pageListByQuery = this.getPageListByQuery(page, dto);
-        return new FebsResponse().success().data(pageListByQuery);
+    public FebsResponse categoryChildList(ApiProductCategoryPageDto dto) {
+        List<ApiProductCategoryVo> vos = new ArrayList<>();
+
+        List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList(
+                Wrappers.lambdaQuery(AiProductCategory.class)
+                        .eq(AiProductCategory::getParentId, dto.getParentId())
+                        .eq(AiProductCategory::getState, 1)
+                .orderByAsc(AiProductCategory::getSort)
+        );
+        if (CollUtil.isNotEmpty(aiProductCategories)){
+            for (AiProductCategory aiProductCategory : aiProductCategories) {
+                ApiProductCategoryVo vo = new ApiProductCategoryVo();
+                vo.setId(aiProductCategory.getId());
+                vo.setName(aiProductCategory.getName());
+                vos.add(vo);
+            }
+        }
+        return new FebsResponse().success().data(vos);
     }
 
     @Override
diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
index 506ef9a..5e5d556 100644
--- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -9,7 +9,7 @@
 import cc.mrbird.febs.ai.res.ai.AiResponse;
 import cc.mrbird.febs.ai.res.ai.RadarDataItem;
 import cc.mrbird.febs.ai.res.ai.Report;
-import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkStreamVoOld;
 import cc.mrbird.febs.ai.service.AiProductRoleService;
 import cc.mrbird.febs.ai.service.AiService;
 import cc.mrbird.febs.ai.service.AiTalkItemService;
@@ -433,18 +433,18 @@
                     }
 
 
-                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
+                    ApiMemberTalkStreamVoOld apiMemberTalkStreamVoOld = new ApiMemberTalkStreamVoOld();
                     // 判断是否触发深度思考,触发则打印模型输出的思维链内容
                     ChatMessage message = choice.getMessage();
                     if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) {
-                        apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent());
+                        apiMemberTalkStreamVoOld.setReasoningContent(message.getReasoningContent());
 //                        System.out.print(message.getReasoningContent());
                     }
 
                     String content = message.getContent() == null ? "" : message.getContent().toString();
-                    apiMemberTalkStreamVo.setContent(content);
+                    apiMemberTalkStreamVoOld.setContent(content);
                     System.out.print(content);
-                    return new FebsResponse().success().data(apiMemberTalkStreamVo);
+                    return new FebsResponse().success().data(apiMemberTalkStreamVoOld);
                 })
                 .onErrorResume(throwable -> {
                     log.error("流式调用AI服务失败,问题输入: {}", question, throwable);
@@ -513,12 +513,12 @@
                     }
 
                     ChatMessage message = choice.getMessage();
-                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
+                    ApiMemberTalkStreamVoOld apiMemberTalkStreamVoOld = new ApiMemberTalkStreamVoOld();
 
                     // 处理 reasoning content
                     String reasoningContent = message.getReasoningContent();
                     if (StrUtil.isNotEmpty(reasoningContent)) {
-                        apiMemberTalkStreamVo.setReasoningContent(reasoningContent);
+                        apiMemberTalkStreamVoOld.setReasoningContent(reasoningContent);
                         log.debug("Reasoning Content: {}", reasoningContent);
                     }
 
@@ -527,11 +527,11 @@
                     if (message.getContent() != null) {
                         content = message.getContent().toString();
                     }
-                    apiMemberTalkStreamVo.setContent(content);
+                    apiMemberTalkStreamVoOld.setContent(content);
                     System.out.print(content);
                     log.debug("Content: {}", content);
 
-                    return new FebsResponse().success().data(apiMemberTalkStreamVo);
+                    return new FebsResponse().success().data(apiMemberTalkStreamVoOld);
                 })
                 .onErrorResume(throwable -> {
                     log.error("流式调用AI服务失败,问题输入: {}", question, throwable);
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
index bd1e116..7a158ef 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.ai.strategy.Impl;
 
+import cc.mrbird.febs.ai.enumerates.AiTypeEnum;
 import cc.mrbird.febs.ai.strategy.LlmStrategyService;
 import cc.mrbird.febs.ai.strategy.enumerates.LlmApplicationAppIdEnum;
 import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyContextEnum;
@@ -53,6 +54,23 @@
             }
         }
         return bizParamsMap;
+    }
+
+    private List<Message> getMessages(List<LlmStrategyDto> dto) {
+        List<Message> messages = new ArrayList<>();
+        for (LlmStrategyDto dtoItem : dto){
+            if (StrUtil.equals(AiTypeEnum.MESSAGES.getName(), dtoItem.getRole())){
+                List<LlmStrategyDto> messages1 = dtoItem.getMessages();
+                for (LlmStrategyDto dtoItem1 : messages1){
+                    messages.add(Message.builder()
+                            .role(dtoItem1.getRole())
+                            .content(dtoItem1.getContent())
+                            .build());
+                }
+                break;
+            }
+        }
+        return messages;
     }
 
     private String getQuery(List<LlmStrategyDto> dto) {
@@ -160,6 +178,7 @@
             throw new FebsException("百炼工作流初始化异常");
         }
         HashMap prompt = getPrompt(dto);
+        List<Message> messages = getMessages(dto);
         String query = getQuery(dto);
         String appId = getAppId(dto);
         if (prompt == null || prompt.size() == 0){
@@ -178,6 +197,7 @@
                 .appId(appId) //替换为实际的应用 ID
                 .flowStreamMode(FlowStreamMode.MESSAGE_FORMAT)
                 .prompt(query)
+                .messages( messages)
                 .bizParams(JsonUtils.toJsonObject( prompt))
                 .build();
 
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/param/LlmStrategyDto.java b/src/main/java/cc/mrbird/febs/ai/strategy/param/LlmStrategyDto.java
index dd47122..25e54b6 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/param/LlmStrategyDto.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/param/LlmStrategyDto.java
@@ -17,4 +17,6 @@
     
     private String content;
 
+    private List<LlmStrategyDto> messages;
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
index 54dd6af..c2fba92 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -121,7 +121,7 @@
     @ApiModelProperty(value = "是否是医生")
     private Integer doctorState;
 
-    @ApiModelProperty(value = "是否是核销员 0-否 1-是")
+    @ApiModelProperty(value = "是否能查看我的团队 0-否 1-是")
     private Integer checkOrder;
 
     @ApiModelProperty(value = "是否是自提核销员 0-否 1-是")

--
Gitblit v1.9.1