feat: 消息已读

feature/task1.0.0__0514__ch
向文可 2 years ago
parent 2029045e5f
commit 97f551719e

@ -36,11 +36,15 @@ const getters = {
}, },
parseContent: () => { parseContent: () => {
return (payload) => { return (payload) => {
payload = JSON.parse(payload); try {
if ('text' in payload) { payload = JSON.parse(payload);
payload = payload.text; if ('text' in payload) {
} else { payload = payload.text;
payload = '[未知消息]'; } else {
payload = '[未知消息]';
}
} catch (e) {
payload = '[解析异常]';
} }
return payload; return payload;
}; };
@ -102,7 +106,7 @@ const actions = {
traceType: 26, traceType: 26,
content: { storeId: 1 }, content: { storeId: 1 },
}); });
console.info('[chat] heart'); // console.info('[chat] heart');
state.task.forEach((item) => { state.task.forEach((item) => {
dispatch('send', item); dispatch('send', item);
}); });
@ -151,24 +155,23 @@ const actions = {
handle: ({ state, commit, dispatch }, { code, traceType, content, session }) => { handle: ({ state, commit, dispatch }, { code, traceType, content, session }) => {
if (code === 200) { if (code === 200) {
switch (traceType) { switch (traceType) {
// 收到消息 case 25: // 收到消息
case 25:
if (session.id === state.currentSession) { if (session.id === state.currentSession) {
commit('setMessageList', [...state.messageList, content.content]); commit('setMessageList', [...state.messageList, content.content]);
} else { } else {
dispatch('querySession'); dispatch('querySession');
} }
break; break;
// 会话列表 case 32: // 发送消息
case 27: commit('setMessageList', [...state.messageList, content]);
break;
case 27: // 会话列表
commit('setSessionData', content); commit('setSessionData', content);
break; break;
// 消息列表 case 28: // 消息列表
case 28:
commit('setMessageList', content); commit('setMessageList', content);
break; break;
// 客服列表 case 29: // 客服列表
case 29:
commit('setCustomerServiceList', content); commit('setCustomerServiceList', content);
break; break;
default: default:
@ -212,6 +215,24 @@ const actions = {
content: { storeId: 1, ...data }, content: { storeId: 1, ...data },
}); });
}, },
/**
* 提交已读消息
*/
submitRead: ({ state, dispatch }) => {
dispatch('invoke', {
traceType: 31,
content: { sessionId: state.currentSession },
});
},
/**
* 提交发送消息
*/
submitMessage: ({ state, dispatch }, payload) => {
dispatch('invoke', {
traceType: 32,
content: { payload, toSessionId: state.currentSession, type: 1 },
});
},
}; };
export default { export default {
state, state,

@ -120,6 +120,7 @@
:config="transferConfig" :config="transferConfig"
:data="customerServiceList" :data="customerServiceList"
:operation="[]" :operation="[]"
style="height: 500px"
/> />
</el-dialog> </el-dialog>
</div> </div>
@ -127,7 +128,8 @@
<script setup lang="jsx"> <script setup lang="jsx">
import { emojiData, entitiestoUtf16 } from '@/utils/chat.js'; import { emojiData, entitiestoUtf16 } from '@/utils/chat.js';
import { ElButton } from 'element-plus/es'; import { ElButton } from 'element-plus/es/components/button/index';
import 'element-plus/es/components/button/style/css';
import MessageItem from './message.vue'; import MessageItem from './message.vue';
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const store = useStore(); const store = useStore();
@ -152,10 +154,30 @@
return store.state.chat.sessionData?.sessionVOS || []; return store.state.chat.sessionData?.sessionVOS || [];
}); });
const currentSession = computed(() => sessionList.value.find((item) => item.id === currentSessionId.value)); const currentSession = computed(() => sessionList.value.find((item) => item.id === currentSessionId.value));
const sessionMessageList = computed(() => store.state.chat.messageList);
const handleChangeSession = (id) => { const handleChangeSession = (id) => {
store.commit('chat/setCurrentSession', id); store.commit('chat/setCurrentSession', id);
store.dispatch('chat/querySessionMessage'); store.dispatch('chat/querySessionMessage');
handleReadMessage();
};
//
const sessionMessageList = computed(() => store.state.chat.messageList);
const refsMessageList = ref(null);
watch(sessionMessageList, () => {
setTimeout(() => {
refsMessageList.value.setScrollTop(refsMessageList.value.scrollbar$.scrollHeight);
}, 1000);
});
const handleSendMessage = (data) => {
if (!data) {
store.dispatch('chat/submitMessage', { text: state.message });
state.message = '';
} else {
proxy.$message.warning('发送消息不能为空');
}
};
const handleReadMessage = () => {
store.dispatch('chat/submitRead');
}; };
// //
@ -170,7 +192,7 @@
}, },
{ {
label: '客户昵称', label: '客户昵称',
prop: 'waiterNickname', prop: 'nickname',
minWidth: 160, minWidth: 160,
}, },
{ {
@ -183,7 +205,6 @@
}, },
{ {
label: '操作', label: '操作',
prop: 'waiterNickname',
width: 100, width: 100,
slots: { slots: {
default: ({ row }) => ( default: ({ row }) => (
@ -206,7 +227,11 @@
confirmButtonText: '确定', confirmButtonText: '确定',
}); });
if (res.action === 'confirm') { if (res.action === 'confirm') {
store.dispatch('chat/submitTransferSession', { waiterId: row.waiterId, reason: res.value }); store.dispatch('chat/submitTransferSession', {
toWaiterId: row.waiterId,
sessionId: unref(currentSessionId),
reason: res.value,
});
transferVisible.value = false; transferVisible.value = false;
} }
} catch (e) { } catch (e) {
@ -259,23 +284,6 @@
handleSendMessage(message); handleSendMessage(message);
}; };
}; };
//
const refsMessageList = ref(null);
const handleSendMessage = (data) => {
if (!data) {
store.dispatch('chat/send', {
traceType: 20,
content: { payload: { 'text ': state.message }, storeId: 2, type: 1 },
});
state.message = '';
nextTick(() => {
refsMessageList.value.setScrollTop(refsMessageList.value.scrollbar$.scrollHeight);
});
} else {
proxy.$message.warning('发送消息不能为空');
}
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

@ -3,15 +3,15 @@
class="message-item" class="message-item"
:class="{ :class="{
[`--${messageType[props.message.type]}`]: true, [`--${messageType[props.message.type]}`]: true,
'--self': props.message.fromId === props.session.fromId, '--self': props.message.fromId !== props.session.fromId,
}" }"
> >
<div class="avatar"> <div class="avatar">
<el-avatar :src="props.session.fromAvatar" /> <el-avatar :src="props.message.fromAvatar" />
</div> </div>
<div class="message-body"> <div class="message-body">
<div class="name"> <div class="name">
{{ props.session.fromNickname }} {{ props.message.fromNickname }}
</div> </div>
<el-card v-if="props.message.type === 'product'" class="shadow"> <el-card v-if="props.message.type === 'product'" class="shadow">
<template #header> <template #header>
@ -63,7 +63,7 @@
{{ store.getters['chat/parseContent'](props.message.payload) }} {{ store.getters['chat/parseContent'](props.message.payload) }}
</div> </div>
</div> </div>
<div v-if="props.message.type !== 'notify'" class="time"> <div v-if="props.message.type !== 7" class="time">
{{ store.getters['chat/parseTime'](props.message.createTimeStamp) }} {{ store.getters['chat/parseTime'](props.message.createTimeStamp) }}
</div> </div>
</div> </div>

Loading…
Cancel
Save