#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using Autofac.Core; using AutoMapper; using Magicodes.ExporterAndImporter.Core; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; 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.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.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; 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 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) : base(BaseDal) { _routerService = routerService; _taskExecuteDetailService = taskExecuteDetailService; _taskExecuteDetailRepository = taskExecuteDetailRepository; _task_HtyService = task_HtyService; _mapper = mapper; _routerRepository = routerRepository; _equipmentStatus = equipmentStatus; } /// /// 兰剑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 = "0"; //目前暂无 dt_Task.Grade = item.priority; dt_Task.WMSId = 0; //目前暂无 BaseDal.AddData(dt_Task); content.code = 0; } else if (item.type == 2) //出库 { string roadway = ""; string CurrentAddress = ""; switch (item.startAddress) { case "1": roadway = "RGV110"; CurrentAddress = "1101"; break; case "2": roadway = "RGV112"; CurrentAddress = "1121"; break; case "3": roadway = "RGV114"; CurrentAddress = "1141"; break; case "4": roadway = "RGV115"; CurrentAddress = "1151"; break; } 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 = ""; dt_Task.CurrentAddress = CurrentAddress; dt_Task.NextAddress = "0"; //目前暂无 dt_Task.Grade = item.priority; dt_Task.WMSId = 0; //目前暂无 BaseDal.AddData(dt_Task); content.code = 0; } 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(string DeviceCode) { return BaseDal.QueryFirst(x => x.Roadway == DeviceCode, TaskOrderBy); } 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); string Meesgt = $"目标地址:{task.CurrentAddress},任务类型:{rwlx},修改状态:{updatesta}"; _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, Meesgt); 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.RGV_InMothercarFinish) { return content = WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskState}】"); } int nextStatus = task.TaskState.GetNextNotCompletedStatus(); task.TaskState = nextStatus; } 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); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"人工手动将任务状态从【{oldState}】跳转到【{task.TaskState}】" : $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskState}】"); 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); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工恢复挂起任务,恢复挂起时任务状态【{task.TaskState}】"); 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 = _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); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工将任务状态从【{oldState}】回滚到【{task.TaskState}】"); 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)TaskOutboundTypeEnum.Outbound) { HandleOutboundTask(task); } else { return WebResponseContent.Instance.Error("未知的任务类型"); } task.ExceptionMessage = string.Empty; BaseDal.UpdateData(task); _taskExecuteDetailService.AddTaskExecuteDetail( task.TaskId, $"自动任务状态从【{oldState}】进入到【{task.TaskState}】" ); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error("更新任务状态时发生系统错误"); } } #region 入库 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; break; case (int)TaskInStatusEnum.RGV_InReleaseExecuting: HandleInboundRelease(task); break; case (int)TaskInStatusEnum.RGV_InZicheExecuting: task.RGVTaskType = (int)RGVTaskTypeEnum.Placing; task.TaskState = (int)TaskInStatusEnum.RGV_InZicheFinish; break; case (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting: task.TaskState = (int)TaskInStatusEnum.RGV_InZicheReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly; break; case (int)TaskInStatusEnum.RGV_InZichemoveExecuting: HandleInboundZichemove(task); break; case (int)TaskInStatusEnum.RGV_InMothercarExecuting: task.TaskState = (int)TaskInStatusEnum.RGV_InMothercarFinish; break; default: throw new InvalidOperationException($"未知的入库任务状态: {task.TaskState}"); } } private void HandleInboundRelease(Dt_Task task) { task.TaskState = (int)TaskInStatusEnum.RGV_InReleaseFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp; var routes = _routerRepository.QueryData(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.IsEnd == false ); foreach (var route in routes) { if (route.ChildPosi == task.TargetAddress || (int.Parse(route.ChildPosi) > 2 && int.Parse(task.TargetAddress) > 2)) { task.Roadway = route.ChildPosiDeviceCode; task.CurrentAddress = route.StartPosi; task.NextAddress = route.NextPosi; break; // 找到匹配路由后退出循环 } } } private void HandleInboundZichemove(Dt_Task task) { var route = _routerRepository.QueryFirst(x => x.IsEnd == true && x.ChildPosi == task.NextAddress && x.InOutType == 1 ); if (route == null) throw new InvalidOperationException("未找到对应的结束路由"); task.TaskState = (int)TaskInStatusEnum.RGV_InZichemoveFinish; task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly; task.CurrentAddress = route.StartPosi; task.NextAddress = route.NextPosi; task.Roadway = route.ChildPosiDeviceCode; } #endregion #region 出库 private void HandleOutboundTask(Dt_Task task) { switch (task.TaskState) { case (int)TaskOutStatusEnum.RGV_OutMothercarExecuting: 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"; } 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 = route.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); CommonConveyorLine conveyorLine = (CommonConveyorLine)device; DeviceProDTO? deviceProDTO = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RGVCurrentlocation" && x.DeviceProParamType == "ReadDeviceCommand"); if (item.type == "pick") //取货 { //获取设备 //获取取货站台货位站台 Dt_Router dt_Router = _routerRepository.QueryFirst(x => x.InOutType == 1 && x.ChildPosiDeviceCode == item.rgvTag && x.IsEnd == true); int Currentlocation = conveyorLine.Communicator.Read(deviceProDTO.DeviceProAddress); if (Currentlocation == int.Parse(dt_Router.NextPosi)) //为无货 { 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") //放货 { int Currentlocation = conveyorLine.Communicator.Read(deviceProDTO.DeviceProAddress); switch (Currentlocation) { case 1101: case 1121: case 1141: case 1151: rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 2 }, }; break; default: rGVstatus.code = 0; rGVstatus.data = new List { new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 0 }, }; break; } } 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; } if (item.type == "pick") //取货 { expoReverse.code = 0; } else if (item.type == "put") //放货 { 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(); string msgeetst = ""; foreach (var item in sCErrorStatus.data) { EquipmentStatus equipment = equipmentList.Find(x => x.Equipment_Number == item.stackerName); msgeetst += $"《设备:{equipment.Equipment_Number},修改前状态:{equipment.Equipment_Status},"; equipment.Equipment_Status = item.errorStatus; msgeetst += $"<修改后状态:{equipment.Equipment_Status}>》................"; equipmentdata.Add(equipment); } WriteLog.Write_Log("设备状态更改", "堆垛机状态更改", "正常", msgeetst); _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}"); } } /// /// 任务信息状态上传(固定入库接口) /// /// /// 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 = 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 CompletedManually(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($"未查询到任务"); 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 }); int oldState = dt_task.TaskState; _taskExecuteDetailService.AddTaskExecuteDetail( dt_task.TaskId, $"自动任务状态从【{oldState}】进入到【{dt_task.TaskState}】" ); if (res.Status == false) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("手动完成失败!"); } var deletetask = BaseDal.DeleteData(dt_task); if (deletetask == false) { 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 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}】" ); var deletetask = BaseDal.DeleteData(dt_task); if (deletetask == false) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!"); } db.Ado.CommitTran(); return WebResponseContent.Instance.OK("取消任务成功!"); } catch (Exception ex) { db.Ado.RollbackTran(); return WebResponseContent.Instance.Error("取消任务失败!"); } } } }