feat: complete phase 3 reporting, logging, cancel counting, and settings
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user