1
huanghongfeng
10 天以前 0b4792ff8245f9eac16e6d02452eb9a091f6f72b
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -17,9 +17,12 @@
using Autofac.Core;
using AutoMapper;
using HslCommunication;
using Magicodes.ExporterAndImporter.Core;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Routing;
using NetTaste;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
@@ -28,6 +31,7 @@
using SqlSugar;
using StackExchange.Profiling.Internal;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
@@ -37,6 +41,8 @@
using System.Net.NetworkInformation;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Runtime.InteropServices;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
@@ -60,6 +66,7 @@
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using static Microsoft.IO.RecyclableMemoryStreamManager;
using static System.Net.Mime.MediaTypeNames;
namespace WIDESEAWCS_TaskInfoService
{
@@ -72,6 +79,7 @@
        private readonly ITask_HtyService _task_HtyService;
        private readonly IMapper _mapper;
        private readonly IEquipmentStatusService _equipmentStatus;
        private readonly IAgvStationService _gvStationService;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
@@ -86,7 +94,7 @@
        public List<int> 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)
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService, IRouterRepository routerRepository, IEquipmentStatusService equipmentStatus, IAgvStationService agvStationService) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -95,6 +103,7 @@
            _mapper = mapper;
            _routerRepository = routerRepository;
            _equipmentStatus = equipmentStatus;
            _gvStationService = agvStationService;
        }
        /// <summary>
@@ -117,8 +126,6 @@
        /// <returns>返回处理结果</returns>
        public ExpoReverse TaskInstruction(ExpoTaskDTO expoTask)
        {
            ExpoReverse content = new ExpoReverse();
            try
            {
@@ -134,8 +141,6 @@
                        WriteLog.Write_Log("任务接收", "任务重复", "异常任务", $"任务号:{dt_Tasks.TaskNum}重复,兰剑系统下发重复任务!!!");
                        return content;
                    }
                    if (item.type == 1)     //入库
                    {
                        Dt_Task dt_Task = new Dt_Task();
@@ -149,35 +154,35 @@
                        dt_Task.SourceAddress = item.startAddress;
                        dt_Task.TargetAddress = item.endAddress;
                        dt_Task.CurrentAddress = item.startAddress;
                        dt_Task.NextAddress = "0";   //目前暂无
                        dt_Task.NextAddress = "";   //目前暂无
                        dt_Task.Grade = item.priority;
                        dt_Task.WMSId = 0;   //目前暂无
                        BaseDal.AddData(dt_Task);
                        content.code = 0;
                        int taskidt = BaseDal.QueryFirst(x => x.TaskNum == dt_Task.TaskNum).TaskId;
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskidt, $"系统自动流程,创建任务");
                    }
                    else if (item.type == 2)    //出库
                    {
                        string roadway = "";
                        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;
                        }
                        AGVStation gVStation = _gvStationService.Corridorequipment(roadway);
                        Dt_Task dt_Task = new Dt_Task();
                        dt_Task.TaskNum = item.taskNo;
