1
huanghongfeng
2025-10-22 8d558cb173873004cd8a0d6c12f37865f03d7a4f
´úÂë¹ÜÀí/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,16 +126,14 @@
        /// <returns>返回处理结果</returns>
        public ExpoReverse TaskInstruction(ExpoTaskDTO expoTask)
        {
            ExpoReverse content = new ExpoReverse();
            try
            {
                foreach (var item in expoTask.data)
                {
                    //查询数据库,查看是否有当前任务
                    Dt_Task dt_Tasks =BaseDal.QueryFirst(x=>x.TaskNum== item.taskNo);
                    if(dt_Tasks != null)
                    Dt_Task dt_Tasks = BaseDal.QueryFirst(x => x.TaskNum == item.taskNo);
                    if (dt_Tasks != null)
                    {
                        content.code = 1;
                        content.msg = $"明和WCS已有当前任务ID,请勿重新下发,任务号:{dt_Tasks.TaskNum}";
@@ -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 = "1021";   //目前暂无
                        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;
@@ -186,15 +191,17 @@
                        dt_Task.TaskType = (int)TaskOutboundTypeEnum.Outbound;
                        dt_Task.RGVTaskType = (int)RGVTaskTypeEnum.TravelingOnly;      //取货
                        dt_Task.RGVCurrentexecution = "0";      //目前暂无
                        dt_Task.TaskState = (int)TaskOutStatusEnum.OutNew;      //目前暂无
                        dt_Task.TaskState = (int)TaskOutStatusEnum.OutNewLj;      //目前暂无
                        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
                    {
@@ -202,14 +209,12 @@
                        content.msg = $"任务类型错误,wcs接收到的类型为:{item.type}";
                    }
                }
                WriteLog.Write_Log("任务接收", "接收兰剑下发任务", "成功", $"接收到的数据为:{expoTask.ToJson()}");
            }
            catch (Exception ex)
            {
                content.code = 1;
                content.msg = $"数据错误,原因:{ex.Message}";
                WriteLog.Write_Log("任务接收", "接收兰剑下发任务异常", "异常", ex.Message);
            }
            return content;
@@ -221,9 +226,215 @@
        /// </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>
        /// <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.NextAddress == "999");
                }
                else
                {
                    dt_Task = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.Outbound && x.NextAddress == "999");
                }
                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)
@@ -252,8 +463,6 @@
                }
                task.RGVTaskType = RGvtype;
                bool updatesta = BaseDal.UpdateData(task);
                string Meesgt = $"目标地址:{task.CurrentAddress},任务类型:{rwlx},修改状态:{updatesta}";
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, Meesgt);
                content = WebResponseContent.Instance.OK();
            }
@@ -290,8 +499,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)
@@ -349,7 +557,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();
            }
@@ -399,7 +614,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();
            }
@@ -424,7 +641,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.CurrentAddress == "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;
@@ -440,7 +670,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();
            }
@@ -524,9 +760,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)
                {
@@ -540,10 +780,28 @@
                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)   //入库任务完成
                {
                    //AutomaticTaskCompleted(task);   //任务完成
                    if (task.NextAddress == "1001" || task.NextAddress == "1002")
                    {
                        //异常排除任务时,异常上报
                    }
                    else
                    {
                        //正常任务,正常上报
                    }
                }
                return WebResponseContent.Instance.OK();
            }
@@ -565,7 +823,7 @@
                    break;
                case (int)TaskInStatusEnum.RGV_InReleaseExecuting:
                    HandleInboundRelease(task);
                    HandleInboundRelease(task);     //入库RGV放货完成后,修改任务状态到子车取货任务
                    break;
                case (int)TaskInStatusEnum.RGV_InZicheExecuting:
@@ -574,14 +832,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;
@@ -591,46 +843,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
@@ -641,6 +919,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;
@@ -683,6 +965,8 @@
                task.TaskState = (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish;
                task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                task.Roadway = "RGV118";
                task.CurrentAddress = "1171";
                task.NextAddress = "";
            }
            else
            {
@@ -698,7 +982,7 @@
                task.RGVTaskType = (int)RGVTaskTypeEnum.PickingUp;
                task.CurrentAddress = nextRoute.StartPosi;
                task.NextAddress = nextRoute.NextPosi;
                task.Roadway = route.ChildPosiDeviceCode;
                task.Roadway = nextRoute.ChildPosiDeviceCode;
            }
        }
        #endregion
