wanshenmean
7 小时以前 ad64840cc04dac2278ca02f22ddc02b1a218e9cf
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -69,6 +69,14 @@
        private readonly HttpClientHelper _httpClientHelper;
        /// <summary>
        /// 假电芯平面点位服务
        /// </summary>
        /// <remarks>
        /// 用于管理假电芯平面点位的分配和状态。
        /// </remarks>
        private readonly IFakeBatteryPositionService _fakeBatteryPositionService;
        /// <summary>
        /// 日志记录器
        /// </summary>
        private readonly ILogger _logger;
@@ -88,7 +96,8 @@
            IRobotTaskService robotTaskService,
            ITaskService taskService,
            HttpClientHelper httpClientHelper,
            ILogger logger)
            ILogger logger,
            IFakeBatteryPositionService fakeBatteryPositionService)
        {
            _socketClientGateway = socketClientGateway;
            _stateManager = stateManager;
@@ -96,6 +105,7 @@
            _taskService = taskService;
            _httpClientHelper = httpClientHelper;
            _logger = logger;
            _fakeBatteryPositionService = fakeBatteryPositionService;
        }
        /// <summary>
@@ -190,6 +200,74 @@
        }
        /// <summary>
        /// 下发假电芯取货指令到机器人客户端
        /// </summary>
        /// <remarks>
        /// 发送格式:Pickbattery,5,{startPosition}-{endPosition}
        /// 例如:Pickbattery,5,1-3 表示从假电芯位置5抓取,平面点位1到3
        ///
        /// 下发成功后:
        /// 1. 标记点位为已使用
        /// 2. 更新任务状态为"机器人执行中"
        /// 3. 安全更新状态到 Redis
        /// </remarks>
        /// <param name="task">要下发的任务对象</param>
        /// <param name="state">机器人当前状态</param>
        /// <param name="positions">要抓取的平面点位列表</param>
        public async Task SendSocketRobotFakeBatteryPickAsync(Dt_RobotTask task, RobotSocketState state, List<int> positions)
        {
            if (positions == null || positions.Count == 0)
            {
                _logger.LogWarning("SendSocketRobotFakeBatteryPickAsync:平面点位列表为空,任务号: {TaskNum}", task.RobotTaskNum);
                return;
            }
            // 计算点位范围,格式:1-3
            int startPos = positions.Min();
            int endPos = positions.Max();
            string taskString = $"Pickbattery,5,{startPos}-{endPos}";
            // 标记点位为已使用
            _fakeBatteryPositionService.MarkAsUsed(positions);
            // 通过 Socket 网关发送指令到机器人客户端
            bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString);
            if (result)
            {
                _logger.LogInformation("下发假电芯取货指令成功,指令: {TaskString},点位: {Positions},设备: {DeviceName}",
                    taskString, string.Join(",", positions), state.RobotCrane?.DeviceName);
                QuartzLogger.Info($"下发假电芯取货指令成功,指令: {taskString}", state.RobotCrane?.DeviceName);
                // 更新任务状态为"机器人执行中"
                task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
                // 将任务关联到状态对象
                state.CurrentTask = task;
                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
                {
                    await _robotTaskService.UpdateRobotTaskAsync(task);
                }
            }
            else
            {
                _logger.LogError("下发假电芯取货指令失败,指令: {TaskString},设备: {DeviceName}", taskString, state.RobotCrane?.DeviceName);
                QuartzLogger.Error($"下发假电芯取货指令失败,指令: {taskString}", state.RobotCrane?.DeviceName);
            }
        }
        /// <summary>
        /// 获取下N个可用的假电芯平面点位
        /// </summary>
        /// <param name="count">需要获取的点位数量</param>
        /// <returns>可用点位列表</returns>
        public List<int> GetNextAvailableFakeBatteryPositions(int count)
        {
            return _fakeBatteryPositionService.GetNextAvailable(count);
        }
        /// <summary>
        /// 处理入库任务回传(拆盘/组盘/换盘场景)
        /// </summary>
        /// <remarks>