@@ -188,13 +193,15 @@
                        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.TargetAddress = "0";
                        dt_Task.CurrentAddress = gVStation.Motherinlaw.ToString();
                        dt_Task.NextAddress = gVStation.ZicheMotherinlaw.ToString();   //目前暂无
                        dt_Task.Grade = item.priority;
                        dt_Task.WMSId = 0;   //目前暂无
                        BaseDal.AddData(dt_Task);
                        content.code = 0;
                        _taskExecuteDetailService.AddTaskExecuteDetail(dt_Task.TaskId, $"系统自动流程,创建任务");
                    }
                    else
                    {
@@ -219,9 +226,223 @@
        /// </summary>
        /// <param name="deviceNo">设备编号</param>
        /// <returns>返回任务实体对象,可能为null</returns>
        public Dt_Task QueryStackerCraneTask(string DeviceCode)
        public Dt_Task QueryStackerCraneTask(AGVStation GdMuChe, AGVStation GdZiche)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode, TaskOrderBy);
            if (GdZiche.Station_Area == 3)  //3巷道母车
            {
                Dt_Task dt_Task = BaseDal.QueryFirst(x => x.Roadway == GdMuChe.ChildPosiDeviceCode && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);    //获取到对应母车的任务
                if (dt_Task != null)
                {
                    Dt_Task dt_Task4 = BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.NextAddress == GdZiche.MotherCarDeviceCode.ToString() && x.Grade < dt_Task.Grade, TaskOrderBy);
                    Dt_Task dt_Taskhcj = BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish && x.CurrentAddress == GdZiche.HCJStorageaddress.ToString() && x.Grade < dt_Task.Grade, TaskOrderBy);
                    if (dt_Task4 == null && dt_Taskhcj == null)   //在两个站台的任务优先级都正常,则正常移动
                    {
                        return dt_Task;
                    }
                }
                //获取HCJ站台任务与4巷任务
                return null;
            }
            return null;
        }
        public Dt_Task ObtainHCJtask(string curraderr)
        {
            return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && (x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheExecuting || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheReleaseExecuting) && x.CurrentAddress == curraderr, TaskOrderBy);
        }
        public Dt_Task ObtainMuChetask(string Nextaderr)
        {
            return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.NextAddress == Nextaderr, TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–æ¯è½¦æ˜¯å¦æœ‰ä»»åŠ¡ï¼Œè¿›è¡Œåˆ¤æ–­
        /// </summary>
        public Dt_Task ObtainMuChetaskbool(AGVStation ZicheinnerSide)
        {
            return BaseDal.QueryFirst(x => x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly && (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskType == (int)TaskOutStatusEnum.RGV_OutMothercarExecuting), TaskOrderBy);
        }
        public Dt_Task GetChariotTaskBool(string ChildPosiDeviceCode)
        {
            Dt_Task dt_Task2 = BaseDal.QueryFirst(x => x.Roadway == ChildPosiDeviceCode, TaskOrderBy);
            if (dt_Task2 != null) return dt_Task2;
            return null;
        }
        /// <summary>
        /// èŽ·å–HCJ站台是否有任务
        /// </summary>
        public Dt_Task GetHCJTaskBool(string ChildPosiDeviceCode,int HCJaddres)
        {
            Dt_Task dt_Task2 = BaseDal.QueryFirst(x => x.Roadway == ChildPosiDeviceCode && x.CurrentAddress== HCJaddres.ToString(), TaskOrderBy);
            if (dt_Task2 != null) return dt_Task2;
            return null;
        }
        public Dt_Task ChildVehicleMission(AGVStation aGVStation)
        {
            Dt_Task dt_Tasks2 = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.MotherCardeputy.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
            if (dt_Tasks2 != null) return dt_Tasks2;
            Dt_Task dt_Tasks = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.MotherCarDeviceCode.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
            if (dt_Tasks != null) return dt_Tasks;
            Dt_Task dt_Tasks3 = BaseDal.QueryFirst(x => x.Roadway == aGVStation.ChildPosiDeviceCode && x.CurrentAddress == aGVStation.HCJStorageaddress.ToString() && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
            if (dt_Tasks3 != null) return dt_Tasks3;
            return null;
        }
        public Dt_Task GetFinhuoTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy);
        }
        public Dt_Task GetOutkouFinhuoTask(string DeviceCode, string curraderr)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutPickupFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing && x.NextAddress != "", TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–å‡ºåº“å£å­è½¦å–è´§
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <param name="curraderr"></param>
        /// <returns></returns>
        public Dt_Task GetOutchachekouFinhuoTask(string DeviceCode, string curraderr)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp && x.CurrentAddress == curraderr, TaskOrderBy);
        }
        /// <summary>
        /// å…¥åº“取货任务
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <param name="type">1:查找需要取货的任务</param>
        public Dt_Task PickupWarehouse(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InNew && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
        }
        /// <summary>
        /// ä»»åŠ¡æŸ¥æ‰¾
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <param name="type">1:查找需要取货的任务   2:查找需要放货的任务</param>
        public Dt_Task GetInkouFinhuoTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.NextAddress != "" && x.TaskState == (int)TaskInStatusEnum.RGV_InPickupFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy);
        }
        /// <summary>
        /// æ¯è½¦ç§»åŠ¨ä»»åŠ¡
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task MothermachinemovementTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly, TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–æ¯è½¦ç§»åŠ¨ä»»åŠ¡å’Œç§»åŠ¨ä¸­çš„ä»»åŠ¡ï¼ˆå…¥åº“ï¼‰
        /// </summary>
        /// <param name="DeviceCode"></param>
        /// <returns></returns>
        public Dt_Task MothermachinemovementTask2(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarExecuting && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly), TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–æ¯è½¦ç§»åŠ¨ä»»åŠ¡å’Œç§»åŠ¨ä¸­çš„ä»»åŠ¡ï¼ˆå…¥åº“ï¼‰
        /// </summary>
        public Dt_Task MothermacTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish || x.TaskState == (int)TaskInStatusEnum.SC_InExecuting || x.TaskState == (int)TaskInStatusEnum.InFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.TravelingOnly), TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–æ¯è½¦ç§»åŠ¨ä»»åŠ¡å’Œç§»åŠ¨ä¸­çš„ä»»åŠ¡ï¼ˆå‡ºåº“ï¼‰
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task OutMothermaTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarExecuting && x.RGVTaskType == (int)TaskOutStatusEnum.RGV_OutMothercarFinish), TaskOrderBy);
        }
        /// <summary>
        /// å­è½¦è¿›è¡Œæ”¾è´§ä»»åŠ¡
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task ViceChariotPlacingTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InZicheFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.Placing, TaskOrderBy);
        }
        /// <summary>
        /// å­è½¦å–货任务,取货HCJ任务
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task ViceChariotPickupTask(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && x.TaskState == (int)TaskInStatusEnum.RGV_InReleaseFinish && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
        }
        /// <summary>
        /// èŽ·å–å­è½¦å–è´§ä»»åŠ¡ï¼Œè¿›å…¥æ¯è½¦å–è´§
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task OutPickupZiche(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskOutStatusEnum.RGV_OutMothercarFinish || x.TaskState == (int)TaskOutStatusEnum.RGV_OutZicheExecuting) && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
        }
        /// <summary>
        /// åˆ¤æ–­æ˜¯å¦æœ‰å­è½¦å–HCJ任务,或者在执行的任务
        /// </summary>
        /// <param name="DeviceCode"></param>
        public Dt_Task ViceChariotPickupTask2(string DeviceCode)
        {
            return BaseDal.QueryFirst(x => x.Roadway == DeviceCode && (x.TaskState == (int)TaskInStatusEnum.RGV_InReleaseFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheFinish || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting || x.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish) && x.RGVTaskType == (int)RGVTaskTypeEnum.PickingUp, TaskOrderBy);
        }
        public WebResponseContent UpdateDeliveryAddress(string NextAddress, int tasktype)
        {
            WebResponseContent webResponse = new WebResponseContent();
            try
            {
                Dt_Task dt_Task = null;
                if (tasktype == 1)
                {
                    dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState== (int)TaskInStatusEnum.InexceptionalSelection);
                }
                else
                {
                    dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.Outbound && x.NextAddress == "");
                }
                if (dt_Task == null) return webResponse.Error("未找到需要修改的任务,无需修改");
                dt_Task.NextAddress = NextAddress;
                BaseDal.UpdateData(dt_Task);
                return webResponse.OK("任务放货地址修改成功");
            }
            catch (Exception ex)
            {
                return webResponse.Error($"任务放货地址修改失败!原因:{ex.Message}");
                throw;
            }
        }
        public WebResponseContent UpdateRGVTasktype(int taskNum, int RGVTasktype)
