/
afanasevn
/
MaxSystems
Обзор
Документация
Войти
/
afanasevn
/
MaxSystems
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/MaxSystems.Infrastructure/Services/ReportService.cs
102 строки
4 KB
IBS\NAfanasev
Integration Event Bus
22 июн 2026, 17:01
22 июн 2026, 17:01
83907da
Код
Авторство
О чём код?
using MaxSystems.Application.Abstractions; using MaxSystems.Application.Contracts.Dashboard; using MaxSystems.Application.Contracts.Works; using MaxSystems.Domain.Enums; using MaxSystems.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace MaxSystems.Infrastructure.Services; /// <summary>Агрегированные KPI и списки для дашборда портала.</summary> public sealed class ReportService(AppDbContext db) : IReportService { /// <inheritdoc /> public async Task<DashboardStatsDto> GetDashboardStatsAsync(CancellationToken ct = default) { var today = DateTime.UtcNow.Date; var monthAhead = today.AddDays(30); var equipmentTotal = await db.Equipment.CountAsync( x => x.Status != EquipmentStatus.Decommissioned, ct); var equipmentFaulty = await db.Equipment.CountAsync( x => x.Status == EquipmentStatus.Faulty, ct); var worksOverdue = await db.Works.CountAsync( x => x.PlannedDate < today && x.Status != WorkStatus.Closed && x.Status != WorkStatus.Cancelled && x.Status != WorkStatus.Done, ct); var maintenanceOverdue = await db.Equipment.CountAsync( x => x.NextMaintenance < today && x.Status != EquipmentStatus.Decommissioned, ct); var maintenanceUpcoming = await db.Works.CountAsync( x => x.Type == WorkType.Maintenance && x.PlannedDate >= today && x.PlannedDate <= monthAhead && x.Status != WorkStatus.Closed && x.Status != WorkStatus.Cancelled, ct); var lowStock = await db.WarehouseItems.CountAsync( x => x.Quantity < x.MinQuantity, ct); var zeroStock = await db.WarehouseItems.CountAsync( x => x.Quantity == 0, ct); var worksWithoutChecklist = await db.Works.CountAsync( x => x.Type == WorkType.Maintenance && x.Status == WorkStatus.Closed && x.Checklist == null && (x.System == EquipmentSystem.Ups || x.System == EquipmentSystem.Acs), ct); var openWorks = await db.Works.CountAsync( x => x.Status != WorkStatus.Closed && x.Status != WorkStatus.Cancelled, ct); var lowStockItems = await db.WarehouseItems .Where(x => x.Quantity < x.MinQuantity) .OrderBy(x => x.Quantity) .Take(10) .Select(x => new LowStockItemDto(x.Id, x.Name, x.Quantity, x.MinQuantity)) .ToListAsync(ct); var overdueWorks = await db.Works .Where(x => x.PlannedDate < today && x.Status != WorkStatus.Closed && x.Status != WorkStatus.Cancelled && x.Status != WorkStatus.Done) .OrderBy(x => x.PlannedDate) .Take(10) .Select(x => new WorkListItemDto( x.Id, x.Number, x.Title, x.Type, x.System, x.Status, x.PlannedDate, x.Priority, null, true)) .ToListAsync(ct); var overdueMaintenance = await db.Equipment .Where(x => x.NextMaintenance < today && x.Status != EquipmentStatus.Decommissioned) .OrderBy(x => x.NextMaintenance) .Take(10) .Select(x => new EquipmentListItemDto( x.Id, x.Name, x.System, x.Location, x.NextMaintenance)) .ToListAsync(ct); return new DashboardStatsDto( equipmentTotal, equipmentFaulty, worksOverdue, maintenanceOverdue, maintenanceUpcoming, lowStock, zeroStock, worksWithoutChecklist, openWorks, overdueWorks, overdueMaintenance, lowStockItems); } }