using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Web.Http; using CncModels.Dto; using CncModels.Dto.Dashboard; using CncService.Interface; using CncWebApi.Infrastructure; using Newtonsoft.Json; namespace CncWebApi.Controllers { /// /// 仪表盘控制器 /// [RoutePrefix("api/admin/dashboard")] [JwtAuthFilter] public class DashboardController : ApiController { private readonly IDashboardService _dashboardService; private static readonly HttpClient _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(10) }; /// /// 构造函数 /// public DashboardController(IDashboardService dashboardService) { _dashboardService = dashboardService; } /// /// 8个统计卡片数据 /// GET /api/admin/dashboard/summary /// [HttpGet] [Route("summary")] public IHttpActionResult GetSummary() { var result = _dashboardService.GetSummary(); return Ok(ApiResponse.Success(result)); } /// /// 车间平均单机产量 /// GET /api/admin/dashboard/workshop-production /// [HttpGet] [Route("workshop-production")] public IHttpActionResult GetWorkshopProduction(DateTime? startDate = null, DateTime? endDate = null) { var result = _dashboardService.GetWorkshopProduction(startDate, endDate); return Ok(ApiResponse.Success(new { items = result })); } /// /// 机床产量排行TOP10 /// GET /api/admin/dashboard/machine-rank /// [HttpGet] [Route("machine-rank")] public IHttpActionResult GetMachineRank(DateTime? startDate = null, DateTime? endDate = null, int top = 10) { var result = _dashboardService.GetMachineRank(startDate, endDate, top); return Ok(ApiResponse.Success(new { items = result })); } /// /// 工人产量排行TOP10 /// GET /api/admin/dashboard/worker-rank /// [HttpGet] [Route("worker-rank")] public IHttpActionResult GetWorkerRank(DateTime? startDate = null, DateTime? endDate = null, int top = 10) { var result = _dashboardService.GetWorkerRank(startDate, endDate, top); return Ok(ApiResponse.Success(new { items = result })); } /// /// 产量趋势(近7天) /// GET /api/admin/dashboard/trend /// [HttpGet] [Route("trend")] public IHttpActionResult GetProductionTrend(int days = 7) { var result = _dashboardService.GetProductionTrend(days); return Ok(ApiResponse.Success(result)); } /// /// 机床状态分布 /// GET /api/admin/dashboard/machine-status-distribution /// [HttpGet] [Route("machine-status-distribution")] public IHttpActionResult GetMachineStatusDistribution() { var result = _dashboardService.GetMachineStatusDistribution(); return Ok(ApiResponse.Success(result)); } /// /// 最新5条告警 /// GET /api/admin/dashboard/recent-alerts /// [HttpGet] [Route("recent-alerts")] public IHttpActionResult GetRecentAlerts(int count = 5) { var result = _dashboardService.GetRecentAlerts(count); return Ok(ApiResponse.Success(new { items = result })); } /// /// 采集服务状态 /// GET /api/admin/collector/status /// [HttpGet] [Route("~/api/admin/collector/status")] public IHttpActionResult GetCollectorStatus() { var result = _dashboardService.GetCollectorStatus(); return Ok(ApiResponse.Success(result)); } /// /// 启动采集服务(转发到CncCollector的5800端口) /// POST /api/admin/collector/start /// [HttpPost] [Route("~/api/admin/collector/start")] public IHttpActionResult StartCollector() { return ForwardToCollector("/api/collector/start"); } /// /// 停止采集服务 /// POST /api/admin/collector/stop /// [HttpPost] [Route("~/api/admin/collector/stop")] public IHttpActionResult StopCollector() { return ForwardToCollector("/api/collector/stop"); } /// /// 刷新采集服务配置 /// POST /api/admin/collector/refresh /// [HttpPost] [Route("~/api/admin/collector/refresh")] public IHttpActionResult RefreshCollectorConfig() { return ForwardToCollector("/api/collector/refresh"); } /// /// 转发请求到采集服务 /// private IHttpActionResult ForwardToCollector(string path) { try { var request = new HttpRequestMessage(HttpMethod.Post, $"http://localhost:5800{path}"); request.Headers.Add("X-Api-Key", "collector_api_key_2026"); var response = _httpClient.SendAsync(request).Result; var body = response.Content.ReadAsStringAsync().Result; return Ok(ApiResponse.Success(new { forwarded = true, collectorResponse = JsonConvert.DeserializeObject(body) })); } catch (Exception ex) { return Ok(ApiResponse.Success(new { forwarded = false, error = ex.Message })); } } } }