huangxiaoqiang
3 天以前 850105e8cdf0d048ef843d87520513ac77a64200
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -16,46 +16,33 @@
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using Magicodes.ExporterAndImporter.Core;
using Microsoft.AspNetCore.Mvc.RazorPages;
using NetTaste;
using Mapster;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using SqlSugar;
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.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;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_DTO.Enum;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.BasicInfo;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_TaskInfoRepository;
using static Microsoft.IO.RecyclableMemoryStreamManager;
namespace WIDESEAWCS_TaskInfoService
{
@@ -66,6 +53,7 @@
        private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository;
        private readonly ITask_HtyService _taskHtyService;
        private readonly ITask_HtyRepository _taskHtyRepository;
        private readonly ISys_ConfigService _sys_ConfigService;
        private readonly IMapper _mapper;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
@@ -83,7 +71,7 @@
        public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
        public List<int> TaskRelocationboundTypes => typeof(TaskRelocationTypeEnum).GetEnumIndexList();
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService taskHtyService, IDt_StationManagerRepository stationManagerRepository, ITask_HtyRepository taskHtyRepository) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService taskHtyService, ISys_ConfigService sys_ConfigService, IDt_StationManagerRepository stationManagerRepository, ITask_HtyRepository taskHtyRepository) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -92,6 +80,8 @@
            _mapper = mapper;
            _stationManagerRepository = stationManagerRepository;
            _taskHtyRepository = taskHtyRepository;
            _mapper = mapper;
            _sys_ConfigService = sys_ConfigService;
        }
        /// <summary>
