2026-03-27 10:53:02 +08:00
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
|
using YD_YiLu.Api.WebSockets;
|
2026-04-02 11:42:03 +08:00
|
|
|
|
using YD_YiLu.Commons.Dto.WebSockets;
|
2026-03-27 10:53:02 +08:00
|
|
|
|
|
|
|
|
|
|
namespace YD_YiLu.Api.Controllers
|
|
|
|
|
|
{
|
2026-04-02 11:42:03 +08:00
|
|
|
|
[Route("device/remind")]
|
2026-03-27 10:53:02 +08:00
|
|
|
|
[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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|