|
|
@@ -12,7 +12,7 @@
|
|
|
class="conversation-chat-list"
|
|
|
:height="list_height"
|
|
|
:agent_id="agent_id"
|
|
|
- :list="chat_log_list"
|
|
|
+ :list="chat_display_list"
|
|
|
:suggestion="chat_suggestion"
|
|
|
:show_welcome="show_welcome"
|
|
|
@share="handleChatShare"
|
|
|
@@ -50,9 +50,15 @@ import DialogAsideRight from '../../modules/conversation-chat/DialogAsideRight.v
|
|
|
|
|
|
import useEleSize from '../../utils/use-ele-size';
|
|
|
|
|
|
-import useWebSocketChat from '../../modules/conversation-chat/use-websocket-chat';
|
|
|
-import { getHistoryLogs } from '../../modules/conversation-dialog/api-dialog';
|
|
|
-import { jsonParse, jsonStringify } from '../../utils/utils';
|
|
|
+import useWebSocketChat from '../../modules/conversation-dialog/use-websocket-chat';
|
|
|
+import { getHistoryLogs, getDialogChatId } from '../../modules/conversation-dialog/api-dialog';
|
|
|
+
|
|
|
+import formatDialogHistoryMessages from '../../modules/conversation-dialog/format-dialog-history-messages';
|
|
|
+
|
|
|
+import formatDialogSendOptions from '../../modules/conversation-dialog/format-dialog-send-options';
|
|
|
+
|
|
|
+import formatDialogTempLoadingMessage from '../../modules/conversation-dialog/format-dialog-temp-loading-message';
|
|
|
+import formatDialogReceiveMessage from '../../modules/conversation-dialog/format-dialog-receive-message';
|
|
|
|
|
|
/**
|
|
|
* 1. 历史会话进入此页面,展示历史会话内容
|
|
|
@@ -94,8 +100,28 @@ const list_height = computed(() => {
|
|
|
/**
|
|
|
* 对话数据列表
|
|
|
*/
|
|
|
-const chat_log_list = ref([]);
|
|
|
-const chat_suggestion = ref({});
|
|
|
+const chat_log_list = ref([]); // 历史对话的数据列表
|
|
|
+const chat_new_list = ref([]); // 新对话的数据列表
|
|
|
+const chat_suggestion = ref({}); // 对话推荐项目
|
|
|
+/**
|
|
|
+ * 此轮对话的状态
|
|
|
+ * 0 未开始
|
|
|
+ * 1 进行中
|
|
|
+ * 2 已结束
|
|
|
+ * 3 错误
|
|
|
+ */
|
|
|
+const chat_new_status = ref(0);
|
|
|
+
|
|
|
+/**
|
|
|
+ * 界面展示的对话列表
|
|
|
+ * 当用户从历史会话进入时,历史会话记录有数据,当用户基于历史会话进行对话时,新会话也有数据,
|
|
|
+ * 当用户从agent进入时,仅有新会话,没有历史会话
|
|
|
+ *
|
|
|
+ * 页面渲染的会话列表是 历史会话 + 新会话数据
|
|
|
+ */
|
|
|
+const chat_display_list = computed(() => {
|
|
|
+ return [].concat(chat_log_list.value, chat_new_list.value);
|
|
|
+});
|
|
|
|
|
|
/**
|
|
|
* 是否显示欢迎页
|
|
|
@@ -103,7 +129,7 @@ const chat_suggestion = ref({});
|
|
|
* 对话区域会显示欢迎内容
|
|
|
* 当用户开始对话时,欢迎内容消失,对话列表开始展示
|
|
|
*/
|
|
|
-const show_welcome = ref(false);
|
|
|
+const show_welcome = ref(true);
|
|
|
|
|
|
/**
|
|
|
* 分享
|
|
|
@@ -133,40 +159,66 @@ const input_disabled = ref(false);
|
|
|
* 输入文本发生了变化
|
|
|
* @param value
|
|
|
*/
|
|
|
-const handleTextChange = (value) => {};
|
|
|
+const handleTextChange = (value) => {
|
|
|
+ input_text.value = value;
|
|
|
+};
|
|
|
/**
|
|
|
* 输入的文件发生了变化
|
|
|
* @param files
|
|
|
*/
|
|
|
-const handleFileChange = (files) => {};
|
|
|
+const handleFileChange = (files) => {
|
|
|
+ input_files.value = files;
|
|
|
+};
|
|
|
/**
|
|
|
* 输入已经确认要提交了
|
|
|
- * 1. 文件上传
|
|
|
- * 2. 创建会话
|
|
|
- * get-chat-id
|
|
|
- * 连接socket
|
|
|
- * 3. socket 发送文本与文件数据内容
|
|
|
+ *
|
|
|
+ * 1. 创建会话 get-chat-id
|
|
|
+ * 2. 文件上传
|
|
|
+ * 3. 连接socket,socket 发送文本与文件数据内容
|
|
|
* 4. 接收 socket 返回的数据项
|
|
|
*/
|
|
|
-const handleInputSubmit = () => {
|
|
|
+const handleInputSubmit = async () => {
|
|
|
/**
|
|
|
* 创建会话 get chat id
|
|
|
*/
|
|
|
|
|
|
+ let chat_id = null;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const chatResult = await getDialogChatId(props.agent_id);
|
|
|
+
|
|
|
+ if (chatResult.code / 1 === 200) {
|
|
|
+ // 成功
|
|
|
+ const res_data = chatResult.data;
|
|
|
+
|
|
|
+ chat_id = res_data.chat_id;
|
|
|
+ } else {
|
|
|
+ // 失败
|
|
|
+ // TODO: 处理错误
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ console.log(err);
|
|
|
+ // TODO: 处理错误
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 上传文件,获取文件参数
|
|
|
+ * 如果存在文件数据,则进行文件上传
|
|
|
*/
|
|
|
+ if (input_files.value.length !== 0) {
|
|
|
+ // 进行文件上传,获取文件信息
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
+ * 上传文件,获取文件参数
|
|
|
* 组装socket参数
|
|
|
- * 发送websocket消息
|
|
|
*/
|
|
|
+ const msg = formatDialogSendOptions(input_text.value, input_files.value);
|
|
|
|
|
|
- const msg = jsonStringify({
|
|
|
- message: '消息内容'
|
|
|
- });
|
|
|
-
|
|
|
- handleWSSend(msg);
|
|
|
+ // 发送websocket消息
|
|
|
+ handleWSSend(chat_id, msg);
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -202,9 +254,19 @@ const { initWSConnection, sendWSMessage, getWSInstance, closeWSConnect } = useWe
|
|
|
* @param value
|
|
|
*/
|
|
|
function handleWSSend(chat_id, value) {
|
|
|
+ // 已发送,但是未响应,表示已经存在了新对话
|
|
|
+ // 只是新对话还未返回响应内容
|
|
|
+ // 客户端依据此数据展示加载中的动画
|
|
|
+ const loadingMsg = formatDialogTempLoadingMessage();
|
|
|
+ chat_new_list.value.push(loadingMsg);
|
|
|
+
|
|
|
// 初始化websocket连接
|
|
|
initWSConnection(props.agent_id, chat_id, props.chat_type);
|
|
|
- sendWSMessage(value);
|
|
|
+ sendWSMessage(value); // 发送socket连接
|
|
|
+
|
|
|
+ // 清空文本数据和文件数据
|
|
|
+ input_text.value = '';
|
|
|
+ input_files.value = [];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -213,17 +275,43 @@ function handleWSSend(chat_id, value) {
|
|
|
*/
|
|
|
function handleWSMessage(e) {
|
|
|
const res_data = e.data;
|
|
|
- const res_content = jsonParse(res_data);
|
|
|
+
|
|
|
+ // 获取当前对话中最后一个对话数据
|
|
|
+ // 最后一个对话数据为当前正在进行的对话
|
|
|
+ const last_msg = chat_new_list.value[chat_new_list.value.length - 1];
|
|
|
|
|
|
/**
|
|
|
- * 类别:
|
|
|
- * close
|
|
|
- * error
|
|
|
- * message
|
|
|
- * stream
|
|
|
+ * 整理返回的数据
|
|
|
*/
|
|
|
- const res_type = res_content.type;
|
|
|
- const res_message = res_content.message; // 消息内容
|
|
|
+ const currentChat = formatDialogReceiveMessage(res_data, last_msg);
|
|
|
+ const chat_status = currentChat.status;
|
|
|
+ const chat_message = currentChat.message;
|
|
|
+ const chat_data = currentChat.data;
|
|
|
+
|
|
|
+ if (chat_status === 0) {
|
|
|
+ // 未开始: 此状态不存在,无需处理
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chat_status === 1) {
|
|
|
+ // 次轮对话仍然在进行中
|
|
|
+
|
|
|
+ // 原来的最后一项弹出
|
|
|
+ chat_new_list.value.pop();
|
|
|
+ // 添加新的最后一项
|
|
|
+ chat_new_list.value.push(chat_data);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chat_status === 2) {
|
|
|
+ // 此轮对话已结束:列表数据无需变化
|
|
|
+ // 原来的最后一项弹出
|
|
|
+ chat_new_list.value.pop();
|
|
|
+ // 添加新的最后一项
|
|
|
+ chat_new_list.value.push(chat_data);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chat_status === 3) {
|
|
|
+ // 对话出错了
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -249,8 +337,14 @@ onMounted(() => {
|
|
|
if (res.code / 1 === 200) {
|
|
|
// 成功
|
|
|
const session_list = res.data;
|
|
|
+
|
|
|
+ // 将列表数据进行转化
|
|
|
+ const list = formatDialogHistoryMessages(session_list);
|
|
|
+
|
|
|
+ chat_log_list.value = list;
|
|
|
} else {
|
|
|
// 异常
|
|
|
+ // TODO:处理异常
|
|
|
}
|
|
|
})
|
|
|
.catch((err) => {
|