| using AutoMapper; | 
| using HslCommunication; | 
| using Mapster; | 
| using Newtonsoft.Json; | 
| using SqlSugar; | 
| using System.Diagnostics.CodeAnalysis; | 
| using WIDESEAWCS_BasicInfoRepository; | 
| using WIDESEAWCS_BasicInfoService; | 
| using WIDESEAWCS_Common; | 
| using WIDESEAWCS_Common.TaskEnum; | 
| using WIDESEAWCS_Core; | 
| using WIDESEAWCS_Core.BaseServices; | 
| using WIDESEAWCS_Core.Helper; | 
| using WIDESEAWCS_DTO.TaskInfo; | 
| using WIDESEAWCS_DTO.WMS; | 
| using WIDESEAWCS_ISystemServices; | 
| using WIDESEAWCS_ITaskInfo_HtyRepository; | 
| using WIDESEAWCS_ITaskInfoRepository; | 
| using WIDESEAWCS_ITaskInfoService; | 
| using WIDESEAWCS_Model.Models; | 
| using WIDESEAWCS_QuartzJob.Models; | 
| using WIDESEAWCS_QuartzJob.Repository; | 
| using WIDESEAWCS_QuartzJob.Service; | 
|   | 
| namespace WIDESEAWCS_TaskInfoService | 
| { | 
|     public partial class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService | 
|     { | 
|         private readonly IRouterService _routerService; | 
|         private readonly ITaskExecuteDetailService _taskExecuteDetailService; | 
|         private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; | 
|         private readonly ISys_ConfigService _sys_ConfigService; | 
|         private readonly IMapper _mapper; | 
|         private readonly IDt_StationManagerService _stationManagerService; | 
|         private readonly IDt_StationManagerRepository _stationManagerRepository; | 
|         private readonly IRouterRepository _routerRepository; | 
|         private readonly ITask_HtyRepository _taskHtyRepository; | 
|         private readonly IDt_needBarcodeRepository _taskNeedBarcodeRepository; | 
|   | 
|         private Dictionary<string, OrderByType> _taskOrderBy = new() | 
|         { | 
|             {nameof(Dt_Task.Grade), OrderByType.Desc }, | 
|             {nameof(Dt_Task.CreateDate), OrderByType.Asc}, | 
|         }; | 
|   | 
|         public Dictionary<string, OrderByType> TaskOrderBy | 
|         { get { return _taskOrderBy; } set { _taskOrderBy = value; } } | 
|   | 
|         public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); | 
|   | 
|         public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); | 
|   | 
|         public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ISys_ConfigService sys_ConfigService, IDt_StationManagerService stationManagerService, IDt_StationManagerRepository stationManagerRepository, IRouterRepository routerRepository, ITask_HtyRepository htyRepository, IDt_needBarcodeRepository taskNeedBarcodeRepository) : base(BaseDal) | 
|         { | 
|             _routerService = routerService; | 
|             _taskExecuteDetailService = taskExecuteDetailService; | 
|             _taskExecuteDetailRepository = taskExecuteDetailRepository; | 
|             _mapper = mapper; | 
|             _sys_ConfigService = sys_ConfigService; | 
|             _stationManagerService = stationManagerService; | 
|             _stationManagerRepository = stationManagerRepository; | 
|             _routerRepository = routerRepository; | 
|             _taskHtyRepository = htyRepository; | 
|             _taskNeedBarcodeRepository = taskNeedBarcodeRepository; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 接收WMS任务信息 | 
|         /// </summary> | 
|         /// <param name="taskDTOs">WMS任务对象集合</param> | 
|         /// <returns>返回处理结果</returns> | 
|         public WebResponseContent ReceiveWMSTask([NotNull] List<WMSTaskDTO> taskDTOs) | 
|         { | 
|             // 创建一个WebResponseContent对象用于存储返回结果 | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 // 创建一个Dt_Task类型的列表用于存储转换后的任务数据 | 
|                 List<Dt_Task> tasks = new List<Dt_Task>(); | 
|                 // 遍历传入的WMSTaskDTO列表 | 
|                 foreach (var item in taskDTOs) | 
|                 { | 
|                     // 查询数据库中是否存在相同任务编号或托盘码的任务,如果存在则跳过当前循环 | 
|                     if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode) != null) | 
|                     { | 
|                         continue; | 
|                     } | 
|                     // 将WMSTaskDTO对象映射为Dt_Task对象 | 
|                     Dt_Task task = _mapper.Map<Dt_Task>(item); | 
|                     // 设置任务的创建者为"WMS" | 
|                     task.Creater = "WMS"; | 
|                     // 判断任务类型是否为出库任务 | 
|                     if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) | 
|                     { | 
|                         // 判断任务目标地址和路径是否满足特定条件 | 
|                         if ((task.TargetAddress == "002-021-001" || task.TargetAddress == "001-021-001") && task.Roadway.Contains("JZ")) | 
|                         { | 
|                             // 设置任务状态为出库新建 | 
|                             task.TaskState = (int)TaskOutStatusEnum.OutNew; | 
|                             // 设置当前地址为源地址 | 
|                             task.CurrentAddress = item.SourceAddress; | 
|                             // 设置下一个地址为目标地址 | 
|                             task.NextAddress = item.TargetAddress; | 
|                         } | 
|                         else | 
|                         { | 
|                             // 查询下一个路由 | 
|                             List<Dt_Router> routers = _routerService.QueryNextRoutes(item.RoadWay, item.TargetAddress); | 
|                             if (routers.Count > 0) | 
|                             { | 
|                                 // 设置任务状态为出库新建 | 
|                                 task.TaskState = (int)TaskOutStatusEnum.OutNew; | 
|                                 // 设置当前地址为源地址 | 
|                                 task.CurrentAddress = item.SourceAddress; | 
|                                 // 设置下一个地址为第一个子位置 | 
|                                 task.NextAddress = routers.FirstOrDefault().ChildPosi; | 
|                             } | 
|                             else | 
|                             { | 
|                                 // 查询从源地址到目标地址的路由 | 
|                                 routers = _routerService.QueryNextRoutes(item.SourceAddress, item.TargetAddress); | 
|                                 if (routers.Count > 0) | 
|                                 { | 
|                                     // 设置任务状态为出库完成 | 
|                                     task.TaskState = (int)TaskOutStatusEnum.SC_OutFinish; | 
|                                     // 设置当前地址为源地址 | 
|                                     task.CurrentAddress = item.SourceAddress; | 
|                                     // 设置下一个地址为第一个子位置 | 
|                                     task.NextAddress = routers.FirstOrDefault().ChildPosi; | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                     // 判断任务类型是否为入库任务 | 
|                     else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) | 
|                     { | 
|                         var value = _sys_ConfigService.GetByConfigKey(CateGoryConst.CONFIG_SYS_InStation, SysConfigKeyConst.JZNGInBoundStation).ConfigValue; | 
|                         var valueList = value.Split(',').ToList(); | 
|                         // 判断源地址是否不等于"1359-4" | 
|                         //if (task.SourceAddress != "1359-4" && task.SourceAddress != "1357-4") | 
|                         if (!valueList.Contains(task.SourceAddress)) | 
|                         { | 
|                             // 查询从源地址到目标地址的路由 | 
|                             List<Dt_Router> routers = _routerService.QueryNextRoutes(item.SourceAddress, item.TargetAddress); | 
|                             if (routers.Count > 0) | 
|                             { | 
|                                 // 设置任务状态为入库新建 | 
|                                 task.TaskState = (int)TaskInStatusEnum.InNew; | 
|                                 // 设置当前地址为源地址 | 
|                                 task.CurrentAddress = item.SourceAddress; | 
|                                 // 设置下一个地址为第一个子位置 | 
|                                 task.NextAddress = routers.FirstOrDefault().ChildPosi; | 
|                             } | 
|                         } | 
|                         else | 
|                         { | 
|                             task.CurrentAddress = string.Empty; | 
|                             if (task.SourceAddress == "1325-6") | 
|                                 // 设置当前地址为"001-021-001" | 
|                                 task.CurrentAddress = "001-021-001"; | 
|                             else | 
|                                 // 设置当前地址为"002-021-001" | 
|                                 task.CurrentAddress = "002-021-001"; | 
|                             // 设置下一个地址为目标地址 | 
|                             task.NextAddress = item.TargetAddress; | 
|                         } | 
|                     } | 
|                     // 将转换后的任务添加到任务列表中 | 
|                     tasks.Add(task); | 
|                 } | 
|                 // 将任务列表添加到数据库中 | 
|                 BaseDal.AddData(tasks); | 
|   | 
|                 // 添加任务执行详情 | 
|                 _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务"); | 
|   | 
|                 // 设置返回结果为成功 | 
|                 content = WebResponseContent.Instance.OK("成功"); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 // 捕获异常并设置返回结果为错误信息 | 
|                 content = WebResponseContent.Instance.Error($"任务接收错误,错误信息:{ex.Message}"); | 
|             } | 
|             // 返回结果 | 
|             return content; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据托盘号、起始地址向WMS请求任务 | 
|         /// </summary> | 
|         /// <param name="palletCode">托盘号</param> | 
|         /// <param name="sourceAddress">起始地址</param> | 
|         /// <returns></returns> | 
|         public async Task<WebResponseContent> RequestWMSTask(string palletCode, string sourceAddress) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var hasTask = await BaseDal.QueryFirstAsync(x => x.PalletCode == palletCode); | 
|                 if (hasTask != null) | 
|                 { | 
|                     return content.OK("当前托盘存在任务"); | 
|                 } | 
|   | 
|                 var wmsIpAddrss = string.Empty; | 
|                 var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == sourceAddress); | 
|                 if (stationManager.stationType == 5) | 
|                 { | 
|                     wmsIpAddrss = GetIpAddress(SysConfigKeyConst.WMSIP_BASE, SysConfigKeyConst.RequestInBoundTaskNG); | 
|                 } | 
|                 else | 
|                 { | 
|                     wmsIpAddrss = GetIpAddress(SysConfigKeyConst.WMSIP_BASE, SysConfigKeyConst.RequestTask); | 
|                 } | 
|   | 
|                 var result = await HttpHelper.PostAsync(wmsIpAddrss, new { Position = sourceAddress, PalletCode = palletCode, stationManager.productLine }.ToJsonString()); | 
|                 content = JsonConvert.DeserializeObject<WebResponseContent>(result); | 
|   | 
|                 if (!content.Status) | 
|                 { | 
|                     // wms失败返回去NG口任务 | 
|                     return content; | 
|                 } | 
|   | 
|                 var task = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); | 
|                 if (task.TaskType == (int)TaskInboundTypeEnum.InNG) | 
|                 { | 
|                     var station = await _stationManagerRepository.QueryFirstAsync(x => x.stationChildCode == task.SourceAddress); | 
|                     Dt_Task _Task = _mapper.Map<Dt_Task>(task); | 
|                     _Task.TaskState = (int)TaskInStatusEnum.InNew; | 
|                     _Task.CurrentAddress = task.SourceAddress; | 
|                     _Task.NextAddress = station.stationNGChildCode; | 
|                     _Task.TargetAddress = task.TargetAddress; | 
|   | 
|                     BaseDal.AddData(_Task); | 
|                     _taskExecuteDetailService.AddTaskExecuteDetail(_Task.TaskNum, "接收WMS任务"); | 
|                     return content.OK(); | 
|                 } | 
|                 else | 
|                 { | 
|                     return ReceiveWMSTask(new List<WMSTaskDTO> { task }); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址查询输送线未执行的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish)) && x.CurrentAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址查询输送线未执行的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryNextConveyorLineTask(string deviceNo, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish)) && x.NextAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据托盘号、当前地址查询输送线未执行的任务 | 
|         /// </summary> | 
|         /// <param name="Barcode">托盘号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryBarCodeConveyorLineTask(string Barcode, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish)) && x.CurrentAddress == currentAddress && x.PalletCode == Barcode, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据任务号、下一地址查询输送线执行中的任务 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="nextAddress">下一地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryExecutingConveyorLineTask(int taskNum, string nextAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据任务号、当前地址查询输送线完成的任务 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryCompletedConveyorLineTask(int taskNum, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InFinish || x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据托盘号、当前地址查询任务 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryBarcodeTask(string barcode, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.PalletCode == barcode && x.CurrentAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据任务号、当前地址查询输送线新建的任务 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task QueryCraneConveyorLineTask(int taskNum, string currentAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、任务类型分组(可选)按照优先级以及创建时间排序查询任务池新增的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="taskTypeGroup">任务类型分组(可选)</param> | 
|         /// <returns></returns> | 
|         public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null) | 
|         { | 
|             if (taskTypeGroup == null) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew)), TaskOrderBy); | 
|             if (taskTypeGroup.Value == TaskTypeGroup.InboundGroup) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); | 
|             if (taskTypeGroup.Value == TaskTypeGroup.OutbondGroup) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); | 
|             return null; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址按照优先级以及创建时间排序查询任务池新增的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns>返回任务实体对象,可能为null</returns> | 
|         public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "") | 
|         { | 
|             if (string.IsNullOrEmpty(currentAddress)) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew)), TaskOrderBy); | 
|             else | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.CurrentAddress == currentAddress && ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew)), TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址按照优先级以及创建时间排序查询任务池入库类型的新增的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns>返回任务实体对象,可能为null</returns> | 
|         public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "") | 
|         { | 
|             if (string.IsNullOrEmpty(currentAddress)) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); | 
|             else | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址按照优先级以及创建时间排序查询任务池出库类型的新增的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns>返回任务实体对象,可能为null</returns> | 
|         public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "") | 
|         { | 
|             if (string.IsNullOrEmpty(currentAddress)) | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); | 
|             else | 
|                 return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、排除的任务、当前地址按照优先级以及创建时间排序查询任务池出库类型的新增的所有任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="excludedTaskId">排除的任务</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns>返回任务实体对象,可能为null</returns> | 
|         public List<Dt_Task> QueryAllOutboundTasks(string deviceNo, string currentAddress = "") | 
|         { | 
|             if (string.IsNullOrEmpty(currentAddress)) | 
|                 return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); | 
|             else | 
|                 return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据设备编号、当前地址按照优先级以及创建时间排序查询任务池出库类型的新增的任务 | 
|         /// </summary> | 
|         /// <param name="deviceNo">设备编号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns>返回任务实体对象集合,可能为null</returns> | 
|         public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes) | 
|         { | 
|             return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 更新任务异常信息显示 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="message">异常信息</param> | 
|         public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); | 
|                 if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); | 
|                 if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) | 
|                 { | 
|                     task.TaskState = (int)TaskOutStatusEnum.OutPending; | 
|                 } | 
|                 else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) | 
|                 { | 
|                     task.TaskState = (int)TaskInStatusEnum.InPending; | 
|                 } | 
|                 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; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 更新任务状态信息,并同步至WMS | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="status">任务状态</param> | 
|         public void UpdateTaskStatus(int taskNum, int status) | 
|         { | 
|             var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); | 
|             if (task == null) return; | 
|             task.TaskState = status; | 
|             task.ModifyDate = DateTime.Now; | 
|             BaseDal.UpdateData(task); | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 将任务状态修改为下一个状态 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         public WebResponseContent UpdateTaskStatusToNext(int taskNum) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); | 
|                 if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); | 
|                 return UpdateTaskStatusToNext(task); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content = WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 将任务状态修改为下一个状态 | 
|         /// </summary> | 
|         /// <param name="task">任务实体对象</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 int oldState = task.TaskState; | 
|                 if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) | 
|                 { | 
|                     int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>(); | 
|   | 
|                     task.TaskState = nextStatus; | 
|   | 
|                     if (task.TaskState == (int)TaskOutStatusEnum.Line_OutFinish) | 
|                     { | 
|                         task.ModifyDate = DateTime.Now; | 
|                         task.Modifier = "System"; | 
|   | 
|                         Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task); | 
|                         task_Hty.TaskId = 0; | 
|   | 
|                         BaseDal.DeleteData(task); | 
|                         _taskHtyRepository.AddData(task_Hty); | 
|                     } | 
|   | 
|                     if (task.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) | 
|                     { | 
|                         content = StackCraneTaskCompleted(task.TaskNum); | 
|                         return content; | 
|                     } | 
|                 } | 
|                 else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) | 
|                 { | 
|                     int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); | 
|                     task.TaskState = nextStatus; | 
|   | 
|                     if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish) | 
|                     { | 
|                         #region 入库调用接口获取货位地址 | 
|   | 
|                         // TODO: 调用接口获取货位地址 | 
|                         // 创建请求对象 | 
|                         var taskDto = new RequestTaskDto() | 
|                         { | 
|                             Position = task.NextAddress, | 
|                             PalletCode = task.PalletCode, | 
|                         }; | 
|   | 
|                         // 获取WMSip地址 | 
|                         var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
|                         var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue; | 
|                         var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.RequestLocation).FirstOrDefault()?.ConfigValue; | 
|                         if (wmsBasez == null || requestLocation == null) | 
|                         { | 
|                             throw new InvalidOperationException("WMS IP 未配置"); | 
|                         } | 
|                         var wmsIpAddrss = wmsBasez + requestLocation; | 
|   | 
|                         // 发送请求并等待响应 | 
|                         var abc = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result; | 
|                         if (abc == null) | 
|                             return content.Error(); | 
|                         // 反序列化响应内容 | 
|                         content = JsonConvert.DeserializeObject<WebResponseContent>(abc); | 
|   | 
|                         // 检查状态并返回 | 
|                         if (!content.Status) | 
|                             return content; | 
|   | 
|                         // 反序列化任务数据 | 
|                         var taskResult = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); | 
|   | 
|                         task.CurrentAddress = task.NextAddress; | 
|                         task.NextAddress = taskResult.TargetAddress; | 
|                         task.TargetAddress = task.NextAddress; | 
|   | 
|                         #endregion 入库调用接口获取货位地址 | 
|                     } | 
|                     else if (task.TaskState == (int)TaskInStatusEnum.SC_InFinish) | 
|                     { | 
|                         if (App.User.UserId > 0) | 
|                         { | 
|                             content = StackCraneTaskCompleted(task.TaskNum); | 
|                             return content; | 
|                         } | 
|   | 
|                         task.ModifyDate = DateTime.Now; | 
|                         task.Modifier = "System"; | 
|   | 
|                         Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task); | 
|                         task_Hty.TaskId = 0; | 
|   | 
|                         BaseDal.DeleteData(task); | 
|                         _taskHtyRepository.AddData(task_Hty); | 
|                     } | 
|                 } | 
|                 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}】"); | 
|   | 
|                 #region 更新任务状态 | 
|   | 
|                 // 获取WMSip地址 | 
|                 var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
|                 var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; | 
|                 var updateTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.UpdateTask)?.ConfigValue; | 
|                 if (wmsBase == null || updateTask == null) | 
|                 { | 
|                     throw new InvalidOperationException("WMS IP 未配置"); | 
|                 } | 
|                 var wmsIpAddress = wmsBase + updateTask; | 
|   | 
|                 var result = HttpHelper.PostAsync(wmsIpAddress, new { TaskNum = task.TaskNum, TaskState = task.TaskState }.ToJsonString()).Result; | 
|                 content = JsonConvert.DeserializeObject<WebResponseContent>(result); | 
|   | 
|                 #endregion 更新任务状态 | 
|   | 
|                 content = WebResponseContent.Instance.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content = WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 根据任务号、当前地址更新任务位置信息 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <param name="currentAddress">当前地址</param> | 
|         /// <returns></returns> | 
|         public Dt_Task? UpdatePosition(int taskNum, string currentAddress) | 
|         { | 
|             try | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress); | 
|                 if (task == null) throw new Exception($"未找到该任务信息,任务号:【{taskNum}】"); | 
|   | 
|                 string oldCurrentPos = task.CurrentAddress; | 
|                 string oldNextPos = task.NextAddress; | 
|   | 
|                 var routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); | 
|                 if (!routers.Any()) throw new Exception($"未找到设备路由信息"); | 
|   | 
|                 task.CurrentAddress = task.NextAddress; | 
|                 task.NextAddress = routers.FirstOrDefault().ChildPosi; | 
|   | 
|                 task.ModifyDate = DateTime.Now; | 
|                 task.Modifier = "System"; | 
|                 BaseDal.UpdateData(task); | 
|   | 
|                 _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"系统自动流程,更新当前位置【{oldCurrentPos} ----> {task.CurrentAddress}】和下一位置【{oldNextPos} ----> {task.NextAddress}】"); | 
|                 return task; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|             } | 
|             return null; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 任务完成 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务编号</param> | 
|         /// <returns>返回处理结果</returns> | 
|         public WebResponseContent StackCraneTaskCompleted(int taskNum) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); | 
|                 if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); | 
|   | 
|                 #region WMS同步任务完成 | 
|   | 
|                 var keys = new Dictionary<string, object>() | 
|                 { | 
|                     {"taskNum", taskNum} | 
|                 }; | 
|                 // 获取WMSip地址 | 
|                 var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
|                 var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; | 
|                 var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue; | 
|                 if (wmsBase == null || completeTask == null) | 
|                 { | 
|                     throw new InvalidOperationException("WMS IP 未配置"); | 
|                 } | 
|                 var wmsIpAddress = wmsBase + completeTask; | 
|   | 
|                 var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result; | 
|                 content = JsonConvert.DeserializeObject<WebResponseContent>(result); | 
|                 if (!content.Data.IsNullOrEmpty()) | 
|                 { | 
|                     if (content.Data.ToString() == "NG") | 
|                     { | 
|                         task.Remark = "NG"; | 
|                         //BaseDal.UpdateData(task); | 
|                         //_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成,MOM返回NG"); | 
|                     } | 
|                 } | 
|                 task.ExceptionMessage += "   " + content.Message; | 
|   | 
|                 #endregion WMS同步任务完成 | 
|   | 
|                 if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) | 
|                 { | 
|                     if (!task.Roadway.Contains("GW")) | 
|                     { | 
|                         var routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); | 
|                         if (!routers.Any()) return WebResponseContent.Instance.Error($"未找到设备路由信息"); | 
|   | 
|                         int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>(); | 
|                         task.TaskState = nextStatus; | 
|                         task.CurrentAddress = task.NextAddress; | 
|                         task.NextAddress = routers.FirstOrDefault().ChildPosi; | 
|                         task.ModifyDate = DateTime.Now; | 
|                         task.Modifier = "System"; | 
|                         BaseDal.UpdateData(task); | 
|   | 
|                         _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成"); | 
|                     } | 
|                     else | 
|                     { | 
|                         task.TaskState = (int)TaskOutStatusEnum.OutFinish; | 
|                         //如高温出库后 NG 则将任务标记为NG 并在出库申请后将任务出至NG口 | 
|                         if (task.Remark == "NG") | 
|                         { | 
|                             BaseDal.UpdateData(task); | 
|                         } | 
|                         else | 
|                         { | 
|                             BaseDal.DeleteData(task); | 
|                             ConsoleHelper.WriteWarningLine($"高温出库目的地址{task.TargetAddress}"); | 
|                         } | 
|   | 
|                         var taskHty = task.Adapt<Dt_Task_Hty>(); | 
|                         _taskHtyRepository.AddData(taskHty); | 
|                         _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成"); | 
|                     } | 
|   | 
|                     //暂不考虑多个出库口 | 
|                 } | 
|                 else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting) | 
|                 { | 
|                     //todo 同步到WMS | 
|                     int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); | 
|                     task.TaskState = nextStatus; | 
|                     task.ModifyDate = DateTime.Now; | 
|                     task.Modifier = "System"; | 
|   | 
|                     Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task); | 
|                     task_Hty.TaskId = 0; | 
|   | 
|                     BaseDal.DeleteData(task); | 
|                     _taskHtyRepository.AddData(task_Hty); | 
|                     _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库完成"); | 
|                 } | 
|                 else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup) | 
|                 { | 
|                     //todo 调用WMS移库完成 | 
|                 } | 
|                 else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup) | 
|                 { | 
|                 } | 
|                 else | 
|                 { | 
|                     throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】"); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content = WebResponseContent.Instance.Error($"任务完成异常,任务号:【{taskNum}】"); | 
|             } | 
|             return content; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 恢复挂起任务 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <returns>返回处理结果</returns> | 
|         public WebResponseContent TaskStatusRecovery(int taskNum) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var 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}】"); | 
|                 } | 
|   | 
|                 var taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { 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.InNew; | 
|                     } | 
|                 } | 
|   | 
|                 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; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 回滚任务状态 | 
|         /// </summary> | 
|         /// <param name="taskNum">任务号</param> | 
|         /// <returns>返回处理结果</returns> | 
|         public WebResponseContent RollbackTaskStatusToLast(int taskNum) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); | 
|                 if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); | 
|   | 
|                 int oldState = task.TaskState; | 
|                 var taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { 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 Dt_Task QueryRelocationTask(string deviceNo) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskType == (int)TaskRelocationTypeEnum.Relocation && x.TaskState == (int)TaskStatus.Created); | 
|         } | 
|   | 
|         public Dt_Task QueryExecutingTaskByBarcode(string barcode, string nextAddress) | 
|         { | 
|             return BaseDal.QueryFirst(x => x.PalletCode == barcode && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy); | 
|         } | 
|   | 
|         private string GetIpAddress(string baseIp, string name) | 
|         { | 
|             var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
|             var wcsBasez = configz.Where(x => x.ConfigKey == baseIp).FirstOrDefault()?.ConfigValue; | 
|             var address = configz.Where(x => x.ConfigKey == name).FirstOrDefault()?.ConfigValue; | 
|             if (wcsBasez == null || address == null) | 
|             { | 
|                 throw new InvalidOperationException("WMS IP 未配置"); | 
|             } | 
|             return wcsBasez + address; | 
|         } | 
|   | 
|         #region 重写方法 | 
|   | 
|         public override WebResponseContent DeleteData(object[] key) | 
|         { | 
|             foreach (var item in key) | 
|             { | 
|                 var task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(item)); | 
|                 var taskHty = task.Adapt<Dt_Task_Hty>(); | 
|                 taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; | 
|                 _taskHtyRepository.AddData(taskHty); | 
|             } | 
|             return base.DeleteData(key); | 
|         } | 
|   | 
|         #endregion 重写方法 | 
|     } | 
| } |