import axios from 'axios' import { getToken } from '@/utils/auth' import { getJavaApi } from '@/utils/java-api' import { resolveAttachmentUrl, validateAttachmentBlob } from '@/utils/attachment' export function reportFilename(value, extension) { const name = String(value || '报告').replace(/[\\/:*?"<>|\x00-\x1f]/g, '-').trim() || '报告' return name.replace(/\.(docx|pdf)$/i, '') + '.' + extension } // 只替换末尾扩展名,兼容目录名、报告编号中含小数点的历史文件。 export function reportPdfPath(path) { return path.replace(/\.docx?$/i, '.pdf') } // 下单页沿用已有报告文件入口,鉴权信息只发送给本系统。 export async function loadReportFile(path, signal) { const url = resolveAttachmentUrl(path, 2) const backend = new URL(getJavaApi(), window.location.origin) const target = new URL(url, window.location.origin) const isBackend = target.origin === backend.origin && target.pathname.startsWith(backend.pathname.replace(/\/$/, '') + '/') const { data } = await axios.get(url, { responseType: 'blob', signal, headers: isBackend && getToken() ? { Authorization: 'Bearer ' + getToken() } : {} }) return data } export async function validateReportPreview(blob, format) { if (!(blob instanceof Blob) || !blob.size) throw new Error('报告内容为空,请重试或联系管理员') await validateAttachmentBlob(blob, '报告.' + format) const header = new Uint8Array(await blob.slice(0, 5).arrayBuffer()) const isPdf = String.fromCharCode(...header) === '%PDF-' const isDocx = header[0] === 0x50 && header[1] === 0x4b if (format === 'pdf' ? !isPdf : !isDocx) throw new Error('未获取到有效的报告文件,请重试或联系管理员') // 静态文件服务器可能返回 octet-stream,PDF 阅读器需要明确的 MIME 类型。 return new Blob([blob], { type: format === 'pdf' ? 'application/pdf' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }) }