using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Emit; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO; using WIDESEAWCS_DTO.AGV.HIKROBOT; using WIDESEAWCS_DTO.RGV.FOURBOT; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_Tasks { public partial class TaskJob { #region 处理海康AGV任务 /// /// 处理海康不同类型的任务,进行不同的业务逻辑处理(配套任务:修改平库货位信息/换层任务记录小车信息(小车位置层);出入库任务处理库位信息) /// /// public void HIKROBOTTask(List tasks) { foreach (var item in tasks) { var content = _taskService.SendHIKROBOTTask(item); } } #endregion #region 处理海康待继续执行任务 public void SendAGVWaitToExecuteTask(List tasks) { foreach (var item in tasks) { var content = _taskService.SendHIKROBOTTask(item); } } #endregion #region 下发海康1-6楼的AGV任务 public void SendAGVTask(List tasks) { foreach (var item in tasks) { // 出库任务处理 (从1楼出库到6楼) if (item.TaskType == (int)TaskTypeEnum.Q3CK) { // 调用接口获取小车信息 var result = _agvcartInfoService.CheckTheCar(); if (result != null && result.Status) { var dataList = result.Data as List; if (dataList != null && dataList.Any()) { // 出库任务:检查是否有在1楼(AA)的小车 // Q3CK 是AA→FF的跨楼层任务,只能使用专用小车 var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == "AA" && d.CarType == "MR-Q3-600LE-D(M)(YWGP)"); if (specialCarInAA != null) { // 有在1楼的小车,直接执行任务 var content = _taskService.SendHIKROBOTTask(item); if (content.Status) { item.TaskState = (int)TaskStatusEnum.Execut; } } else { // 没有专用小车在1楼,需要呼叫专用小车来到1楼 var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)(YWGP)"); if (anySpecialCar != null) { // 起点:小车当前所在楼层的点位,目标:1楼点位 var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, "AA"); if (callCarResult.Status) { // 原任务状态改为等待空车 item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition; } } else { item.ExceptionMessage = "未找到可用AGV小车"; } } } } else { item.ExceptionMessage = "获取AGV小车信息失败"; } } // 入库任务处理 (从6楼入库到1楼) else if (item.TaskType == (int)TaskTypeEnum.Q3RK) { var result = _agvcartInfoService.CheckTheCar(); if (result != null && result.Status) { var dataList = result.Data as List; if (dataList != null && dataList.Any()) { // Q3RK 是FF→AA的跨楼层任务,只能使用专用小车 var specialCarInFF = dataList.FirstOrDefault(d => d.mapCode == "FF" && d.CarType == "MR-Q3-600LE-D(M)(YWGP)"); if (specialCarInFF!=null) { // 有在1楼的小车,直接执行任务 var content = _taskService.SendHIKROBOTTask(item); item.TaskState = (int)TaskStatusEnum.Execut; } else { // 没有专用小车在6楼,需要呼叫专用小车来到6楼 var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)(YWGP)"); if (anySpecialCar != null) { // 起点:小车当前所在楼层的点位,目标:6楼点位 var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, "FF"); if (callCarResult.Status) { item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition; } } else { item.ExceptionMessage = "未找到可用AGV小车"; } } } } else { item.ExceptionMessage = "获取AGV小车信息失败"; } } else if (item.TaskType == (int)TaskTypeEnum.F01) { // F01任务处理:根据目标地址判断需要哪个楼层的小车 var result = _agvcartInfoService.CheckTheCar(); if (result != null && result.Status) { var dataList = result.Data as List; if (dataList != null && dataList.Any()) { // 从任务的起始地址中提取需要的楼层代码 string requiredMapCode = GetMapCodeFromAddress(item.SourceAddress); if (string.IsNullOrEmpty(requiredMapCode)) { item.ExceptionMessage = $"无法从目标地址 {item.SourceAddress} 中识别楼层信息"; _taskService.UpdateData(item); continue; } // 检查是否有在目标楼层的小车 var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode&&d.CarType== "MR-Q3-600LE-D(M)"); if (hasRequiredCar!=null) { // 有在目标楼层的小车,直接执行任务 var content = _taskService.SendHIKROBOTTask(item); if (content.Status) { item.TaskState = (int)TaskStatusEnum.Execut; } } else { // 没有目标楼层的小车,需要呼叫空车从当前位置到目标楼层 var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)"); if (anySpecialCar != null) { var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, requiredMapCode); if (callCarResult.Status) { item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition; } } else { item.ExceptionMessage = "未找到可用AGV小车"; } } } } } _taskService.UpdateData(item); } } #endregion #region 处理海康agv搬运任务 /// /// 创建空车呼叫任务:根据小车当前位置和目标楼层,设置任务的起点、当前位置和目标点,并下发给海康接口 /// /// /// 当前位置 /// 目标地址 /// public WebResponseContent AddAGVCartInfo(Dt_Task task, string currentMapCode, string targetMapCode) { WebResponseContent content = new WebResponseContent(); try { // 获取起点楼层信息 if (!FloorMapping.FloorMap.ContainsKey(currentMapCode)) { content.Error($"无效的起点楼层代码:{currentMapCode}"); return content; } // 获取目标楼层信息 if (!FloorMapping.FloorMap.ContainsKey(targetMapCode)) { content.Error($"无效的目标楼层代码:{targetMapCode}"); return content; } var currentFloorInfo = FloorMapping.FloorMap[currentMapCode]; var targetFloorInfo = FloorMapping.FloorMap[targetMapCode]; // 设置任务信息 //task.SourceAddress = currentFloorInfo.PointCode; // 起点:小车当前位置的点位 //task.CurrentAddress = currentFloorInfo.PointCode; // 当前位置:小车当前位置的点位 //task.TargetAddress = targetFloorInfo.PointCode; // 目标点:目标楼层点位 //task.NextAddress = targetFloorInfo.PointCode; // 记录目标楼层代码 Dt_Task newTask = new Dt_Task { WMSTaskNum="HKkc"+ DateTime.Now.ToString("yyyyMMddHHmmss"), // 生成唯一的WMS任务号 TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), SourceAddress = currentFloorInfo.PointCode, CurrentAddress = currentFloorInfo.PointCode, TargetAddress = targetFloorInfo.PointCode, NextAddress = targetFloorInfo.PointCode, TaskType = (int)TaskTypeEnum.MOVE, Grade = task.Grade, PalletCode = null, TaskState = (int)TaskStatusEnum.CallingHKtransportation, // 复制其他必要字段 CreateDate = DateTime.Now, Creater = "System" }; _taskService.AddData(newTask); // 添加新任务 var result = _taskService.SendHIKROBOTTask(newTask); if (result.Status) { content.OK("空车呼叫任务创建成功", newTask); } else { content.Error("空车呼叫任务下发失败"); } return content; } catch (Exception ex) { content.Error($"创建空车呼叫任务失败:{ex.Message}"); } return content; } #endregion #region 处理agv待空车搬运任务 public void SendHKWaitTask() { try { List reslut = _taskService.Repository.QueryData(x => x.TaskType == (int)TaskTypeEnum.MOVE); if (reslut.Count<=0) { List reslut2 = _taskService.Repository.QueryData(x => x.TaskType == (int)TaskTypeEnum.Q3RK||x.TaskType==(int)TaskTypeEnum.Q3CK || x.TaskType == (int)TaskTypeEnum.F01); foreach (var item in reslut2) { var content = _taskService.SendHIKROBOTTask(item); } reslut.ForEach(x => { x.TaskState =(int)TaskStatusEnum.Execut; }); } _taskService.UpdateData(reslut); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion /// /// 从地址中提取楼层代码(AA、BB、CC、DD、EE、FF) /// /// 点位地址 /// 楼层代码 private string GetMapCodeFromAddress(string address) { if (string.IsNullOrEmpty(address)) return null; // 地址格式示例 :AA 对应 0339050AA0309145 // keys 是 AA、BB、CC、DD、EE、FF,vule是对应的点位信息 foreach (var floorCode in FloorMapping.FloorMap.Keys) { if (address.Contains(floorCode)) { return floorCode;//返回的就是AA、BB、CC、DD、EE、FF中的一个,代表对应的楼层 } } return null; } } }