@@ -250,8 +471,6 @@
                }
                task.RGVTaskType = RGvtype;
                bool updatesta = BaseDal.UpdateData(task);
                string Meesgt = $"目标地址:{task.CurrentAddress},任务类型:{rwlx},修改状态:{updatesta}";
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, Meesgt);
                content = WebResponseContent.Instance.OK();
            }
@@ -288,7 +507,7 @@
                task.ExceptionMessage = message;
                task.ModifyDate = DateTime.Now;
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "更新任务异常:" + task.ExceptionMessage);
                content = WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -311,7 +530,7 @@
                int oldState = task.TaskState;
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
                {
                    if (task.TaskState >= (int)TaskInStatusEnum.RGV_InMothercarFinish)
                    if (task.TaskState >= (int)TaskInStatusEnum.InFinish)
                    {
                        return content = WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskState}】");
                    }
@@ -319,6 +538,11 @@
                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
                    task.TaskState = nextStatus;
                    /*if (task.TaskState == (int)TaskInStatusEnum.RGV_InPickupExecuting)  //当下发入库口取货中,则调取兰剑接口
                    {
                        TaskResultIn(task.TaskNum.ToString(),"",1,"");
                    }*/
                }
                else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
                {
@@ -346,7 +570,14 @@
                task.Modifier = "System";
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"人工手动将任务状态从【{oldState}】跳转到【{task.TaskState}】" : $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskState}】");
                string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态
                string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态
                string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ?
                    $"人工手动将任务状态从【{oldstaterem}】跳转到【{afterstaterem}】"
                    : $"系统自动流程,任务状态从【{oldstaterem}】转到【{afterstaterem}】");
                content = WebResponseContent.Instance.OK();
            }
@@ -396,7 +627,9 @@
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工恢复挂起任务,恢复挂起时任务状态【{task.TaskState}】");
                string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工恢复挂起任务,恢复挂起时任务状态【{afterstaterem}】");
                content = WebResponseContent.Instance.OK();
            }
@@ -421,7 +654,20 @@
                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<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
                Dt_TaskExecuteDetail taskExecuteDetail = null;
                if (task.NextAddress == "1061")
                {
                    taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState > task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
                }
                else
                {
                    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;
@@ -437,7 +683,13 @@
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工将任务状态从【{oldState}】回滚到【{task.TaskState}】");
                string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态
                string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态
                string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId,
                    $"人工手动将任务状态从【{oldstaterem}】回归到【{afterstaterem}】");
                content = WebResponseContent.Instance.OK();
            }
