// api/report.ts:报告文件(下载地址构造 / 覆盖保存 / 对话式改 Word)。 import { defHttp } from '/@/utils/http/axios/index'; enum Api { downloadReport = '/ventAI/api/download/report/', saveReport = '/ventAI/api/report/save/', editWord = '/ventAI/api/report/edit-word', } /** * 把后端返回的报告地址归一成走 /ventAI 代理的下载地址。 * * 后端实际返回过两种形式:`http:///api/download/report/`(绝对地址)与 * `/api/download/report/`(相对路径)。后者缺 /ventAI 前缀,直接交给浏览器会打到前端自己的源上 * (dev 是 Vite,没有 /api 路由)从而 404。这里统一重建成 /ventAI/api/download/report/, * 与其余接口一致走代理,dev 与生产都不依赖后端返回的 Host。 * * 注意地址里的文件名是已百分号编码的,必须先解码再编码,否则会双重编码导致后端找不到文件。 */ export const buildReportDownloadUrl = (urlOrFilename: string) => { const raw = urlOrFilename.split('/').pop() || urlOrFilename; let filename = raw; try { filename = decodeURIComponent(raw); } catch { // 含非法百分号序列时按原样处理 } return `${Api.downloadReport}${encodeURIComponent(filename)}`; }; /** * 覆盖保存报告(文本) * @param filename - 文件名,如 report_20260810_150000.md * @param content - 文本内容 */ export const saveReportText = (filename: string, content: string): Promise => defHttp.put({ url: `${Api.saveReport}${encodeURIComponent(filename)}`, data: { content } }, { isTransformResponse: false }); /** * 覆盖保存报告(二进制,如 xlsx) * @param filename - 文件名 * @param data - ArrayBuffer / Blob / Uint8Array */ export const saveReportBinary = (filename: string, data: ArrayBuffer | Blob | Uint8Array): Promise => defHttp.put( { url: `${Api.saveReport}${encodeURIComponent(filename)}`, data, headers: { 'Content-Type': 'application/octet-stream' }, }, { isTransformResponse: false } ); /** * 对话式修改 Word 报告 * @param filename - docx 文件名 * @param instruction - 修改要求(自然语言) */ export const editWordReport = (filename: string, instruction: string): Promise => defHttp.post({ url: Api.editWord, data: { filename, instruction } }, { isTransformResponse: false });