Your Name 30f9a3e735 feat: 优化数据分析页面
- 支持月份选择器,可查看指定月份数据
- 新增4个Tab:需求分析、设计师绩效、流程效率、预警监控
- 核心指标卡片:总任务数、待处理、进行中、已完成、完成率、准时率
- 设计师绩效:接单量、完成量、准时率、好评率、工作负载排行
- 流程效率:各环节耗时分析、瓶颈识别、环比对比
- 预警监控:超时预警、即将超时、长期未接单、审批滞后
- 后端新增3个API:设计师绩效、流程效率、预警任务
2026-01-04 08:57:45 +08:00

353 lines
8.3 KiB
TypeScript

import request from '@/utils/request';
// 需求统计数据类型定义
export interface UserDemandStat {
userId: number;
userName: 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;
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<DemandStatistics> => {
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<DesignerPerformance> => {
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<ProcessEfficiency> => {
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<WarningTask[]> => {
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 [];
};