@@ -108,73 +98,83 @@
                // éåŽ†ä¼ å…¥çš„WMSTaskDTO列表
                foreach (var item in taskDTOs)
                {
                    // æŸ¥è¯¢æ•°æ®åº“中是否存在相同任务编号或托盘码的任务,如果存在则跳过当前循环
                    if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskId || x.PalletCode == item.TPbarcode) != null)
                    var task = BaseDal.QueryFirst(x => x.WMSTaskNum == item.TaskId || x.PalletCode == item.TPbarcode);
                    if (task != null)
                    {
                        continue;
                        task.Creater = "WMS";
                        task.Grade = 1;
                        task.PalletCode = item.TPbarcode;
                    }
                    // å°†WMSTaskDTO对象映射为Dt_Task对象
                    Dt_Task task = _mapper.Map<Dt_Task>(item);
                    // è®¾ç½®ä»»åŠ¡çš„åˆ›å»ºè€…ä¸º"WMS"
                    task.Creater = "WMS";
                    task.Grade = 1; // è®¾ç½®é»˜è®¤ä¼˜å…ˆçº§ä¸º1
                    // åˆ¤æ–­ä»»åŠ¡ç±»åž‹æ˜¯å¦ä¸ºå‡ºåº“ä»»åŠ¡
                    if (item.TaskType == "2")
                    {
                        task.TaskType = (int)TaskOutboundTypeEnum.Outbound;
                        List<Dt_Router> routers = _routerService.QueryNextRoutes(item.WhCode, item.EndPoint);
                        if (routers.Count > 0)
                        string[] targetCodes = item.BeginPoint.Split("-");
                        Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == GetScCode(Convert.ToInt32(targetCodes[0])) && x.stationType == 2);
                        Dt_Task taskOut = new Dt_Task()
                        {
                            // è®¾ç½®ä»»åŠ¡çŠ¶æ€ä¸ºå‡ºåº“æ–°å»º
                            task.TaskState = (int)TaskOutStatusEnum.OutNew;
                            // è®¾ç½®å½“前地址为源地址
                            task.CurrentAddress = item.BeginPoint;
                            // è®¾ç½®ä¸‹ä¸€ä¸ªåœ°å€ä¸ºç¬¬ä¸€ä¸ªå­ä½ç½®
                            task.NextAddress = routers.FirstOrDefault().ChildPosi;
                        }
                        else
                        {
                            // æŸ¥è¯¢ä»Žæºåœ°å€åˆ°ç›®æ ‡åœ°å€çš„路由
                            routers = _routerService.QueryNextRoutes(item.BeginPoint, item.EndPoint);
                            if (routers.Count > 0)
                            {
                                // è®¾ç½®ä»»åŠ¡çŠ¶æ€ä¸ºå‡ºåº“å®Œæˆ
                                task.TaskState = (int)TaskOutStatusEnum.SC_OutFinish;
                                // è®¾ç½®å½“前地址为源地址
                                task.CurrentAddress = item.BeginPoint;
                                // è®¾ç½®ä¸‹ä¸€ä¸ªåœ°å€ä¸ºç¬¬ä¸€ä¸ªå­ä½ç½®
                                task.NextAddress = routers.FirstOrDefault().ChildPosi;
                            }
                        }
                    }// åˆ¤æ–­ä»»åŠ¡ç±»åž‹æ˜¯å¦ä¸ºå…¥åº“ä»»åŠ¡
                            TaskNum = BaseDal.GetTaskNo().Result,
                            Creater = "WMS",
                            WMSTaskNum=item.TaskId,
                            Grade = 1,
                            PalletCode = item.TPbarcode,
                            TaskType = (int)TaskOutboundTypeEnum.Outbound,
                            TaskState = (int)TaskOutStatusEnum.OutNew,
                            SourceAddress = item.BeginPoint,
                            CurrentAddress = item.BeginPoint,
                            Roadway = GetScCode(Convert.ToInt32(targetCodes[0])),
                            NextAddress = stationManager.stationChildCode,
                            TargetAddress = item.EndPoint,
                            RGVName = "RGV01"
                        };
                        BaseDal.AddData(taskOut);
                    }
                    // åˆ¤æ–­ä»»åŠ¡ç±»åž‹æ˜¯å¦ä¸ºå…¥åº“ä»»åŠ¡
                    else if (item.TaskType == "1")
                    {
                        task.TaskType = (int)TaskInboundTypeEnum.Inbound;
                        // æŸ¥è¯¢ä»Žæºåœ°å€åˆ°ç›®æ ‡åœ°å€çš„路由
                        List<Dt_Router> routers = _routerService.QueryNextRoutes(item.BeginPoint, item.EndPoint);
                        if (routers.Count > 0)
                        {
                            // è®¾ç½®ä»»åŠ¡çŠ¶æ€ä¸ºå…¥åº“æ–°å»º
                            task.TaskState = (int)TaskInStatusEnum.InNew;
                            // è®¾ç½®å½“前地址为源地址
                            task.CurrentAddress = item.BeginPoint;
                            // è®¾ç½®ä¸‹ä¸€ä¸ªåœ°å€ä¸ºç¬¬ä¸€ä¸ªå­ä½ç½®
                            task.NextAddress = routers.FirstOrDefault().ChildPosi;
                        }
                        task.TaskState = (int)TaskInStatusEnum.RGV_IndispatchFinish;
                        task.CurrentAddress = item.BeginPoint;
                        task.WMSTaskNum = item.TaskId;
                        task.TargetAddress = item.EndPoint;
                        string[] targetCodes = item.EndPoint.Split("-");
                        task.Roadway = GetScCode(Convert.ToInt32(targetCodes[0]));
                        Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationType == 3);
                        task.NextAddress = stationManager.stationChildCode;
                        BaseDal.UpdateData(task);
                    }
                    else if (item.TaskType == "3")
                    {
                        task.TaskType = (int)TaskRelocationTypeEnum.Relocation;
                        // è®¾ç½®ä»»åŠ¡çŠ¶æ€ä¸ºæ–°å»º
                        task.TaskState = (int)TaskRelocationStatusEnum.RelocationNew;
                        task.Grade = 3; // è®¾ç½®é»˜è®¤ä¼˜å…ˆçº§ä¸º1
                        task.SourceAddress = item.BeginPoint;
                        task.CurrentAddress = item.BeginPoint;
                        task.NextAddress = item.EndPoint;
                        task.TargetAddress = item.EndPoint;
                        task.Grade = 3;
                        BaseDal.AddData(tasks);
                    }
                    else
                    {
                        return content.Error($"任务类型错误,未找到该任务类型,任务号:【{item.TaskId}】,任务类型:【{item.TaskType}】");
                    }
                }
                BaseDal.AddData(tasks);
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskId).ToList(), "接收WMS任务");
                content = WebResponseContent.Instance.OK("成功");
            }
