using Model; using Model.Dto.Inspection; using Model.Entity.Asset; using Model.Entity.Inspection; using ORM; using Service.Interface; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Service.Implement { /// /// 统计报表 服务实现 /// public class StatisticsReportService : IStatisticsReportService { #region 设备统计报表 /// /// 设备统计概览(总数/在用/闲置/报废等) /// public async Task> GetDeviceStatisticsAsync() { try { var query = SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0); var all = await query.ToListAsync(); var total = all.Count; var dto = new DeviceStatisticsDto { Total = total, InUse = all.Count(x => x.Status == EquipmentStatusEnum.InUse), Idle = all.Count(x => x.Status == EquipmentStatusEnum.Idle), Scrapped = all.Count(x => x.Status == EquipmentStatusEnum.Disposed || x.Status == EquipmentStatusEnum.PendingDisposal), Repairing = all.Count(x => x.Status == EquipmentStatusEnum.Repairing), Suspended = all.Count(x => x.Status == EquipmentStatusEnum.Suspended), Other = all.Count(x => x.Status != EquipmentStatusEnum.InUse && x.Status != EquipmentStatusEnum.Idle && x.Status != EquipmentStatusEnum.Disposed && x.Status != EquipmentStatusEnum.PendingDisposal && x.Status != EquipmentStatusEnum.Repairing && x.Status != EquipmentStatusEnum.Suspended) }; return Result.Success(dto); } catch (Exception ex) { return Result.Error("查询设备统计失败", ex); } } /// /// 按分类统计设备数量 /// public async Task>> GetCategoryStatisticsAsync() { try { var list = await SqlSugarContext.DbContext.Queryable() .LeftJoin((e, c) => e.CategoryId == c.Id) .Where((e, c) => e.IsDel == 0) .GroupBy((e, c) => new { c.Name }) .Select((e, c) => new CategoryStatisticsDto { CategoryName = c.Name, Count = SqlFunc.AggregateCount(e.Id) }) .ToListAsync(); return Result>.Success(list); } catch (Exception ex) { return Result>.Error("查询分类统计失败", ex); } } /// /// 按部门统计设备数量 /// public async Task>> GetDepartmentStatisticsAsync() { try { var list = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0) .GroupBy(x => x.Department) .Select(x => new DepartmentStatisticsDto { Department = x.Department, Count = SqlFunc.AggregateCount(x.Id) }) .OrderByDescending(x => x.Count) .ToListAsync(); return Result>.Success(list); } catch (Exception ex) { return Result>.Error("查询部门统计失败", ex); } } #endregion #region 设备维护报表 /// /// 设备维护统计(校准/保养及时率、超期数量等) /// public async Task> GetMaintenanceStatisticsAsync() { try { var all = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0) .ToListAsync(); var total = all.Count; var calNormal = all.Count(x => x.CalibrationStatus == ComplianceStatusEnum.Normal); var calOverdue = all.Count(x => x.CalibrationStatus == ComplianceStatusEnum.Overdue); var maintNormal = all.Count(x => x.MaintenanceStatus == ComplianceStatusEnum.Normal); var maintOverdue = all.Count(x => x.MaintenanceStatus == ComplianceStatusEnum.Overdue); var dto = new MaintenanceStatisticsDto { Total = total, CalibrationNormal = calNormal, CalibrationOverdue = calOverdue, MaintenanceNormal = maintNormal, MaintenanceOverdue = maintOverdue, CalibrationTimelyRate = total > 0 ? Math.Round((decimal)calNormal / total * 100, 1) : 0, MaintenanceTimelyRate = total > 0 ? Math.Round((decimal)maintNormal / total * 100, 1) : 0 }; return Result.Success(dto); } catch (Exception ex) { return Result.Error("查询维护统计失败", ex); } } /// /// 维护超期设备明细 /// public async Task>> GetMaintenanceOverdueDetailsAsync() { try { var now = DateTime.Now; var list = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0 && (x.CalibrationStatus == ComplianceStatusEnum.Overdue || x.MaintenanceStatus == ComplianceStatusEnum.Overdue)) .ToListAsync(); var details = new List(); foreach (var eq in list) { if (eq.CalibrationStatus == ComplianceStatusEnum.Overdue && eq.NextCalibrationDate.HasValue) { var days = (int)(now - eq.NextCalibrationDate.Value).TotalDays; details.Add(new MaintenanceOverdueDetailDto { EquipmentCode = eq.Code, EquipmentName = eq.Name, Department = eq.Department, OverdueType = "校准超期", ExpireDate = eq.NextCalibrationDate, OverdueDays = days > 0 ? days : 0 }); } if (eq.MaintenanceStatus == ComplianceStatusEnum.Overdue && eq.NextMaintenanceDate.HasValue) { var days = (int)(now - eq.NextMaintenanceDate.Value).TotalDays; details.Add(new MaintenanceOverdueDetailDto { EquipmentCode = eq.Code, EquipmentName = eq.Name, Department = eq.Department, OverdueType = "保养超期", ExpireDate = eq.NextMaintenanceDate, OverdueDays = days > 0 ? days : 0 }); } } return Result>.Success(details); } catch (Exception ex) { return Result>.Error("查询维护超期明细失败", ex); } } #endregion #region 维修类报表 /// /// 维修统计概览 /// public async Task> GetRepairStatisticsAsync() { try { var all = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0) .ToListAsync(); var total = all.Count; var completed = all.Count(x => x.RepairStatus == "已完成"); var inProgress = all.Count(x => x.RepairStatus == "维修中"); var pending = all.Count(x => x.RepairStatus == "待维修"); var totalHours = all.Where(x => x.RepairHours.HasValue).Sum(x => x.RepairHours ?? 0); var completedWithHours = all.Where(x => x.RepairHours.HasValue && x.RepairStatus == "已完成").ToList(); var avgHours = completedWithHours.Count > 0 ? Math.Round(completedWithHours.Sum(x => x.RepairHours ?? 0) / completedWithHours.Count, 1) : 0; var totalCost = all.Where(x => x.RepairCost.HasValue).Sum(x => x.RepairCost ?? 0); var dto = new RepairStatisticsDto { Total = total, Completed = completed, InProgress = inProgress, Pending = pending, AvgRepairHours = avgHours, TotalRepairHours = totalHours, TotalRepairCost = totalCost }; return Result.Success(dto); } catch (Exception ex) { return Result.Error("查询维修统计失败", ex); } } /// /// 故障类型分布 /// public async Task>> GetFaultTypeDistributionAsync() { try { var list = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0) .GroupBy(x => x.FaultType) .Select(x => new FaultTypeDistributionDto { FaultType = x.FaultType, Count = SqlFunc.AggregateCount(x.Id) }) .OrderByDescending(x => x.Count) .ToListAsync(); return Result>.Success(list); } catch (Exception ex) { return Result>.Error("查询故障类型分布失败", ex); } } /// /// 维修工时分析 /// public async Task>> GetRepairHoursAnalysisAsync() { try { var list = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0 && x.RepairHours.HasValue) .GroupBy(x => x.FaultType) .Select(x => new RepairHoursAnalysisDto { FaultType = x.FaultType, AvgHours = SqlFunc.AggregateAvg(x.RepairHours) ?? 0, MaxHours = SqlFunc.AggregateMax(x.RepairHours) ?? 0, MinHours = SqlFunc.AggregateMin(x.RepairHours) ?? 0, Count = SqlFunc.AggregateCount(x.Id) }) .OrderByDescending(x => x.AvgHours) .ToListAsync(); return Result>.Success(list); } catch (Exception ex) { return Result>.Error("查询维修工时分析失败", ex); } } /// /// 维修记录明细列表 /// public async Task>> GetRepairRecordDetailsAsync() { try { var list = await SqlSugarContext.DbContext.Queryable() .Where(x => x.IsDel == 0) .OrderByDescending(x => x.CreateTime) .Select(x => new RepairRecordDetailDto { EquipmentCode = x.EquipmentCode, EquipmentName = x.EquipmentName, FaultType = x.FaultType, FaultDescription = x.FaultDescription, ReportDate = x.ReportDate, RepairEndDate = x.RepairEndDate, RepairHours = x.RepairHours, RepairPerson = x.RepairPerson, RepairCost = x.RepairCost, RepairStatus = x.RepairStatus }) .ToListAsync(); return Result>.Success(list); } catch (Exception ex) { return Result>.Error("查询维修记录明细失败", ex); } } #endregion } }