diff --git a/yunkes/src/views/CustomerList.vue b/yunkes/src/views/CustomerList.vue index a46b184..b6b3475 100644 --- a/yunkes/src/views/CustomerList.vue +++ b/yunkes/src/views/CustomerList.vue @@ -3,6 +3,7 @@ import { computed, onMounted, reactive, ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { ElMessage } from 'element-plus' import { getCustomers } from '@/api' +import { downloadBlob } from '@/api/client' import type { Channel, Customer } from '@/api/types' import { useChannelStore } from '@/stores/channel' import { useOrgStore } from '@/stores/org' @@ -165,6 +166,45 @@ function viewChatFromDrawer(): void { viewChat(row) } +// ---- 操作列:导出HTML聊天记录 → 弹「请选择时间」→ /api/export/chat-html ---- +// 对齐云客:先弹时间范围 modal(可选,不选=全部),确定后下载。 +const exportOpen = ref(false) +const exportRow = ref(null) +// el-date-picker value-format="X" 绑定秒级 unix 字符串数组;confirmExport 里 *1000 转毫秒。 +const exportRange = ref<[string, string] | null>(null) + +function openExport(row: Customer): void { + if (!row.owner_account_id || !row.friend_id) { + ElMessage.warning('该客户缺少归属账号/客户标识,无法导出') + return + } + exportRow.value = row + exportRange.value = null + exportOpen.value = true +} + +async function confirmExport(): Promise { + const row = exportRow.value + if (!row) return + const params: Record = { + channel: row.channel, + owner_account_id: row.owner_account_id, + talker_id: row.friend_id, + } + if (exportRange.value) { + // value-format="X" 返回秒级字符串,后端要毫秒 + params.start = Number(exportRange.value[0]) * 1000 + params.end = Number(exportRange.value[1]) * 1000 + } + exportOpen.value = false + try { + await downloadBlob('/export/chat-html', params) + ElMessage.success('导出已开始') + } catch (e) { + ElMessage.error(`导出失败,请稍后重试:${(e as Error).message}`) + } +} + /** 清除 owner_account_id query(保留其余 query)。 */ function clearOwnerFilter(): void { const { owner_account_id: _drop, ...rest } = route.query @@ -298,11 +338,14 @@ onMounted(() => { - + @@ -438,6 +481,28 @@ onMounted(() => { + + + + + + + + + +