@@ -189,18 +189,45 @@
            return content;
        }
        public string GetScCode(int number)
        {
            if (number >= 1 && number <= 4)
            {
                return "SC01";
            }
            else if (number >= 5 && number <= 8)
            {
                return "SC02";
            }
            else if (number >= 9 && number <= 12)
            {
                return "SC03";
            }
            else if (number >= 13 && number <= 16)
            {
                return "SC04";
            }
            else
            {
                // å¤„理不在1-16范围内的情况(可选)
                throw new ArgumentOutOfRangeException(nameof(number), "输入的数字必须在1-16范围内");
                // æˆ–者返回一个默认值:return "SC00";
            }
        }
        public WebResponseContent GetTask(WMSTaskDTO taskDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskDTO.TaskId || x.Roadway == taskDTO.WhCode);
                Dt_Task_Hty taskHty = _taskHtyRepository.QueryFirst(x => x.TaskNum == taskDTO.TaskId || x.Roadway == taskDTO.WhCode);
                Dt_Task task = BaseDal.QueryFirst(x => x.WMSTaskNum == taskDTO.TaskId || x.Roadway == taskDTO.WhCode);
                Dt_Task_Hty taskHty = _taskHtyRepository.QueryFirst(x => x.WMSTaskNum == taskDTO.TaskId || x.Roadway == taskDTO.WhCode);
                if (task != null)
                {
                    return content.OK(data: new WMSTaskDTO()
                    {
                        TaskId = task.TaskNum,
                        TaskId = task.WMSTaskNum,
                        TPbarcode = task.PalletCode,
                        WhCode = task.Roadway,
                        BeginPoint = task.SourceAddress,
@@ -212,7 +239,7 @@
                {
                    return content.OK(data: new WMSTaskDTO()
                    {
                        TaskId = taskHty.TaskNum,
                        TaskId = taskHty.WMSTaskNum,
                        TPbarcode = taskHty.PalletCode,
                        WhCode = taskHty.Roadway,
                        BeginPoint = taskHty.SourceAddress,
@@ -290,10 +317,32 @@
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress)
        public Dt_Task QueryConveyorLineTask(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);
            Dt_Task task= BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.RGV_InExecutingFinish && x.CurrentAddress == currentAddress, TaskOrderBy);
            if (task == null)
            {
                task = BaseDal.QueryFirst(x => TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish && x.CurrentAddress == currentAddress, TaskOrderBy);
            }
            return task;
        }
        /// <summary>
        /// æ ¹æ®è®¾å¤‡ç¼–号、当前地址查询输送线未执行的任务
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public Dt_Task QueryConveyorLineFinishTask(string currentAddress)
        {
            Dt_Task task = BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InExecuting && x.NextAddress == currentAddress, TaskOrderBy);
            if (task == null)
            {
                task = BaseDal.QueryFirst(x => TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting && x.NextAddress == currentAddress, TaskOrderBy);
            }
            return task;
        }
        /// <summary>
        /// æ ¹æ®è®¾å¤‡ç¼–号、当前地址查询RGV未执行的任务
@@ -301,9 +350,9 @@
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public Dt_Task QueryRGVTask(string deviceNo, string currentAddress)
        public Dt_Task QueryRGVExecutingTask(string deviceNo)
        {
            return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy);
            return BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.RGV_IndispatchFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.RGV_OutdispatchFinish);
        }
        /// <summary>
@@ -331,44 +380,6 @@
                return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, 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="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>
        /// æ ¹æ®è®¾å¤‡ç¼–号、当前地址按照优先级以及创建时间排序查询任务池新增的任务
@@ -381,7 +392,18 @@
            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); return BaseDal.QueryFirst(x => x.TaskState == (int)AGVTaskStatusEnum.AGVNew && x.Roadway == deviceNo, TaskOrderBy);
                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 QueryRGVTask(string deviceNo)
        {
            return BaseDal.QueryFirst(x => x.RGVName == deviceNo && ((TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew) || (TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish)), TaskOrderBy);
        }
        /// <summary>
@@ -396,6 +418,17 @@
                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 QueryRGVInTask(string deviceNo)
        {
            return BaseDal.QueryFirst(x => x.RGVName == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew, TaskOrderBy);
        }
        /// <summary>
