using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_S7Simulator.Server.Services;
namespace WIDESEAWCS_S7Simulator.Server.Controllers;
///
/// 机械手客户端管理接口(主动连接模式)。
///
[ApiController]
[Route("api/[controller]")]
public class RobotClientsController : ControllerBase
{
private readonly IRobotClientManager _robotClientManager;
private readonly ILogger _logger;
public RobotClientsController(IRobotClientManager robotClientManager, ILogger logger)
{
_robotClientManager = robotClientManager;
_logger = logger;
}
[HttpGet("status")]
[ProducesResponseType(typeof(RobotServerCollectionStatusResponse), StatusCodes.Status200OK)]
public async Task> GetStatus()
{
var status = await _robotClientManager.GetStatusAsync();
return Ok(status);
}
[HttpPost("start")]
[ProducesResponseType(typeof(RobotServerCollectionStatusResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task> Start([FromBody] RobotServerStartRequest request)
{
try
{
var status = await _robotClientManager.StartAsync(request, HttpContext.RequestAborted);
return Ok(status);
}
catch (ArgumentException ex)
{
return BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "启动机械手客户端实例失败");
return StatusCode(StatusCodes.Status500InternalServerError, new { error = "启动机械手客户端实例失败" });
}
}
[HttpPost("stop")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task Stop([FromQuery] string? serverId = null)
{
await _robotClientManager.StopAsync(serverId);
return Ok(new { message = string.IsNullOrWhiteSpace(serverId) ? "机械手客户端已全部停止" : $"机械手客户端 {serverId} 已停止" });
}
[HttpPost("send")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task Send([FromBody] RobotServerSendRequest request)
{
if (string.IsNullOrWhiteSpace(request.Message))
{
return BadRequest(new { error = "发送内容不能为空" });
}
try
{
if (string.IsNullOrWhiteSpace(request.ServerId))
{
return BadRequest(new { error = "ServerId 不能为空" });
}
if (request.ClientId.HasValue)
{
await _robotClientManager.SendToClientAsync(request.ServerId, request.ClientId.Value, request.Message);
}
else
{
await _robotClientManager.SendToAllAsync(request.ServerId, request.Message);
}
return Ok(new { message = "发送成功" });
}
catch (InvalidOperationException ex)
{
return BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "发送机械手客户端消息失败");
return StatusCode(StatusCodes.Status500InternalServerError, new { error = "发送机械手客户端消息失败" });
}
}
///
/// 清空指定客户端实例的消息日志。
///
[HttpPost("clear-received")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task ClearReceived([FromQuery] string serverId)
{
if (string.IsNullOrWhiteSpace(serverId))
{
return BadRequest(new { error = "ServerId 不能为空" });
}
try
{
await _robotClientManager.ClearReceivedMessagesAsync(serverId);
return Ok(new { message = $"实例 {serverId} 的接收消息已清空" });
}
catch (InvalidOperationException ex)
{
return BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
_logger.LogError(ex, "清空接收消息失败");
return StatusCode(StatusCodes.Status500InternalServerError, new { error = "清空接收消息失败" });
}
}
}