|
|
@ -77,7 +77,7 @@ |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 长按/右击菜单 --> |
|
|
<!-- 长按/右击菜单 --> |
|
|
<div |
|
|
<!-- <div |
|
|
v-if="menuVisible" |
|
|
v-if="menuVisible" |
|
|
class="menu-overlay" |
|
|
class="menu-overlay" |
|
|
@click="closeMenu" |
|
|
@click="closeMenu" |
|
|
@ -87,17 +87,17 @@ |
|
|
class="context-menu" |
|
|
class="context-menu" |
|
|
:style="{ top: menuPosition.y + 'px', left: menuPosition.x + 'px' }" |
|
|
:style="{ top: menuPosition.y + 'px', left: menuPosition.x + 'px' }" |
|
|
> |
|
|
> |
|
|
<!-- <div class="menu-item" @click.stop="onEdit"> |
|
|
<div class="menu-item" @click.stop="onEdit"> |
|
|
<van-icon name="edit" size="16" /> |
|
|
<van-icon name="edit" size="16" /> |
|
|
<span>编辑</span> |
|
|
<span>编辑</span> |
|
|
</div> --> |
|
|
</div> |
|
|
<div class="menu-divider"></div> |
|
|
<div class="menu-divider"></div> |
|
|
<div class="menu-item" @click.stop="onRecall"> |
|
|
<div class="menu-item" @click.stop="onRecall"> |
|
|
<van-icon name="revoke" size="16" /> |
|
|
<van-icon name="revoke" size="16" /> |
|
|
<span>撤回</span> |
|
|
<span>撤回</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> --> |
|
|
|
|
|
|
|
|
<!-- 底部输入区域 --> |
|
|
<!-- 底部输入区域 --> |
|
|
<div class="chat-input-area"> |
|
|
<div class="chat-input-area"> |
|
|
@ -125,10 +125,11 @@ |
|
|
import { ref, nextTick, onMounted } from 'vue'; |
|
|
import { ref, nextTick, onMounted } from 'vue'; |
|
|
import { showToast } from 'vant'; |
|
|
import { showToast } from 'vant'; |
|
|
import 'vant/es/toast/style'; |
|
|
import 'vant/es/toast/style'; |
|
|
import { getLawNoticeMessageList } from '@/api/enterprise/planNotice'; |
|
|
import { getLawNoticeMessageList, sendLawNoticeMessage, sendLawNoticeMessageViewed } from '@/api/enterprise/planNotice'; |
|
|
|
|
|
|
|
|
const router = useRouter(); |
|
|
const router = useRouter(); |
|
|
const route = useRoute(); |
|
|
const route = useRoute(); |
|
|
|
|
|
const { useCommon } = $globalStore; |
|
|
|
|
|
|
|
|
// ========== 从路由参数获取信息 ========== |
|
|
// ========== 从路由参数获取信息 ========== |
|
|
const noticeId = ref(route.query.id || ''); |
|
|
const noticeId = ref(route.query.id || ''); |
|
|
@ -154,14 +155,35 @@ const fetchMessageList = () => { |
|
|
(res) => { |
|
|
(res) => { |
|
|
if (res.code === 200) { |
|
|
if (res.code === 200) { |
|
|
const rows = res.rows || res.data?.rows || res.data?.list || res.data || []; |
|
|
const rows = res.rows || res.data?.rows || res.data?.list || res.data || []; |
|
|
messageList.value = rows.map(item => ({ |
|
|
const currentUserName = useCommon.enterpriseName || ''; |
|
|
id: item.id || item.messageId, |
|
|
messageList.value = rows.map(item => { |
|
|
sender: item.sender === 'self' || item.senderType === 1 || item.isSelf ? 'self' : 'other', |
|
|
const isSelf = item.userName == currentUserName; |
|
|
content: item.content || item.message || item.messageContent, |
|
|
return { |
|
|
time: item.time || item.createTime || item.sendMessageTime || '', |
|
|
id: item.id, |
|
|
avatar: item.sender === 'self' || item.senderType === 1 || item.isSelf ? selfAvatar : otherAvatar, |
|
|
sender: isSelf ? 'self' : 'other', |
|
|
isRecalled: item.isRecalled || item.recallStatus || false, |
|
|
content: item.message, |
|
|
})); |
|
|
time:item.createTime|| '', |
|
|
|
|
|
avatar: isSelf ? selfAvatar : otherAvatar, |
|
|
|
|
|
isRecalled: item.isRecalled || false, |
|
|
|
|
|
}; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 取最后一条数据的id,调用已读接口 |
|
|
|
|
|
if (rows.length > 0) { |
|
|
|
|
|
const lastMessageId = rows[rows.length - 1].id; |
|
|
|
|
|
sendLawNoticeMessageViewed( |
|
|
|
|
|
{ noticeId: lastMessageId }, |
|
|
|
|
|
(viewRes) => { |
|
|
|
|
|
if (viewRes.code !== 200) { |
|
|
|
|
|
console.warn('标记已读失败:', viewRes.msg); |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
() => { |
|
|
|
|
|
console.warn('标记已读网络请求失败'); |
|
|
|
|
|
} |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
nextTick(() => { |
|
|
nextTick(() => { |
|
|
scrollToBottom(); |
|
|
scrollToBottom(); |
|
|
}); |
|
|
}); |
|
|
@ -332,39 +354,38 @@ const sendMessage = () => { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const now = new Date(); |
|
|
// 调用接口发送消息 |
|
|
const timeStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`; |
|
|
const params = { |
|
|
|
|
|
noticeId: noticeId.value, |
|
|
messageList.value.push({ |
|
|
userId: String(useCommon.userId || ''), |
|
|
id: Date.now(), |
|
|
userName: useCommon.enterpriseName || '企业', |
|
|
sender: 'self', |
|
|
message: text, |
|
|
content: text, |
|
|
}; |
|
|
time: timeStr, |
|
|
sendLawNoticeMessage(params, (res) => { |
|
|
avatar: selfAvatar, |
|
|
if (res.code === 200) { |
|
|
isRecalled: false, |
|
|
const now = new Date(); |
|
|
}); |
|
|
const timeStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`; |
|
|
|
|
|
messageList.value.push({ |
|
|
inputMessage.value = ''; |
|
|
id: res.data?.id || Date.now(), |
|
|
|
|
|
sender: 'self', |
|
|
// 滚动到底部 |
|
|
content: text, |
|
|
nextTick(() => { |
|
|
time: timeStr, |
|
|
scrollToBottom(); |
|
|
avatar: selfAvatar, |
|
|
|
|
|
isRecalled: false, |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
inputMessage.value = ''; |
|
|
|
|
|
|
|
|
|
|
|
// 滚动到底部 |
|
|
|
|
|
nextTick(() => { |
|
|
|
|
|
scrollToBottom(); |
|
|
|
|
|
}); |
|
|
|
|
|
} else { |
|
|
|
|
|
showToast(res.msg || '发送失败'); |
|
|
|
|
|
} |
|
|
|
|
|
}, () => { |
|
|
|
|
|
showToast('网络请求失败'); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
// 模拟对方回复 |
|
|
|
|
|
// setTimeout(() => { |
|
|
|
|
|
// messageList.value.push({ |
|
|
|
|
|
// id: Date.now() + 1, |
|
|
|
|
|
// sender: 'other', |
|
|
|
|
|
// content: '收到,我们会尽快安排并与您确认具体时间。', |
|
|
|
|
|
// time: timeStr, |
|
|
|
|
|
// avatar: otherAvatar, |
|
|
|
|
|
// isRecalled: false, |
|
|
|
|
|
// }); |
|
|
|
|
|
// nextTick(() => { |
|
|
|
|
|
// scrollToBottom(); |
|
|
|
|
|
// }); |
|
|
|
|
|
// }, 1500); |
|
|
|
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
// ========== 滚动到底部 ========== |
|
|
// ========== 滚动到底部 ========== |
|
|
|