wanshenmean
3 天以前 b690250002ee04f4309e6a90fd16fbfd9bd959e2
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
@@ -89,47 +89,60 @@
        public async Task<string?> HandleMessageReceivedAsync(string message, bool isJson, TcpClient client)
        {
            var state = _stateManager.GetState(client.Client.RemoteEndPoint.ToString());
            if (state.OperStatus == message)
            {
                // 处理成功后,将原消息回写到客户端(保持原有行为)
                //await _socketClientGateway.SendMessageAsync(client, message);
            }
            // 记录接收到的消息日志
            QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName);
            // 检查任务总数是否未达到上限
            if (state.RobotTaskTotalNum > RobotConst.MaxTaskTotalNum)
            // 设备状态不存在时直接返回,避免后续空引用
            if (state == null)
            {
                return null;
            }
            // 获取该设备的互斥锁,确保消息处理与 Job 执行互斥
            // Job 在处理任务时会等待此锁释放后才继续执行
            var robotLock = _stateManager.GetOrCreateLock(state.IPAddress);
            await robotLock.WaitAsync();
            try
            {
                // 记录接收到的消息日志
                QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName);
                await _socketClientGateway.SendMessageAsync(client, message);
                return null;
                // 检查任务总数是否未达到上限
                if (state.RobotTaskTotalNum > RobotConst.MaxTaskTotalNum)
                {
                    QuartzLogHelper.LogInfo(_logger, $"接收到客户端【{state.RobotCrane?.DeviceName}】发送消息【{message}】", state.RobotCrane?.DeviceName);
                    await _socketClientGateway.SendMessageAsync(client, message);
                    return null;
                }
                // 将消息转换为小写(用于简单命令匹配)
                string messageLower = message.ToLowerInvariant();
                // 尝试用简单命令处理器处理
                // 简单命令包括:homing、homed、running、pausing、runmode、controlmode 等
                if (await _simpleCommandHandler.HandleAsync(messageLower, state))
                {
                    //if (messageLower != "batteryarrived")
                    //{
                    // 处理成功后,将原消息回写到客户端(保持原有行为)
                    //await _socketClientGateway.SendMessageAsync(client, message);
                    QuartzLogHelper.LogInfo(_logger, $"接收到消息消息【{message}】,约定不返回发送消息:【{message}】", state.RobotCrane?.DeviceName);
                    //}
                    //// 安全更新状态到数据库
                    //_stateManager.TryUpdateStateSafely(state.IPAddress, state);
                    return null;
                }
                // 如果不是简单命令,检查是否是前缀命令
                // 前缀命令包括:pickfinished、putfinished(后面跟逗号分隔的位置参数)
                if (_prefixCommandHandler.IsPrefixCommand(messageLower))
                {
                    // 调用前缀命令处理器
                    await _prefixCommandHandler.HandleAsync(message, state, client);
                }
            }
            // 将消息转换为小写(用于简单命令匹配)
            string messageLower = message.ToLowerInvariant();
            // 尝试用简单命令处理器处理
            // 简单命令包括:homing、homed、running、pausing、runmode、controlmode 等
            if (await _simpleCommandHandler.HandleAsync(messageLower, state))
            finally
            {
                //if (messageLower != "batteryarrived")
                //{
                // 处理成功后,将原消息回写到客户端(保持原有行为)
                //await _socketClientGateway.SendMessageAsync(client, message);
                QuartzLogHelper.LogInfo(_logger, $"接收到消息消息【{message}】,约定不返回发送消息:【{message}】", state.RobotCrane?.DeviceName);
                //}
                // 安全更新状态到数据库
                _stateManager.TryUpdateStateSafely(state.IPAddress, state);
                return null;
            }
            // 如果不是简单命令,检查是否是前缀命令
            // 前缀命令包括:pickfinished、putfinished(后面跟逗号分隔的位置参数)
            if (_prefixCommandHandler.IsPrefixCommand(messageLower))
            {
                // 调用前缀命令处理器
                await _prefixCommandHandler.HandleAsync(message, state, client);
                robotLock.Release();
            }
            return null;