定时拉取聊天记录

This commit is contained in:
2026-05-07 17:36:00 +08:00
parent b6e6394e51
commit 36847ea70c
5 changed files with 114 additions and 11 deletions
+5
View File
@@ -261,6 +261,11 @@ export function getImChatMessages(params: { diagnosis_id: number; only_archived?
return request.get({ url: '/tcm.diagnosis/getImChatMessages', params })
}
/** 触发后台异步同步:从腾讯云 IM 拉取诊单聊天记录入归档表,请求即返回 */
export function triggerImChatSync(data: { diagnosis_id: number }) {
return request.post({ url: '/tcm.diagnosis/triggerImChatSync', data })
}
// 获取企业微信聊天记录
export function getWechatChatRecords(params: any) {
return request.get({ url: '/tcm.diagnosis/getWechatChatRecords', params })
@@ -4,14 +4,18 @@
<p class="panel-tip">
展示单聊记录已合并患者
<strong>所有医生 / 医助账号</strong>分别产生的会话按时间排序
数据来自 IM 漫游若未开通漫游或某账号与该患者无会话对应侧无消息
数据由后台定时任务从腾讯云 IM 漫游消息同步至本地归档点击下方按钮可立即触发后台同步
</p>
</el-alert>
<div class="toolbar mb-3">
<el-button type="primary" link :loading="loading" @click="refreshLive">
<el-button type="primary" link :loading="syncing" @click="triggerSync">
<el-icon class="mr-1"><Promotion /></el-icon>
同步最新后台异步
</el-button>
<el-button type="primary" link :loading="loading" @click="reloadArchived">
<el-icon class="mr-1"><Refresh /></el-icon>
刷新同步云端最新
重新加载已归档
</el-button>
</div>
@@ -68,8 +72,9 @@
<script setup lang="ts">
import { ref, shallowRef, watch, computed } from 'vue'
import dayjs from 'dayjs'
import { Refresh } from '@element-plus/icons-vue'
import { getImChatMessages } from '@/api/tcm'
import { Refresh, Promotion } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import { getImChatMessages, triggerImChatSync } from '@/api/tcm'
import type { FriendlyParse } from '@/utils/im-business-message-parse'
import { parseImBusinessPayload } from '@/utils/im-business-message-parse'
@@ -78,6 +83,7 @@ const props = defineProps<{
}>()
const loading = ref(false)
const syncing = ref(false)
const rawRows = shallowRef<any[]>([])
const patientImId = ref('')
const patientName = ref('')
@@ -139,13 +145,13 @@ function senderLabel(row: any) {
return patientName.value ? `患者(${patientName.value}` : '患者'
}
async function load(onlyArchived = false) {
async function load() {
if (!props.diagnosisId) return
loading.value = true
try {
const res = (await getImChatMessages({
diagnosis_id: props.diagnosisId,
only_archived: onlyArchived ? 1 : 0
only_archived: 1
})) as {
lists?: any[]
patient_im_id?: string
@@ -162,19 +168,33 @@ async function load(onlyArchived = false) {
}
}
function refreshLive() {
load(false)
function reloadArchived() {
load()
}
async function triggerSync() {
if (!props.diagnosisId) return
syncing.value = true
try {
await triggerImChatSync({ diagnosis_id: props.diagnosisId })
ElMessage.success('已发起后台同步,几秒后请点击"重新加载已归档"查看新消息')
} catch (e) {
console.error(e)
ElMessage.error('发起同步失败')
} finally {
syncing.value = false
}
}
watch(
() => props.diagnosisId,
() => {
load(true)
load()
},
{ immediate: true }
)
defineExpose({ refresh: refreshLive })
defineExpose({ refresh: reloadArchived })
</script>
<style scoped lang="scss">