Skip to content

Commit 70abc5f

Browse files
author
puhui999
committed
【功能完善】商城客服: 消息获取改为游标查询
1 parent ce3380f commit 70abc5f

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

src/api/mall/promotion/kefu/message/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ export const KeFuMessageApi = {
2929
url: '/promotion/kefu-message/update-read-status?conversationId=' + conversationId
3030
})
3131
},
32-
// 获得消息分页数据
33-
getKeFuMessagePage: async (params: any) => {
34-
return await request.get({ url: '/promotion/kefu-message/page', params })
32+
// 获得消息数据
33+
getKeFuMessageList: async (params: any) => {
34+
return await request.get({ url: '/promotion/kefu-message/list', params })
3535
}
3636
}

src/store/modules/mall/kefu.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { store } from '@/store'
2+
import { defineStore } from 'pinia'
3+
import { KeFuConversationApi, KeFuConversationRespVO } from '@/api/mall/promotion/kefu/conversation'
4+
import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message'
5+
6+
// TODO puhui999: 待优化完善
7+
interface MallKefuInfoVO {
8+
conversationList: KeFuConversationRespVO[] // 会话列表
9+
conversationMessageList: Map<number, KeFuMessageRespVO[]> // 会话消息
10+
}
11+
12+
export const useMallKefuStore = defineStore('mall-kefu', {
13+
state: (): MallKefuInfoVO => ({
14+
conversationList: [],
15+
conversationMessageList: new Map<number, KeFuMessageRespVO[]>() // key 会话,value 会话消息列表
16+
}),
17+
getters: {
18+
getConversationList(): KeFuConversationRespVO[] {
19+
return this.conversationList
20+
},
21+
getConversationMessageList(): Map<number, KeFuMessageRespVO[]> {
22+
return this.conversationMessageList
23+
}
24+
},
25+
actions: {
26+
async setConversationList() {
27+
const list = await KeFuConversationApi.getConversationList()
28+
list.sort((a: KeFuConversationRespVO, _) => (a.adminPinned ? -1 : 1))
29+
this.conversationList = list
30+
}
31+
// async setConversationMessageList(conversationId: number) {}
32+
}
33+
})
34+
35+
export const useUserStoreWithOut = () => {
36+
return useMallKefuStore(store)
37+
}

src/views/mall/promotion/kefu/components/KeFuMessageList.vue

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,8 @@ const messageList = ref<KeFuMessageRespVO[]>([]) // 消息列表
164164
const conversation = ref<KeFuConversationRespVO>({} as KeFuConversationRespVO) // 用户会话
165165
const showNewMessageTip = ref(false) // 显示有新消息提示
166166
const queryParams = reactive({
167-
pageNo: 1,
168-
pageSize: 10,
169-
conversationId: 0
167+
conversationId: 0,
168+
createTime: undefined
170169
})
171170
const total = ref(0) // 消息总条数
172171
const refreshContent = ref(false) // 内容刷新,主要解决会话消息页面高度不一致导致的滚动功能精度失效
@@ -175,14 +174,20 @@ const refreshContent = ref(false) // 内容刷新,主要解决会话消息页面
175174
const getMessageContent = computed(() => (item: any) => jsonParse(item.content))
176175
/** 获得消息列表 */
177176
const getMessageList = async () => {
178-
const res = await KeFuMessageApi.getKeFuMessagePage(queryParams)
179-
total.value = res.total
177+
const res = await KeFuMessageApi.getKeFuMessageList(queryParams)
178+
if (isEmpty(res)) {
179+
// 当返回的是空列表说明没有消息或者已经查询完了历史消息
180+
skipGetMessageList.value = true
181+
return
182+
}
183+
queryParams.createTime = formatDate(res.at(-1).createTime) as any
184+
180185
// 情况一:加载最新消息
181-
if (queryParams.pageNo === 1) {
182-
messageList.value = res.list
186+
if (!queryParams.createTime) {
187+
messageList.value = res
183188
} else {
184189
// 情况二:加载历史消息
185-
for (const item of res.list) {
190+
for (const item of res) {
186191
pushMessage(item)
187192
}
188193
}
@@ -216,8 +221,7 @@ const refreshMessageList = async (message?: any) => {
216221
}
217222
pushMessage(message)
218223
} else {
219-
// TODO @puhui999:不基于 page 做。而是流式分页;通过 createTime 排序查询;
220-
queryParams.pageNo = 1
224+
queryParams.createTime = undefined
221225
await getMessageList()
222226
}
223227
@@ -234,24 +238,21 @@ const refreshMessageList = async (message?: any) => {
234238
// TODO @puhui999:可优化:可以考虑本地做每个会话的消息 list 缓存;然后点击切换时,读取缓存;然后异步获取新消息,merge 下;
235239
const getNewMessageList = async (val: KeFuConversationRespVO) => {
236240
// 会话切换,重置相关参数
237-
queryParams.pageNo = 1
238241
messageList.value = []
239242
total.value = 0
240243
loadHistory.value = false
241244
refreshContent.value = false
242245
// 设置会话相关属性
243246
conversation.value = val
244247
queryParams.conversationId = val.id
248+
queryParams.createTime = undefined
245249
// 获取消息
246250
await refreshMessageList()
247251
}
248252
defineExpose({ getNewMessageList, refreshMessageList })
249253
250254
const showKeFuMessageList = computed(() => !isEmpty(conversation.value)) // 是否显示聊天区域
251-
const skipGetMessageList = computed(() => {
252-
// 已加载到最后一页的话则不触发新的消息获取
253-
return total.value > 0 && Math.ceil(total.value / queryParams.pageSize) === queryParams.pageNo
254-
}) // 跳过消息获取
255+
const skipGetMessageList = ref(false) // 跳过消息获取
255256
256257
/** 处理表情选择 */
257258
const handleEmojiSelect = (item: Emoji) => {
@@ -345,8 +346,6 @@ const handleOldMessage = async () => {
345346
return
346347
}
347348
loadHistory.value = true
348-
// 加载消息列表
349-
queryParams.pageNo += 1
350349
await getMessageList()
351350
// 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
352351
scrollbarRef.value!.setScrollTop(innerRef.value!.clientHeight - oldPageHeight)

0 commit comments

Comments
 (0)