| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // 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://<host>/api/download/report/<file>`(绝对地址)与
- * `/api/download/report/<file>`(相对路径)。后者缺 /ventAI 前缀,直接交给浏览器会打到前端自己的源上
- * (dev 是 Vite,没有 /api 路由)从而 404。这里统一重建成 /ventAI/api/download/report/<file>,
- * 与其余接口一致走代理,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<unknown> =>
- defHttp.put<unknown>({ 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<unknown> =>
- defHttp.put<unknown>(
- {
- 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<unknown> =>
- defHttp.post<unknown>({ url: Api.editWord, data: { filename, instruction } }, { isTransformResponse: false });
|