wanshenmean
4 天以前 64a2aa2301946f777659239247233e47ad1e3076
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_S7Simulator.Server.Services;
 
namespace WIDESEAWCS_S7Simulator.Server.Controllers;
 
/// <summary>
/// 机械手客户端管理接口(主动连接模式)。
/// </summary>
[ApiController]
[Route("api/[controller]")]
public class RobotClientsController : ControllerBase
{
    private readonly IRobotClientManager _robotClientManager;
    private readonly ILogger<RobotClientsController> _logger;
 
    public RobotClientsController(IRobotClientManager robotClientManager, ILogger<RobotClientsController> logger)
    {
        _robotClientManager = robotClientManager;
        _logger = logger;
    }
 
    [HttpGet("status")]
    [ProducesResponseType(typeof(RobotServerCollectionStatusResponse), StatusCodes.Status200OK)]
    public async Task<ActionResult<RobotServerCollectionStatusResponse>> GetStatus()
    {
        var status = await _robotClientManager.GetStatusAsync();
        return Ok(status);
    }
 
    [HttpPost("start")]
    [ProducesResponseType(typeof(RobotServerCollectionStatusResponse), StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public async Task<ActionResult<RobotServerCollectionStatusResponse>> 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<ActionResult> 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<ActionResult> 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 = "发送机械手客户端消息失败" });
        }
    }
 
    /// <summary>
    /// 清空指定客户端实例的消息日志。
    /// </summary>
    [HttpPost("clear-received")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public async Task<ActionResult> 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 = "清空接收消息失败" });
        }
    }
}