import { ref } from 'vue' import { ElMessage } from 'element-plus' export function usePrintExportPage({ downloadFileName, requestExport, resolvePrintRecords, buildPreviewRows, buildPreviewMeta }) { 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 requestExport(payload) 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 resolvePrintRecords(payload) if (activePrintToken.value !== token) { 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 } }