Merge pull request #142 from keke-cxn/main

修复:请求地址'/system/role/authUser/selectAll',发生未知异常:cn.dev33.satoken.exce…
This commit is contained in:
ageerle
2025-08-02 15:56:16 +08:00
committed by GitHub
7 changed files with 87 additions and 12 deletions

View File

@@ -1,5 +1,6 @@
package org.ruoyi.chat.service.chat.impl;
import cn.hutool.core.util.StrUtil;
import io.github.imfangs.dify.client.DifyClient;
import io.github.imfangs.dify.client.DifyClientFactory;
import io.github.imfangs.dify.client.callback.ChatStreamCallback;
@@ -12,10 +13,15 @@ import io.github.imfangs.dify.client.model.chat.ChatMessage;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.chat.enums.ChatModeType;
import org.ruoyi.chat.service.chat.IChatCostService;
import org.ruoyi.chat.service.chat.IChatService;
import org.ruoyi.common.chat.entity.chat.Message;
import org.ruoyi.common.chat.request.ChatRequest;
import org.ruoyi.domain.bo.ChatSessionBo;
import org.ruoyi.domain.vo.ChatModelVo;
import org.ruoyi.domain.vo.ChatSessionVo;
import org.ruoyi.service.IChatModelService;
import org.ruoyi.service.IChatSessionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@@ -31,6 +37,10 @@ public class DifyServiceImpl implements IChatService {
@Autowired
private IChatModelService chatModelService;
@Autowired
private IChatSessionService chatSessionService;
@Autowired
private IChatCostService chatCostService;
@Override
public SseEmitter chat(ChatRequest chatRequest, SseEmitter emitter) {
@@ -53,6 +63,15 @@ public class DifyServiceImpl implements IChatService {
.responseMode(ResponseMode.STREAMING)
.build();
// 获取conversationId
ChatSessionVo sessionInfo = chatSessionService.queryById(chatRequest.getSessionId());
if (StrUtil.isNotBlank(sessionInfo.getConversationId())) {
message.setConversationId(sessionInfo.getConversationId());
}
// 获取模型返回的消息
StringBuffer respMessage = new StringBuffer();
// 发送流式消息
try {
chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
@@ -60,6 +79,7 @@ public class DifyServiceImpl implements IChatService {
@Override
public void onMessage(MessageEvent event) {
emitter.send(event.getAnswer());
respMessage.append(event.getAnswer());
log.info("收到消息片段: {}", event.getAnswer());
}
@@ -67,6 +87,29 @@ public class DifyServiceImpl implements IChatService {
public void onMessageEnd(MessageEndEvent event) {
emitter.complete();
log.info("消息结束完整消息ID: {}", event.getMessageId());
// 更新conversationId
if (StrUtil.isBlank(sessionInfo.getConversationId())) {
String conversationId = event.getConversationId();
sessionInfo.setConversationId(conversationId);
// 更新conversationId
ChatSessionBo chatSessionBo = new ChatSessionBo();
chatSessionBo.setConversationId(sessionInfo.getConversationId());
chatSessionBo.setId(sessionInfo.getId());
chatSessionBo.setUserId(sessionInfo.getUserId());
chatSessionBo.setSessionTitle(sessionInfo.getSessionTitle());
chatSessionBo.setSessionContent(sessionInfo.getSessionContent());
chatSessionBo.setRemark(sessionInfo.getRemark());
chatSessionService.updateByBo(chatSessionBo);
}
// 扣除费用
ChatRequest chatRequestResponse = new ChatRequest();
// 设置对话角色
chatRequestResponse.setRole(Message.Role.ASSISTANT.getName());
chatRequestResponse.setModel(chatRequest.getModel());
chatRequestResponse.setUserId(chatRequest.getUserId());
chatRequestResponse.setSessionId(chatRequest.getSessionId());
chatRequestResponse.setPrompt(respMessage.toString());
chatCostService.deductToken(chatRequestResponse);
}
@Override