@@ -417,22 +450,12 @@
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns>返回任务实体对象集合,可能为null</returns>
        public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes)
        /// <returns>返回任务实体对象,可能为null</returns>
        public Dt_Task QueryRGVOutTask(string deviceNo)
        {
            return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy);
            return BaseDal.QueryFirst(x => x.RGVName == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish, TaskOrderBy);
        }
        /// <summary>
        /// æ ¹æ®å‡ºåº“货位查询是否有当前浅货位任务
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns>返回任务实体对象集合,可能为null</returns>
        public List<Dt_Task> QueryStationIsOccupiedOutTasks(string deviceNo, string SourceAddress)
        {
            return BaseDal.QueryData(x => x.Roadway == deviceNo && SourceAddress.Contains(x.SourceAddress), TaskOrderBy);
        }
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡å¼‚å¸¸ä¿¡æ¯æ˜¾ç¤º
@@ -467,20 +490,6 @@
                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)
        {
            Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
            if (task == null) return;
            task.TaskState = status;
            task.ModifyDate = DateTime.Now;
            BaseDal.UpdateData(task);
        }
        /// <summary>
@@ -520,7 +529,7 @@
                    task.TaskState = nextStatus;
                    if (task.TaskState == (int)TaskOutStatusEnum.Line_OutFinish)
                    if (task.TaskState == (int)TaskOutStatusEnum.RGV_OutFinish)
                    {
                        task.ModifyDate = DateTime.Now;
                        task.Modifier = "System";
@@ -542,23 +551,16 @@
                {
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
                    task.TaskState = nextStatus;
                    if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish)
                    if (task.TaskState == (int)TaskInStatusEnum.Line_InExecuting)
                    {
                        #region å…¥åº“调用接口获取货位地址
                        // æ£€æŸ¥çŠ¶æ€å¹¶è¿”å›ž
                        if (!content.Status)
                            return content;
                        // ååºåˆ—化任务数据
                        var taskResult = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
                        Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode== task.NextAddress);
                        task.CurrentAddress = task.NextAddress;
                        task.NextAddress = taskResult.EndPoint;
                        task.TargetAddress = task.NextAddress;
                        #endregion å…¥åº“调用接口获取货位地址
                        task.NextAddress = stationManager.stationNextChildCode;
                    }
                    else if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish)
                    {
                        task.CurrentAddress = task.NextAddress;
                        task.NextAddress = task.TargetAddress;
                    }
                    else if (task.TaskState == (int)TaskInStatusEnum.SC_InFinish)
                    {
@@ -594,23 +596,6 @@
                _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)
