| | |
| | | using Microsoft.Extensions.Logging; |
| | | using WIDESEA_Core; |
| | | using Serilog; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_Tasks.SocketServer; |
| | | using WIDESEAWCS_Tasks.Workflow.Abstractions; |
| | | |
| | | namespace WIDESEAWCS_Tasks.Workflow |
| | |
| | | && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 1) |
| | | && task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode()) |
| | | { |
| | | _logger.LogInformation("ExecuteAsync:满足放货条件,开始下发放货任务,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsync:满足放货条件,开始下发放货任务", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | QuartzLogHelper.LogInfo(_logger, $"ExecuteAsync:满足放货条件,开始下发放货任务,任务号: {task.RobotTaskNum}", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | // 发送放货指令 |
| | | await HandlePickFinishedStateAsync(task, ipAddress); |
| | | } |
| | |
| | | // - 任务状态为 RobotPutFinish 或不是 RobotExecuting |
| | | else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction.IsNullOrEmpty()) |
| | | && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 0) |
| | | && (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() || task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode()) |
| | | && latestState.BatteryArrived) |
| | | && (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() || task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode())) |
| | | { |
| | | _logger.LogInformation("ExecuteAsync:满足取货条件,开始下发取货任务,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsync:满足取货条件,开始下发取货任务", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | QuartzLogHelper.LogInfo(_logger, $"ExecuteAsync:满足取货条件,开始下发取货任务,任务号: {task.RobotTaskNum}", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | // 发送取货指令 |
| | | await HandlePutFinishedStateAsync(task, ipAddress); |
| | | } |
| | |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake)); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePickFinishedStateAsync:无可用假电芯点位,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePickFinishedStateAsync:无可用假电芯点位,任务号: {task.RobotTaskNum}", state?.RobotCrane?.DeviceName ?? ipAddress); |
| | | return; |
| | | } |
| | | |
| | |
| | | |
| | | if (result) |
| | | { |
| | | _logger.LogInformation("HandlePickFinishedStateAsync:下发放货指令成功,指令: {TaskString},任务号: {TaskNum}", taskString, task.RobotTaskNum); |
| | | QuartzLogger.Info($"下发放货指令成功,指令: {taskString}", task.RobotRoadway); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePickFinishedStateAsync:下发放货指令成功,指令: {taskString},任务号: {task.RobotTaskNum}", state?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | |
| | |
| | | } |
| | | else |
| | | { |
| | | _logger.LogError("HandlePickFinishedStateAsync:下发放货指令失败,指令: {TaskString},任务号: {TaskNum}", taskString, task.RobotTaskNum); |
| | | QuartzLogger.Error($"下发放货指令失败,指令: {taskString}", task.RobotRoadway); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePickFinishedStateAsync:下发放货指令失败,指令: {taskString},任务号: {task.RobotTaskNum}", state?.RobotCrane?.DeviceName ?? ipAddress); |
| | | } |
| | | } |
| | | |
| | |
| | | RobotSocketState? stateForUpdate = _stateManager.GetState(ipAddress); |
| | | if (stateForUpdate == null) |
| | | { |
| | | _logger.LogWarning("HandlePutFinishedStateAsync:获取状态失败,IP: {IpAddress}", ipAddress); |
| | | QuartzLogger.Warn($"HandlePutFinishedStateAsync:获取状态失败,IP: {ipAddress}", ipAddress); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:获取状态失败,IP: {ipAddress}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | return; |
| | | } |
| | | |
| | |
| | | { |
| | | if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2)) |
| | | { |
| | | _logger.LogError("HandlePutFinishedStateAsync:读取的托盘条码已存在,可能存在重复,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Error($"读取的托盘条码已存在,可能存在重复", stateForUpdate.RobotCrane.DeviceName); |
| | | |
| | | // 条码重复,记录错误日志并停止后续操作(后续放货时会用到这些条码信息,供后续放货时使用,调试后可能会取消此逻辑) |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:读取的托盘条码已存在,可能存在重复,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // 发送取货指令 标记扫码NG,放货时不使用这些条码,并放入NG口 |
| | | //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | |
| | | } |
| | | else |
| | | { |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:读取的托盘条码唯一,继续执行,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"读取的托盘条码唯一,继续执行", stateForUpdate.RobotCrane.DeviceName); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:读取的托盘条码唯一,继续执行,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // 将条码添加到状态中,供后续放货时使用 |
| | | stateForUpdate.CellBarcode = new List<string>() |
| | |
| | | } |
| | | |
| | | // 记录日志:读取托盘条码成功 |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:读取托盘条码成功: {Barcode1}+{Barcode2},任务号: {TaskNum}", trayBarcode1, trayBarcode2, task.RobotTaskNum); |
| | | QuartzLogger.Info($"读取托盘条码成功: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:读取托盘条码成功: 【{trayBarcode1}】-----【{trayBarcode2}】,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // 发送取货指令 |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | |
| | | else |
| | | { |
| | | // 条码读取失败,记录错误日志 |
| | | _logger.LogError("HandlePutFinishedStateAsync:读取托盘条码失败,任务号: {TaskNum},一号位: {trayBarcode1},二号位: {trayBarcode2}", task.RobotTaskNum,trayBarcode1,trayBarcode2); |
| | | QuartzLogger.Error($"读取托盘条码失败,一号位:{trayBarcode1},二号位:{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:读取托盘条码失败,【{trayBarcode1}】-----【{trayBarcode2}】,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // 发送取货指令 标记扫码NG,放货时不使用这些条码,并放入NG口 |
| | | //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | |
| | | { |
| | | stateForUpdate.ChangePalletPhase = 1; |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:换盘任务进入批次模式,任务号: {TaskNum},流向: {Flow}", |
| | | task.RobotTaskNum, isFlowA ? "A" : "B"); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:换盘任务进入批次模式,任务号: {{TaskNum}},流向: {(isFlowA ? "A" : "B")},任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | } |
| | | |
| | |
| | | // 正常电芯取完,切换到 Phase 3 取假电芯 |
| | | stateForUpdate.ChangePalletPhase = 3; |
| | | stateForUpdate.CurrentBatchIndex = 1; // 假电芯批次从头开始 |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:正常电芯取完,切换到Phase 3取假电芯,任务号: {TaskNum}", task.RobotTaskNum); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:正常电芯取完,切换到Phase 3取假电芯,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | |
| | | { |
| | | // 假电芯全部处理完,切换到 Phase 5 等待入库 |
| | | stateForUpdate.ChangePalletPhase = 5; |
| | | _logger.LogInformation("HandlePutFinishedStateAsync:假电芯处理完毕,切换到Phase 5等待入库,任务号: {TaskNum}", task.RobotTaskNum); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:假电芯处理完毕,切换到Phase 5等待入库,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake)); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePutFinishedStateAsync:无可用假电芯点位,任务号: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsync:无可用假电芯点位,任务号: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | return; |
| | | } |
| | | await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions); |