| | |
| | | using Microsoft.AspNetCore.Authorization; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using Microsoft.Extensions.Caching.Memory; |
| | | using Newtonsoft.Json; |
| | | using System.DirectoryServices.Protocols; |
| | | using System.Threading.Tasks; |
| | |
| | | |
| | | public readonly ITaskService _taskService; |
| | | private readonly ILogger<ESSController> _logger; |
| | | public ESSController(ITaskService taskService, ILogger<ESSController> logger) |
| | | private readonly IMemoryCache _memoryCache; |
| | | private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); |
| | | public ESSController(ITaskService taskService, ILogger<ESSController> logger, IMemoryCache memoryCache) |
| | | { |
| | | _taskService = taskService; |
| | | _logger = logger; |
| | | _memoryCache = memoryCache; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | [HttpPost("ContainerArrivalReport"), AllowAnonymous] |
| | | public async Task<IActionResult> ContainerArrivalReport([FromBody] ContainerArrivalRequest request) |
| | | { |
| | | //è¿éè¦å¤æåºåºçæ¶åï¼æç®±ä¼å°æ«ç å¤ãä¹ä¼è¯·æ±è¿ä¸ªæ¥å£ã |
| | | _logger.LogInformation(" ESSController ContainerArrivalReport : CallId={CallId},ContainerCode={ContainerCode},SlotCode={SlotCode}", request.CallId, request.ContainerCode, request.SlotCode); |
| | | var response = new ApiResponse<ContainerArrivalResponseData> |
| | | { |
| | | Code = 0, |
| | | Msg = "", |
| | | Data = new ContainerArrivalResponseData |
| | | { |
| | | direction = "100" // 示ä¾å¼ï¼å¯æ ¹æ®å®é
æ
åµè¿åæ¹åæå
¶ä»ä¿¡æ¯ |
| | | } |
| | | Code = 1 |
| | | |
| | | }; |
| | | var result = await _taskService.RequestInboundTask(request.ContainerCode, request.SlotCode); |
| | | if (result.Status) |
| | | |
| | | // çæè¯·æ±çå¯ä¸æ è¯ï¼åºäºcallId + æ¶é´æ³ï¼ |
| | | var requestKey = $"callback_{request.CallId}-{request.ContainerCode}_{DateTime.UtcNow:yyyyMMddHH}"; |
| | | |
| | | // æ£æ¥æ¯å¦å·²ç»å¤çè¿ç¸åçè¯·æ± |
| | | if (_memoryCache.TryGetValue(requestKey, out bool _)) |
| | | { |
| | | _logger.LogWarning("æ£æµå°éå¤è¯·æ±ï¼å·²å¿½ç¥: CallId={CallId}", request.CallId); |
| | | response.Code = 1; |
| | | response.Msg = null; |
| | | response.Data = null; |
| | | return Ok(response); |
| | | } |
| | | else |
| | | |
| | | |
| | | await _semaphore.WaitAsync(); |
| | | try |
| | | { |
| | | response.Code = 1; |
| | | response.Msg = "error"; |
| | | response.Data.direction = "0"; |
| | | return Ok(response); |
| | | if (_memoryCache.TryGetValue(requestKey, out bool _)) |
| | | { |
| | | _logger.LogWarning("åéæ£æ¥æ£æµå°éå¤è¯·æ±ï¼å·²å¿½ç¥: CallId={CallId}", request.CallId); |
| | | response.Code = 1; |
| | | response.Msg = null; |
| | | response.Data = null; |
| | | return Ok(response); |
| | | } |
| | | |
| | | WebResponseContent result = await _taskService.RequestInboundTask(request.ContainerCode, request.SlotCode); |
| | | |
| | | var cacheOptions = new MemoryCacheEntryOptions |
| | | { |
| | | AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(20) |
| | | }; |
| | | _memoryCache.Set(requestKey, true, cacheOptions); |
| | | response = new ApiResponse<ContainerArrivalResponseData> |
| | | { |
| | | Code = 0, |
| | | Msg = "", |
| | | Data = new ContainerArrivalResponseData |
| | | { |
| | | direction = "100" |
| | | } |
| | | }; |
| | | if (result != null && !string.IsNullOrEmpty( result.Message ) && result.Message.Contains("该æçå·²çæä»»å¡")) |
| | | { |
| | | return Ok(response); |
| | | } |
| | | if (result != null && result.Status) |
| | | { |
| | | return Ok(response); |
| | | } |
| | | else |
| | | { |
| | | response.Code = 1; |
| | | response.Msg = null; |
| | | response.Data = null; |
| | | _logger.LogError(" ESSController ContainerArrivalReport Error: Message={Message}", result.Message); |
| | | |
| | | return Ok(response); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError(ex, "å¤çä»»å¡ç¶æåè°æ¶åçå¼å¸¸: CallId={CallId}", request.CallId); |
| | | return Ok($"å¤çåè°æ¶åçå¼å¸¸: {ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | _semaphore.Release(); |
| | | } |
| | | |
| | | } |
| | |
| | | // æ ¹æ®äºä»¶ç±»ååç¶æè¿è¡ä¸åçä¸å¡å¤ç |
| | | switch (request.EventType) |
| | | { |
| | | case EventType.task: |
| | | await HandleTaskStatusChange(request); |
| | | break; |
| | | case EventType.task_allocated: |
| | | await HandleTaskAllocated(request); |
| | | break; |
| | | case EventType.tote_load: |
| | | await HandleToteLoad(request); |
| | | break; |
| | |
| | | case EventType.robot_reach: |
| | | await HandleRobotReach(request); |
| | | break; |
| | | case EventType.task: |
| | | await HandleTaskStatusChange(request); |
| | | break; |
| | | case EventType.task_allocated: |
| | | await HandleTaskAllocated(request); |
| | | break; |
| | | |
| | | default: |
| | | _logger.LogWarning("æªç¥çäºä»¶ç±»å: {EventType}", request.EventType); |
| | | break; |
| | |
| | | _logger.LogInformation("ä»»å¡å®æ: TaskCode={TaskCode}, Container={Container}, Robot={Robot}", |
| | | request.TaskCode, request.ContainerCode, request.RobotCode); |
| | | |
| | | _taskService.TaskCompleted(request.TaskCode); |
| | | // æ ¹æ®ä¸åçä»»å¡ç±»åè¿è¡ç¹æ®å¤ç |
| | | if (request.Weight.HasValue) |
| | | { |