import { ref } from 'vue' import { ElMessage } from 'element-plus' import { guardRequestWithMessage } from '@/utils/sys/requestGuard' export function usePrintExportPage({ downloadFileName, requestExport, resolvePrintRecords, buildPreviewRows, buildPreviewMeta, timeoutMs }) { const previewVisible = ref(false) const previewRows = ref([]) const previewMeta = ref({}) const previewToken = ref(0) const activePrintToken = ref(0) const handlePreviewVisibleChange = (visible) => { previewVisible.value = Boolean(visible) if (!visible) { activePrintToken.value = 0 } } const handleExport = async (payload) => { try { const response = await guardRequestWithMessage(requestExport(payload), null, { timeoutMs, timeoutMessage: '导出请求超时,已停止等待' }) if (!response) { return } if (!response.ok) { throw new Error(`导出失败 (${response.status})`) } const blob = await response.blob() const downloadUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = downloadUrl link.download = downloadFileName document.body.appendChild(link) link.click() link.remove() window.URL.revokeObjectURL(downloadUrl) ElMessage.success('导出成功') } catch (error) { ElMessage.error(error?.message || '导出失败') } } const handlePrint = async (payload) => { const token = previewToken.value + 1 previewToken.value = token activePrintToken.value = token previewVisible.value = false previewRows.value = [] previewMeta.value = {} try { const records = await guardRequestWithMessage(resolvePrintRecords(payload), null, { timeoutMs, timeoutMessage: '打印数据加载超时,已停止等待' }) if (activePrintToken.value !== token) { return } if (!records) { return } const rows = buildPreviewRows(records) previewRows.value = rows previewMeta.value = buildPreviewMeta(rows) handlePreviewVisibleChange(true) } catch (error) { if (activePrintToken.value !== token) { return } ElMessage.error(error?.message || '打印失败') } } return { previewVisible, previewRows, previewMeta, handlePreviewVisibleChange, handleExport, handlePrint } }