@@ -521,9 +773,13 @@
            try
            {
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)  //正常流程
                {
                    HandleInboundTask(task);
                }
                else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && (task.NextAddress == "1001" || task.NextAddress == "1002"))
                {
                    task.TaskState = (int)TaskInStatusEnum.RGV_InMothercarFinish;
                }
                else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
                {
@@ -537,10 +793,32 @@
                task.ExceptionMessage = string.Empty;
                BaseDal.UpdateData(task);
                _taskExecuteDetailService.AddTaskExecuteDetail(
                    task.TaskId,
                    $"自动任务状态从【{oldState}】进入到【{task.TaskState}】"
                );
                string oldstaterem = _taskExecuteDetailService.GetEnumDescription(oldState); //前一个状态
                string afterstaterem = _taskExecuteDetailService.GetEnumDescription(task.TaskState); //后一个状态
                string rgvtyperem = _taskExecuteDetailService.GetEnumDescription2(task.RGVTaskType); //后一个状态
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ?
                    $"人工手动将任务状态从【{oldstaterem}】跳转到【{afterstaterem}】"
                    : $"系统自动流程,任务状态从【{oldstaterem}】转到【{afterstaterem}】");
                if (task.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish || task.TaskState == (int)TaskOutStatusEnum.OutFinish)   //入库任务完成
                {
                    if (task.NextAddress == "1001" || task.NextAddress == "1002")
                    {
                        //异常排除任务时,异常上报
                    }
                    else
                    {
                        //正常任务,正常上报
                        TaskResultIn(task.TaskNum.ToString(), "", 2, "");
                        /*AutomaticTaskCompleted(task);   //任务完成
                        BaseDal.DeleteData(task);*/
                    }
                }
                return WebResponseContent.Instance.OK();
            }
@@ -552,6 +830,19 @@
        }
        #region å…¥åº“
        public WebResponseContent HandleInAbnormal(int taskNum)
        {
            Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
            if (task == null)
                return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
            task.TaskState = (int)TaskInStatusEnum.InAbnormalFinish;
            task.RGVTaskType = (int)RGVTaskTypeEnum.Placing;
            BaseDal.UpdateData(task);
            return WebResponseContent.Instance.OK();
        }
        private void HandleInboundTask(Dt_Task task)
        {
            switch (task.TaskState)
@@ -559,10 +850,11 @@
                case (int)TaskInStatusEnum.RGV_InPickupExecuting:
                    task.TaskState = (int)TaskInStatusEnum.RGV_InPickupFinish;
                    task.RGVTaskType = (int)RGVTaskTypeEnum.Placing;
                    task.NextAddress = "1021";
                    break;
                case (int)TaskInStatusEnum.RGV_InReleaseExecuting:
                    HandleInboundRelease(task);
                    HandleInboundRelease(task);     //入库RGV放货完成后,修改任务状态到子车取货任务
                    break;
                case (int)TaskInStatusEnum.RGV_InZicheExecuting:
@@ -571,14 +863,8 @@
                    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;
@@ -588,46 +874,72 @@
            }
        }
        /// <summary>
        /// å…¥åº“RGV放货完成后
        /// </summary>
        /// <param name="task"></param>
        private void HandleInboundRelease(Dt_Task task)
        {
            task.TaskState = (int)TaskInStatusEnum.RGV_InReleaseFinish;
            task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
            var routes = _routerRepository.QueryData(x =>
            Dt_Router routes = _routerRepository.QueryFirst(x =>
                x.StartPosi == task.NextAddress &&
                x.InOutType == 1 &&
                x.IsEnd == false
            );
            foreach (var route in routes)
                x.IsEnd == false && x.ChildPosi == task.TargetAddress
                );
            if (task.TargetAddress != "1" && task.TargetAddress != "2")
            {
                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; // æ‰¾åˆ°åŒ¹é…è·¯ç”±åŽé€€å‡ºå¾ªçޝ
                }
                routes = _routerRepository.QueryFirst(x =>
                x.StartPosi == task.NextAddress &&
                x.InOutType == 1 &&
                x.IsEnd == false && x.ChildPosi == "1061"
                );
            }
            task.Roadway = routes.ChildPosiDeviceCode;
            task.CurrentAddress = routes.StartPosi;
            task.NextAddress = routes.NextPosi;
        }
        private void HandleInboundZichemove(Dt_Task task)
        {
            var route = _routerRepository.QueryFirst(x =>
                x.IsEnd == true &&
                x.ChildPosi == task.NextAddress &&
                x.InOutType == 1
            );
            if (task.TargetAddress == "1" || task.TargetAddress == "2")
            {
                task.TaskState = (int)TaskInStatusEnum.RGV_InZicheReleaseFinish;
                task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly;
            if (route == null)
                throw new InvalidOperationException("未找到对应的结束路由");
                Dt_Router dt_InRouter = _routerRepository.QueryFirst(x => x.IsEnd == true && x.StartPosi == task.NextAddress && x.InOutType == 1);
                task.CurrentAddress = dt_InRouter.StartPosi;
                task.NextAddress = dt_InRouter.NextPosi;
                task.Roadway = dt_InRouter.ChildPosiDeviceCode;
            task.TaskState = (int)TaskInStatusEnum.RGV_InZichemoveFinish;
            task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly;
            task.CurrentAddress = route.StartPosi;
            task.NextAddress = route.NextPosi;
            task.Roadway = route.ChildPosiDeviceCode;
            }
            else
            {
                //子车完成
                Dt_Router dt_Routernei = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.ChildPosi == task.TargetAddress && x.IsEnd == false);
                if (dt_Routernei != null)
                {
                    task.TaskState = (int)TaskInStatusEnum.RGV_InReleaseFinish;
                    task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                    task.CurrentAddress = dt_Routernei.StartPosi;
                    task.NextAddress = dt_Routernei.NextPosi;
                    task.Roadway = dt_Routernei.ChildPosiDeviceCode;
                }
                else
                {
                    Dt_Router dt_Routernei2 = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 1 && x.ChildPosi == task.TargetAddress && x.IsEnd==true);
                    task.TaskState = (int)TaskInStatusEnum.RGV_InZicheReleaseFinish;
                    task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly;
                    task.CurrentAddress = dt_Routernei2.StartPosi;
                    task.NextAddress = dt_Routernei2.NextPosi;
                    task.Roadway = dt_Routernei2.ChildPosiDeviceCode;
                }
            }
        }
        #endregion
