using System; using System.Collections.Generic; using CncModels.Dto.Dashboard; using CncRepository.Interface; using CncService.Interface; namespace CncService.Impl { /// /// 仪表盘实现 /// public class DashboardService : IDashboardService { private readonly IDashboardRepository _dashboardRepository; private readonly ICollectorHeartbeatRepository _collectorHeartbeatRepository; private readonly IWindowsServiceChecker _serviceChecker; public DashboardService(IDashboardRepository dashboardRepository, ICollectorHeartbeatRepository collectorHeartbeatRepository, IWindowsServiceChecker serviceChecker = null) { _dashboardRepository = dashboardRepository ?? throw new ArgumentNullException(nameof(dashboardRepository)); _collectorHeartbeatRepository = collectorHeartbeatRepository ?? throw new ArgumentNullException(nameof(collectorHeartbeatRepository)); _serviceChecker = serviceChecker; } /// public DashboardSummaryResponse GetSummary() { return _dashboardRepository.GetSummary(); } /// public List GetWorkshopProduction(DateTime? startDate, DateTime? endDate) { var s = startDate ?? DateTime.Today; var e = endDate ?? DateTime.Today; return _dashboardRepository.GetWorkshopProduction(s, e); } /// public List GetMachineRank(DateTime? startDate, DateTime? endDate, int top = 10) { var s = startDate ?? DateTime.Today; var e = endDate ?? DateTime.Today; return _dashboardRepository.GetMachineRank(s, e, top); } /// public List GetWorkerRank(DateTime? startDate, DateTime? endDate, int top = 10) { var s = startDate ?? DateTime.Today; var e = endDate ?? DateTime.Today; return _dashboardRepository.GetWorkerRank(s, e, top); } /// public object GetProductionTrend(int days = 7) { return _dashboardRepository.GetProductionTrend(days); } /// public object GetMachineStatusDistribution() { return _dashboardRepository.GetMachineStatusDistribution(); } /// public List GetRecentAlerts(int count = 5) { return _dashboardRepository.GetRecentAlerts(count); } /// public object GetCollectorStatus() { var latest = _collectorHeartbeatRepository.GetLatest("collector-service"); // 心跳超时阈值:90秒(3个心跳间隔,采集服务默认每30秒上报一次) const int heartbeatTimeoutSeconds = 90; bool heartbeatRunning = false; long heartbeatUptime = 0; DateTime? lastCollectTime = latest?.LastCollectTime; if (latest != null && latest.Status == "running") { var lastHeartbeat = latest.CreatedAt; var elapsed = (DateTime.Now - lastHeartbeat).TotalSeconds; heartbeatRunning = elapsed <= heartbeatTimeoutSeconds; if (heartbeatRunning) heartbeatUptime = latest.UptimeSeconds ?? 0; } // 额外的 Windows 服务状态 string serviceStatusText = "NotInstalled"; if (_serviceChecker != null) { var svc = _serviceChecker.GetServiceStatus("collector-service"); serviceStatusText = svc.ToString(); } // 组合状态:NotInstalled -> 停止,其他根据心跳决定 string status = (serviceStatusText == "NotInstalled") ? "stopped" : (heartbeatRunning ? "running" : "stopped"); return new { status, uptimeSeconds = heartbeatRunning ? heartbeatUptime : 0, lastCollectTime, serviceStatus = serviceStatusText, serviceName = "collector-service", serviceMessage = (string)null }; } } }