refactor: 重构项目结构并优化代码
- 删除无用的文件和错误日志 - 创建统一的 imports 模块集中管理依赖 - 重构组件使用新的 imports 方式 - 修复文档路径大小写问题 - 优化类型定义和接口导出 - 更新依赖版本 - 改进错误处理和API配置 - 统一组件导出方式
This commit is contained in:
289
dashboard/src/services/executionResultDataSource.ts
Normal file
289
dashboard/src/services/executionResultDataSource.ts
Normal file
@@ -0,0 +1,289 @@
|
||||
/**
|
||||
* [MOCK-015] 执行结果模块DataSource
|
||||
* AI注意: 这是Mock实现,不是真实业务逻辑
|
||||
* 仅在USE_MOCK=true时启用 */
|
||||
|
||||
export interface ExecutionResult {
|
||||
id: string;
|
||||
taskId: string;
|
||||
actionType: string;
|
||||
status: 'success' | 'failed' | 'in_progress' | 'pending';
|
||||
startTime: Date;
|
||||
endTime?: Date;
|
||||
duration?: number;
|
||||
clientId: string;
|
||||
result: {
|
||||
success: boolean;
|
||||
message: string;
|
||||
data?: any;
|
||||
error?: string;
|
||||
};
|
||||
logs: {
|
||||
timestamp: Date;
|
||||
level: 'info' | 'warn' | 'error';
|
||||
message: string;
|
||||
}[];
|
||||
metadata: {
|
||||
platform: string;
|
||||
userId: string;
|
||||
correlationId: string;
|
||||
attempt: number;
|
||||
};
|
||||
}
|
||||
|
||||
export interface StatData {
|
||||
total: number;
|
||||
success: number;
|
||||
failed: number;
|
||||
inProgress: number;
|
||||
successRate: number;
|
||||
avgDuration: number;
|
||||
}
|
||||
|
||||
export interface ExecutionResultDataSource {
|
||||
fetchResults(params?: {
|
||||
status?: string;
|
||||
actionType?: string;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
search?: string;
|
||||
}): Promise<ExecutionResult[]>;
|
||||
getResult(id: string): Promise<ExecutionResult | null>;
|
||||
getExecutionStats(): Promise<StatData>;
|
||||
exportResult(id: string): Promise<boolean>;
|
||||
retryExecution(id: string): Promise<ExecutionResult | null>;
|
||||
}
|
||||
|
||||
export class ExecutionResultDataSourceImpl implements ExecutionResultDataSource {
|
||||
private results: ExecutionResult[] = [
|
||||
{
|
||||
id: '1',
|
||||
taskId: 'task-001',
|
||||
actionType: 'price_update',
|
||||
status: 'success',
|
||||
startTime: new Date(Date.now() - 3600000),
|
||||
endTime: new Date(Date.now() - 3540000),
|
||||
duration: 60,
|
||||
clientId: 'localhost:8080',
|
||||
result: {
|
||||
success: true,
|
||||
message: 'Price updated successfully',
|
||||
data: {
|
||||
productId: 'prod-123',
|
||||
oldPrice: 100,
|
||||
newPrice: 90,
|
||||
},
|
||||
},
|
||||
logs: [
|
||||
{ timestamp: new Date(Date.now() - 3600000), level: 'info', message: 'Starting price update' },
|
||||
{ timestamp: new Date(Date.now() - 3570000), level: 'info', message: 'Fetching product data' },
|
||||
{ timestamp: new Date(Date.now() - 3550000), level: 'info', message: 'Updating price' },
|
||||
{ timestamp: new Date(Date.now() - 3540000), level: 'info', message: 'Price updated successfully' },
|
||||
],
|
||||
metadata: {
|
||||
platform: 'amazon',
|
||||
userId: 'user-001',
|
||||
correlationId: 'corr-001',
|
||||
attempt: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
taskId: 'task-002',
|
||||
actionType: 'inventory_sync',
|
||||
status: 'failed',
|
||||
startTime: new Date(Date.now() - 7200000),
|
||||
endTime: new Date(Date.now() - 7140000),
|
||||
duration: 60,
|
||||
clientId: 'localhost:8081',
|
||||
result: {
|
||||
success: false,
|
||||
message: 'Inventory sync failed',
|
||||
error: 'Connection timeout',
|
||||
},
|
||||
logs: [
|
||||
{ timestamp: new Date(Date.now() - 7200000), level: 'info', message: 'Starting inventory sync' },
|
||||
{ timestamp: new Date(Date.now() - 7180000), level: 'info', message: 'Connecting to inventory service' },
|
||||
{ timestamp: new Date(Date.now() - 7140000), level: 'error', message: 'Connection timeout' },
|
||||
],
|
||||
metadata: {
|
||||
platform: 'shopify',
|
||||
userId: 'user-002',
|
||||
correlationId: 'corr-002',
|
||||
attempt: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
taskId: 'task-003',
|
||||
actionType: 'order_processing',
|
||||
status: 'in_progress',
|
||||
startTime: new Date(Date.now() - 1800000),
|
||||
clientId: 'localhost:8080',
|
||||
result: {
|
||||
success: false,
|
||||
message: 'Processing...',
|
||||
},
|
||||
logs: [
|
||||
{ timestamp: new Date(Date.now() - 1800000), level: 'info', message: 'Starting order processing' },
|
||||
{ timestamp: new Date(Date.now() - 1740000), level: 'info', message: 'Fetching orders' },
|
||||
],
|
||||
metadata: {
|
||||
platform: 'ebay',
|
||||
userId: 'user-001',
|
||||
correlationId: 'corr-003',
|
||||
attempt: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '4',
|
||||
taskId: 'task-004',
|
||||
actionType: 'price_update',
|
||||
status: 'success',
|
||||
startTime: new Date(Date.now() - 10800000),
|
||||
endTime: new Date(Date.now() - 10740000),
|
||||
duration: 60,
|
||||
clientId: 'localhost:8082',
|
||||
result: {
|
||||
success: true,
|
||||
message: 'Price updated successfully',
|
||||
data: {
|
||||
productId: 'prod-456',
|
||||
oldPrice: 200,
|
||||
newPrice: 180,
|
||||
},
|
||||
},
|
||||
logs: [
|
||||
{ timestamp: new Date(Date.now() - 10800000), level: 'info', message: 'Starting price update' },
|
||||
{ timestamp: new Date(Date.now() - 10770000), level: 'info', message: 'Fetching product data' },
|
||||
{ timestamp: new Date(Date.now() - 10750000), level: 'info', message: 'Updating price' },
|
||||
{ timestamp: new Date(Date.now() - 10740000), level: 'info', message: 'Price updated successfully' },
|
||||
],
|
||||
metadata: {
|
||||
platform: 'amazon',
|
||||
userId: 'user-003',
|
||||
correlationId: 'corr-004',
|
||||
attempt: 1,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
async fetchResults(params?: {
|
||||
status?: string;
|
||||
actionType?: string;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
search?: string;
|
||||
}): Promise<ExecutionResult[]> {
|
||||
// 模拟API延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
|
||||
let filteredResults = [...this.results];
|
||||
|
||||
if (params?.status && params.status !== 'all') {
|
||||
filteredResults = filteredResults.filter(result => result.status === params.status);
|
||||
}
|
||||
|
||||
if (params?.actionType && params.actionType !== 'all') {
|
||||
filteredResults = filteredResults.filter(result => result.actionType === params.actionType);
|
||||
}
|
||||
|
||||
if (params?.search) {
|
||||
const searchLower = params.search.toLowerCase();
|
||||
filteredResults = filteredResults.filter(result =>
|
||||
result.taskId.toLowerCase().includes(searchLower) ||
|
||||
result.actionType.toLowerCase().includes(searchLower) ||
|
||||
result.clientId.toLowerCase().includes(searchLower) ||
|
||||
result.metadata.platform.toLowerCase().includes(searchLower)
|
||||
);
|
||||
}
|
||||
|
||||
if (params?.startDate && params?.endDate) {
|
||||
const startDate = new Date(params.startDate).getTime();
|
||||
const endDate = new Date(params.endDate).getTime();
|
||||
filteredResults = filteredResults.filter(result => {
|
||||
const resultTime = result.startTime.getTime();
|
||||
return resultTime >= startDate && resultTime <= endDate;
|
||||
});
|
||||
}
|
||||
|
||||
return filteredResults;
|
||||
}
|
||||
|
||||
async getResult(id: string): Promise<ExecutionResult | null> {
|
||||
// 模拟API延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 300));
|
||||
|
||||
const result = this.results.find(result => result.id === id);
|
||||
return result || null;
|
||||
}
|
||||
|
||||
async getExecutionStats(): Promise<StatData> {
|
||||
// 模拟API延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 300));
|
||||
|
||||
const total = this.results.length;
|
||||
const success = this.results.filter(r => r.status === 'success').length;
|
||||
const failed = this.results.filter(r => r.status === 'failed').length;
|
||||
const inProgress = this.results.filter(r => r.status === 'in_progress').length;
|
||||
const successRate = total > 0 ? (success / total) * 100 : 0;
|
||||
const completedResults = this.results.filter(r => r.duration);
|
||||
const avgDuration = completedResults.length > 0
|
||||
? completedResults.reduce((sum, r) => sum + (r.duration || 0), 0) / completedResults.length
|
||||
: 0;
|
||||
|
||||
return {
|
||||
total,
|
||||
success,
|
||||
failed,
|
||||
inProgress,
|
||||
successRate,
|
||||
avgDuration,
|
||||
};
|
||||
}
|
||||
|
||||
async exportResult(id: string): Promise<boolean> {
|
||||
// 模拟API延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
const result = this.results.find(result => result.id === id);
|
||||
return !!result;
|
||||
}
|
||||
|
||||
async retryExecution(id: string): Promise<ExecutionResult | null> {
|
||||
// 模拟API延迟
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
|
||||
const resultIndex = this.results.findIndex(result => result.id === id);
|
||||
if (resultIndex === -1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const originalResult = this.results[resultIndex];
|
||||
const newResult: ExecutionResult = {
|
||||
...originalResult,
|
||||
id: `${Date.now()}`,
|
||||
status: 'in_progress',
|
||||
startTime: new Date(),
|
||||
endTime: undefined,
|
||||
duration: undefined,
|
||||
result: {
|
||||
success: false,
|
||||
message: 'Processing...',
|
||||
},
|
||||
logs: [
|
||||
{ timestamp: new Date(), level: 'info', message: `Retrying execution for task ${originalResult.taskId}` },
|
||||
],
|
||||
metadata: {
|
||||
...originalResult.metadata,
|
||||
attempt: originalResult.metadata.attempt + 1,
|
||||
correlationId: `corr-${Date.now()}`,
|
||||
},
|
||||
};
|
||||
|
||||
this.results.unshift(newResult);
|
||||
return newResult;
|
||||
}
|
||||
}
|
||||
|
||||
export const executionResultDataSource = new ExecutionResultDataSourceImpl();
|
||||
Reference in New Issue
Block a user