using Microsoft.AspNetCore.Mvc; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK; using Microsoft.AspNetCore.SignalR; using HTEX.Complex.Services; using System.Text.Json; using TEAMModelOS.SDK.Extension; namespace HTEX.Complex.Controllers { [ApiController] [Route("api/screen")] public class ScreenController : ControllerBase { private readonly DingDing _dingDing; private readonly IHttpClientFactory _httpClient; private readonly IConfiguration _configuration; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; private readonly IHubContext _screenServerHub; private readonly ILogger _logger; public ScreenController(AzureRedisFactory azureRedis, IHttpClientFactory httpClient, IConfiguration configuration, AzureStorageFactory azureStorage, DingDing dingDing, IHubContext screenServerHub , ILogger logger) { _httpClient = httpClient; _configuration = configuration; _azureStorage = azureStorage; _dingDing = dingDing; _azureRedis=azureRedis; _screenServerHub = screenServerHub; _logger = logger; } /// /// 外部触发任务发送 /// /// [HttpPost("send-task")] public async Task SendTask(JsonElement json) { var values = await _azureRedis.GetRedisClient(8).HashGetAllAsync("ScreenApi:clients"); if (values!=null) { foreach (var value in values) { ScreenClient screenClient = value.Value.ToString().ToObject(); //先检查状态是否是在忙碌,在时间戳范围里,如果不在时间戳范围,强制free。 if (!screenClient.status!.Equals(ScreenConstant.idle) && screenClient.last_time + screenClient.timeout+ screenClient.delay + ScreenConstant.time_excess < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()) { screenClient.status = ScreenConstant.idle; } if (screenClient.status!.Equals(ScreenConstant.idle) && !string.IsNullOrWhiteSpace(screenClient.connid)) { _logger.LogInformation($"客户端当前空闲=>{screenClient.name},{screenClient.region},{screenClient.clientid},分发任务......"); //连接成功,马上分发任务。 var task = await TaskService.SentTask(_azureRedis, _azureStorage); if (task.genQueue!=null && task.genRedis!=null && !string.IsNullOrWhiteSpace(task.genQueue.cntName)) { screenClient.status = ScreenConstant.busy; screenClient.last_time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); await _screenServerHub.Clients.Client(screenClient.connid!).SendAsync("ReceiveMessage", new ScreenProcessMessage { connid = screenClient.connid, clientid =screenClient.clientid, status = ScreenConstant.busy, grant_type =screenClient.grant_type, message_type= MessageType.task_send_success, content =$"{task.genQueue.ToJsonString()}",//从Redis中获取任务信息 }); } else { _logger.LogInformation($"客户端当前空闲=>{screenClient.name},{screenClient.region},{screenClient.clientid},暂无任务可领取的任务......"); if (task.genRedis!=null) { string msgError = $"分发任务异常原因=>{screenClient.name},{screenClient.region},{screenClient.clientid}:{task.msg}\ngenQueue:{task.genQueue?.ToJsonString()}\ngenRedis:{task.genRedis?.ToJsonString()}"; _logger.LogInformation(msgError); await _dingDing.SendBotMsg(msgError, GroupNames.成都开发測試群組); } else { _logger.LogInformation($"分发任务异常原因=>{screenClient.name},{screenClient.region},{screenClient.clientid}:{task.msg}\n"); } await _screenServerHub.Clients.Client(screenClient.connid!).SendAsync("ReceiveMessage", new ScreenProcessMessage { connid = screenClient.connid, clientid = screenClient.clientid, status = ScreenConstant.idle, grant_type = screenClient.grant_type, message_type= MessageType.task_send_error, content = task.msg }); } } await _azureRedis.GetRedisClient(8).HashSetAsync($"ScreenApi:clients", screenClient.clientid, screenClient.ToJsonString()); } } else { } return Ok(); } } }