using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Core; using SqlSugar.Extensions; using WIDESEAWCS_DTO.WMS; using WIDESEAWCS_Common.LocationEnum; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_DTO; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_QuartzJob; using System.Reflection.Metadata; namespace WIDESEAWCS_TaskInfoService { public partial class TaskService { #region 凯乐士任务创建 /// /// 创建凯乐士AGV入库任务 /// /// /// public WebResponseContent CreateKLSNewInTask(TaskDTO taskDTO, int taskType) { WebResponseContent content = new WebResponseContent(); Dt_KLSLocationInfo? kLSLocationInfo = null; try { int containerType = taskDTO.containerCode.Contains("LLM") ? (int)LocationTypeEnum.LargePallet : (int)LocationTypeEnum.SmallPallet; #region 点到点 if (!string.IsNullOrEmpty(taskDTO.toLocationCode)) { kLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == taskDTO.toLocationCode) ?? throw new Exception($"未找到终点货位【{taskDTO.toLocationCode}】"); if (kLSLocationInfo.LocationStatus != (int)LocationStatusEnum.Free) throw new Exception($"终点货位【{taskDTO.toLocationCode}】货位状态不为空货位"); } #endregion //获取货位信息 else kLSLocationInfo = _kLSLocationInfoService.GetFreeLocationInfo(taskDTO.toAreaCode, containerType) ?? throw new Exception($"未找到终点库区【{taskDTO.toAreaCode}】可用空货位!"); Dt_Task dt_Task = new() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = kLSLocationInfo.RoadwayNo, TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = kLSLocationInfo.LocationCode, TargetAddress = kLSLocationInfo.LocationCode, Creater = "WMS", }; kLSLocationInfo.LocationStatus = (int)LocationStatusEnum.InLock; #region 下发凯乐士任务 content = SendKLSTask(dt_Task); if (!content.Status) throw new Exception(content.Message); dt_Task.TaskState = (int)TaskStatusEnum.Execut; dt_Task.Dispatchertime = DateTime.Now; #endregion try { Db.Ado.BeginTran(); BaseDal.AddData(dt_Task); _kLSLocationInfoService.Repository.UpdateData(kLSLocationInfo); Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } return content.OK(data: new { taskCode = taskDTO.taskCode, Message = "成功!" }); } catch (Exception ex) { content.Data = new { taskCode = taskDTO.taskCode, Message = $"失败!{ex.Message}" }; return content.Error(ex.Message); } } /// /// 创建凯乐士AGV出库任务 /// /// /// /// public WebResponseContent CreateKLSNewOutTask(TaskDTO taskDTO, int taskType) { WebResponseContent content = new WebResponseContent(); try { Dt_KLSLocationInfo? kLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!"); if (kLSLocationInfo.LocationStatus != (int)LocationStatusEnum.InStock) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】当前库位状态不可出库!"); if (kLSLocationInfo.PalletCode != taskDTO.containerCode) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】绑定料箱号【{kLSLocationInfo.PalletCode}】与任务料箱号【{taskDTO.containerCode}】不匹配!"); Dt_Task dt_Task = new() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = kLSLocationInfo.RoadwayNo, TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = taskDTO.toLocationCode, TargetAddress = taskDTO.toLocationCode, Creater = "WMS", }; kLSLocationInfo.LocationStatus = (int)LocationStatusEnum.OutLock; #region 下发凯乐士任务 content = SendKLSTask(dt_Task); if (!content.Status) throw new Exception(content.Message); dt_Task.TaskState = (int)TaskStatusEnum.Execut; dt_Task.Dispatchertime = DateTime.Now; #endregion try { Db.Ado.BeginTran(); BaseDal.AddData(dt_Task); _kLSLocationInfoService.Repository.UpdateData(kLSLocationInfo); Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } return content.OK(data: new { taskCode = taskDTO.taskCode, Message = "成功!" }); } catch (Exception ex) { content.Data = new { taskCode = taskDTO.taskCode, Message = $"失败!{ex.Message}" }; return content.Error(ex.Message); } } #endregion #region 下发凯乐士任务 public WebResponseContent SendKLSTask(Dt_Task task) { WebResponseContent content = new WebResponseContent(); GALAXISTaskInfo gALAXISTaskInfo = new(); GALAXISReturn agvContent = new(); try { gALAXISTaskInfo.groupId = DateTime.Now.ToString("yyMMddHHmmss") + task.TaskNum; gALAXISTaskInfo.msgTime = DateTime.Now.ToString(); GALAXISTask gALAXISTask = new GALAXISTask() { taskId = task.WMSTaskNum, taskType = task.TaskType == (int)TaskTypeEnum.MLInbound ? 0 : 1, barCode = task.PalletCode, endNode = task.TargetAddress, startNode = task.SourceAddress, priorityCode = task.Grade }; gALAXISTaskInfo.tasks.Add(gALAXISTask); Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(GALAXISTaskInfo)) ?? throw new Exception("未找到凯乐士AGV任务下发接口配置信息!请检查接口配置"); string response = HttpHelper.Post(apiInfo.ApiAddress, gALAXISTaskInfo.Serialize()); agvContent = response.DeserializeObject(); content.OK(data: agvContent); if (agvContent.success) { if (agvContent.data.returnStatus != 0) throw new Exception(agvContent.data.returnInfo); } } catch (Exception ex) { content.Error(ex.Message); } finally { _trackloginfoService.AddTrackLog(gALAXISTaskInfo, content, "下发凯乐士AGV任务", "", agvContent.data.returnInfo); } return content; } #endregion #region 5 跨楼层运输任务创建 (都是点到点) public WebResponseContent CarryTask(TaskDTO taskDTO, int taskType) { WebResponseContent content = new WebResponseContent(); try { Dt_StationManger? stationInfo = null; Dt_Task dt_Task = null; //入库 到一楼三个站台的位置 if (taskType == (int)TaskTypeEnum.Q3RK) { dt_Task = new Dt_Task() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = "1", TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = taskDTO.toLocationCode, TargetAddress = taskDTO.toLocationCode, Creater = "WMS", }; } //出库 if (taskType == (int)TaskTypeEnum.Q3CK) { //stationInfo = _stationMangerService.Repository.QueryFirst(x => x.StationCode == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!"); //if (stationInfo.IsOccupied != (int)LocationStatusEnum.InStock) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】当前库位状态不可出库!"); dt_Task = new Dt_Task() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = "1", TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = taskDTO.toLocationCode, TargetAddress = taskDTO.toLocationCode, Creater = "WMS", }; } try { Db.Ado.BeginTran(); BaseDal.AddData(dt_Task); Db.Ado.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } return content.OK(data: new { taskCode = taskDTO.taskCode, Message = "成功!" }); } catch (Exception ex) { content.Error(ex.Message); } return content; } #endregion #region 6 裁剪送货 public WebResponseContent CJCarryTaske(TaskDTO taskDTO, int taskType) { WebResponseContent content = new WebResponseContent(); Dt_StationInfo? stationInfo = null; try { //#region 是否需要判断平库库位状态 //if (taskType!= (int)TaskTypeEnum.CK3F) //{ // stationInfo = _stationInfo.Repository.QueryFirst(x => x.StationName == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!"); // if (stationInfo.StationName != LocationStatusEnum.InStock.ToString()) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】当前库位状态不可出库!"); // if (stationInfo.PalletCode != taskDTO.containerCode) throw new Exception($"起点库位【{taskDTO.fromLocationCode}】绑定料箱号【{stationInfo.PalletCode}】与任务料箱号【{taskDTO.containerCode}】不匹配!"); //} //else //{ // stationInfo = _stationInfo.Repository.QueryFirst(x => x.StationName == taskDTO.toLocationCode) ?? throw new Exception($"未找到终点库位【{taskDTO.toLocationCode}】!"); // if (stationInfo.StationName != LocationStatusEnum.InStock.ToString()) throw new Exception($"起点库位【{taskDTO.toLocationCode}】当前库位状态不可出库!"); //} //#endregion Dt_Task dt_Task = new Dt_Task() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = "", TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = taskDTO.toLocationCode, TargetAddress = taskDTO.toLocationCode, Creater = "WMS", }; content = SendHIKROBOTTask(dt_Task); if (!content.Status) throw new Exception(content.Message); dt_Task.TaskState = (int)TaskStatusEnum.Execut; dt_Task.Dispatchertime = DateTime.Now; BaseDal.AddData(dt_Task); } catch (Exception ex) { content.Error(ex.Message); } return content; } #endregion #region 5空车转运 public WebResponseContent HKF01Transport(TaskDTO taskDTO, int taskType) { WebResponseContent content = new WebResponseContent(); try { var stationInfo = _stationInfo.Repository.QueryFirst(x => x.StationName == taskDTO.fromLocationCode) ?? throw new Exception($"未找到起点库位【{taskDTO.fromLocationCode}】!"); var dt_Task = new Dt_Task() { TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), WMSTaskNum = taskDTO.taskCode, //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Grade = taskDTO.taskPriority, PalletCode = taskDTO.containerCode, Roadway = "1", TaskState = (int)TaskStatusEnum.New, TaskType = taskType, SourceAddress = taskDTO.fromLocationCode, CurrentAddress = taskDTO.fromLocationCode, NextAddress = taskDTO.toLocationCode, TargetAddress = taskDTO.toLocationCode, Creater = "WMS", }; content = SendHIKROBOTTask(dt_Task); if (!content.Status) throw new Exception(content.Message); dt_Task.Dispatchertime = DateTime.Now; BaseDal.AddData(dt_Task); } catch (Exception ex) { content.Error(ex.Message); } return content; } #endregion } }