You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/src/CncService/Impl/DashboardService.cs

117 lines
4.3 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using CncModels.Dto.Dashboard;
using CncRepository.Interface;
using CncService.Interface;
namespace CncService.Impl
{
/// <summary>
/// 仪表盘实现
/// </summary>
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;
}
/// <inheritdoc/>
public DashboardSummaryResponse GetSummary()
{
return _dashboardRepository.GetSummary();
}
/// <inheritdoc/>
public List<WorkshopProductionResponse> GetWorkshopProduction(DateTime? startDate, DateTime? endDate)
{
var s = startDate ?? DateTime.Today;
var e = endDate ?? DateTime.Today;
return _dashboardRepository.GetWorkshopProduction(s, e);
}
/// <inheritdoc/>
public List<MachineRankResponse> GetMachineRank(DateTime? startDate, DateTime? endDate, int top = 10)
{
var s = startDate ?? DateTime.Today;
var e = endDate ?? DateTime.Today;
return _dashboardRepository.GetMachineRank(s, e, top);
}
/// <inheritdoc/>
public List<WorkerRankResponse> GetWorkerRank(DateTime? startDate, DateTime? endDate, int top = 10)
{
var s = startDate ?? DateTime.Today;
var e = endDate ?? DateTime.Today;
return _dashboardRepository.GetWorkerRank(s, e, top);
}
/// <inheritdoc/>
public object GetProductionTrend(int days = 7)
{
return _dashboardRepository.GetProductionTrend(days);
}
/// <inheritdoc/>
public object GetMachineStatusDistribution()
{
return _dashboardRepository.GetMachineStatusDistribution();
}
/// <inheritdoc/>
public List<AlertListItem> GetRecentAlerts(int count = 5)
{
return _dashboardRepository.GetRecentAlerts(count);
}
/// <inheritdoc/>
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
};
}
}
}