52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
import prisma from '@/lib/prisma';
|
|
import { NextResponse } from 'next/server';
|
|
|
|
export async function GET() {
|
|
try {
|
|
const users = await prisma.user.findMany({
|
|
include: {
|
|
countings: true
|
|
}
|
|
});
|
|
|
|
const report = users.map(user => {
|
|
const counts = user.countings || [];
|
|
const totalCounted = counts.length;
|
|
|
|
// Calculate discrepancies (assuming old_count !== new_count)
|
|
const discrepancies = counts.filter(c => c.old_count !== c.new_count).length;
|
|
|
|
// Calculate total cancelled
|
|
const cancelled = counts.filter(c => c.status === 'CANCELLED').length;
|
|
|
|
// Unique shelves visited
|
|
const uniqueShelves = new Set(counts.map(c => c.shelfCode).filter(Boolean)).size;
|
|
|
|
return {
|
|
id: user.id,
|
|
name: user.name || user.username,
|
|
totalCounted,
|
|
discrepancies,
|
|
cancelled,
|
|
uniqueShelves,
|
|
accuracy: totalCounted > 0 ? (((totalCounted - discrepancies) / totalCounted) * 100).toFixed(1) : 0
|
|
};
|
|
}).filter(u => u.totalCounted > 0);
|
|
|
|
// Sort top performers by totalCounted
|
|
const topPerformers = [...report].sort((a, b) => b.totalCounted - a.totalCounted).slice(0, 5);
|
|
|
|
// Sort most discrepancies
|
|
const mostDiscrepancies = [...report].sort((a, b) => b.discrepancies - a.discrepancies).slice(0, 5);
|
|
|
|
return NextResponse.json({
|
|
topPerformers,
|
|
mostDiscrepancies,
|
|
all: report.sort((a, b) => b.totalCounted - a.totalCounted)
|
|
});
|
|
} catch (error) {
|
|
console.error('Fetch leaderboard error:', error);
|
|
return NextResponse.json({ error: 'خطا در دریافت گزارش' }, { status: 500 });
|
|
}
|
|
}
|