YD_YiLu.Api/YD_YiLu/Controllers/DeviceRemindController.cs
2026-04-02 11:42:03 +08:00

109 lines
3.7 KiB
C#

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<DeviceRemindController> _logger;
public DeviceRemindController(ICameraDeviceSocketRegistry registry, ILogger<DeviceRemindController> logger)
{
_registry = registry;
_logger = logger;
}
/// <summary>
/// 向单个设备发送提醒命令
/// </summary>
[HttpPost("single")]
public async Task<IActionResult> 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, "发送失败");
}
}
/// <summary>
/// 批量向多个设备发送提醒命令
/// </summary>
[HttpPost("batch")]
public async Task<IActionResult> RemindBatch([FromBody] BatchRemindRequest request)
{
if (request.SerialNumbers == null || request.SerialNumbers.Count == 0)
return BadRequest("serialNumbers不能为空");
var tasks = new List<Task>();
var failed = new List<string>();
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, "批量发送失败");
}
}
/// <summary>
/// 构建 station:remind 消息
/// </summary>
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();
}
}
}