#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using Autofac.Core; using AutoMapper; using HslCommunication; using Magicodes.ExporterAndImporter.Core; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Routing; using NetTaste; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using SqlSugar; using StackExchange.Profiling.Internal; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Net.NetworkInformation; using System.Reflection; using System.Reflection.Metadata; using System.Reflection.PortableExecutable; using System.Runtime.InteropServices; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using WIDESEA_Comm.Http; using WIDESEA_Common.Log; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_Core.Utilities; using WIDESEAWCS_DTO.Enum; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Repository; using WIDESEAWCS_QuartzJob.Service; using static Microsoft.IO.RecyclableMemoryStreamManager; using static System.Net.Mime.MediaTypeNames; namespace WIDESEAWCS_TaskInfoService { public class TaskService : ServiceBase, ITaskService { private readonly IRouterService _routerService; private readonly IRouterRepository _routerRepository; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; private readonly ITask_HtyService _task_HtyService; private readonly IMapper _mapper; private readonly IEquipmentStatusService _equipmentStatus; private readonly IAgvStationService _gvStationService; private Dictionary _taskOrderBy = new() { {nameof(Dt_Task.Grade),OrderByType.Asc }, {nameof(Dt_Task.CreateDate),OrderByType.Asc}, }; public Dictionary TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } } public List TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); public List TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService, IRouterRepository routerRepository, IEquipmentStatusService equipmentStatus, IAgvStationService agvStationService) : base(BaseDal) { _routerService = routerService; _taskExecuteDetailService = taskExecuteDetailService; _taskExecuteDetailRepository = taskExecuteDetailRepository; _task_HtyService = task_HtyService; _mapper = mapper; _routerRepository = routerRepository; _equipmentStatus = equipmentStatus; _gvStationService = agvStationService; } /// /// 兰剑WCS调取接口 /// public string urlLanJianWCSAPI = WIDESEAWCS_Core.Helper.AppSettings.Configuration["urlLanJianWCSAPI"]; /// /// 兰剑接口名(堆垛机运行状态) /// public string LanJianStkRunStatus = WIDESEAWCS_Core.Helper.AppSettings.Configuration["LanJianStkRunStatus"]; /// /// 兰剑任务反馈接口 /// public string LanJiantaskResult = WIDESEAWCS_Core.Helper.AppSettings.Configuration["LanJiantaskResult"]; /// /// 接收任务信息 /// /// WMS任务对象集合 /// 返回处理结果 public ExpoReverse TaskInstruction(ExpoTaskDTO expoTask) { ExpoReverse content = new ExpoReverse(); try { foreach (var item in expoTask.data) { //查询数据库,查看是否有当前任务 Dt_Task dt_Tasks = BaseDal.QueryFirst(x => x.TaskNum == item.taskNo); if (dt_Tasks != null) { content.code = 1; content.msg = $"明和WCS已有当前任务ID,请勿重新下发,任务号:{dt_Tasks.TaskNum}"; WriteLog.Write_Log("任务接收", "任务重复", "异常任务", $"任务号:{dt_Tasks.TaskNum}重复,兰剑系统下发重复任务!!!"); return content; } if (item.type == 1) //入库 { Dt_Task dt_Task = new Dt_Task(); dt_Task.TaskNum = item.taskNo; dt_Task.PalletCode = item.containerNo; //暂无 dt_Task.Roadway = "RGV101"; dt_Task.TaskType = (int)TaskInboundTypeEnum.Inbound; dt_Task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; //取货 dt_Task.RGVCurrentexecution = "0"; //目前暂无 dt_Task.TaskState = (int)TaskInStatusEnum.RGV_InNew; //目前暂无 dt_Task.SourceAddress = item.startAddress; dt_Task.TargetAddress = item.endAddress; dt_Task.CurrentAddress = item.startAddress; dt_Task.NextAddress = ""; //目前暂无 dt_Task.Grade = item.priority; dt_Task.WMSId = 0; //目前暂无 BaseDal.AddData(dt_Task); content.code = 0; int taskidt = BaseDal.QueryFirst(x => x.TaskNum == dt_Task.TaskNum).TaskId; _taskExecuteDetailService.AddTaskExecuteDetail(taskidt, $"系统自动流程,创建任务"); } else if (item.type == 2) //出库 { string roadway = ""; switch (item.startAddress) { case "1": roadway = "RGV110"; break; case "2": roadway = "RGV112"; break; case "3": roadway = "RGV114"; break; case "4": roadway = "RGV115"; break; } AGVStation gVStation = _gvStationService.Corridorequipment(roadway); Dt_Task dt_Task = new Dt_Task(); dt_Task.TaskNum = item.taskNo; dt_Task.PalletCode = item.containerNo; //暂无 dt_Task.Roadway = roadway; dt_Task.TaskType = (int)TaskOutboundTypeEnum.Outbound; dt_Task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly; //取货 dt_Task.RGVCurrentexecution = "0"; //目前暂无 dt_Task.TaskState = (int)TaskOutStatusEnum.OutNew; //目前暂无 dt_Task.SourceAddress = item.startAddress; dt_Task.TargetAddress = "0"; dt_Task.CurrentAddress = gVStation.Motherinlaw.ToString(); dt_Task.NextAddress = gVStation.ZicheMotherinlaw.ToString(); //目前暂无 dt_Task.Grade = item.priority; dt_Task.WMSId = 0; //目前暂无 BaseDal.AddData(dt_Task); content.code = 0; _taskExecuteDetailService.AddTaskExecuteDetail(dt_Task.TaskId, $"系统自动流程,创建任务"); } else { content.code = 1; content.msg = $"任务类型错误,wcs接收到的类型为:{item.type}"; } } WriteLog.Write_Log("任务接收", "接收兰剑下发任务", "成功", $"接收到的数据为:{expoTask.ToJson()}"); } catch (Exception ex) { content.code = 1; content.msg = $"数据错误,原因:{ex.Message}"; WriteLog.Write_Log("任务接收", "接收兰剑下发任务异常", "异常", ex.Message); } return content; } /// /// 根据设备编号、当前地址按照优先级以及创建时间排序查询任务池新增的任务 /// /// 设备编号 /// 返回任务实体对象,可能为null public Dt_Task QueryStackerCraneTask(AGVStation GdMuChe, AGVStation GdZiche) { if (GdZiche.Station_Area == 3) //3巷道母车 { Dt_Task dt_Task = BaseDal.QueryFirst(x => x.Roadway == GdMuChe.ChildPosiDeviceCode && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); //获取到对应母车的任务 if (dt_Task != null) { Dt_Task dt_Task4 = BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.NextAddress == GdZiche.MotherCarDeviceCode.ToString() && x.Grade < dt_Task.Grade, TaskOrderBy); Dt_Task dt_Taskhcj = BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish && x.CurrentAddress == GdZiche.HCJStorageaddress.ToString() && x.Grade < dt_Task.Grade, TaskOrderBy); if (dt_Task4 == null && dt_Taskhcj == null) //在两个站台的任务优先级都正常,则正常移动 { return dt_Task; } } //获取HCJ站台任务与4巷任务 return null; } return null; } public Dt_Task ObtainHCJtask(string curraderr) { return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && (x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheExecuting || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheReleaseExecuting) && x.CurrentAddress == curraderr, TaskOrderBy); } public Dt_Task ObtainMuChetask(string Nextaderr) { return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.NextAddress == Nextaderr, TaskOrderBy); } /// /// 获取母车是否有任务,进行判断 /// public Dt_Task ObtainMuChetaskbool(AGVStation ZicheinnerSide) { return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskType == (int)TaskOutStatusEnum.RGV_OutMothercarExecuting), TaskOrderBy); } public Dt_Task GetChariotTaskBool(string ChildPosiDeviceCode) { Dt_Task dt_Task2 = BaseDal.QueryFirst(x => x.Roadway == ChildPosiDeviceCode, TaskOrderBy); if (dt_Task2 != null) return dt_Task2; return null; } /// /// 获取HCJ站台是否有任务 /// public Dt_Task GetHCJTaskBool(string ChildPosiDeviceCode,int HCJaddres) { Dt_Task dt_Task2 = BaseDal.QueryFirst(x => x.Roadway == ChildPosiDeviceCode && x.CurrentAddress== HCJaddres.ToString(), TaskOrderBy); if (dt_Task2 != null) return dt_Task2; return null; } public Dt_Task ChildVehicleMission(AGVStation aGVStation) { Dt_Task dt_Tasks2 = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.MotherCardeputy.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); if (dt_Tasks2 != null) return dt_Tasks2; Dt_Task dt_Tasks = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.MotherCarDeviceCode.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); if (dt_Tasks != null) return dt_Tasks; Dt_Task dt_Tasks3 = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.HCJStorageaddress.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); if (dt_Tasks3 != null) return dt_Tasks3; return null; } public Dt_Task GetFinhuoTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy); } public Dt_Task GetOutkouFinhuoTask(string DeviceCode, string curraderr) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutPickupFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing && x.NextAddress != "", TaskOrderBy); } /// /// 获取出库口子车取货 /// /// /// /// public Dt_Task GetOutchachekouFinhuoTask(string DeviceCode, string curraderr) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && x.CurrentAddress == curraderr, TaskOrderBy); } /// /// 入库取货任务 /// /// /// 1:查找需要取货的任务 public Dt_Task PickupWarehouse(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InNew && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); } /// /// 任务查找 /// /// /// 1:查找需要取货的任务 2:查找需要放货的任务 public Dt_Task GetInkouFinhuoTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.NextAddress != "" && x.TaskState == (int)TaskInStatusEnum.RGV_InPickupFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy); } /// /// 母车移动任务 /// /// public Dt_Task MothermachinemovementTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly, TaskOrderBy); } /// /// 获取母车移动任务和移动中的任务(入库) /// /// /// public Dt_Task MothermachinemovementTask2(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarExecuting && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly), TaskOrderBy); } /// /// 获取母车移动任务和移动中的任务(入库) /// public Dt_Task MothermacTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish || x.TaskState == (int)TaskInStatusEnum.SC_InExecuting || x.TaskState == (int)TaskInStatusEnum.InFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly), TaskOrderBy); } /// /// 获取母车移动任务和移动中的任务(出库) /// /// public Dt_Task OutMothermaTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarExecuting && x.RGVTaskType == (int)TaskOutStatusEnum.RGV_OutMothercarFinish), TaskOrderBy); } /// /// 子车进行放货任务 /// /// public Dt_Task ViceChariotPlacingTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InZicheFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy); } /// /// 子车取货任务,取货HCJ任务 /// /// public Dt_Task ViceChariotPickupTask(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); } /// /// 获取子车取货任务,进入母车取货 /// /// public Dt_Task OutPickupZiche(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheExecuting) && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); } /// /// 判断是否有子车取HCJ任务,或者在执行的任务 /// /// public Dt_Task ViceChariotPickupTask2(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish) && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy); } public WebResponseContent UpdateDeliveryAddress(string NextAddress, int tasktype) { WebResponseContent webResponse = new WebResponseContent(); try { Dt_Task dt_Task = null; if (tasktype == 1) { dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState== (int)TaskInStatusEnum.InexceptionalSelection); } else { dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.Outbound && x.NextAddress == ""); } if (dt_Task == null) return webResponse.Error("未找到需要修改的任务,无需修改"); dt_Task.NextAddress = NextAddress; BaseDal.UpdateData(dt_Task); return webResponse.OK("任务放货地址修改成功"); } catch (Exception ex) { return webResponse.Error($"任务放货地址修改失败!原因:{ex.Message}"); throw; } } public WebResponseContent UpdateRGVTasktype(int taskNum, int RGVTasktype) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); int RGvtype = 0; string rwlx = "无"; switch (RGVTasktype) { case (int)RGVTaskTypeEnum.PickingUp: RGvtype = 1; rwlx = "取货"; break; case (int)RGVTaskTypeEnum.Placing: RGvtype = 2; rwlx = "放货"; break; case (int)RGVTaskTypeEnum.TravelingOnly: RGvtype = 3; rwlx = "仅行走中"; break; } task.RGVTaskType = RGvtype; bool updatesta = BaseDal.UpdateData(task); content = WebResponseContent.Instance.OK(); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); throw; } return content; } /// /// 更新任务异常信息显示 /// /// 任务号 /// 异常信息 public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) { task.TaskState = (int)TaskInStatusEnum.InPending; } else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) { task.TaskState = (int)TaskOutStatusEnum.OutPending; } task.ExceptionMessage = message; task.ModifyDate = DateTime.Now; BaseDal.UpdateData(task); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "更新任务异常:" + task.ExceptionMessage); content = WebResponseContent.Instance.OK(); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 将任务状态修改为下一个状态 /// /// 任务实体对象 /// public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { int oldState = task.TaskState; if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) { if (task.TaskState >= (int)TaskInStatusEnum.InFinish) { return content = WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskState}】"); } int nextStatus = task.TaskState.GetNextNotCompletedStatus(); task.TaskState = nextStatus; /*if (task.TaskState == (int)TaskInStatusEnum.RGV_InPickupExecuting) //当下发入库口取货中,则调取兰剑接口 { TaskResultIn(task.TaskNum.ToString(),"",1,""); }*/ } else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) { if (task.TaskState >= (int)TaskOutStatusEnum.OutFinish) { return content = WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskState}】"); } int nextStatus = task.TaskState.GetNextNotCompletedStatus(); task.TaskState = nextStatus; } else { throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】"); } if (task.TaskState <= 0) { return content = WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskState}】"); } task.ModifyDate = DateTime.Now; task.Modifier = "System"; BaseDal.UpdateData(task); string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态 string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态 string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态 _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"人工手动将任务状态从【{oldstaterem}】跳转到【{afterstaterem}】" : $"系统自动流程,任务状态从【{oldstaterem}】转到【{afterstaterem}】"); content = WebResponseContent.Instance.OK(); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 恢复挂起任务 /// /// 任务号 /// 返回处理结果 public WebResponseContent TaskStatusRecovery(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending) { return content = WebResponseContent.Instance.Error($"该任务状态不可恢复,任务号:【{taskNum}】,任务状态:【{task.TaskState}】"); } Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); if (taskExecuteDetail != null) { task.TaskState = taskExecuteDetail.TaskState; } else { if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) { task.TaskState = (int)TaskOutStatusEnum.OutNew; } else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) { task.TaskState = (int)TaskInStatusEnum.RGV_InNew; } //todo } task.ExceptionMessage = string.Empty; BaseDal.UpdateData(task); string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态 _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工恢复挂起任务,恢复挂起时任务状态【{afterstaterem}】"); content = WebResponseContent.Instance.OK(); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 回滚任务状态 /// /// 任务号 /// 返回处理结果 public WebResponseContent RollbackTaskStatusToLast(int taskNum) { WebResponseContent content = new(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); int oldState = task.TaskState; Dt_TaskExecuteDetail taskExecuteDetail = null; if (task.NextAddress == "1061") { taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState > task.TaskState && x.TaskState > 0, new Dictionary { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); } else { taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); } if (taskExecuteDetail != null) { task.TaskState = taskExecuteDetail.TaskState; task.CurrentAddress = taskExecuteDetail.CurrentAddress; task.NextAddress = taskExecuteDetail.NextAddress; } else { return content = WebResponseContent.Instance.Error($"未找到任务明细信息,该任务状态不可回滚到上一步,任务号:【{taskNum}】,任务状态:【{task.TaskState}】"); } task.ExceptionMessage = string.Empty; BaseDal.UpdateData(task); string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态 string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态 string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态 _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工手动将任务状态从【{oldstaterem}】回归到【{afterstaterem}】"); content = WebResponseContent.Instance.OK(); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// /// 删除数据 /// /// 主键数组 /// public virtual WebResponseContent DeleteData(object[] keys) { try { List tasks = BaseDal.QureyDataByIds(keys); foreach (Dt_Task task in tasks) { _task_HtyService.AddTaskHty(task); } if (typeof(Dt_Task).GetNavigatePro() == null) return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error(); else { if (keys != null) { Type detailType = typeof(Dt_Task).GetDetailType(); string name = typeof(Dt_Task).GetMainIdByDetail(); List dynamicDelKeys = new List(); for (int i = 0; i < keys.Length; i++) { dynamicDelKeys.Add(keys[i]); } ((SqlSugarClient)BaseDal.Db).BeginTran(); if (dynamicDelKeys.Count > 0) BaseDal.Db.Deleteable().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange(); BaseDal.DeleteDataByIds(keys); ((SqlSugarClient)BaseDal.Db).CommitTran(); return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error("参数错误"); } } } catch (Exception ex) { ((SqlSugarClient)BaseDal.Db).RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 任务完成将状态修改至下一步(后续调整) /// /// 任务编号 /// 返回处理结果 public WebResponseContent UpdateTaskStatus(int taskNum) { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); int oldState = task.TaskState; try { if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) //正常流程 { HandleInboundTask(task); } else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && (task.NextAddress == "1001" || task.NextAddress == "1002")) { task.TaskState = (int)TaskInStatusEnum.RGV_InMothercarFinish; } else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) { HandleOutboundTask(task); } else { return WebResponseContent.Instance.Error("未知的任务类型"); } task.ExceptionMessage = string.Empty; BaseDal.UpdateData(task); string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态 string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态 string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态 _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"人工手动将任务状态从【{oldstaterem}】跳转到【{afterstaterem}】" : $"系统自动流程,任务状态从【{oldstaterem}】转到【{afterstaterem}】"); if (task.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish || task.TaskState == (int)TaskOutStatusEnum.OutFinish) //入库任务完成 { if (task.NextAddress == "1001" || task.NextAddress == "1002") { //异常排除任务时,异常上报 } else { //正常任务,正常上报 TaskResultIn(task.TaskNum.ToString(), "", 2, ""); /*AutomaticTaskCompleted(task); //任务完成 BaseDal.DeleteData(task);*/ } } return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error("更新任务状态时发生系统错误"); } } #region 入库 public WebResponseContent HandleInAbnormal(int taskNum) { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); task.TaskState = (int)TaskInStatusEnum.InAbnormalFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; BaseDal.UpdateData(task); return WebResponseContent.Instance.OK(); } private void HandleInboundTask(Dt_Task task) { switch (task.TaskState) { case (int)TaskInStatusEnum.RGV_InPickupExecuting: task.TaskState = (int)TaskInStatusEnum.RGV_InPickupFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; task.NextAddress = "1021"; break; case (int)TaskInStatusEnum.RGV_InReleaseExecuting: HandleInboundRelease(task); //入库RGV放货完成后,修改任务状态到子车取货任务 break; case (int)TaskInStatusEnum.RGV_InZicheExecuting: task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; task.TaskState = (int)TaskInStatusEnum.RGV_InZicheFinish; break; case (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting: HandleInboundZichemove(task); break; case (int)TaskInStatusEnum.RGV_InMothercarExecuting: task.TaskState = (int)TaskInStatusEnum.RGV_InMothercarFinish; break; default: throw new InvalidOperationException($"未知的入库任务状态: {task.TaskState}"); } } /// /// 入库RGV放货完成后 /// /// private void HandleInboundRelease(Dt_Task task) { task.TaskState = (int)TaskInStatusEnum.RGV_InReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; Dt_Router routes = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.IsEnd == false && x.ChildPosi == task.TargetAddress ); if (task.TargetAddress != "1" && task.TargetAddress != "2") { routes = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.IsEnd == false && x.ChildPosi == "1061" ); } task.Roadway = routes.ChildPosiDeviceCode; task.CurrentAddress = routes.StartPosi; task.NextAddress = routes.NextPosi; } private void HandleInboundZichemove(Dt_Task task) { if (task.TargetAddress == "1" || task.TargetAddress == "2") { task.TaskState = (int)TaskInStatusEnum.RGV_InZicheReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly; Dt_Router dt_InRouter = _routerRepository.QueryFirst(x => x.IsEnd == true && x.StartPosi == task.NextAddress && x.InOutType == 1); task.CurrentAddress = dt_InRouter.StartPosi; task.NextAddress = dt_InRouter.NextPosi; task.Roadway = dt_InRouter.ChildPosiDeviceCode; } else { //子车完成 Dt_Router dt_Routernei = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.ChildPosi == task.TargetAddress && x.IsEnd == false); if (dt_Routernei != null) { task.TaskState = (int)TaskInStatusEnum.RGV_InReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; task.CurrentAddress = dt_Routernei.StartPosi; task.NextAddress = dt_Routernei.NextPosi; task.Roadway = dt_Routernei.ChildPosiDeviceCode; } else { Dt_Router dt_Routernei2 = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.ChildPosi == task.TargetAddress && x.IsEnd==true); task.TaskState = (int)TaskInStatusEnum.RGV_InZicheReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly; task.CurrentAddress = dt_Routernei2.StartPosi; task.NextAddress = dt_Routernei2.NextPosi; task.Roadway = dt_Routernei2.ChildPosiDeviceCode; } } } #endregion #region 出库 private void HandleOutboundTask(Dt_Task task) { switch (task.TaskState) { case (int)TaskOutStatusEnum.RGV_OutMothercarExecuting: Dt_Router dt_Router = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 2); task.CurrentAddress = dt_Router.StartPosi; task.NextAddress = dt_Router.NextPosi; task.Roadway = dt_Router.ChildPosiDeviceCode; task.TaskState = (int)TaskOutStatusEnum.RGV_OutMothercarFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; break; case (int)TaskOutStatusEnum.RGV_OutZicheExecuting: task.TaskState = (int)TaskOutStatusEnum.RGV_OutZicheFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; break; case (int)TaskOutStatusEnum.RGV_OutZicheReleaseExecuting: HandleOutboundZicheRelease(task); break; case (int)TaskOutStatusEnum.RGV_OutPickupExecuting: task.TaskState = (int)TaskOutStatusEnum.RGV_OutPickupFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; break; case (int)TaskOutStatusEnum.RGV_OutReleaseExecuting: task.TaskState = (int)TaskOutStatusEnum.OutFinish; break; default: throw new InvalidOperationException($"未知的出库任务状态: {task.TaskState}"); } } private void HandleOutboundZicheRelease(Dt_Task task) { var route = _routerRepository.QueryFirst(x => x.StartPosi == task.CurrentAddress && x.InOutType == 2 ); if (route == null) throw new InvalidOperationException("未找到对应的路由信息"); if (route.IsEnd) { task.TaskState = (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; task.Roadway = "RGV118"; task.CurrentAddress = "1171"; task.NextAddress = ""; } else { var nextRoute = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 2 ); if (nextRoute == null) throw new InvalidOperationException("未找到下一个路由信息"); task.TaskState = (int)TaskOutStatusEnum.RGV_OutMothercarFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; task.CurrentAddress = nextRoute.StartPosi; task.NextAddress = nextRoute.NextPosi; task.Roadway = nextRoute.ChildPosiDeviceCode; } } #endregion #region 兰剑调取接口内容 /// /// 查询RGV状态(完成,待测试) /// /// /// public RGVStoResponse RgvStatus(StatusqueryReception statusquery) { RGVStoResponse rGVstatus = new RGVStoResponse(); try { foreach (var item in statusquery.data) { if (statusquery == null) { rGVstatus.code = 1; rGVstatus.msg = "明和WCS接收到的参数为空,请检查"; return rGVstatus; } if (item.rgvTag == null) { rGVstatus.code = 1; rGVstatus.msg = "明和WCS接收到RGV编号为空,请检查"; return rGVstatus; } IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == item.rgvTag); if (device == null) { rGVstatus.code = 1; rGVstatus.msg = "查询的RGV已断线"; return rGVstatus; } SpeStackerCrane Commonstacker = (SpeStackerCrane)device; //当前位置 DeviceProDTO? deviceProDTO = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RGVCurrentlocation" && x.DeviceProParamType == "RGVCurrentlocation"); if (item.type == "pick") //取货 { //获取设备 //获取取货站台货位站台 AGVStation aGVStation = _gvStationService.Corridorequipment(item.rgvTag); if (aGVStation == null) { rGVstatus.code = 1; rGVstatus.msg = "未查找到该RGV"; return rGVstatus; } //有无货状态 DeviceProDTO? deviceProFh = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvEquipmentStatus" && x.DeviceProParamType == "RgvEquipmentStatus"); DeviceProDTO? RgvCraneAutoStatus = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvCraneAutoStatus" && x.DeviceProParamType == "RgvCraneAutoStatus"); int Itstock = Commonstacker.Communicator.Read(deviceProFh.DeviceProAddress); int RgvCraneAutoStatusValues = Commonstacker.Communicator.Read(RgvCraneAutoStatus.DeviceProAddress); int Currentlocation = Commonstacker.Communicator.Read(deviceProDTO.DeviceProAddress); if (Currentlocation == aGVStation.Motherinlaw && Itstock == 1 && RgvCraneAutoStatusValues == 1) //是否在取货位 { rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 1 }, }; } else { rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 0 }, }; } } else if (item.type == "put") //放货 { AGVStation aGVStation = _gvStationService.Corridorequipment(item.rgvTag); int Currentlocation = Commonstacker.Communicator.Read(deviceProDTO.DeviceProAddress); //有无货状态 DeviceProDTO? deviceProFh = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvEquipmentStatus" && x.DeviceProParamType == "RgvEquipmentStatus"); DeviceProDTO? RgvCraneAutoStatus = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvCraneAutoStatus" && x.DeviceProParamType == "RgvCraneAutoStatus"); int Itstock = Commonstacker.Communicator.Read(deviceProFh.DeviceProAddress); int RgvCraneAutoStatusValues = Commonstacker.Communicator.Read(RgvCraneAutoStatus.DeviceProAddress); if (aGVStation.Motherinlaw== Currentlocation && Itstock==0 && RgvCraneAutoStatusValues==1) //Itstock:0为无货 RgvCraneAutoStatusValues: 1为自动 { rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 2 }, }; } else { rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 0 }, }; } } else { rGVstatus.code = 1; rGVstatus.msg = $"明和WCS接收的参数类型错误,实际接收值为:{item.type}"; } } return rGVstatus; } catch (Exception ex) { rGVstatus.code = 1; rGVstatus.msg = $"明和WCS接口错误:{ex.Message}"; return rGVstatus; } } /// /// 堆垛机完成的接口 /// /// /// public ExpoReverse StkPickPutStatus(SCstatusReception sCstatus) { ExpoReverse expoReverse = new ExpoReverse(); try { foreach (var item in sCstatus.data) { if (sCstatus == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS接收到的参数为空,请检查"; return expoReverse; } if (item.rgvTag == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS接收到RGV编号为空,请检查"; return expoReverse; } //查找RGV完成的任务 if (item.type == "pick") //取货 { if (item.status == 1) //堆垛机进行取货中 { Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish && x.Roadway == item.rgvTag); if (dt_Task == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS未找到需要取货的任务"; return expoReverse; } dt_Task.TaskState = (int)TaskInStatusEnum.SC_InExecuting; BaseDal.UpdateData(dt_Task); expoReverse.code = 0; } else if (item.status == 2) { Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState == (int)TaskInStatusEnum.SC_InExecuting && x.Roadway == item.rgvTag); if (dt_Task == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS未找到需要取货的任务"; return expoReverse; } dt_Task.TaskState = (int)TaskInStatusEnum.InFinish; AutomaticTaskCompleted(dt_Task); //有问题,等待优化 BaseDal.DeleteData(dt_Task); //删除任务 expoReverse.code = 0; } } else if (item.type == "put") //放货 { if (item.status == 2) //堆垛机执行中 { Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.Outbound && x.TaskState == (int)TaskOutStatusEnum.OutNewLj && x.Roadway == item.rgvTag); if (dt_Task != null) { dt_Task.TaskState = (int)TaskOutStatusEnum.OutNew; BaseDal.UpdateData(dt_Task); } } expoReverse.code = 0; } else { expoReverse.code = 1; expoReverse.msg = $"明和WCS接收的参数类型错误,实际接收值为:{item.type}"; } } return expoReverse; } catch (Exception ex) { expoReverse.code = 1; expoReverse.msg = $"明和WCS接口错误:{ex.Message}"; return expoReverse; } } /// /// 获取堆垛机故障信息 /// /// /// public ExpoReverse StkErrorStatus(SCErrorStatusReception sCErrorStatus) { ExpoReverse expoReverse = new ExpoReverse(); try { if (sCErrorStatus == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS接收到的参数为空,请检查"; return expoReverse; } List equipmentdata = new List(); List equipmentList = _equipmentStatus.GetEquipmentStatus(); foreach (var item in sCErrorStatus.data) { EquipmentStatus equipment = equipmentList.Find(x => x.Equipment_Number == item.stackerName); if (equipment.Equipment_Status != item.errorStatus) { equipment.Equipment_Status = item.errorStatus; equipmentdata.Add(equipment); } } if (equipmentdata.Count > 0) { _equipmentStatus.UpdateData(equipmentdata); //修改状态 } expoReverse.code = 0; return expoReverse; } catch (Exception ex) { expoReverse.code = 1; expoReverse.msg = $"明和WCS接口错误:{ex.Message}"; WriteLog.Write_Log("设备状态更改", "堆垛机状态更改", "异常", ex.Message); return expoReverse; } } /// /// 任务取消接口(待测试) /// /// /// public ExpoReverse TaskCancel(TaskcanceledReception taskcanceled) { ExpoReverse expoReverse = new ExpoReverse(); try { List _TaskList = BaseDal.QueryData(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound).ToList(); foreach (var item in taskcanceled.data) { if (taskcanceled == null) { expoReverse.code = 1; expoReverse.msg = "明和WCS接收到的参数为空,请检查"; return expoReverse; } Dt_Task dt_Task = _TaskList.FirstOrDefault(x => x.TaskNum == item.taskNo); if (dt_Task != null) { if (dt_Task.TaskState == (int)TaskInStatusEnum.RGV_InNew) { dt_Task.TaskState = (int)TaskInStatusEnum.InCancel; //任务取消后,则移入历史 _task_HtyService.AddTaskHty(dt_Task); BaseDal.DeleteData(dt_Task); expoReverse.code = 0; WriteLog.Write_Log("任务取消信息", "任务取消", "信息", $"任务号:{dt_Task.TaskNum},已取消"); } else { expoReverse.code = 0; expoReverse.msg = $"当前任务已在执行中,不可取消!任务号:{item.taskNo}"; return expoReverse; } } else { expoReverse.code = 0; expoReverse.msg = $"未找到入库任务,任务号:{item.taskNo}"; return expoReverse; } } return expoReverse; } catch (Exception ex) { expoReverse.code = 1; expoReverse.msg = $"明和WCS接口错误:{ex.Message}"; return expoReverse; } } #endregion /// /// 堆垛机运行状态接口 /// /// /// public WebResponseContent StkRunStatus() { WebResponseContent responseContent = new WebResponseContent(); // 创建并赋值 StkRunStatusReception reception = new StkRunStatusReception { data = new List { new StkRunStatusData { stackerName = "ALL" } } }; StkRunStatusReturns LJReturns = HttpHelper.Post(urlLanJianWCSAPI + LanJianStkRunStatus, reception, "查询堆垛机运行状态"); if (LJReturns.code == 0) { if (LJReturns.data[0].runStatus == 0) //全部堆垛机不在运行状态 { return responseContent.OK(); } else { return responseContent.Error($"有堆垛机在运行中,不可限制"); } } else { WriteLog.Write_Log("堆垛机运行状态查询", "状态查询失败", "接口调取失败", $"返回内容:{LJReturns.msg}"); return responseContent.Error($"调取兰剑WCS失败!,返回内容:{LJReturns.msg}"); } } /// /// 任务信息状态上传(固定入库接口)可进行测试 1.当执行该任务的时候,上报兰剑任务执行中 /// /// /// public WebResponseContent TaskResultIn(string taskNo, string finalAddress, int status, string remark) { WebResponseContent responseContent = new WebResponseContent(); TaskfeedbackResponse reception = new TaskfeedbackResponse { data = new List { new TaskfeedbackData { taskNo = taskNo, type = 1, finalAddress = finalAddress, status = status, remark = remark } } }; StkRunStatusReturns LJReturns = HttpHelper.Post(urlLanJianWCSAPI + LanJiantaskResult, reception, "任务反馈接口"); if (LJReturns.code == 0) { responseContent.OK("上传成功"); } else { responseContent.OK("上传失败,原因:" + LJReturns.msg); } // 创建并赋值 return responseContent; } /// /// 任务信息状态上传(固定出库接口)可进行测试 /// /// /// public WebResponseContent TaskResultOut(string taskNo, string finalAddress, int status, string remark) { WebResponseContent responseContent = new WebResponseContent(); TaskfeedbackResponse reception = new TaskfeedbackResponse { data = new List { new TaskfeedbackData { taskNo = taskNo, type = 2, finalAddress = finalAddress, status = status, remark = remark } } }; StkRunStatusReturns LJReturns = HttpHelper.Post(urlLanJianWCSAPI + LanJiantaskResult, reception, "任务反馈接口"); if (LJReturns.code == 0) { responseContent.OK("上传成功"); } else { responseContent.OK("上传失败,原因:" + LJReturns.msg); } // 创建并赋值 return responseContent; } /// /// 自动完成任务 /// /// /// /// public WebResponseContent AutomaticTaskCompleted(Dt_Task dt_task) { try { var res = _task_HtyService.AddData(new Dt_Task_hty { TaskNum = dt_task.TaskNum, PalletCode = dt_task.PalletCode, Roadway = dt_task.Roadway, TaskType = dt_task.TaskType, TaskState = dt_task.TaskState, SourceAddress = dt_task.SourceAddress, TargetAddress = dt_task.TargetAddress, CurrentAddress = dt_task.CurrentAddress, NextAddress = dt_task.NextAddress, WMSId = dt_task.WMSId, Dispatchertime = dt_task.Dispatchertime, Remark = "自动完成", Creater = App.User.UserName, CreateDate = DateTime.Now, RGVTaskType = dt_task.RGVTaskType, RGVCurrentexecution = dt_task.RGVCurrentexecution }); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error("任务完成失败!"); } } /// /// 人工手动完成 /// /// /// /// public WebResponseContent CompletedManually(int id, int CompletionType) { var db = BaseDal.Db as SqlSugarClient; try { db.Ado.BeginTran(); Dt_Task dt_task = BaseDal.QueryData().Where(x => x.TaskId == id).FirstOrDefault(); if (dt_task == null) return WebResponseContent.Instance.Error($"未查询到任务"); string Remark = CompletionType == 1 ? "人工手动完成" : "自动完成"; var res = _task_HtyService.AddData(new Dt_Task_hty { TaskNum = dt_task.TaskNum, PalletCode = dt_task.PalletCode, Roadway = dt_task.Roadway, TaskType = dt_task.TaskType, TaskState = dt_task.TaskState, SourceAddress = dt_task.SourceAddress, TargetAddress = dt_task.TargetAddress, CurrentAddress = dt_task.CurrentAddress, NextAddress = dt_task.NextAddress, WMSId = dt_task.WMSId, Dispatchertime = dt_task.Dispatchertime, Remark = Remark, Creater = App.User.UserName, CreateDate = DateTime.Now, RGVTaskType = dt_task.RGVTaskType, RGVCurrentexecution = dt_task.RGVCurrentexecution }); if (res.Status == false) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error($"{Remark}失败!"); } var deletetask = BaseDal.DeleteData(dt_task); if (deletetask == false) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!"); } db.Ado.CommitTran(); return WebResponseContent.Instance.OK($"{Remark}成功!"); } catch (Exception ex) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("任务完成失败!"); } } /// /// 人工手动取消任务 /// /// /// /// public WebResponseContent MHWCSTaskCancel(int id) { var db = BaseDal.Db as SqlSugarClient; try { db.Ado.BeginTran(); Dt_Task dt_task = BaseDal.QueryData().Where(x => x.TaskId == id).FirstOrDefault(); if (dt_task == null) return WebResponseContent.Instance.Error($"未查询到任务"); //if (dt_task.TaskState > (int)TaskInStatusEnum.RGV_InNew || dt_task.TaskState > (int)TaskOutStatusEnum.OutNew) return WebResponseContent.Instance.Error($"任务状态不允许取消"); /*if (dt_task.TaskType >= 200 && dt_task.TaskType <= 203) { if (dt_task.TaskState > (int)TaskInStatusEnum.RGV_InNew) return WebResponseContent.Instance.Error($"任务状态不允许取消"); } else { if (dt_task.TaskState > (int)TaskOutStatusEnum.OutNew) return WebResponseContent.Instance.Error($"任务状态不允许取消"); }*/ Dt_Task_hty dt_Task_Hty = new Dt_Task_hty { TaskNum = dt_task.TaskNum, PalletCode = dt_task.PalletCode, Roadway = dt_task.Roadway, TaskType = dt_task.TaskType, TaskState = dt_task.TaskType >= (int)TaskInboundTypeEnum.Inbound ? (int)TaskInStatusEnum.InCancel : (int)TaskOutStatusEnum.OutCancel, SourceAddress = dt_task.SourceAddress, TargetAddress = dt_task.TargetAddress, CurrentAddress = dt_task.CurrentAddress, NextAddress = dt_task.NextAddress, WMSId = dt_task.WMSId, Dispatchertime = dt_task.Dispatchertime, Remark = "人工手动取消任务", Creater = App.User.UserName, CreateDate = DateTime.Now, RGVTaskType = dt_task.RGVTaskType, RGVCurrentexecution = dt_task.RGVCurrentexecution }; var res = _task_HtyService.AddData(dt_Task_Hty); if (res.Status == false) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("取消任务失败!"); } /*int oldState = dt_task.TaskState; _taskExecuteDetailService.AddTaskExecuteDetail( dt_task.TaskId, $"自动任务状态从【{oldState}】进入到【{dt_Task_Hty.TaskState}】" );*/ bool deletetask = BaseDal.DeleteData(dt_task); if (!deletetask) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!"); } db.Ado.CommitTran(); return WebResponseContent.Instance.OK("取消任务成功!"); } catch (Exception ex) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("取消任务失败!"); } } /// /// 任务下一步执行 /// /// /// public WebResponseContent NextStepeXecuted(int taskid) { WebResponseContent responseContent = new WebResponseContent(); Dt_Task task = BaseDal.QueryData().Where(x => x.TaskNum == taskid).FirstOrDefault(); if (task == null) return WebResponseContent.Instance.Error($"未查询到任务"); switch (task.TaskState) { //入库状态 case (int)TaskInStatusEnum.RGV_InNew: case (int)TaskInStatusEnum.RGV_InPickupFinish: case (int)TaskInStatusEnum.RGV_InReleaseFinish: case (int)TaskInStatusEnum.RGV_InZicheFinish: case (int)TaskInStatusEnum.RGV_InZicheReleaseFinish: //入库状态 //出库状态 case (int)TaskOutStatusEnum.OutNew: case (int)TaskOutStatusEnum.RGV_OutMothercarFinish: case (int)TaskOutStatusEnum.RGV_OutZicheFinish: case (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish: case (int)TaskOutStatusEnum.RGV_OutPickupFinish: //出库状态 //调取下发的接口 responseContent = UpdateTaskStatusToNext(task); break; //入库状态 case (int)TaskInStatusEnum.RGV_InPickupExecuting: case (int)TaskInStatusEnum.RGV_InReleaseExecuting: case (int)TaskInStatusEnum.RGV_InZicheExecuting: case (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting: case (int)TaskInStatusEnum.RGV_InMothercarExecuting: //入库状态 //出库状态 case (int)TaskOutStatusEnum.RGV_OutMothercarExecuting: case (int)TaskOutStatusEnum.RGV_OutZicheExecuting: case (int)TaskOutStatusEnum.RGV_OutZicheReleaseExecuting: case (int)TaskOutStatusEnum.RGV_OutPickupExecuting: case (int)TaskOutStatusEnum.RGV_OutReleaseExecuting: //出库状态 //调取完成接口 responseContent = UpdateTaskStatus(task.TaskNum); break; case (int)TaskInStatusEnum.RGV_InMothercarFinish: return WebResponseContent.Instance.Error("RGV部分任务已走位,不可往下执行"); default: return WebResponseContent.Instance.Error("任务状态错误,执行下一步失败"); } // 创建并赋值 return responseContent; } } }