openOfficeFile.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { openOfficeFileApi } from '@jeesite/core/api/sys/login';
  2. const normalizeOfficeFileKey = (value: string) => value.trim().toLowerCase().replace(/[_\-\s]/g, '');
  3. const OFFICE_FILE_ID_KEY_SET = new Set(['fileid']);
  4. export const normalizeOfficeFileId = (value: unknown) => {
  5. const text = String(value ?? '').trim();
  6. if (!text || text === '-' || text === 'null' || text === 'undefined') return undefined;
  7. return text;
  8. };
  9. const readOfficeFileIdFromRecord = (record: Record<string, any>) => {
  10. for (const [key, value] of Object.entries(record)) {
  11. if (OFFICE_FILE_ID_KEY_SET.has(normalizeOfficeFileKey(key))) {
  12. const fileId = normalizeOfficeFileId(value);
  13. if (fileId) return fileId;
  14. }
  15. }
  16. return undefined;
  17. };
  18. export const resolveOfficeFileId = (source: unknown): string | undefined => {
  19. if (!source || typeof source !== 'object') return undefined;
  20. const queue: Array<Record<string, any>> = [source as Record<string, any>];
  21. const visited = new Set<Record<string, any>>();
  22. while (queue.length) {
  23. const current = queue.shift();
  24. if (!current || visited.has(current)) continue;
  25. visited.add(current);
  26. const directFileId = readOfficeFileIdFromRecord(current);
  27. if (directFileId) return directFileId;
  28. ['raw', 'record', 'source', 'data'].forEach((key) => {
  29. const nested = current[key];
  30. if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
  31. queue.push(nested as Record<string, any>);
  32. }
  33. });
  34. }
  35. return undefined;
  36. };
  37. export const isOpenOfficeFileSuccess = (response: any) => {
  38. const result = String(response?.result ?? '').toLowerCase();
  39. const code = String(response?.code ?? '').toLowerCase();
  40. return result === 'true' || result === 'success' || code === '200' || code === '0';
  41. };
  42. export const getOpenOfficeFileErrorMessage = (error: any, fallback = '打开文件失败') =>
  43. error?.response?.data?.message || error?.message || fallback;
  44. export const openOfficeFileById = (fileId: string | number) => openOfficeFileApi(fileId);