import request from '@/utils/request'; // 需求统计数据类型定义 export interface UserDemandStat { userId: number; userName: string; realName?: string; // 真实姓名 deptName: string; totalDemands: number; completedDemands: number; pendingDemands: number; totalScore: number; avgScore: number; completionRate: number; satisfactionRate: number; } export interface DeptDemandStat { deptId: number; deptName: string; totalDemands: number; completedDemands: number; pendingDemands: number; totalScore: number; remainingScore: number; dailyLimit: number; weeklyLimit: number; monthlyLimit: number; dailyUsed: number; weeklyUsed: number; monthlyUsed: number; utilizationRate: number; alertLevel: string; } export interface TrendData { date: string; demandCount: number; completedCount: number; scoreUsed: number; } export interface TypeDistribution { typeName: string; count: number; percentage: number; totalScore: number; } export interface OverviewData { totalDemands: number; todayDemands: number; weekDemands: number; monthDemands: number; completedDemands: number; pendingDemands: number; canceledDemands: number; totalScoreUsed: number; todayScoreUsed: number; weekScoreUsed: number; monthScoreUsed: number; avgCompletionTime: number; avgSatisfaction: number; } export interface DemandStatistics { userStats: UserDemandStat[]; deptStats: DeptDemandStat[]; trendData: TrendData[]; typeDistribution: TypeDistribution[]; overview: OverviewData; } // ==================== 设计师绩效类型 ==================== export interface DesignerStat { userId: number; userName: string; realName: string; deptName: string; deptId: number; receivedCount: number; completedCount: number; inProgressCount: number; completionRate: number; onTimeRate: number; onTimeCount: number; overdueCount: number; avgProcessTime: number; avgRating: number; fiveStarCount: number; satisfactionRate: number; totalScore: number; deductionScore?: number; netScore?: number; targetScore?: number; targetCompletionRate?: number; weekCompletedCount: number; monthCompletedCount: number; } export interface WorkloadStat { userId: number; userName: string; realName: string; deptName: string; currentLoad: number; loadLevel: string; earliestDeadline: string; avgDailyTasks: number; } export interface DesignerPerformanceSummary { totalDesigners: number; totalReceived: number; totalCompleted: number; avgCompletionRate: number; avgOnTimeRate: number; avgProcessTime: number; avgSatisfaction: number; overloadCount: number; } export interface DesignerPerformance { designerStats: DesignerStat[]; workloadStats: WorkloadStat[]; summary: DesignerPerformanceSummary; } // ==================== 流程效率类型 ==================== export interface StageTimeStats { demandApprovalTime: number; receivingApprovalTime: number; grabWaitTime: number; processTime: number; totalCycleTime: number; bottleneckStage: string; bottleneckPercentage: number; } export interface EfficiencyMetrics { weekDemandApprovalTime: number; weekReceivingApprovalTime: number; weekGrabWaitTime: number; weekProcessTime: number; weekFirstPassRate: number; lastWeekDemandApprovalTime: number; lastWeekReceivingApprovalTime: number; lastWeekGrabWaitTime: number; lastWeekProcessTime: number; lastWeekFirstPassRate: number; monthDemandApprovalTime: number; monthReceivingApprovalTime: number; monthGrabWaitTime: number; monthProcessTime: number; monthFirstPassRate: number; totalRejected: number; rejectionRate: number; } export interface StageDistribution { stageName: string; avgTime: number; percentage: number; } export interface ProcessEfficiency { stageTimeStats: StageTimeStats; efficiencyMetrics: EfficiencyMetrics; approvalTrend: TrendData[]; stageDistribution: StageDistribution[]; } // ==================== 预警任务类型 ==================== export interface WarningTask { taskId: number; taskNo: string; taskTitle: string; status: string; statusText: string; warningLevel: string; warningType: string; warningReason: string; receiverId: number | null; receiverName: string | null; receiverDeptName: string | null; publisherName: string | null; estimatedHours: number | null; deadline: string | null; createTime: string; startTime: string | null; hoursInfo: number; score: number; } // ==================== API函数 ==================== /** * 获取需求统计数据 */ export const getDemandStatistics = async ( dateRange: string = 'month', deptId?: number, userId?: number, month?: string ): Promise => { const params: any = { dateRange }; if (deptId) params.deptId = deptId; if (userId) params.userId = userId; if (month) params.month = month; const response = await request.get('/analytics/demand-statistics', { params }); if (response && typeof response === 'object') { if ('data' in response && response.data !== undefined && response.data !== null) { return response.data as DemandStatistics; } if ('overview' in response || 'trendData' in response) { return response as unknown as DemandStatistics; } } return { overview: { totalDemands: 0, todayDemands: 0, weekDemands: 0, monthDemands: 0, completedDemands: 0, pendingDemands: 0, canceledDemands: 0, totalScoreUsed: 0, todayScoreUsed: 0, weekScoreUsed: 0, monthScoreUsed: 0, avgCompletionTime: 0, avgSatisfaction: 0 }, trendData: [], typeDistribution: [], userStats: [], deptStats: [] }; }; /** * 获取设计师绩效数据 */ export const getDesignerPerformance = async ( month?: string, deptId?: number ): Promise => { const params: any = {}; if (month) params.month = month; if (deptId) params.deptId = deptId; const response = await request.get('/analytics/designer-performance', { params }); if (response && typeof response === 'object') { if ('data' in response && response.data !== undefined && response.data !== null) { return response.data as DesignerPerformance; } if ('designerStats' in response || 'summary' in response) { return response as unknown as DesignerPerformance; } } return { designerStats: [], workloadStats: [], summary: { totalDesigners: 0, totalReceived: 0, totalCompleted: 0, avgCompletionRate: 0, avgOnTimeRate: 0, avgProcessTime: 0, avgSatisfaction: 0, overloadCount: 0 } }; }; /** * 获取流程效率数据 */ export const getProcessEfficiency = async ( month?: string ): Promise => { const params: any = {}; if (month) params.month = month; const response = await request.get('/analytics/process-efficiency', { params }); if (response && typeof response === 'object') { if ('data' in response && response.data !== undefined && response.data !== null) { return response.data as ProcessEfficiency; } if ('stageTimeStats' in response || 'efficiencyMetrics' in response) { return response as unknown as ProcessEfficiency; } } return { stageTimeStats: { demandApprovalTime: 0, receivingApprovalTime: 0, grabWaitTime: 0, processTime: 0, totalCycleTime: 0, bottleneckStage: '', bottleneckPercentage: 0 }, efficiencyMetrics: { weekDemandApprovalTime: 0, weekReceivingApprovalTime: 0, weekGrabWaitTime: 0, weekProcessTime: 0, weekFirstPassRate: 0, lastWeekDemandApprovalTime: 0, lastWeekReceivingApprovalTime: 0, lastWeekGrabWaitTime: 0, lastWeekProcessTime: 0, lastWeekFirstPassRate: 0, monthDemandApprovalTime: 0, monthReceivingApprovalTime: 0, monthGrabWaitTime: 0, monthProcessTime: 0, monthFirstPassRate: 0, totalRejected: 0, rejectionRate: 0 }, approvalTrend: [], stageDistribution: [] }; }; /** * 获取预警任务列表 */ export const getWarningTasks = async (): Promise => { const response = await request.get('/analytics/warnings'); if (response && typeof response === 'object') { if ('data' in response && Array.isArray(response.data)) { return response.data as WarningTask[]; } if (Array.isArray(response)) { return response as WarningTask[]; } } return []; }; // ==================== 扣分明细类型 ==================== export interface DelayDeductionItem { taskId: number; taskNo: string; taskTitle: string; taskScore: number; deadline: string; actualEndTime: string; overdueHours: number; deductionScore: number; deductionReason: string; } export interface ProgressDeductionItem { taskId: number; taskNo: string; taskTitle: string; deductionDate: string; deductionScore: number; reason: string; } export interface DeductionDetail { totalDeduction: number; delayDeductions: DelayDeductionItem[]; progressDeductions: ProgressDeductionItem[]; } /** * 获取设计师扣分明细 */ export const getDesignerDeductionDetails = async ( userId: number, month?: string ): Promise => { const params: any = { userId }; if (month) params.month = month; const response = await request.get('/analytics/designer-deduction-details', { params }); if (response && typeof response === 'object') { if ('data' in response && response.data !== undefined && response.data !== null) { return response.data as DeductionDetail; } if ('totalDeduction' in response || 'delayDeductions' in response) { return response as unknown as DeductionDetail; } } return { totalDeduction: 0, delayDeductions: [], progressDeductions: [] }; };