ScreenController.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using Microsoft.AspNetCore.Mvc;
  2. using TEAMModelOS.SDK.DI;
  3. using TEAMModelOS.SDK;
  4. using Microsoft.AspNetCore.SignalR;
  5. using HTEX.Complex.Services;
  6. using System.Text.Json;
  7. using TEAMModelOS.SDK.Extension;
  8. using TEAMModelOS.SDK.DI.Device;
  9. using Microsoft.Azure.Amqp.Framing;
  10. namespace HTEX.Complex.Controllers
  11. {
  12. [ApiController]
  13. [Route("api/screen")]
  14. public class ScreenController : ControllerBase
  15. {
  16. private readonly DingDing _dingDing;
  17. private readonly IHttpClientFactory _httpClient;
  18. private readonly IConfiguration _configuration;
  19. private readonly AzureStorageFactory _azureStorage;
  20. private readonly AzureRedisFactory _azureRedis;
  21. private readonly IHubContext<SignalRScreenServerHub> _screenServerHub;
  22. private readonly ILogger<ScreenController> _logger;
  23. private readonly CoreDevice _device;
  24. public ScreenController(AzureRedisFactory azureRedis, IHttpClientFactory httpClient, IConfiguration configuration, AzureStorageFactory azureStorage,
  25. DingDing dingDing, IHubContext<SignalRScreenServerHub> screenServerHub , ILogger<ScreenController> logger, CoreDevice device)
  26. {
  27. _httpClient = httpClient;
  28. _configuration = configuration;
  29. _azureStorage = azureStorage;
  30. _dingDing = dingDing;
  31. _azureRedis=azureRedis;
  32. _screenServerHub = screenServerHub;
  33. _logger = logger;
  34. _device = device;
  35. }
  36. /// <summary>
  37. /// 添加任务
  38. /// </summary>
  39. /// <returns></returns>
  40. [HttpPost("push-task")]
  41. public async Task<IActionResult> AddTask(JsonElement json)
  42. {
  43. GenPDFData genPDFData = json.ToObject<GenPDFData>();
  44. ClientDevice serverDevice = await _device.GetCoreDevice();
  45. var addData = await GenPDFService.AddGenPdfQueue(_azureRedis, genPDFData, serverDevice);
  46. await ManualSendTask();
  47. return Ok(new { add= addData .add ,total= addData .total});
  48. }
  49. /// <summary>
  50. /// 外部触发任务发送
  51. /// </summary>
  52. /// <returns></returns>
  53. [HttpPost("send-task")]
  54. public async Task<IActionResult> SendTask(JsonElement json)
  55. {
  56. await ManualSendTask();
  57. return Ok();
  58. }
  59. private async Task ManualSendTask()
  60. {
  61. ClientDevice serverDevice = await _device.GetCoreDevice();
  62. var values = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"ScreenApi:clients:{serverDevice.deviceId}");
  63. if (values!=null)
  64. {
  65. foreach (var value in values)
  66. {
  67. ScreenClient screenClient = value.Value.ToString().ToObject<ScreenClient>();
  68. //先检查状态是否是在忙碌,在时间戳范围里,如果不在时间戳范围,强制free。
  69. if (!screenClient.status!.Equals(ScreenConstant.idle) && screenClient.last_time + screenClient.timeout+ screenClient.delay + ScreenConstant.time_excess < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())
  70. {
  71. screenClient.status = ScreenConstant.idle;
  72. }
  73. if (screenClient.status!.Equals(ScreenConstant.idle) && !string.IsNullOrWhiteSpace(screenClient.connid))
  74. {
  75. ////////////////////
  76. ///检擦是否在线
  77. //var cts = new CancellationTokenSource();
  78. //try
  79. //{
  80. // await _screenServerHub.Clients.Client(screenClient.connid!).SendAsync("ReceiveConnection", new ConnectionMessage
  81. // {
  82. // connid=screenClient.connid!,
  83. // clientid = screenClient.clientid,
  84. // status = screenClient.status,
  85. // grant_type = screenClient.grant_type,
  86. // message_type= MessageType.conn_success,
  87. // content = $"检查连接!"
  88. // }, cts);
  89. //}
  90. //catch (OperationCanceledException)
  91. //{
  92. // Console.WriteLine("Operation was canceled.");
  93. //}
  94. //catch (HubException ex)
  95. //{
  96. // if (ex.Message.Contains("disconnected"))
  97. // {
  98. // _logger.LogInformation($"客户端连接异常=>{screenClient.name},{screenClient.region},{screenClient.clientid},连接失败......{ex.Message},{ex.StackTrace}"); // 客户端不在线
  99. // }
  100. // _logger.LogInformation($"客户端连接异常=>{screenClient.name},{screenClient.region},{screenClient.clientid},连接失败......{ex.Message},{ex.StackTrace}");
  101. //}
  102. //catch (Exception ex)
  103. //{
  104. // _logger.LogInformation($"客户端连接异常=>{screenClient.name},{screenClient.region},{screenClient.clientid},连接失败......{ex.Message},{ex.StackTrace}");
  105. //}
  106. _logger.LogInformation($"客户端当前空闲=>{screenClient.name},{screenClient.region},{screenClient.clientid},分发任务......");
  107. //连接成功,马上分发任务。
  108. var task = await TaskService.SentTask(_azureRedis, _azureStorage, _logger, serverDevice);
  109. if (task.genQueue!=null && task.genRedis!=null && !string.IsNullOrWhiteSpace(task.genQueue.cntName))
  110. {
  111. screenClient.status = ScreenConstant.busy;
  112. screenClient.last_time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  113. await _screenServerHub.Clients.Client(screenClient.connid!).SendAsync("ReceiveMessage", new ScreenProcessMessage
  114. {
  115. connid = screenClient.connid,
  116. clientid =screenClient.clientid,
  117. status = ScreenConstant.busy,
  118. grant_type =screenClient.grant_type,
  119. message_type= MessageType.task_send_success,
  120. content =$"{task.genQueue.ToJsonString()}",//从Redis中获取任务信息
  121. });
  122. _logger.LogInformation($"分发任务:{task.genQueue.ToJsonString()}");
  123. }
  124. else
  125. {
  126. //_logger.LogInformation($"客户端当前空闲=>{screenClient.name},{screenClient.region},{screenClient.clientid},暂无任务可领取的任务......");
  127. if (task.genRedis!=null)
  128. {
  129. string msgError = $"分发任务异常原因=>{screenClient.name},{screenClient.region},{screenClient.clientid}:{task.msg}\ngenQueue:{task.genQueue?.ToJsonString()}\ngenRedis:{task.genRedis?.ToJsonString()}";
  130. _logger.LogInformation(msgError);
  131. await _dingDing.SendBotMsg(msgError, GroupNames.成都开发測試群組);
  132. }
  133. else
  134. {
  135. _logger.LogInformation($"分发任务异常原因=>{screenClient.name},{screenClient.region},{screenClient.clientid}:{task.msg}\n");
  136. }
  137. await _screenServerHub.Clients.Client(screenClient.connid!).SendAsync("ReceiveMessage", new ScreenProcessMessage
  138. {
  139. connid = screenClient.connid,
  140. clientid = screenClient.clientid,
  141. status = ScreenConstant.idle,
  142. grant_type = screenClient.grant_type,
  143. message_type= MessageType.task_send_error,
  144. content = task.msg
  145. });
  146. }
  147. }
  148. await _azureRedis.GetRedisClient(8).HashSetAsync($"ScreenApi:clients:{serverDevice.deviceId}", screenClient.clientid, screenClient.ToJsonString());
  149. }
  150. }
  151. }
  152. }
  153. }