@@ -638,6 +950,10 @@
            switch (task.TaskState)
            {
                case (int)TaskOutStatusEnum.RGV_OutMothercarExecuting:
                    Dt_Router dt_Router = _routerRepository.QueryFirst(x => x.StartPosi == task.NextAddress && x.InOutType == 2);
                    task.CurrentAddress = dt_Router.StartPosi;
                    task.NextAddress = dt_Router.NextPosi;
                    task.Roadway = dt_Router.ChildPosiDeviceCode;
                    task.TaskState = (int)TaskOutStatusEnum.RGV_OutMothercarFinish;
                    task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                    break;
@@ -680,6 +996,8 @@
                task.TaskState = (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish;
                task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                task.Roadway = "RGV118";
                task.CurrentAddress = "1171";
                task.NextAddress = "";
            }
            else
            {
@@ -695,7 +1013,7 @@
                task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                task.CurrentAddress = nextRoute.StartPosi;
                task.NextAddress = nextRoute.NextPosi;
                task.Roadway = route.ChildPosiDeviceCode;
                task.Roadway = nextRoute.ChildPosiDeviceCode;
            }
        }
        #endregion
@@ -704,7 +1022,7 @@
        #region å…°å‰‘调取接口内容
        /// <summary>
        /// æŸ¥è¯¢RGV状态
        /// æŸ¥è¯¢RGV状态(完成,待测试)
        /// </summary>
        /// <param name="statusquery"></param>
        /// <returns></returns>
