From 898cfb426c97a272a5dbfc912ee00dec5a52f265 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Mon, 20 Oct 2025 16:07:28 +0800
Subject: [PATCH] feat(ai): 添加会员角色申请创建时间字段
---
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberTalkStreamServiceImpl.java | 154 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 128 insertions(+), 26 deletions(-)
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 001f00a..779cc73 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
@@ -5,12 +5,18 @@
import cc.mrbird.febs.ai.enumerates.AiTypeEnum;
import cc.mrbird.febs.ai.mapper.AiMemberTalkMapper;
import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkItemPageDto;
+import cc.mrbird.febs.ai.req.memberTalk.ApiTalkMemberListDto;
+import cc.mrbird.febs.ai.req.memberTalk.ApiTalkReportListDto;
import cc.mrbird.febs.ai.req.memberTalkStream.*;
+import cc.mrbird.febs.ai.req.memberTalk.ApiMemberTalkListDto;
import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkMemberAnswerSavaVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiTalkReportListVo;
import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkReloadStreamVo;
import cc.mrbird.febs.ai.res.memberTalkStream.ApiMemberTalkStreamVo;
+import cc.mrbird.febs.ai.res.memberTalk.ApiMemberTalkListVo;
import cc.mrbird.febs.ai.service.*;
import cc.mrbird.febs.ai.strategy.LlmStrategyFactory;
+import cc.mrbird.febs.ai.strategy.enumerates.LlmApplicationAppIdEnum;
import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
import cc.mrbird.febs.common.entity.FebsResponse;
@@ -30,10 +36,7 @@
import org.springframework.transaction.annotation.Transactional;
import reactor.core.publisher.Flux;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
/**
* AI用户对话训练记录 Service实现类
@@ -55,6 +58,7 @@
private final AiProductQuestionService aiProductQuestionService;
private final LlmStrategyFactory llmStrategyFactory;
private final AiService aiService;
+ private final AiCompanyWorkflowService aiCompanyWorkflowService;
@Override
@@ -81,6 +85,7 @@
query.eq(AiMemberTalk::getMemberId,memberUuid);
query.eq(AiMemberTalk::getProductId,productId);
query.eq(AiMemberTalk::getState,AiTypeEnum.AI_MEMBER_TALK_STATE_ING.getCode());
+ query.orderByDesc(AiMemberTalk::getCreatedTime);
query.last("limit 1");
AiMemberTalk aiMemberTalk = aiMemberTalkService.getByQuery(query);
if (ObjectUtil.isNull(aiMemberTalk)){
@@ -103,6 +108,60 @@
apiMemberTalkVo.setDoneCnt(aiMemberTalk.getDoneCnt() + 1);
return new FebsResponse().success().data(apiMemberTalkVo);
}
+
+ @Override
+ public FebsResponse talkList(ApiMemberTalkListDto dto) {
+
+ return new FebsResponse().success().data(aiMemberTalkService.getPageByDto(dto));
+ }
+
+ @Override
+ public FebsResponse talkMemberList(ApiTalkMemberListDto dto) {
+
+ return new FebsResponse().success().data(aiMemberTalkItemService.getPageByDto(dto));
+ }
+
+ @Override
+ public Flux<FebsResponse> talkReportList(ApiTalkReportListDto dto) {
+ String memberTalkId = dto.getMemberTalkId();
+ AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId);
+ String analysis = byId.getAnalysis();
+
+ if (StrUtil.isEmpty(analysis)) {
+ return Flux.just(new FebsResponse().success().data(""));
+ }
+
+ // 将分析报告分块,每块100个字符
+ return Flux.generate(
+ () -> 0, // 初始状态
+ (index, sink) -> {
+ int endIndex = Math.min(index + 100, analysis.length());
+ String chunk = analysis.substring(index, endIndex);
+
+ Map<String, Object> responseData = new HashMap<>();
+ responseData.put("chunk", chunk);
+ responseData.put("isLast", endIndex >= analysis.length());
+ responseData.put("progress", Math.min(100, (endIndex * 100) / analysis.length()));
+
+ sink.next(new FebsResponse().success().data(responseData));
+
+ if (endIndex >= analysis.length()) {
+ sink.complete();
+ return index; // 结束状态
+ }
+
+ return endIndex; // 下一次的起始索引
+ }
+ );
+ }
+
+ @Override
+ public FebsResponse talkReportListV2(ApiTalkReportListDto dto) {
+ String memberTalkId = dto.getMemberTalkId();
+ AiMemberTalk byId = aiMemberTalkService.getById(memberTalkId);
+ return new FebsResponse().success().data(byId.getAnalysis());
+ }
+
@Override
public FebsResponse reload(ApiMemberTalkReloadStreamDto dto) {
@@ -254,24 +313,24 @@
llmStrategyDtoList.add(llmStrategyDto);
llmStrategyDto = this.buildLlmStrategyDtoList(answer, 2);
llmStrategyDtoList.add(llmStrategyDto);
- llmStrategyDto = this.buildLlmStrategyDtoList(String.valueOf(type), 4);
+
+ AiCompanyWorkflow aiCompanyWorkflow = aiCompanyWorkflowService.getByTypeAndCompanyId(type,aiMemberTalk.getCompanyId());
+ if (ObjectUtil.isNull(aiCompanyWorkflow)){
+ throw new FebsException("工作流配置异常,请联系管理员");
+ }
+ llmStrategyDto = this.buildLlmStrategyDtoList(aiCompanyWorkflow.getCode(), 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) {
+ private LlmStrategyDto buildMessages(String memberTalkId) {
LlmStrategyDto message = new LlmStrategyDto();
- if (1!= state){
- return message;
- }
LambdaQueryWrapper<AiMemberTalkItem> memberTalkItemQuery = Wrappers.lambdaQuery(AiMemberTalkItem.class);
memberTalkItemQuery.eq(AiMemberTalkItem::getMemberTalkId,memberTalkId);
+ memberTalkItemQuery.in(AiMemberTalkItem::getType,Arrays.asList(1, 2));
memberTalkItemQuery.orderByAsc(AiMemberTalkItem::getCreatedTime);
List<AiMemberTalkItem> aiMemberTalkItems = aiMemberTalkItemService.getListByQuery(memberTalkItemQuery);
if (CollUtil.isEmpty(aiMemberTalkItems)){
@@ -287,14 +346,12 @@
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.setContent(AiTypeEnum.MESSAGES.getName());
message.setMessages(messages);
return message;
@@ -397,25 +454,70 @@
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);
- }
+// 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))
+ .set(AiMemberTalk::getAnalysis,content)
.eq(AiMemberTalk::getId,aiMemberTalk.getId())
);
return new FebsResponse().success();
}
+ @Override
+ public Flux<FebsResponse> answerV3(AiTalkAnswerStreamDto dto) {
+ String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+ String memberTalkId = dto.getId();
+ AiMemberTalk aiMemberTalk = this.getById(memberTalkId);
+ if (ObjectUtil.isNull(aiMemberTalk)){
+ throw new FebsException("对话不存在");
+ }
+
+ LambdaQueryWrapper<AiProductRoleLink> productLinkQuery = Wrappers.lambdaQuery(AiProductRoleLink.class);
+ productLinkQuery.eq(AiProductRoleLink::getProductId,aiMemberTalk.getProductId());
+ productLinkQuery.last("limit 1");
+ AiProductRoleLink aiProductRoleLink = aiProductRoleLinkService.getByQuery(productLinkQuery);
+ if(ObjectUtil.isNull(aiProductRoleLink)){
+ throw new FebsException("产品没有关联AI陪练");
+ }
+
+ String productRoleId = aiProductRoleLink.getProductRoleId();
+ AiProductRole aiProductRole = aiProductRoleService.getById(productRoleId);
+ if (ObjectUtil.isNull(aiProductRole)){
+ throw new FebsException("产品AI陪练不存在");
+ }
+
+ String promptHead = aiProductRole.getPromptHead();
+
+ List<LlmStrategyDto> llmStrategyDtoList = new ArrayList<>();
+ LlmStrategyDto llmStrategyDto = this.buildLlmStrategyDtoList(promptHead, 1);
+ llmStrategyDtoList.add(llmStrategyDto);
+ llmStrategyDto = this.buildLlmStrategyDtoList("请按照要求生成报告", 2);
+ llmStrategyDtoList.add(llmStrategyDto);
+
+ AiCompanyWorkflow aiCompanyWorkflow = aiCompanyWorkflowService.getByTypeAndCompanyId(LlmApplicationAppIdEnum.REPORT.getCode(),aiMemberTalk.getCompanyId());
+ if (ObjectUtil.isNull(aiCompanyWorkflow)){
+ throw new FebsException("工作流配置异常,请联系管理员");
+ }
+ llmStrategyDto = this.buildLlmStrategyDtoList(aiCompanyWorkflow.getCode(), 4);
+ llmStrategyDtoList.add(llmStrategyDto);
+
+ LlmStrategyDto llmStrategyDtoMessage = buildMessages(memberTalkId);
+ llmStrategyDtoList.add(llmStrategyDtoMessage);
+ String modelName = LlmStrategyEnum.getName(aiService.getSystemSetAiType());
+
+ return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(llmStrategyDtoList);
+ }
+
}
--
Gitblit v1.9.1