using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.LocationEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO; using WIDESEAWCS_DTO.RGV.FOURBOT; using WIDESEAWCS_DTO.WMS; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_Tasks { public partial class TaskJob { #region 下发四向车入库任务 /// /// 下发四向车新建入库任务 /// /// public void SendRGVInTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); foreach (var item in tasks) { fOURBOTnewMovePodTask.priority = item.Grade; fOURBOTnewMovePodTask.podID = item.PalletCode; //fOURBOTnewMovePodTask.destination = item.NextAddress; fOURBOTnewMovePodTask.desExt = new { unload = 0//是否放下容器,0否1是 }; fOURBOTnewMovePodTask.taskExt = new { keepRobot = 1, keepRobotTimeout = 1 }; fOURBOTnewMovePodTask.desType = 1; fOURBOTnewMovePodTask.desNodeID = item.NextAddress; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { string dataJson = fOURBOTReturn.data.ToString(); FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson); if (fOURBO == null || fOURBO.taskID == 0) { throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}"); } //FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Execut; } } _taskService.UpdateData(tasks); content.OK(); } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发四向车新建入库任务", "", ""); } } #endregion #region 处理出库任务是否需要移库 /// /// 处理出库任务是否需要移库 /// /// public void IsMoveTask(List tasks) { object requestData = null; // 添加变量记录请求数据 WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(GetBlockPodContentDto)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); List dt_Tasks = new List(); var PalletCodes = tasks.Select(x => x.PalletCode).ToList(); //GetBlockPodContentDto content = new GetBlockPodContentDto(); var request = new GetBlockPodContentListDto { content = new List { new GetBlockPodContentDto { candidatePodIDs = PalletCodes, num = 0 // 0表示全部出,如果需要限制数量可以调整 } } }; requestData = request; // 保存请求数据用于日志 //content.candidatePodIDs = tasks.Select(x => x.PalletCode).ToList(); string response = HttpHelper.Post(apiInfo.ApiAddress, request.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { //ReturnBlockPodResultDto getBlockPod = fOURBOTReturn.data as ReturnBlockPodResultDto ?? throw new Exception("未获取到阻碍托盘关系数据"); var dataJson = fOURBOTReturn.data.ToString(); ReturnBlockPodResultDto? getBlockPod = JsonConvert.DeserializeObject(dataJson); if (getBlockPod.Result.Count == 0) { throw new Exception("未获取到阻碍托盘关系数据"); } foreach (var Result in getBlockPod.Result) { foreach (var item in Result.outPods) { var task = tasks.First(x => x.PalletCode == item.outPod); if (item.blockPods.Count > 0) { task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute; dt_Tasks.Add(task); AddMoveTask(item.blockPods);//添加移库任务 } else { task.TaskState = (int)TaskStatusEnum.RGV_WaitSend; dt_Tasks.Add(task); } } } _taskService.UpdateData(dt_Tasks); content.OK(); } } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(requestData, content, "处理出库任务是否需要移库", "", ""); } } #endregion #region 下发外形检测成功任务 /// /// 下发外形检测成功任务 /// /// public void SendCheckShapeingOkTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); var tasksToUpdate = new List(); var locationsToUpdate = new List(); var stationsToUpdate = new List(); #region 任务下发 foreach (var item in tasks) { try { #region 获取货位 var rGVLocationInfo = _rGVLocationInfoService.GetFreeLocationInfo(item.Roadway); if (rGVLocationInfo == null) { item.ExceptionMessage = $"未找到终点库区【{item.Roadway}】可用空货位!"; continue; } #endregion fOURBOTnewMovePodTask = new FOURBOTnewMovePodTask { priority = item.Grade, podID = item.PalletCode, desStorageID = rGVLocationInfo.LocationCode, //destination = rGVLocationInfo.LocationCode, desExt = new { unload = 1 }, // 是否放下容器,0否1是 desType = 2 }; fOURBOTnewMovePodTask.taskExt = new { autoToRest = 1 }; item.CurrentAddress = item.NextAddress; item.NextAddress = rGVLocationInfo.LocationCode; item.TargetAddress = rGVLocationInfo.LocationCode; item.Roadway = rGVLocationInfo.RoadwayNo; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); var fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { var data = fOURBOTReturn.data.ToString(); var fOURBO = data.DeserializeObject(); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Puting; rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt(); locationsToUpdate.Add(rGVLocationInfo); #region 释放入库站台 var stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress); if (stationManger != null) { stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt(); stationsToUpdate.Add(stationManger); } content.OK(); #endregion } else { item.ExceptionMessage = $"四向车接口返回错误:{fOURBOTReturn.returnMsg}"; // 记录失败的任务 content.Error($"四向车接口返回错误:{fOURBOTReturn.returnMsg}"); } } catch (Exception ex) { item.ExceptionMessage = $"处理任务异常:{ex.Message}"; //WriteError($"{nameof(TaskJob)}-{item.TaskId}", ex.Message, ex); content.Error($"四向车接口返回错误:{ex.Message}"); } tasksToUpdate.Add(item); } #endregion #region 更新数据 // 如果有需要更新的数据,才执行事务 if (tasksToUpdate.Any() || locationsToUpdate.Any() || stationsToUpdate.Any()) { try { _unitOfWorkManage.BeginTran(); if (tasksToUpdate.Any()) _taskService.UpdateData(tasksToUpdate); if (locationsToUpdate.Any()) _rGVLocationInfoService.UpdateData(locationsToUpdate); if (stationsToUpdate.Any()) _stationMangerService.UpdateData(stationsToUpdate); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); content.Error($"下发外形检测任务失败{ex.Message}"); } finally { _trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发外形检测任务失败", "", ""); } } #endregion #region 下发外形检测失败任务 public void SendCheckShapeingNGTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); foreach (var item in tasks) { Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress); item.CurrentAddress = item.NextAddress; item.NextAddress = stationManger.StationCode; fOURBOTnewMovePodTask.priority = item.Grade; fOURBOTnewMovePodTask.podID = item.PalletCode; fOURBOTnewMovePodTask.destination = item.NextAddress; fOURBOTnewMovePodTask.desExt = new { unload = 1//是否放下容器,0否1是 }; fOURBOTnewMovePodTask.taskExt = new { autoToRest = 1 }; fOURBOTnewMovePodTask.desType = 5; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { //FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); string dataJson = fOURBOTReturn.data.ToString(); FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson); if (fOURBO == null || fOURBO.taskID == 0) { throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}"); } item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Puting; } } _taskService.UpdateData(tasks); content.OK(); } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发外形检测失败任务", "", ""); } } #endregion #region 添加移库任务 public void AddMoveTask(List blockPods) { try { List tasks = new List(); List _UpRGVLocationInfos = new List(); List rGVLocationInfos = _rGVLocationInfoService.Repository.QueryData(x => blockPods.Contains(x.PalletCode)); var FreeLocationInfos = _rGVLocationInfoService.GetFreeLocationInfos(); if (FreeLocationInfos.Count < 1) throw new Exception($"成品库创建移库任务无可用空货位"); foreach (var item in rGVLocationInfos) { Dt_RGVLocationInfo? rGVLocationInfo = FreeLocationInfos.Where(x => x.Layer == item.Layer).OrderBy(n => Math.Abs(n.Row - item.Row)).FirstOrDefault(); rGVLocationInfo ??= FreeLocationInfos.First(); Dt_Task dt_Task = new() { TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), //WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = 1, PalletCode = item.PalletCode, Roadway = item.RoadwayNo, TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(), TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(), SourceAddress = item.LocationCode, CurrentAddress = item.LocationCode, NextAddress = rGVLocationInfo.LocationCode, TargetAddress = rGVLocationInfo.LocationCode, Creater = "WCS", }; tasks.Add(dt_Task); item.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); rGVLocationInfo.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt(); _UpRGVLocationInfos.Add(rGVLocationInfo); FreeLocationInfos.Remove(rGVLocationInfo); } _rGVLocationInfoService.UpdateData(rGVLocationInfos); _rGVLocationInfoService.UpdateData(_UpRGVLocationInfos); _taskService.AddData(tasks); } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #region 下发四向车批量移库任务 public void SendMoveTasks(List tasks) { WebResponseContent content = new WebResponseContent(); List dt_Tasks = new List(); List moveBlocks = new List(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(MoveBlockPodContentDto)) ?? throw new Exception("未找到四向车批量搬运阻碍托任务接口配置信息!请检查接口配置"); foreach (var item in tasks) { MoveBlockPodContentDto moveBlock = new MoveBlockPodContentDto() { podID = item.PalletCode, des = item.TargetAddress }; moveBlocks.Add(moveBlock); } string response = HttpHelper.Post(apiInfo.ApiAddress, moveBlocks.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { string dataJson = fOURBOTReturn.data.ToString(); //MoveBlockPodsDataDto moveBlockPodsData = fOURBOTReturn.data as MoveBlockPodsDataDto ?? throw new Exception("未获取到四向车批量搬运阻碍托返回的任务ID"); MoveBlockPodsDataDto? moveBlockPodsData = JsonConvert.DeserializeObject(dataJson); if (moveBlockPodsData == null || moveBlockPodsData.succList.Count == 0) { throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}"); } foreach (var item in moveBlockPodsData.succList) { if (item.taskID == 0) continue; // 跳过无效的任务ID var task = tasks.First(x => x.PalletCode == item.podID); task.RGVTaskId = item.taskID; task.TaskState = TaskStatusEnum.RGV_MoveTaskSend.ObjToInt(); dt_Tasks.Add(task); } _taskService.UpdateData(dt_Tasks); content.OK(); } } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(moveBlocks, content, "下发四向车批量移库任务", "", ""); } } #endregion #region 处理待移库后出库任务 public void MoveToExecuteTask(List tasks) { try { foreach (var item in tasks) { var takes = _taskService.Repository.QueryFirst(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory); if (takes == null) { item.TaskState = (int)TaskStatusEnum.RGV_WaitSend; } } _taskService.UpdateData(tasks); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion #region 下发出库任务 public void SendOutTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); WebResponseContent content = new WebResponseContent(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); foreach (var item in tasks) { var stationManger = _stationMangerService.GetOutStationInfo(item.TargetAddress); item.NextAddress = stationManger.StationCode; if (stationManger.IsOccupied != LocationStatusEnum.Free.ObjToInt()) continue; #region 下发出库任务 fOURBOTnewMovePodTask.priority = item.Grade; fOURBOTnewMovePodTask.podID = item.PalletCode; fOURBOTnewMovePodTask.destination = item.NextAddress; fOURBOTnewMovePodTask.desExt = new { unload = 0//是否放下容器,0否1是 }; fOURBOTnewMovePodTask.taskExt = new { autoToRest = 1 }; fOURBOTnewMovePodTask.desType = 5; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); content.Data = fOURBOTReturn; if (fOURBOTReturn.returnCode == 0) { string dataJson = fOURBOTReturn.data.ToString(); FOURBOTnewMovePodTaskResponseData? fOURBO = JsonConvert.DeserializeObject(dataJson); if (fOURBO == null || fOURBO.taskID == 0) { throw new Exception($"未获取到四向车返回的任务ID,返回数据:{response}"); } item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Execut; stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt(); _stationMangerService.UpdateData(stationManger); } #endregion } _taskService.UpdateData(tasks); content.OK(); } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(fOURBOTnewMovePodTask, content, "下发四向车出库任务", "", ""); } } #endregion } }