@@ -728,60 +1046,88 @@
                        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 (device == null)
                    {
                        rGVstatus.code = 1;
                        rGVstatus.msg = "查询的RGV已断线";
                        return rGVstatus;
                    }
                    SpeStackerCrane Commonstacker = (SpeStackerCrane)device;
                    //当前位置
                    DeviceProDTO? deviceProDTO = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RGVCurrentlocation" && x.DeviceProParamType == "RGVCurrentlocation");
                    if (item.type == "pick")   //取货
                    {
                        //获取设备
                        //获取取货站台货位站台
                        Dt_Router dt_Router = _routerRepository.QueryFirst(x => x.InOutType == 1 && x.ChildPosiDeviceCode == item.rgvTag && x.IsEnd == true);
                        AGVStation aGVStation = _gvStationService.Corridorequipment(item.rgvTag);
                        if (aGVStation == null)
                        {
                            rGVstatus.code = 1;
                            rGVstatus.msg = "未查找到该RGV";
                            return rGVstatus;
                        }
                        //有无货状态
                        DeviceProDTO? deviceProFh = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvEquipmentStatus" && x.DeviceProParamType == "RgvEquipmentStatus");
                        DeviceProDTO? RgvCraneAutoStatus = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvCraneAutoStatus" && x.DeviceProParamType == "RgvCraneAutoStatus");
                        int Itstock = Commonstacker.Communicator.Read<short>(deviceProFh.DeviceProAddress);
                        int RgvCraneAutoStatusValues = Commonstacker.Communicator.Read<short>(RgvCraneAutoStatus.DeviceProAddress);
                        int Currentlocation = conveyorLine.Communicator.Read<short>(deviceProDTO.DeviceProAddress);
                        if (Currentlocation == int.Parse(dt_Router.NextPosi))    //为无货
                        int Currentlocation = Commonstacker.Communicator.Read<short>(deviceProDTO.DeviceProAddress);
                        if (Currentlocation == aGVStation.Motherinlaw && Itstock == 1 && RgvCraneAutoStatusValues == 1)    //是否在取货位
                        {
                            rGVstatus.code = 0;
                            rGVstatus.data = new List<RgvOperation>
                    {
                        new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 1 },
                    };
                            {
                                new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 1 },
                            };
                        }
                        else
                        {
                            rGVstatus.code = 0;
                            rGVstatus.data = new List<RgvOperation>
                    {
                        new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 0 },
                    };
                            {
                                new RgvOperation { rgvTag = item.rgvTag, type = "pick", status = 0 },
                            };
                        }
                    }
                    else if (item.type == "put")    //放货
                    {
                        AGVStation aGVStation = _gvStationService.Corridorequipment(item.rgvTag);
                        int Currentlocation = Commonstacker.Communicator.Read<short>(deviceProDTO.DeviceProAddress);
                        int Currentlocation = conveyorLine.Communicator.Read<short>(deviceProDTO.DeviceProAddress);
                        switch (Currentlocation)
                        //有无货状态
                        DeviceProDTO? deviceProFh = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvEquipmentStatus" && x.DeviceProParamType == "RgvEquipmentStatus");
                        DeviceProDTO? RgvCraneAutoStatus = Commonstacker.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == item.rgvTag && x.DeviceProParamName == "RgvCraneAutoStatus" && x.DeviceProParamType == "RgvCraneAutoStatus");
                        int Itstock = Commonstacker.Communicator.Read<short>(deviceProFh.DeviceProAddress);
                        int RgvCraneAutoStatusValues = Commonstacker.Communicator.Read<short>(RgvCraneAutoStatus.DeviceProAddress);
                        if (aGVStation.Motherinlaw== Currentlocation && Itstock==0 && RgvCraneAutoStatusValues==1) //Itstock:0为无货    RgvCraneAutoStatusValues: 1为自动
                        {
                            case 1101:
                            case 1121:
                            case 1141:
                            case 1151:
                                rGVstatus.code = 0;
                                rGVstatus.data = new List<RgvOperation>
                            rGVstatus.code = 0;
                            rGVstatus.data = new List<RgvOperation>
                                {
                                    new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 2 },
                                };
                                break;
                            default:
                                rGVstatus.code = 0;
                                rGVstatus.data = new List<RgvOperation>
                        }
                        else
                        {
                            rGVstatus.code = 0;
                            rGVstatus.data = new List<RgvOperation>
                                {
                                    new RgvOperation { rgvTag = item.rgvTag, type = "put", status = 0 },
                                };
                                break;
                        }
                    }
                    else
                    {
@@ -801,6 +1147,7 @@
            }
        }
        /// <summary>
@@ -824,24 +1171,61 @@
                    if (item.rgvTag == null)
                    {
                        expoReverse.code = 1;
                        expoReverse.msg = "明和WCS接收到RGV编号为空,请检查";
                        return expoReverse;
                    }
                    //查找RGV完成的任务
                    if (item.type == "pick")   //取货
                    {
                        expoReverse.code = 0;
                        if (item.status == 1)   //堆垛机进行取货中
                        {
                            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState == (int)TaskInStatusEnum.RGV_InMothercarFinish && x.Roadway == item.rgvTag);
                            if (dt_Task == null)
                            {
                                expoReverse.code = 1;
                                expoReverse.msg = "明和WCS未找到需要取货的任务";
                                return expoReverse;
                            }
                            dt_Task.TaskState = (int)TaskInStatusEnum.SC_InExecuting;
                            BaseDal.UpdateData(dt_Task);
                            expoReverse.code = 0;
                        }
                        else if (item.status == 2)
                        {
                            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskInboundTypeEnum.Inbound && x.TaskState == (int)TaskInStatusEnum.SC_InExecuting && x.Roadway == item.rgvTag);
                            if (dt_Task == null)
                            {
                                expoReverse.code = 1;
                                expoReverse.msg = "明和WCS未找到需要取货的任务";
                                return expoReverse;
                            }
                            dt_Task.TaskState = (int)TaskInStatusEnum.InFinish;
                            AutomaticTaskCompleted(dt_Task);    //有问题,等待优化
                            BaseDal.DeleteData(dt_Task);        //删除任务
                            expoReverse.code = 0;
                        }
                    }
                    else if (item.type == "put")    //放货
                    {
                        if (item.status == 2)   //堆垛机执行中
                        {
                            Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.Outbound && x.TaskState == (int)TaskOutStatusEnum.OutNewLj && x.Roadway == item.rgvTag);
                            if (dt_Task != null)
                            {
                                dt_Task.TaskState = (int)TaskOutStatusEnum.OutNew;
                                BaseDal.UpdateData(dt_Task);
                            }
                        }
                        expoReverse.code = 0;
                    }
                    else
                    {
                        expoReverse.code = 1;
                        expoReverse.msg = $"明和WCS接收的参数类型错误,实际接收值为:{item.type}";
                    }
                }
