using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace SHH.CameraSdk; /// /// 视频源实时状态监控 API 控制器 /// 核心功能:提供相机设备遥测数据查询、单设备详情查询、系统日志查询 /// [ApiController] [Route("api/monitor")] // [建议] 显式指定路由为小写,确保与前端 ${API}/monitor/... 匹配 public class MonitorController : ControllerBase { #region --- 依赖注入 (Dependency Injection) --- private readonly CameraManager _cameraManager; private readonly IStorageService _storage; // [新增] 存储服务引用 /// /// 构造函数:注入 CameraManager 和 IStorageService /// public MonitorController(CameraManager cameraManager, IStorageService storage) { _cameraManager = cameraManager; _storage = storage; } #endregion #region --- API 接口定义 (API Endpoints) --- /// /// 获取全量相机实时遥测数据快照 /// 适用场景:监控大屏首页数据看板 /// [HttpGet("dashboard")] public IActionResult GetDashboard() { var telemetrySnapshot = _cameraManager.GetTelemetrySnapshot(); return Ok(telemetrySnapshot); } /// /// 获取指定相机的详细运行指标 /// [HttpGet("{id}")] public IActionResult GetDeviceDetail(long id) { var device = _cameraManager.GetDevice(id); if (device == null) return NotFound($"设备 ID: {id} 不存在"); return Ok(new { device.Id, device.Status, device.IsOnline, device.RealFps, device.TotalFrames, device.Config.Name, device.Config.IpAddress }); } /// /// 获取指定相机的实时截图 /// [HttpGet("snapshot/{id}")] public async Task GetSnapshot(long id) { // 假设您有 SnapshotCoordinator 单例,此处保留原逻辑 var imageBytes = await SnapshotCoordinator.Instance.RequestSnapshotAsync(id, 2000); if (imageBytes == null) { return StatusCode(StatusCodes.Status504GatewayTimeout, "截图请求超时或设备未响应"); } return File(imageBytes, "image/jpeg"); } /// /// 获取指定相机的深度诊断信息(包含持久化的审计日志) /// [HttpGet("diagnose/{id}")] public async Task GetDeviceDiagnostic(long id) { var device = _cameraManager.GetDevice(id); if (device == null) return NotFound("设备不存在"); // [修正] 改为从 StorageService 读取文件日志 // 这样即使重启程序,历史日志也能查到 var logs = await _storage.GetDeviceLogsAsync((int)id, 50); return Ok(new { // 基础信息 Id = device.Id, Status = device.Status.ToString(), RealFps = device.RealFps, TotalFrames = device.TotalFrames, // 实时状态 BasicInfo = device.Config, RealTimeStats = new { device.RealFps, device.TotalFrames, device.IsPhysicalOnline, device.Width, device.Height }, // [关键] 持久化日志 AuditLogs = logs }); } #endregion /// /// 获取系统操作日志(读取最新的 50 条) /// [HttpGet("system-logs")] public async Task GetSystemLogs() { // [修正] 彻底废弃手动读文件,改用 Service // Service 内部会自动处理锁、路径 (App_Data/Process_X/system.log) 和异常 var logs = await _storage.GetSystemLogsAsync(50); return Ok(logs); } }