feat(ui): 所有列表页加CSV导出按钮(全量拉取+中文BOM兼容Excel)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,11 +2,13 @@
|
||||
import { computed, onMounted, reactive, ref, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Download } from '@element-plus/icons-vue'
|
||||
import { getGroups } from '@/api'
|
||||
import { downloadBlob } from '@/api/client'
|
||||
import type { Channel, Group } from '@/api/types'
|
||||
import { useChannelStore } from '@/stores/channel'
|
||||
import { channelLabel, formatTime } from '@/utils/format'
|
||||
import { exportListToCsv } from '@/utils/csvExport'
|
||||
import { buildGroupSections, readField } from '@/utils/groupFields'
|
||||
import { fromTypeLabel } from '@/utils/customerFields'
|
||||
|
||||
@@ -174,6 +176,44 @@ async function exportGroupHtml(row: Group): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
// ---- header 导出:当前 tab 渠道全量群 CSV(含当前员工筛选) ----
|
||||
const exporting = ref(false)
|
||||
|
||||
async function exportGroups(): Promise<void> {
|
||||
const channel = activeTab.value // 'wechat' | 'whatsapp'
|
||||
if (tabState[channel].total === 0) {
|
||||
ElMessage.warning('当前列表为空,无数据可导出')
|
||||
return
|
||||
}
|
||||
exporting.value = true
|
||||
try {
|
||||
const result = await exportListToCsv({
|
||||
fetchPage: (page, pageSize) =>
|
||||
getGroups({
|
||||
channel,
|
||||
owner_account_id: ownerId.value ?? undefined,
|
||||
page,
|
||||
page_size: pageSize,
|
||||
}),
|
||||
columns: [
|
||||
{ key: 'room_name', label: '群名' },
|
||||
{ key: 'room_id', label: '群ID' },
|
||||
{ key: 'owner_account_nickname', label: '群主', format: (r) => r.owner_account_nickname ?? r.owner_account_id ?? '' },
|
||||
{ key: 'member_count', label: '成员数' },
|
||||
{ key: 'message_count', label: '消息数' },
|
||||
{ key: 'last_chat_time', label: '最新消息时间', format: (r) => (r.last_chat_time ? formatTime(r.last_chat_time) : '') },
|
||||
{ key: 'owner_account_id', label: '归属员工' },
|
||||
],
|
||||
filename: `${channel === 'wechat' ? '微信群' : 'WA群'}列表`,
|
||||
})
|
||||
ElMessage.success(`已导出 ${result.rows} 条`)
|
||||
} catch (e) {
|
||||
ElMessage.error(`导出失败:${(e as Error).message}`)
|
||||
} finally {
|
||||
exporting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 清除 owner_account_id query(保留其余 query)。 */
|
||||
function clearOwnerFilter(): void {
|
||||
const { owner_account_id: _drop, ...rest } = route.query
|
||||
@@ -237,6 +277,9 @@ onMounted(() => {
|
||||
</span>
|
||||
</div>
|
||||
<div class="yk-groups__filters">
|
||||
<el-button size="small" :loading="exporting" @click="exportGroups">
|
||||
<el-icon><Download /></el-icon> 导出
|
||||
</el-button>
|
||||
<el-button v-if="ownerId" size="small" type="info" plain @click="clearOwnerFilter">
|
||||
清除员工筛选
|
||||
</el-button>
|
||||
|
||||
Reference in New Issue
Block a user