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