importProgressSession.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { reactive, toRefs } from 'vue';
  2. import type { FileInfo } from '@jeesite/types/api';
  3. const IMPORT_PROGRESS_STORAGE_KEY = 'case_clean_import_progress';
  4. export interface ImportProgressSnapshot {
  5. active: boolean;
  6. caseId?: string | number;
  7. progress: number;
  8. activeStep: number;
  9. currentFileName: string;
  10. currentCleanFiles: FileInfo[];
  11. currentCleanBatchId: string;
  12. successCount: number;
  13. failCount: number;
  14. cleanStatsSnapshot: { success?: number; fail?: number };
  15. cleanTaskStarted: boolean;
  16. cleanTaskFinished: boolean;
  17. calcTaskTriggered: boolean;
  18. governTaskStarted: boolean;
  19. governTaskFinished: boolean;
  20. shouldRunGovernAfterClean: boolean;
  21. updatedAt: number;
  22. }
  23. interface ImportProgressRuntimeState {
  24. progress: number;
  25. activeStep: number;
  26. currentFileName: string;
  27. currentCleanFiles: FileInfo[];
  28. currentCleanBatchId: string;
  29. sseConnected: boolean;
  30. sseError: string | null;
  31. cleanTaskStarted: boolean;
  32. calcTaskTriggered: boolean;
  33. cleanTaskFinished: boolean;
  34. governTaskStarted: boolean;
  35. governTaskFinished: boolean;
  36. shouldRunGovernAfterClean: boolean;
  37. governCompleteNotified: boolean;
  38. successCount: number;
  39. failCount: number;
  40. cleanStatsSnapshot: { success?: number; fail?: number };
  41. }
  42. const createImportProgressRuntimeState = (): ImportProgressRuntimeState => ({
  43. progress: 0,
  44. activeStep: 0,
  45. currentFileName: '',
  46. currentCleanFiles: [],
  47. currentCleanBatchId: '',
  48. sseConnected: false,
  49. sseError: null,
  50. cleanTaskStarted: false,
  51. calcTaskTriggered: false,
  52. cleanTaskFinished: false,
  53. governTaskStarted: false,
  54. governTaskFinished: false,
  55. shouldRunGovernAfterClean: true,
  56. governCompleteNotified: false,
  57. successCount: 0,
  58. failCount: 0,
  59. cleanStatsSnapshot: {},
  60. });
  61. const importProgressRuntimeState = reactive(createImportProgressRuntimeState());
  62. let activeImportProgressEventSource: EventSource | null = null;
  63. export const useImportProgressRuntimeState = () => toRefs(importProgressRuntimeState);
  64. export const resetImportProgressRuntimeState = () => {
  65. Object.assign(importProgressRuntimeState, createImportProgressRuntimeState());
  66. };
  67. export const getImportProgressEventSource = () => activeImportProgressEventSource;
  68. export const setImportProgressEventSource = (eventSource: EventSource | null) => {
  69. activeImportProgressEventSource = eventSource;
  70. };
  71. const getStorage = () => (typeof window === 'undefined' ? null : window.sessionStorage);
  72. const normalizeCaseId = (caseId?: string | number) => (caseId === undefined || caseId === null ? '' : String(caseId));
  73. export const getActiveImportProgress = (caseId?: string | number): ImportProgressSnapshot | null => {
  74. const raw = getStorage()?.getItem(IMPORT_PROGRESS_STORAGE_KEY);
  75. if (!raw) return null;
  76. try {
  77. const snapshot = JSON.parse(raw) as ImportProgressSnapshot;
  78. if (!snapshot?.active || !snapshot.cleanTaskStarted) return null;
  79. const currentCaseId = normalizeCaseId(caseId);
  80. const snapshotCaseId = normalizeCaseId(snapshot.caseId);
  81. if (currentCaseId && snapshotCaseId && currentCaseId !== snapshotCaseId) return null;
  82. return snapshot;
  83. } catch {
  84. getStorage()?.removeItem(IMPORT_PROGRESS_STORAGE_KEY);
  85. return null;
  86. }
  87. };
  88. export const saveImportProgress = (snapshot: ImportProgressSnapshot) => {
  89. getStorage()?.setItem(IMPORT_PROGRESS_STORAGE_KEY, JSON.stringify(snapshot));
  90. };
  91. export const clearImportProgress = (caseId?: string | number) => {
  92. const storage = getStorage();
  93. if (!storage) return;
  94. const snapshot = getActiveImportProgress();
  95. const currentCaseId = normalizeCaseId(caseId);
  96. const snapshotCaseId = normalizeCaseId(snapshot?.caseId);
  97. if (!currentCaseId || !snapshotCaseId || currentCaseId === snapshotCaseId) {
  98. storage.removeItem(IMPORT_PROGRESS_STORAGE_KEY);
  99. }
  100. };
  101. export const resetImportProgressSession = (caseId?: string | number) => {
  102. activeImportProgressEventSource?.close();
  103. activeImportProgressEventSource = null;
  104. resetImportProgressRuntimeState();
  105. clearImportProgress(caseId);
  106. };