@@ -707,7 +991,7 @@
        #region å…°å‰‘调取接口内容
        /// <summary>
        /// æŸ¥è¯¢RGV状态
        /// æŸ¥è¯¢RGV状态(完成,待测试)
        /// </summary>
        /// <param name="statusquery"></param>
        /// <returns></returns>
@@ -731,60 +1015,72 @@
                        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;
                        }
                        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)    //是否在取货位
                        {
                            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");
                        int Itstock = Commonstacker.Communicator.Read<short>(deviceProFh.DeviceProAddress);
                        if (aGVStation.Motherinlaw== Currentlocation && Itstock==0)
                        {
                            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
                    {
@@ -804,6 +1100,7 @@
            }
        }
        /// <summary>
@@ -827,24 +1124,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}";
                    }
                }
@@ -908,7 +1242,7 @@
        }
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆæŽ¥å£
        /// ä»»åŠ¡å–æ¶ˆæŽ¥å£(待测试)
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
@@ -975,10 +1309,10 @@
        /// <returns></returns>
        public WebResponseContent StkRunStatus()
        {
            WebResponseContent responseContent=new WebResponseContent();
            WebResponseContent responseContent = new WebResponseContent();
            // åˆ›å»ºå¹¶èµ‹å€¼
            StkRunStatusReception reception = new StkRunStatusReception{data = new List<StkRunStatusData>{new StkRunStatusData{stackerName = "ALL"}}};
            StkRunStatusReturns LJReturns  = HttpHelper.Post<StkRunStatusReturns>(urlLanJianWCSAPI + LanJianStkRunStatus, reception, "查询堆垛机运行状态");
            StkRunStatusReception reception = new StkRunStatusReception { data = new List<StkRunStatusData> { new StkRunStatusData { stackerName = "ALL" } } };
            StkRunStatusReturns LJReturns = HttpHelper.Post<StkRunStatusReturns>(urlLanJianWCSAPI + LanJianStkRunStatus, reception, "查询堆垛机运行状态");
            if (LJReturns.code == 0)
            {
                if (LJReturns.data[0].runStatus == 0)   //全部堆垛机不在运行状态
@@ -1000,33 +1334,11 @@
        /// <summary>
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定入库接口)
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定入库接口)可进行测试   1.当执行该任务的时候,上报兰剑任务执行中
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
        public WebResponseContent TaskResultIn(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 } } };
            StkRunStatusReturns LJReturns = HttpHelper.Post<StkRunStatusReturns>(urlLanJianWCSAPI + LanJiantaskResult, reception, "任务反馈接口");
            if (LJReturns.code == 0)
            {
                responseContent.OK("上传成功");
            }
            else
            {
                responseContent.OK("上传失败,原因:"+LJReturns.msg);
            }
            // åˆ›å»ºå¹¶èµ‹å€¼
            return responseContent;
        }
        /// <summary>
        /// ä»»åŠ¡ä¿¡æ¯çŠ¶æ€ä¸Šä¼ (固定出库接口)
        /// </summary>
        /// <param name="sCErrorStatus"></param>
        /// <returns></returns>
        public WebResponseContent TaskResultOut(string taskNo, string finalAddress, int status, string remark)
        public WebResponseContent TaskResultIn(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 } } };