@@ -620,42 +605,87 @@
            return content;
        }
        /// <summary>
        /// æ ¹æ®ä»»åŠ¡å·ã€å½“å‰åœ°å€æ›´æ–°ä»»åŠ¡ä½ç½®ä¿¡æ¯
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        public Dt_Task? UpdatePosition(int taskNum, string currentAddress)
        public WebResponseContent RGVTaskCompleted(int taskNum, string Barcode = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress);
                if (task == null) throw new Exception($"未找到该任务信息,任务号:【{taskNum}】");
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                string oldCurrentPos = task.CurrentAddress;
                string oldNextPos = task.NextAddress;
                if (task.TaskState == (int)TaskInStatusEnum.RGV_Indispatch)
                {
                    //var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                    //var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
                    //var requestTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTask)?.ConfigValue;
                    //var keys = new Dictionary<string, object>()
                    //{
                    //    {"TPbarcode", Barcode},
                    //    {"WhCode", "1001"},
                    //    {"BeginPoint", task.SourceAddress}
                    //};
                    //if (wmsBase == null || requestTask == null)
                    //{
                    //    throw new InvalidOperationException("WMS IP æœªé…ç½®");
                    //}
                    //var wmsIpAddress = wmsBase + requestTask;
                    //var result = WIDESEA_Comm.Http.HttpHelper.PostAsync(wmsIpAddress, keys.ToString()).Result;
                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress);
                if (!routers.Any()) throw new Exception($"未找到设备路由信息");
                    //if (result != null)
                    //{
                        task.TaskState = (int)TaskInStatusEnum.RGV_InAwaitWMS;
                        task.PalletCode = Barcode;
                        task.ModifyDate = DateTime.Now;
                        BaseDal.UpdateData(task);
                    //}
                task.CurrentAddress = task.NextAddress;
                task.NextAddress = routers.FirstOrDefault().ChildPosi;
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"RGV调度完成等待WMS任务");
                }
                else if (task.TaskState == (int)TaskInStatusEnum.RGV_InExecuting)
                {
                    Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == task.NextAddress);
                    task.TaskState = (int)TaskInStatusEnum.RGV_InExecutingFinish;
                    task.NextAddress = stationManager.stationNextChildCode;
                    task.CurrentAddress = task.NextAddress;
                    task.ModifyDate = DateTime.Now;
                    BaseDal.UpdateData(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"RGV入库完成");
                }
                else if (task.TaskState == (int)TaskOutStatusEnum.RGV_Outdispatch)
                {
                    task.TaskState = (int)TaskOutStatusEnum.RGV_OutdispatchFinish;
                    task.ModifyDate = DateTime.Now;
                    BaseDal.UpdateData(task);
                task.ModifyDate = DateTime.Now;
                task.Modifier = "System";
                BaseDal.UpdateData(task);
                }
                else if (task.TaskState == (int)TaskOutStatusEnum.RGV_OutExecuting)
                {
                    task.TaskState = (int)TaskOutStatusEnum.RGV_OutFinish;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"系统自动流程,更新当前位置【{oldCurrentPos} ----> {task.CurrentAddress}】和下一位置【{oldNextPos} ----> {task.NextAddress}】");
                return task;
                    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, $"RGV出库完成");
                }
                else
                {
                    throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】");
                }
                content = WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error($"任务完成异常,任务号:【{taskNum}】");
            }
            return null;
            return content;
        }
        public WebResponseContent StackCraneTaskCompleted(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
@@ -664,18 +694,75 @@
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                if ( task.TaskState == (int)AGVTaskStatusEnum.AGV_Executing)
                //var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                //var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
                //var requestTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue;
                //var keys = new Dictionary<string, object>()
                //    {
                //        {"TaskId", task.WMSTaskNum},
                //        {"TPbarcode", task.PalletCode},
                //        {"WhCode", "1001"},
                //        {"BeginPoint", task.SourceAddress},
                //        {"EndPoint", task.TargetAddress},
                //        {"Results", 1},
                //    };
                //if (wmsBase == null || requestTask == null)
                //{
                //    throw new InvalidOperationException("WMS IP æœªé…ç½®");
                //}
                //var wmsIpAddress = wmsBase + requestTask;
                //var result = WIDESEA_Comm.Http.HttpHelper.PostAsync(wmsIpAddress, keys.ToString()).Result;
                //if (result != null)
                //{
                //    task.ExceptionMessage += "   " + content.Message;
                //}
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
                {
                    task.TaskState = (int)AGVTaskStatusEnum.AGVFinish;
                    task.TaskState = (int)TaskOutStatusEnum.SC_OutFinish;
                    Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationType == 2);
                    task.CurrentAddress = task.NextAddress;
                    task.NextAddress = stationManager.stationNextChildCode;
                    BaseDal.UpdateData(task);
                    _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);
                    //_taskHtyService.AddTaskHty(task, (int)OperateTypeEnum.自动完成);
                    _taskHtyRepository.AddData(task_Hty);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库完成");
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                {
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
                    task.TaskState = nextStatus;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                    Dt_Task_Hty taskHty = _mapper.Map<Dt_Task_Hty>(task);
                    taskHty.OperateType = (int)OperateTypeEnum.自动完成;
                    _taskHtyRepository.AddData(taskHty);
                    Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
                    task_Hty.TaskId = 0;
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"AGV搬运完成完成");
                    BaseDal.DeleteData(task);
                    _taskHtyRepository.AddData(task_Hty);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机移库完成");
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup)
                {
                }
                else
                {
@@ -695,7 +782,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<Dt_Task> tasks = BaseDal.QueryData(x => (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskRelocationStatusEnum.RelocationNew) && x.TaskNum == taskDTO.TaskId && x.PalletCode == taskDTO.TPbarcode && x.Roadway == taskDTO.WhCode);
                List<Dt_Task> tasks = BaseDal.QueryData(x => (x.TaskState == (int)TaskInStatusEnum.InNew || x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskRelocationStatusEnum.RelocationNew) && x.WMSTaskNum == taskDTO.TaskId && x.PalletCode == taskDTO.TPbarcode && x.Roadway == taskDTO.WhCode);
                if (tasks.Count == 0) return content.Error("没有需要取消的任务");
                foreach (Dt_Task task in tasks)
                {
@@ -705,7 +792,6 @@
                    BaseDal.DeleteData(task);
                    Dt_Task_Hty taskHty = _mapper.Map<Dt_Task_Hty>(task);
                    //_taskHtyService.AddTaskHty(task, (int)OperateTypeEnum.WMS取消);
                    taskHty.OperateType = (int)OperateTypeEnum.WMS取消;
                    _taskHtyRepository.AddData(taskHty);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "人工取消任务");