pan
2025-11-19 efb46c6025d8e8fc366a0ec1541b4df0466eac8b
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ESSController.cs
@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using System.DirectoryServices.Protocols;
using System.Threading.Tasks;
@@ -24,10 +25,13 @@
        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>
@@ -38,26 +42,82 @@
        [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();
            }
        }
@@ -94,12 +154,6 @@
                // æ ¹æ®äº‹ä»¶ç±»åž‹å’ŒçŠ¶æ€è¿›è¡Œä¸åŒçš„ä¸šåŠ¡å¤„ç†
                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;
@@ -109,6 +163,13 @@
                    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;
@@ -156,6 +217,7 @@
            _logger.LogInformation("任务完成: TaskCode={TaskCode}, Container={Container}, Robot={Robot}",
                request.TaskCode, request.ContainerCode, request.RobotCode);
            _taskService.TaskCompleted(request.TaskCode);
            // æ ¹æ®ä¸åŒçš„任务类型进行特殊处理
            if (request.Weight.HasValue)
            {