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);
}
}