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.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(); 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.desType = 2; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); if (fOURBOTReturn.returnCode == 0) { FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Execut; } } _taskService.UpdateData(tasks); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion #region 处理出库任务是否需要移库 /// /// 处理出库任务是否需要移库 /// /// public void IsMoveTask(List tasks) { 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(); content.CandidatePodIDs = tasks.Select(x => x.PalletCode).ToList(); string response = HttpHelper.Post(apiInfo.ApiAddress, content.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); if (fOURBOTReturn.returnCode == 0) { ReturnBlockPodResultDto getBlockPod = fOURBOTReturn.data as ReturnBlockPodResultDto ?? 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); } } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion #region 下发外形检测成功任务 /// /// 下发外形检测成功任务 /// /// public void SendCheckShapeingOkTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); try { Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置"); List rGVLocationInfos = new List(); List stationMangers = new List(); foreach (var item in tasks) { #region 获取货位 var rGVLocationInfo = _rGVLocationInfoService.GetFreeLocationInfo(item.Roadway); if (rGVLocationInfo == null) { item.ExceptionMessage = $"未找到终点库区【{item.Roadway}】可用空货位!"; } #endregion else { item.CurrentAddress = item.NextAddress; item.NextAddress = rGVLocationInfo.LocationCode; item.Roadway = rGVLocationInfo.RoadwayNo; fOURBOTnewMovePodTask.priority = item.Grade; fOURBOTnewMovePodTask.podID = item.PalletCode; fOURBOTnewMovePodTask.destination = item.NextAddress; fOURBOTnewMovePodTask.desExt = new { unload = 1//是否放下容器,0否1是 }; fOURBOTnewMovePodTask.desType = 2; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); if (fOURBOTReturn.returnCode == 0) { FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Puting; rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt(); rGVLocationInfos.Add(rGVLocationInfo); #region 释放入库站台 Dt_StationManger stationManger = _stationMangerService.GetInStationInfo(item.SourceAddress); stationManger.IsOccupied = LocationStatusEnum.Free.ObjToInt(); stationMangers.Add(stationManger); #endregion } } } _taskService.Db.Ado.BeginTran(); _taskService.UpdateData(tasks); _rGVLocationInfoService.UpdateData(rGVLocationInfos); _stationMangerService.UpdateData(stationMangers); _taskService.Db.Ado.CommitTran(); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion #region 下发外形检测失败任务 public void SendCheckShapeingNGTask(List tasks) { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); 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.RGVStationCode; fOURBOTnewMovePodTask.priority = item.Grade; fOURBOTnewMovePodTask.podID = item.PalletCode; fOURBOTnewMovePodTask.destination = item.NextAddress; fOURBOTnewMovePodTask.desExt = new { unload = 1//是否放下容器,0否1是 }; fOURBOTnewMovePodTask.desType = 2; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); if (fOURBOTReturn.returnCode == 0) { FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Puting; } } _taskService.UpdateData(tasks); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #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) { try { List dt_Tasks = new List(); List moveBlocks = new List(); 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(); if (fOURBOTReturn.returnCode == 0) { MoveBlockPodsDataDto moveBlockPodsData = fOURBOTReturn.data as MoveBlockPodsDataDto ?? throw new Exception("未获取到四向车批量搬运阻碍托返回的任务ID"); foreach (var item in moveBlockPodsData.succList) { 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); } } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion #region 处理待移库后出库任务 public void MoveToExecuteTask(List tasks) { try { foreach (var item in tasks) { if (_taskService.Repository.QueryFirst(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory) == 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) { try { FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new(); 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); 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.desType = 2; string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize()); FOURBOTReturn fOURBOTReturn = response.DeserializeObject(); if (fOURBOTReturn.returnCode == 0) { FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID"); item.RGVTaskId = fOURBO.taskID; item.TaskState = (int)TaskStatusEnum.Execut; stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt(); _stationMangerService.UpdateData(stationManger); } #endregion } _taskService.UpdateData(tasks); } catch (Exception ex) { WriteError(nameof(TaskJob), ex.Message, ex); } } #endregion } }