更新
This commit is contained in:
2026-02-23 18:52:32 +08:00
parent d429560511
commit 123fa6a7aa
81 changed files with 5952 additions and 407 deletions
+113 -110
View File
@@ -4,115 +4,118 @@ import { messageService } from "@/services/message";
import { useConversationStore } from "./conversation";
export const useChatStore = defineStore('chat', {
state: () => ({
activeConversationId: null,
activeSessionId: null,
maxSequenceId: null,
isEnded: false,
messages: [],
pageSize: 20
}),
actions: {
// 抽取统一的排序去重方法
async pushAndSortMessagesAsync(newMsgs, sessionId, shouldSaveToDb = true) {
if (shouldSaveToDb) {
for (const m of newMsgs) {
await messagesDb.save({ ...m, sessionId });
}
}
if (sessionId == this.activeSessionId) {
const combined = [...this.messages, ...newMsgs];
// 1. 根据 msgId 或唯一 key 去重
const uniqueMap = new Map();
combined.forEach(m => uniqueMap.set(m.msgId || m.sequenceId, m));
// 2. 转换为数组并按sequenceId升序排序 (旧的在前,新的在后)
this.messages = Array.from(uniqueMap.values()).sort((a, b) => {
return a.sequenceId - b.sequenceId;
});
this.maxSequenceId = this.messages.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
}
},
/**
* 切换会话加载当前会话消息列表
* @param {*} sessionId
*/
async swtichSession(sessionId, conversationId) {
this.activeSessionId = sessionId;
this.activeConversationId = conversationId;
this.messages = [];
this.isEnded = false;
//先从浏览器缓存加载一部分消息列表
const localHistory = await messagesDb.getLatestMessages(sessionId, this.pageSize);
console.log(localHistory)
if (localHistory.length > 0) {
this.messages = localHistory;
this.maxSequenceId = this.messages.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
}
},
/**
* 从服务器加载新消息
* @param {*} sessionId
* @returns
*/
async fetchNewMsgFromServier(conversationId, sequenceId) {
const newMsg = (await messageService.getMessages(conversationId, sequenceId, sequenceId ? 1 : 0, this.pageSize)).data;
if (newMsg.length > 0) {
return newMsg;
} else {
return [];
}
},
/**
* 从服务器加载历史消息
* @param {*} sessionId
* @param {*} msgId
* @returns
*/
async fetchHistoryFromServer(conversationId, sequenceId) {
const res = (await messageService.getMessages(conversationId, sequenceId, 0, this.pageSize)).data;
if (res.length > 0) {
const sessionId = this.activeSessionId;
return res;
} else {
return [];
}
},
/**
* 加载更多历史消息
*/
async loadMoreMessages() {
let minSequenceId = 0;
if (!this.messages || this.messages.length === 0) return;
minSequenceId = this.messages.reduce((min, m) =>
(m.sequenceId < min ? m.sequenceId : min),
this.messages[0].sequenceId // 使用第一项作为初始参考值
);
const dbCacheList = await messagesDb.getPageMessages(this.activeSessionId, minSequenceId, this.pageSize)
const dbMaxSequenceId = dbCacheList.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
if (dbCacheList.length < this.pageSize) {
const newList = await this.fetchHistoryFromServer(this.activeConversationId, minSequenceId)
if (newList.length === 0) this.isEnded = true;
await this.pushAndSortMessagesAsync(newList, this.activeSessionId, true);
} else if (dbMaxSequenceId < minSequenceId - 1) {
const newList = await this.fetchHistoryFromServer(this.activeConversationId, minSequenceId)
if (newList.length === 0) this.isEnded = true;
await this.pushAndSortMessagesAsync(newList, this.activeSessionId, true);
}
else {
await this.pushAndSortMessagesAsync(dbCacheList, this.activeSessionId, false);
}
state: () => ({
activeConversationId: null,
activeSessionId: null,
maxSequenceId: null,
isEnded: false,
messages: [],
pageSize: 20
}),
actions: {
// 抽取统一的排序去重方法
async pushAndSortMessagesAsync(newMsgs, sessionId, shouldSaveToDb = true) {
if (shouldSaveToDb) {
for (const m of newMsgs) {
if (m.type != 'Text' && !m.isLoading && !m.isError && !m.isImgLoading) {
m.content = JSON.parse(m.content);
}
await messagesDb.save({ ...m, sessionId });
}
}
if (sessionId == this.activeSessionId) {
const combined = [...this.messages, ...newMsgs];
// 1. 根据 msgId 或唯一 key 去重
const uniqueMap = new Map();
combined.forEach(m => uniqueMap.set(m.msgId || m.sequenceId, m));
// 2. 转换为数组并按sequenceId升序排序 (旧的在前,新的在后)
this.messages = Array.from(uniqueMap.values()).sort((a, b) => {
return a.sequenceId - b.sequenceId;
});
this.maxSequenceId = this.messages.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
}
},
/**
* 切换会话加载当前会话消息列表
* @param {*} sessionId
*/
async swtichSession(sessionId, conversationId) {
this.activeSessionId = sessionId;
this.activeConversationId = conversationId;
this.messages = [];
this.isEnded = false;
//先从浏览器缓存加载一部分消息列表
const localHistory = await messagesDb.getLatestMessages(sessionId, this.pageSize);
console.log(localHistory)
if (localHistory.length > 0) {
this.messages = localHistory;
this.maxSequenceId = this.messages.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
}
},
/**
* 从服务器加载新消息
* @param {*} sessionId
* @returns
*/
async fetchNewMsgFromServier(conversationId, sequenceId) {
const newMsg = (await messageService.getMessages(conversationId, sequenceId, sequenceId ? 1 : 0, this.pageSize)).data;
if (newMsg.length > 0) {
return newMsg;
} else {
return [];
}
},
/**
* 从服务器加载历史消息
* @param {*} sessionId
* @param {*} msgId
* @returns
*/
async fetchHistoryFromServer(conversationId, sequenceId) {
const res = (await messageService.getMessages(conversationId, sequenceId, 0, this.pageSize)).data;
if (res.length > 0) {
const sessionId = this.activeSessionId;
return res;
} else {
return [];
}
},
/**
* 加载更多历史消息
*/
async loadMoreMessages() {
let minSequenceId = 0;
if (!this.messages || this.messages.length === 0) return;
minSequenceId = this.messages.reduce((min, m) =>
(m.sequenceId < min ? m.sequenceId : min),
this.messages[0].sequenceId // 使用第一项作为初始参考值
);
const dbCacheList = await messagesDb.getPageMessages(this.activeSessionId, minSequenceId, this.pageSize)
const dbMaxSequenceId = dbCacheList.reduce((max, m) =>
m.sequenceId > max ? m.sequenceId : max,
null // 初始值
);
if (dbCacheList.length < this.pageSize) {
const newList = await this.fetchHistoryFromServer(this.activeConversationId, minSequenceId)
if (newList.length === 0) this.isEnded = true;
await this.pushAndSortMessagesAsync(newList, this.activeSessionId, true);
} else if (dbMaxSequenceId < minSequenceId - 1) {
const newList = await this.fetchHistoryFromServer(this.activeConversationId, minSequenceId)
if (newList.length === 0) this.isEnded = true;
await this.pushAndSortMessagesAsync(newList, this.activeSessionId, true);
}
else {
await this.pushAndSortMessagesAsync(dbCacheList, this.activeSessionId, false);
}
}
})
}
})