report.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // api/report.ts:报告文件(下载地址构造 / 覆盖保存 / 对话式改 Word)。
  2. import { defHttp } from '/@/utils/http/axios/index';
  3. enum Api {
  4. downloadReport = '/ventAI/api/download/report/',
  5. saveReport = '/ventAI/api/report/save/',
  6. editWord = '/ventAI/api/report/edit-word',
  7. }
  8. /**
  9. * 把后端返回的报告地址归一成走 /ventAI 代理的下载地址。
  10. *
  11. * 后端实际返回过两种形式:`http://<host>/api/download/report/<file>`(绝对地址)与
  12. * `/api/download/report/<file>`(相对路径)。后者缺 /ventAI 前缀,直接交给浏览器会打到前端自己的源上
  13. * (dev 是 Vite,没有 /api 路由)从而 404。这里统一重建成 /ventAI/api/download/report/<file>,
  14. * 与其余接口一致走代理,dev 与生产都不依赖后端返回的 Host。
  15. *
  16. * 注意地址里的文件名是已百分号编码的,必须先解码再编码,否则会双重编码导致后端找不到文件。
  17. */
  18. export const buildReportDownloadUrl = (urlOrFilename: string) => {
  19. const raw = urlOrFilename.split('/').pop() || urlOrFilename;
  20. let filename = raw;
  21. try {
  22. filename = decodeURIComponent(raw);
  23. } catch {
  24. // 含非法百分号序列时按原样处理
  25. }
  26. return `${Api.downloadReport}${encodeURIComponent(filename)}`;
  27. };
  28. /**
  29. * 覆盖保存报告(文本)
  30. * @param filename - 文件名,如 report_20260810_150000.md
  31. * @param content - 文本内容
  32. */
  33. export const saveReportText = (filename: string, content: string): Promise<unknown> =>
  34. defHttp.put<unknown>({ url: `${Api.saveReport}${encodeURIComponent(filename)}`, data: { content } }, { isTransformResponse: false });
  35. /**
  36. * 覆盖保存报告(二进制,如 xlsx)
  37. * @param filename - 文件名
  38. * @param data - ArrayBuffer / Blob / Uint8Array
  39. */
  40. export const saveReportBinary = (filename: string, data: ArrayBuffer | Blob | Uint8Array): Promise<unknown> =>
  41. defHttp.put<unknown>(
  42. {
  43. url: `${Api.saveReport}${encodeURIComponent(filename)}`,
  44. data,
  45. headers: { 'Content-Type': 'application/octet-stream' },
  46. },
  47. { isTransformResponse: false }
  48. );
  49. /**
  50. * 对话式修改 Word 报告
  51. * @param filename - docx 文件名
  52. * @param instruction - 修改要求(自然语言)
  53. */
  54. export const editWordReport = (filename: string, instruction: string): Promise<unknown> =>
  55. defHttp.post<unknown>({ url: Api.editWord, data: { filename, instruction } }, { isTransformResponse: false });