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
|
}
|
}
|