优化构架

This commit is contained in:
2026-08-03 18:49:18 +08:00
parent 1241d11c01
commit 44c33a6280
133 changed files with 651 additions and 603 deletions
@@ -0,0 +1,41 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { http } from '@/shared/api/http'
import {
createPlatformExportTask,
downloadPlatformExportTask,
listPlatformExportTasks,
retryPlatformExportTask,
} from './platformExportTasks'
vi.mock('@/shared/api/http', async () => {
const actual = await vi.importActual<typeof import('@/shared/api/http')>('@/shared/api/http')
return { ...actual, http: { get: vi.fn(), post: vi.fn() } }
})
describe('platformExportTasks', () => {
beforeEach(() => vi.clearAllMocks())
it('creates a backend export task with the filter snapshot', async () => {
const task = { id: '9', status: 'PENDING', exportType: 'CUSTOMER_LIST' }
vi.mocked(http.post).mockResolvedValue({ code: '200', message: 'success', data: task })
const payload = { exportType: 'CUSTOMER_LIST', format: 'XLSX' as const, taskName: '客户列表', parameters: { status: 'ACTIVE' } }
await expect(createPlatformExportTask(payload)).resolves.toEqual(task)
expect(http.post).toHaveBeenCalledWith('/platform/v1/files/export-tasks', payload)
})
it('lists, downloads, and retries export tasks through File service', async () => {
const page = { records: [], page: '1', size: '20', total: '0', pages: '0' }
const blob = new Blob(['xlsx'])
vi.mocked(http.get).mockResolvedValueOnce({ code: '200', message: 'success', data: page }).mockResolvedValueOnce(blob)
vi.mocked(http.post).mockResolvedValue({ code: '200', message: 'success', data: { id: '9', status: 'PENDING' } })
await expect(listPlatformExportTasks({ page: 1, size: 20, status: 'FAILED' })).resolves.toEqual({ records: [], page: 1, size: 20, total: 0, pages: 0 })
await expect(downloadPlatformExportTask('9')).resolves.toBe(blob)
await expect(retryPlatformExportTask('9')).resolves.toMatchObject({ id: '9', status: 'PENDING' })
expect(http.get).toHaveBeenNthCalledWith(1, '/platform/v1/files/export-tasks', { params: { page: 1, size: 20, status: 'FAILED' } })
expect(http.get).toHaveBeenNthCalledWith(2, '/platform/v1/files/export-tasks/9/download', { responseType: 'blob' })
expect(http.post).toHaveBeenCalledWith('/platform/v1/files/export-tasks/9/retry', {})
})
})
@@ -0,0 +1,82 @@
import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
export type ExportTaskStatus = 'PENDING' | 'RUNNING' | 'SUCCEEDED' | 'FAILED' | 'EXPIRED'
export type ExportTaskType = 'CUSTOMER_LIST' | string
export interface PlatformExportTask {
id: string
taskNo: string
exportType: ExportTaskType
format: 'XLSX' | string
taskName: string
status: ExportTaskStatus
totalRows: number | null
processedRows: number
fileName: string | null
contentType: string | null
sizeBytes: number | null
failureMessage: string | null
requestedBy: string
requestedUsername: string | null
requestedAt: string
startedAt: string | null
completedAt: string | null
expiresAt: string | null
}
export interface PlatformExportTaskPage {
records: PlatformExportTask[]
page: number
size: number
total: number
pages: number
}
export interface PlatformExportTaskQuery {
page: number
size: number
exportType?: string
status?: ExportTaskStatus
requestedFrom?: string
requestedTo?: string
}
export interface CreatePlatformExportTaskRequest {
exportType: ExportTaskType
format: 'XLSX'
taskName: string
parameters: Record<string, string | number | boolean | null | undefined>
}
const basePath = '/platform/v1/files/export-tasks'
export async function createPlatformExportTask(payload: CreatePlatformExportTaskRequest) {
const response = await http.post<ApiEnvelope<PlatformExportTask>, ApiEnvelope<PlatformExportTask>>(basePath, payload)
return unwrapApiResponse(response)
}
export async function listPlatformExportTasks(query: PlatformExportTaskQuery) {
const response = await http.get<ApiEnvelope<PlatformExportTaskPage>, ApiEnvelope<PlatformExportTaskPage>>(basePath, {
params: query,
})
const page = unwrapApiResponse(response)
return {
...page,
page: Number(page.page),
size: Number(page.size),
total: Number(page.total),
pages: Number(page.pages),
}
}
export function downloadPlatformExportTask(taskId: string) {
return http.get<Blob, Blob>(`${basePath}/${encodeURIComponent(taskId)}/download`, { responseType: 'blob' })
}
export async function retryPlatformExportTask(taskId: string) {
const response = await http.post<ApiEnvelope<PlatformExportTask>, ApiEnvelope<PlatformExportTask>>(
`${basePath}/${encodeURIComponent(taskId)}/retry`,
{},
)
return unwrapApiResponse(response)
}