using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; using YD_YiLu.Api.WebSockets; using YD_YiLu.Commons.Dto.WebSockets; namespace YD_YiLu.Api.Controllers { [Route("device/remind")] [ApiController] public class DeviceRemindController : ControllerBase { private readonly ICameraDeviceSocketRegistry _registry; private readonly ILogger _logger; public DeviceRemindController(ICameraDeviceSocketRegistry registry, ILogger logger) { _registry = registry; _logger = logger; } /// /// 向单个设备发送提醒命令 /// [HttpPost("single")] public async Task RemindSingle([FromQuery] string serialNumber, [FromQuery] int remindType, [FromQuery] string remindMessage) { if (!_registry.TryGet(serialNumber, out var socket)) { return NotFound($"设备 {serialNumber} 未在线"); } var msg = CreateRemindMessage(remindType, remindMessage); try { await CameraDeviceWebSocketHandler.SendAsync(socket, msg, HttpContext.RequestAborted); _logger.LogInformation("📢 已发送提醒给设备 {0}: {1}", serialNumber, remindMessage); return Ok("提醒已发送"); } catch (Exception ex) { _logger.LogError(ex, "发送提醒失败"); return StatusCode(500, "发送失败"); } } /// /// 批量向多个设备发送提醒命令 /// [HttpPost("batch")] public async Task RemindBatch([FromBody] BatchRemindRequest request) { if (request.SerialNumbers == null || request.SerialNumbers.Count == 0) return BadRequest("serialNumbers不能为空"); var tasks = new List(); var failed = new List(); var msg = CreateRemindMessage(request.RemindType, request.RemindMessage); foreach (var sn in request.SerialNumbers) { if (_registry.TryGet(sn, out var socket)) { tasks.Add(CameraDeviceWebSocketHandler.SendAsync(socket, msg, HttpContext.RequestAborted)); } else { failed.Add(sn); } } try { await Task.WhenAll(tasks); _logger.LogInformation("📢 已发送提醒给设备: 成功{0}台, 失败{1}台", tasks.Count, failed.Count); return Ok(new { SuccessCount = tasks.Count, FailedDevices = failed }); } catch (Exception ex) { _logger.LogError(ex, "批量发送提醒失败"); return StatusCode(500, "批量发送失败"); } } /// /// 构建 station:remind 消息 /// private string CreateRemindMessage(int remindType, string remindMessage) { var msg = new JObject { ["msgId"] = Guid.NewGuid().ToString("N"), ["request"] = "station:remind", ["code"] = 0, ["msg"] = "", ["data"] = new JObject { ["remindType"] = remindType, ["remindMessage"] = remindMessage, ["time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") } }; return msg.ToString(); } } }