@@ -856,7 +1240,7 @@
        }
        /// <summary>
        /// å †åž›æœºæ•…障信息
        /// èŽ·å–å †åž›æœºæ•…éšœä¿¡æ¯
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
@@ -875,24 +1259,21 @@
                List<EquipmentStatus> equipmentdata = new List<EquipmentStatus>();
                List<EquipmentStatus> 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);
                    if (equipment.Equipment_Status != item.errorStatus)
                    {
                        equipment.Equipment_Status = item.errorStatus;
                        equipmentdata.Add(equipment);
                    }
                }
                WriteLog.Write_Log("设备状态更改", "堆垛机状态更改", "正常", msgeetst);
                _equipmentStatus.UpdateData(equipmentdata);     //修改状态
                if (equipmentdata.Count > 0)
                {
                    _equipmentStatus.UpdateData(equipmentdata);     //修改状态
                }
                expoReverse.code = 0;
                return expoReverse;
            }
            catch (Exception ex)
@@ -905,7 +1286,7 @@
        }
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆæŽ¥å£
        /// ä»»åŠ¡å–æ¶ˆæŽ¥å£(待测试)
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
@@ -997,7 +1378,7 @@
        /// <summary>
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定入库接口)
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定入库接口)可进行测试   1.当执行该任务的时候,上报兰剑任务执行中
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
@@ -1019,14 +1400,15 @@
        }
        /// <summary>
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定出库接口)
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定出库接口)可进行测试
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
        public WebResponseContent TaskResultOut(string taskNo, string finalAddress, int status, string remark)
        {
            WebResponseContent responseContent = new WebResponseContent();
            TaskfeedbackResponse reception = new TaskfeedbackResponse { data = new List<TaskfeedbackData> { new TaskfeedbackData { taskNo = taskNo, type = 1, finalAddress = finalAddress, status = status, remark = remark } } };
            TaskfeedbackResponse reception = new TaskfeedbackResponse { data = new List<TaskfeedbackData> { new TaskfeedbackData { taskNo = taskNo, type = 2, finalAddress = finalAddress, status = status, remark = remark } } };
            StkRunStatusReturns LJReturns = HttpHelper.Post<StkRunStatusReturns>(urlLanJianWCSAPI + LanJiantaskResult, reception, "任务反馈接口");
            if (LJReturns.code == 0)
            {
@@ -1040,26 +1422,16 @@
            return responseContent;
        }
        /// <summary>
        /// äººå·¥æ‰‹åŠ¨å®Œæˆ
        /// è‡ªåŠ¨å®Œæˆä»»åŠ¡
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent CompletedManually(int id)
        public WebResponseContent AutomaticTaskCompleted(Dt_Task dt_task)
        {
            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,
@@ -1073,38 +1445,81 @@
                    NextAddress = dt_task.NextAddress,
                    WMSId = dt_task.WMSId,
                    Dispatchertime = dt_task.Dispatchertime,
                    Remark = "人工手动完成",
                    Remark = "自动完成",
                    Creater = App.User.UserName,
                    CreateDate = DateTime.Now,
                    RGVTaskType = dt_task.RGVTaskType,
                    RGVCurrentexecution = dt_task.RGVCurrentexecution
                });
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("任务完成失败!");
            }
        }
        /// <summary>
        /// äººå·¥æ‰‹åŠ¨å®Œæˆ
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent CompletedManually(int id, int CompletionType)
        {
            var db = BaseDal.Db as SqlSugarClient;
            try
            {
                db.Ado.BeginTran();
                Dt_Task dt_task = BaseDal.QueryData().Where(x => x.TaskId == id).FirstOrDefault();
                if (dt_task == null) return WebResponseContent.Instance.Error($"未查询到任务");
                string Remark = CompletionType == 1 ? "人工手动完成" : "自动完成";
                var res = _task_HtyService.AddData(new Dt_Task_hty
                {
                    TaskNum = dt_task.TaskNum,
                    PalletCode = dt_task.PalletCode,
                    Roadway = dt_task.Roadway,
                    TaskType = dt_task.TaskType,
                    TaskState = dt_task.TaskState,
                    SourceAddress = dt_task.SourceAddress,
                    TargetAddress = dt_task.TargetAddress,
                    CurrentAddress = dt_task.CurrentAddress,
                    NextAddress = dt_task.NextAddress,
                    WMSId = dt_task.WMSId,
                    Dispatchertime = dt_task.Dispatchertime,
                    Remark = Remark,
                    Creater = App.User.UserName,
                    CreateDate = DateTime.Now,
                    RGVTaskType = dt_task.RGVTaskType,
                    RGVCurrentexecution = dt_task.RGVCurrentexecution
                });
                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("手动完成失败!");
                    return WebResponseContent.Instance.Error($"{Remark}失败!");
                }
                var deletetask = BaseDal.DeleteData(dt_task);
                if (deletetask == false) {
                if (deletetask == false)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!");
                    return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!");
                }
                db.Ado.CommitTran();
                return WebResponseContent.Instance.OK("手动完成成功!");
                return WebResponseContent.Instance.OK($"{Remark}成功!");
            }
            catch (Exception ex)
            {
                db.Ado.RollbackTran();
                return WebResponseContent.Instance.Error("手动完成失败!");
                return WebResponseContent.Instance.Error("任务完成失败!");
            }
        }
@@ -1124,7 +1539,7 @@
                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.TaskType >= 200 && dt_task.TaskType <= 203)
                {
                    if (dt_task.TaskState > (int)TaskInStatusEnum.RGV_InNew) return WebResponseContent.Instance.Error($"任务状态不允许取消");
                }
@@ -1132,7 +1547,7 @@
                {
                    if (dt_task.TaskState > (int)TaskOutStatusEnum.OutNew) return WebResponseContent.Instance.Error($"任务状态不允许取消");
                }
                }*/
                Dt_Task_hty dt_Task_Hty = new Dt_Task_hty
                {
@@ -1154,18 +1569,20 @@
                    RGVCurrentexecution = dt_task.RGVCurrentexecution
                };
                var res = _task_HtyService.AddData(dt_Task_Hty);
                if (res.Status == false) {
                if (res.Status == false)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("取消任务失败!");
                }
                int oldState = dt_task.TaskState;
                /*int oldState = dt_task.TaskState;
                _taskExecuteDetailService.AddTaskExecuteDetail(
    dt_task.TaskId,
    $"自动任务状态从【{oldState}】进入到【{dt_Task_Hty.TaskState}】"
);
);*/
                var deletetask = BaseDal.DeleteData(dt_task);
                if (deletetask == false) {
                bool deletetask = BaseDal.DeleteData(dt_task);
                if (!deletetask)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!");
                }
@@ -1178,5 +1595,69 @@
                return WebResponseContent.Instance.Error("取消任务失败!");
            }
        }
        /// <summary>
        /// ä»»åŠ¡ä¸‹ä¸€æ­¥æ‰§è¡Œ
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
        public WebResponseContent NextStepeXecuted(int taskid)
        {
            WebResponseContent responseContent = new WebResponseContent();
            Dt_Task task = BaseDal.QueryData().Where(x => x.TaskNum == taskid).FirstOrDefault();
            if (task == null) return WebResponseContent.Instance.Error($"未查询到任务");
            switch (task.TaskState)
            {
                //入库状态
                case (int)TaskInStatusEnum.RGV_InNew:
                case (int)TaskInStatusEnum.RGV_InPickupFinish:
                case (int)TaskInStatusEnum.RGV_InReleaseFinish:
                case (int)TaskInStatusEnum.RGV_InZicheFinish:
                case (int)TaskInStatusEnum.RGV_InZicheReleaseFinish:
                //入库状态
                //出库状态
                case (int)TaskOutStatusEnum.OutNew:
                case (int)TaskOutStatusEnum.RGV_OutMothercarFinish:
                case (int)TaskOutStatusEnum.RGV_OutZicheFinish:
                case (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish:
                case (int)TaskOutStatusEnum.RGV_OutPickupFinish:
                    //出库状态
                    //调取下发的接口
                    responseContent = UpdateTaskStatusToNext(task);
                    break;
                //入库状态
                case (int)TaskInStatusEnum.RGV_InPickupExecuting:
                case (int)TaskInStatusEnum.RGV_InReleaseExecuting:
                case (int)TaskInStatusEnum.RGV_InZicheExecuting:
                case (int)TaskInStatusEnum.RGV_InZicheReleaseExecuting:
                case (int)TaskInStatusEnum.RGV_InMothercarExecuting:
                //入库状态
                //出库状态
                case (int)TaskOutStatusEnum.RGV_OutMothercarExecuting:
                case (int)TaskOutStatusEnum.RGV_OutZicheExecuting:
                case (int)TaskOutStatusEnum.RGV_OutZicheReleaseExecuting:
                case (int)TaskOutStatusEnum.RGV_OutPickupExecuting:
                case (int)TaskOutStatusEnum.RGV_OutReleaseExecuting:
                    //出库状态
                    //调取完成接口
                    responseContent = UpdateTaskStatus(task.TaskNum);
                    break;
                case (int)TaskInStatusEnum.RGV_InMothercarFinish:
                    return WebResponseContent.Instance.Error("RGV部分任务已走位,不可往下执行");
                default:
                    return WebResponseContent.Instance.Error("任务状态错误,执行下一步失败");
            }
            // åˆ›å»ºå¹¶èµ‹å€¼
            return responseContent;
        }
    }
}