@@ -1042,5 +1354,261 @@
            // åˆ›å»ºå¹¶èµ‹å€¼
            return responseContent;
        }
        /// <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 = 2, finalAddress = finalAddress, status = status, remark = remark } } };
            StkRunStatusReturns LJReturns = HttpHelper.Post<StkRunStatusReturns>(urlLanJianWCSAPI + LanJiantaskResult, reception, "任务反馈接口");
            if (LJReturns.code == 0)
            {
                responseContent.OK("上传成功");
            }
            else
            {
                responseContent.OK("上传失败,原因:" + LJReturns.msg);
            }
            // åˆ›å»ºå¹¶èµ‹å€¼
            return responseContent;
        }
        /// <summary>
        /// è‡ªåŠ¨å®Œæˆä»»åŠ¡
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent AutomaticTaskCompleted(Dt_Task dt_task)
        {
            try
            {
                var res = _task_HtyService.AddData(new Dt_Task_hty
                {
                    TaskNum = dt_task.TaskNum,
                    PalletCode = dt_task.PalletCode,
                    Roadway = dt_task.Roadway,
                    TaskType = dt_task.TaskType,
                    TaskState = dt_task.TaskState,
                    SourceAddress = dt_task.SourceAddress,
                    TargetAddress = dt_task.TargetAddress,
                    CurrentAddress = dt_task.CurrentAddress,
                    NextAddress = dt_task.NextAddress,
                    WMSId = dt_task.WMSId,
                    Dispatchertime = dt_task.Dispatchertime,
                    Remark = "自动完成",
                    Creater = App.User.UserName,
                    CreateDate = DateTime.Now,
                    RGVTaskType = dt_task.RGVTaskType,
                    RGVCurrentexecution = dt_task.RGVCurrentexecution
                });
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("任务完成失败!");
            }
        }
        /// <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
                });
                if (res.Status == false)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error($"{Remark}失败!");
                }
                var deletetask = BaseDal.DeleteData(dt_task);
                if (deletetask == false)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!");
                }
                db.Ado.CommitTran();
                return WebResponseContent.Instance.OK($"{Remark}成功!");
            }
            catch (Exception ex)
            {
                db.Ado.RollbackTran();
                return WebResponseContent.Instance.Error("任务完成失败!");
            }
        }
        /// <summary>
        /// äººå·¥æ‰‹åŠ¨å–æ¶ˆä»»åŠ¡
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public WebResponseContent MHWCSTaskCancel(int id)
        {
            var db = BaseDal.Db as SqlSugarClient;
            try
            {
                db.Ado.BeginTran();
                Dt_Task dt_task = BaseDal.QueryData().Where(x => x.TaskId == id).FirstOrDefault();
                if (dt_task == null) return WebResponseContent.Instance.Error($"未查询到任务");
                //if (dt_task.TaskState > (int)TaskInStatusEnum.RGV_InNew || dt_task.TaskState > (int)TaskOutStatusEnum.OutNew) return WebResponseContent.Instance.Error($"任务状态不允许取消");
                /*if (dt_task.TaskType >= 200 && dt_task.TaskType <= 203)
                {
                    if (dt_task.TaskState > (int)TaskInStatusEnum.RGV_InNew) return WebResponseContent.Instance.Error($"任务状态不允许取消");
                }
                else
                {
                    if (dt_task.TaskState > (int)TaskOutStatusEnum.OutNew) return WebResponseContent.Instance.Error($"任务状态不允许取消");
                }*/
                Dt_Task_hty dt_Task_Hty = new Dt_Task_hty
                {
                    TaskNum = dt_task.TaskNum,
                    PalletCode = dt_task.PalletCode,
                    Roadway = dt_task.Roadway,
                    TaskType = dt_task.TaskType,
                    TaskState = dt_task.TaskType >= (int)TaskInboundTypeEnum.Inbound ? (int)TaskInStatusEnum.InCancel : (int)TaskOutStatusEnum.OutCancel,
                    SourceAddress = dt_task.SourceAddress,
                    TargetAddress = dt_task.TargetAddress,
                    CurrentAddress = dt_task.CurrentAddress,
                    NextAddress = dt_task.NextAddress,
                    WMSId = dt_task.WMSId,
                    Dispatchertime = dt_task.Dispatchertime,
                    Remark = "人工手动取消任务",
                    Creater = App.User.UserName,
                    CreateDate = DateTime.Now,
                    RGVTaskType = dt_task.RGVTaskType,
                    RGVCurrentexecution = dt_task.RGVCurrentexecution
                };
                var res = _task_HtyService.AddData(dt_Task_Hty);
                if (res.Status == false)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("取消任务失败!");
                }
                /*int oldState = dt_task.TaskState;
                _taskExecuteDetailService.AddTaskExecuteDetail(
    dt_task.TaskId,
    $"自动任务状态从【{oldState}】进入到【{dt_Task_Hty.TaskState}】"
);*/
                bool deletetask = BaseDal.DeleteData(dt_task);
                if (!deletetask)
                {
                    db.Ado.RollbackTran();
                    return WebResponseContent.Instance.Error("删除任务失败所有操作回滚!");
                }
                db.Ado.CommitTran();
                return WebResponseContent.Instance.OK("取消任务成功!");
            }
            catch (Exception ex)
            {
                db.Ado.RollbackTran();
                return WebResponseContent.Instance.Error("取消任务失败!");
            }
        }
        /// <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;
        }
    }
}