using Magicodes.IE.Core; using NetTaste; using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Text.Json; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.LocationEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO; using WIDESEAWCS_DTO.AGV.HIKROBOT; using WIDESEAWCS_DTO.RGV.FOURBOT; using WIDESEAWCS_DTO.WMS; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_TaskInfoService { public partial class TaskService { #region 更新任务状态 /// /// 更新任务状态 /// /// /// /// /// public WebResponseContent UpdateTaskStatus(object TaskDTO, DeviceTypeEnum deviceTypeEnum) { WebResponseContent content = new WebResponseContent(); GALAXISUpdateTaskStatus gALAXIS = new(); FOURBOTTaskStatusNotify Rgv = new();//四向车任务状态通知 HIKROBOTTaskProcessReport hIKROBOT = new();//海康机器人 try { if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) { gALAXIS = TaskDTO.Serialize().DeserializeObject(); if (gALAXIS == null) throw new Exception("参数转换失败!"); var task = BaseDal.QueryFirst(x => x.WMSTaskNum == gALAXIS.taskId); if (task == null) throw new Exception($"未找到任务,任务编号【{gALAXIS.taskId}】"); switch (gALAXIS.taskStatus) { case 0: TaskCompleted(task, deviceTypeEnum); break; case 4: TaskFromCompleted(task, deviceTypeEnum); break; default: task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum); BaseDal.UpdateData(task); break; } } else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) { hIKROBOT=TaskDTO.Serialize().DeserializeObject(); if (hIKROBOT==null) throw new Exception("参数转换失败!"); var task = BaseDal.QueryFirst(x => x.WMSTaskNum == hIKROBOT.robotTaskCode); if (task == null) throw new Exception($"未找到任务,任务编号【{hIKROBOT.robotTaskCode}】"); switch (hIKROBOT.extra.values.method) { case "start": TaskCompleted(task, deviceTypeEnum); break; case "end": TaskFromCompleted(task, deviceTypeEnum); break; default: task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum); BaseDal.UpdateData(task); break; } } else //四向车 { Rgv = TaskDTO.Serialize().DeserializeObject(); if (Rgv==null) throw new Exception("参数转换失败!"); var task = BaseDal.QueryFirst(x => x.WMSTaskNum == Rgv.taskID.ToString()); if (task==null) throw new Exception($"未找到任务,任务编号【{Rgv.taskID}】"); switch (Rgv.status) { case 2: TaskCompleted(task, deviceTypeEnum); break; case 4: TaskFromCompleted(task, deviceTypeEnum); break; default: task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum); break; } } return content.OK(); } catch (Exception ex) { return content.Error(ex.Message); } finally { // 在 finally 中判断哪个对象被赋值了 object logObject = null; string deviceName = ""; if (gALAXIS != null && gALAXIS.taskId != null) { logObject = gALAXIS; deviceName = "凯乐士AGV"; } else if (hIKROBOT != null && hIKROBOT.robotTaskCode != null) { logObject = hIKROBOT; deviceName = "海康机器人"; } else if (Rgv != null && Rgv.taskID != 0) { logObject = Rgv; deviceName = "四向车"; } if (logObject != null) { _trackloginfoService.AddTrackLog(logObject, content, $"下发{deviceName}任务", "", ""); } } } #endregion #region 任务状态转换 public int ReturnTaskStatus(object status, DeviceTypeEnum deviceTypeEnum) { try { if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) { TaskStatusEnum taskStatus = status switch { 1 => TaskStatusEnum.FromOutOfStock, 2 => TaskStatusEnum.ToaddInStock, 3 => TaskStatusEnum.TaskNumRepetition, 5 => TaskStatusEnum.RCSDataError, 6 => TaskStatusEnum.TaskTypeError, 7 => TaskStatusEnum.ParameterError, 8 => TaskStatusEnum.RCSError, 10 => TaskStatusEnum.Takeing, 13 => TaskStatusEnum.Cancel, _ => throw new ArgumentOutOfRangeException( nameof(status), status, $"未知的任务状态码: {status}" ) }; return (int)taskStatus; } else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) { return 0; } else { return 0; } } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #region 任务起点完成 /// /// 任务起点完成 /// /// /// /// public WebResponseContent TaskFromCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum) { try { dt_Task.TaskState = TaskStatusEnum.TakeFinish.ObjToInt(); Db.Ado.BeginTran(); UpdateLocationStatus(dt_Task, deviceTypeEnum, LocationStatusEnum.Free); BaseDal.UpdateData(dt_Task); Db.Ado.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } } #endregion #region 任务完成 /// /// 任务完成 /// /// /// /// public WebResponseContent TaskCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum) { try { WMSInOutBoundCompleteFeedback boundCompleteFeedback = new WMSInOutBoundCompleteFeedback(); WMSReturn agvContent = null; dt_Task.TaskState = TaskStatusEnum.Finish.ObjToInt(); Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(WMSInOutBoundCompleteFeedback)); if (apiInfo == null) dt_Task.ExceptionMessage = "未找到出入库完成反馈WMS接口配置信息!请检查接口配置"; else { boundCompleteFeedback.taskCode = dt_Task.WMSTaskNum; boundCompleteFeedback.containerCode = dt_Task.PalletCode; boundCompleteFeedback.fromStationCode = dt_Task.SourceAddress; boundCompleteFeedback.toLocationCode = dt_Task.TargetAddress; switch (deviceTypeEnum) { case DeviceTypeEnum.GALAXIS: boundCompleteFeedback.businessType = 1; break; case DeviceTypeEnum.YuanLiJuHe: boundCompleteFeedback.businessType = 2; break; } boundCompleteFeedback.completeType = 1; string response = HttpHelper.Post(apiInfo.ApiAddress, boundCompleteFeedback.Serialize()); agvContent = response.DeserializeObject(); if (agvContent.code != 0) dt_Task.ExceptionMessage = agvContent.msg; } Db.Ado.BeginTran(); UpdateLocationStatus(dt_Task, deviceTypeEnum, LocationStatusEnum.InStock); if (agvContent != null && agvContent.code == 0) BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.自动完成); else BaseDal.UpdateData(dt_Task); Db.Ado.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } } #endregion #region 更新货位状态 /// /// 更新货位状态 /// /// /// /// /// public WebResponseContent UpdateLocationStatus(Dt_Task takse, DeviceTypeEnum deviceTypeEnum, LocationStatusEnum locationStatusEnum) { try { if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) { Dt_KLSLocationInfo? dt_KLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress); if (dt_KLSLocationInfo != null) { if (locationStatusEnum== LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号 { dt_KLSLocationInfo.PalletCode = ""; } else { dt_KLSLocationInfo.PalletCode = takse.PalletCode; } dt_KLSLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); _kLSLocationInfoService.Repository.UpdateData(dt_KLSLocationInfo); } } else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) { Dt_HKLocationInfo? dt_HKLocationInfo = _hKLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress); if (dt_HKLocationInfo != null) { if (locationStatusEnum == LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号 { dt_HKLocationInfo.PalletCode = ""; } else { dt_HKLocationInfo.PalletCode = takse.PalletCode; } dt_HKLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); _hKLocationInfoService.Repository.UpdateData(dt_HKLocationInfo); } } else if (deviceTypeEnum == DeviceTypeEnum.YuanLiJuHe) { Dt_RGVLocationInfo dt_RGVLocationInfo = _rGVLocationInfoService.Repository.QueryFirst(x => x.LocationCode == takse.SourceAddress); //这里将任务的托盘号给货位表中的PalletCode字段。 if (dt_RGVLocationInfo != null) { if (locationStatusEnum == LocationStatusEnum.Free) //如果起点完成就给货位赋值托盘号 { dt_RGVLocationInfo.PalletCode = ""; } else { dt_RGVLocationInfo.PalletCode = takse.PalletCode; } dt_RGVLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); _rGVLocationInfoService.Repository.UpdateData(dt_RGVLocationInfo); } } else//库外站台 { } return WebResponseContent.Instance.OK(); } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion } }