duyongjia
2024-11-29 c362218b8ef0af6402d3715fbed040ac1cbe0433
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -16,10 +16,12 @@
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using SqlSugar;
using SqlSugar.Extensions;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
@@ -53,6 +55,7 @@
        private readonly ILocationInfoRepository _locationInfoRepository;
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly ITaskRepository _taskRepository;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
            {
@@ -70,7 +73,7 @@
        public List<int> TaskOtherboundTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ILocationInfoRepository locationInfoRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ILocationInfoRepository locationInfoRepository, IUnitOfWorkManage unitOfWorkManage, ITaskRepository taskRepository) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -78,6 +81,7 @@
            _mapper = mapper;
            _locationInfoRepository = locationInfoRepository;
            _unitOfWorkManage = unitOfWorkManage;
            _taskRepository = taskRepository;
        }
        /// <summary>
@@ -147,7 +151,9 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
               // ServiceLogger.WriteLogToFile("");
                string inparam = JsonConvert.SerializeObject(taskDTO);
                ServiceLogger.WriteDebug("ReceiveTask", $"ReceiveMESTask方法入参{inparam}");
                Dt_Task task = new Dt_Task();
                Dt_Task taskinfo = BaseDal.QueryFirst(x => x.TaskNum == taskDTO.task_id);
                if(taskDTO.cmd==101)//如果是101按旧的任务号去查
@@ -157,6 +163,7 @@
                if (taskDTO.cmd!=3001&& taskDTO.cmd != 101 && taskinfo != null)
                {
                    ServiceLogger.WriteDebug("ReceiveTask", $"任务号重复,任务号:{taskDTO.task_id}");
                    return content = WebResponseContent.Instance.Error($"任务号重复,任务号:{taskDTO.task_id}");
                }
                Dt_LocationInfo locationsrc = _locationInfoRepository.QueryFirst(x => x.Remark == taskDTO.src_station.ToString());
@@ -175,10 +182,11 @@
                        }
                        else
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"WCS未查询到源站点对应的库位,源站点:{taskDTO.dest_station.ToString()}");
                            return content = WebResponseContent.Instance.Error($"WCS未查询到源站点对应的库位,源站点:{taskDTO.dest_station.ToString()}");
                        }
                        break;
                    case 3001://AGV放货完成 WMS发3001的同时会写提升信号
                    case 3001://AGV放货完成 WMS发3001的同时WCS需在job中写提升信号
                        if (BaseDal.QueryFirst(x => x.TaskNum == taskDTO.task_id) == null)//手动入库直接发3001,需要生成任务,因为没有1001环节
                        {
@@ -193,6 +201,7 @@
                            }
                            else
                            {
                                ServiceLogger.WriteDebug("ReceiveTask", $"WCS未查询到源站点对应的库位,源站点:{taskDTO.dest_station.ToString()}");
                                return content = WebResponseContent.Instance.Error($"WCS未查询到源站点对应的库位,源站点:{taskDTO.dest_station.ToString()}");
                            }
                        }
@@ -202,6 +211,7 @@
                            {
                                UpdateTaskStatus(taskinfo.TaskId, (int)TaskInStatusEnum.AGV_InExecuting);
                                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"AGV入库执行中");
                                ServiceLogger.WriteDebug("ReceiveTask", $"AGV入库执行中(自动3001)更新状态成功,任务号:{taskinfo.TaskId}");
                                return content = WebResponseContent.Instance.OK($"AGV入库执行中(自动3001)更新状态成功,任务号:{taskinfo.TaskId}");
                            }
                            else
@@ -217,10 +227,12 @@
                            //更新任务表中NextAddress字段为新的任务号   taskDTO.weight-旧的任务号   taskDTO.task_id-新的任务号
                            UpdateTaskStatus(taskinfo.TaskId, taskDTO.task_id, (int)TaskInStatusEnum.AGV_InFinish);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"AGV搬运完成");
                            ServiceLogger.WriteDebug("ReceiveTask", $"AGV搬运完成(101)更新状态成功,任务号:{taskinfo.TaskId}");
                            return content = WebResponseContent.Instance.OK($"AGV搬运完成(101)更新状态成功,任务号:{taskinfo.TaskId}");
                        }
                        else
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"AGV搬运完成(101)更新状态时,查询不到任务号");
                            return content = WebResponseContent.Instance.Error($"AGV搬运完成(101)更新状态时,查询不到任务号");
                        }
                        break;
@@ -252,7 +264,8 @@
                        }
                        else
                        {
                           return  content = WebResponseContent.Instance.Error($"WCS未查询到目标站点对应的库位,目标站点:{taskDTO.dest_station.ToString()}");
                            ServiceLogger.WriteDebug("ReceiveTask", $"WCS未查询到目标站点对应的库位,目标站点:{taskDTO.dest_station.ToString()}");
                            return  content = WebResponseContent.Instance.Error($"WCS未查询到目标站点对应的库位,目标站点:{taskDTO.dest_station.ToString()}");
                        }
                        break;
                    case 104://组立机上料  æš‚存位-->组立机
@@ -270,7 +283,8 @@
                            }
                            else
                            {
                              return  content = WebResponseContent.Instance.Error($"WCS未查询到目标站点对应的库位,目标站点:{task.TargetAddress.ToString()}");
                                ServiceLogger.WriteDebug("ReceiveTask", $"WCS未查询到目标站点对应的库位,目标站点:{task.TargetAddress.ToString()}");
                                return  content = WebResponseContent.Instance.Error($"WCS未查询到目标站点对应的库位,目标站点:{task.TargetAddress.ToString()}");
                            }
                            //根据目标地址(组立机)查询默认的执行任务的小堆垛机编号
                            Dt_LocationInfo locationtemp2 = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress.ToString());
@@ -280,6 +294,8 @@
                            }
                            else
                            {
                                ServiceLogger.WriteDebug("ReceiveTask", $"WCS未查询到组立机对应的默认小堆垛机配置");
                                return content = WebResponseContent.Instance.Error($"WCS未查询到组立机对应的默认小堆垛机配置");
                            }
                            
@@ -292,7 +308,7 @@
                task.TaskNum = taskDTO.task_id;
                task.PalletCode = taskDTO.CarId;
                task.Roadway = "SC01";
                if (string.IsNullOrEmpty(task.SourceAddress))//如果不是站点,直接取行列层
                {
                    task.SourceAddress = $"SC01-{taskDTO.src_rack.ToString().PadLeft(3, '0')}-{taskDTO.src_col.ToString().PadLeft(3, '0')}-{taskDTO.src_row.ToString().PadLeft(3, '0')}";
@@ -310,10 +326,12 @@
                {
                    if (srcLocation.EnableStatus == (int)EnableStatusEnum.Disable)
                    {
                        ServiceLogger.WriteDebug("ReceiveTask", $"源地址已禁用:{srcLocation.LocationCode}");
                        return content = WebResponseContent.Instance.Error($"源地址已禁用:{srcLocation.LocationCode}");
                    }
                    if (tarLocation.EnableStatus == (int)EnableStatusEnum.Disable)
                    {
                        ServiceLogger.WriteDebug("ReceiveTask", $"目标地址已禁用:{tarLocation.LocationCode}");
                        return content = WebResponseContent.Instance.Error($"目标地址已禁用:{tarLocation.LocationCode}");
                    }
                    if (taskDTO.cmd != 101)//入库时不需要判断是否锁定,锁定状态是在生成任务时锁定
@@ -323,10 +341,13 @@
                        {
                            if (srcLocation.LocationStatus == (int)LocationStatusEnum.Lock)
                            {
                                ServiceLogger.WriteDebug("ReceiveTask", $"源地址已锁定:{srcLocation.LocationCode}");
                                return content = WebResponseContent.Instance.Error($"源地址已锁定:{srcLocation.LocationCode}");
                            }
                            if (tarLocation.LocationStatus == (int)LocationStatusEnum.Lock)
                            {
                                ServiceLogger.WriteDebug("ReceiveTask", $"目标地址已锁定:{tarLocation.LocationCode}");
                                return content = WebResponseContent.Instance.Error($"目标地址已锁定:{tarLocation.LocationCode}");
                            }
                        }
@@ -336,6 +357,8 @@
                        //WCS查询库位状态是否为“空闲”并且未禁用,锁定库位修改库位状态为“锁定”,生成WCS产品入库任务,加入WCS任务队列中。          
                        if (tarLocation.LocationStatus != (int)LocationStatusEnum.Free)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"入库-目标地址不是空闲状态:{tarLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"入库-目标地址不是空闲状态:{tarLocation.LocationCode}");
                        }
                        //srcLocation.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -354,10 +377,14 @@
                        //WCS查询库位状态是否为“有货”,库位/暂存库位是否“空闲”
                        if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"移库-源地址不是有货状态:{srcLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"移库-源地址不是有货状态:{srcLocation.LocationCode}");
                        }
                        if(tarLocation.LocationStatus != (int)LocationStatusEnum.Free)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"移库-目标地址不是空闲状态:{srcLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"移库-目标地址不是空闲状态:{srcLocation.LocationCode}");
                        }
                        srcLocation.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -369,6 +396,8 @@
                        //WCS查询库位状态是否为“有货”
                        if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"异常出库-源地址不是有货状态:{srcLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"异常出库-源地址不是有货状态:{srcLocation.LocationCode}");
                        }
                        srcLocation.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -384,6 +413,8 @@
                        //WCS查询暂存库位是否“有货”
                        if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"空车出库-源地址不是有货状态:{srcLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"空车出库-源地址不是有货状态:{srcLocation.LocationCode}");
                        }
                        //srcLocation.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -398,6 +429,8 @@
                        //WCS查询暂存库位是否“有货”
                        if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock)
                        {
                            ServiceLogger.WriteDebug("ReceiveTask", $"上料任务-源地址不是有货状态:{srcLocation.LocationCode}");
                            return content = WebResponseContent.Instance.Error($"上料任务-源地址不是有货状态:{srcLocation.LocationCode}");
                        }
                        //srcLocation.LocationStatus = (int)LocationStatusEnum.Lock;
@@ -408,6 +441,7 @@
                }
                else
                {
                    ServiceLogger.WriteDebug("ReceiveTask", $"库位地址不存在,任务号:{task.TaskNum}");
                    return content = WebResponseContent.Instance.Error($"库位地址不存在,任务号:{task.TaskNum}");
                }
@@ -431,12 +465,13 @@
                    _unitOfWorkManage.RollbackTran();
                    throw;
                }
                content = WebResponseContent.Instance.OK("成功",task);
                ServiceLogger.WriteDebug("ReceiveTask", $"接收任务成功,任务号:{task.TaskNum}");
                content = WebResponseContent.Instance.OK($"接收任务成功,任务号:{task.TaskNum}", task);
                
            }
            catch (Exception ex)
            {
                ServiceLogger.WriteDebug("ReceiveTask", $"任务接收错误,错误信息:{ex.StackTrace}");
                content = WebResponseContent.Instance.Error($"任务接收错误,错误信息:{ex.Message}");
            }
            return content;
@@ -646,7 +681,7 @@
                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage);
                content = WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
@@ -668,6 +703,245 @@
            task.Modifier = "System";
            task.ModifyDate = DateTime.Now;
            BaseDal.UpdateData(task);
        }
        /// <summary>
        /// ä»»åŠ¡å¼ºåˆ¶å®Œæˆ å †åž›æœºå®žé™…已完成任务,WCS未收到完成信号或其他未知原因导致WCS任务未完成,可以执行该方法强制完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent ForceCompleteTask(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                bool isBack = false;
                //1,先查询任务,根据不同的任务类型做任务强制完成操作
                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                Dt_LocationInfo locationsrc = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress.ToString());
                Dt_LocationInfo locationdsc = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress.ToString());
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
                {
                    if (task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
                    {
                        task.TaskState = (int)TaskInStatusEnum.SC_InFinish;
                        //需要将目标地址改为有货状态
                        locationdsc.LocationStatus = (int)LocationStatusEnum.InStock;
                        //更新状态为任务完成
                        UpdateTaskStatus(task.TaskId, task.TaskState);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库完成");
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"入库任务完成");
                        //更新货位
                        _locationInfoRepository.UpdateData(locationdsc);
                        isBack = true;
                    }
                    else
                    {
                        return content = WebResponseContent.Instance.Error("该任务目前状态,不允计强制完成!");
                    }
                }
                else
                {
                    if (task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
                    {
                        if (task.TaskType == (int)TaskOutboundTypeEnum.OutInventory || task.TaskType == (int)TaskOutboundTypeEnum.OutPick)//异常出库 ç©ºè½¦å‡ºåº“
                        {
                            task.TaskState = (int)TaskOutStatusEnum.OutFinish;
                            //源地址更新为空闲
                            locationsrc.LocationStatus = (int)LocationStatusEnum.Free;
                            //更新状态为任务完成
                            UpdateTaskStatus(task.TaskId, task.TaskState);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成");
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"出库任务完成");
                            //更新货位
                            _locationInfoRepository.UpdateData(locationsrc);
                            isBack = true;
                        }
                        else if (task.TaskType == (int)TaskRelocationTypeEnum.Relocation)//移库
                        {
                            task.TaskState = (int)TaskOutStatusEnum.OutFinish;
                            //源地址更新为空闲
                            locationsrc.LocationStatus = (int)LocationStatusEnum.Free;
                            //目标地址更新为有货
                            locationdsc.LocationStatus = (int)LocationStatusEnum.InStock;
                            //更新状态为任务完成
                            UpdateTaskStatus(task.TaskId, task.TaskState);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成");
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"出库任务完成");
                            //更新货位
                            _locationInfoRepository.UpdateData(locationsrc);
                            _locationInfoRepository.UpdateData(locationdsc);
                            isBack = true;
                        }
                        else
                        {
                            return WebResponseContent.Instance.Error($"上料任务不允计强制完成!");
                        }
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"该任务状态不允计强制完成!");
                    }
                }
                //任务强制完成回调MES
                if (isBack)
                {
                    if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)//入库时回传需传新任务号
                    {
                        task.TaskNum =int.Parse(task.NextAddress);
                    }
                    MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                    MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                    if (res != null && res.code != 0)
                    {
                        ServiceLogger.WriteDebug("ForceCompleteTask", $"任务强制完成后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        content = WebResponseContent.Instance.Error($"任务强制完成后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                    }
                    else
                    {
                        ServiceLogger.WriteDebug("ForceCompleteTask", $"任务强制完成后回传MES成功!,任务号:【{taskNum}】");
                        content = WebResponseContent.Instance.Error($"大堆垛机完成后回传MES成功!,任务号:【{taskNum}】");
                    }
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆ
        /// </summary>
        /// <param name="taskid"></param>
        /// <returns></returns>
        public WebResponseContent CancelTask(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //1,先查询任务,根据不同的任务类型做任务取消操作
                Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                Dt_LocationInfo locationsrc = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress.ToString());
                Dt_LocationInfo locationdsc = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress.ToString());
                bool isBack = false;
                //如果是入库分自动和手动两种情况处理
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
                {
                    if (task.WMSId == 0 && task.TaskState == (int)TaskInStatusEnum.InNew)//自动入库,1001-AGV请求是否允计进入,任务状态为“新建入库任务200”之前可以取消
                    {
                        task.TaskState = (int)TaskInStatusEnum.InCancel;
                        //需要将目标地址恢复为空闲状态
                        locationdsc.LocationStatus = (int)LocationStatusEnum.Free;
                        //更新状态为任务取消
                        UpdateTaskStatus(task.TaskId, task.TaskState);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"入库任务取消");
                        _locationInfoRepository.UpdateData(locationdsc);
                        isBack = true;
                    }
                    else if (task.WMSId == 1 && task.TaskState == (int)TaskInStatusEnum.AGV_InExecuting)//手动入库,3001-AGV放货完成,任务状态为“AGV入库执行中210”之前可以取消
                    {
                        task.TaskState = (int)TaskInStatusEnum.InCancel;
                        //需要将目标地址恢复空闲状态
                        locationdsc.LocationStatus = (int)LocationStatusEnum.Free;
                        //更新状态为任务取消
                        UpdateTaskStatus(task.TaskId, task.TaskState);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"入库任务取消");
                        _locationInfoRepository.UpdateData(locationdsc);
                        isBack = true;
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"该任务状态不允计取消!");
                    }
                }
                else//其他任务,任务状态“新建出库任务”之前,才可以取消
                {
                    if (task.TaskState == (int)TaskOutStatusEnum.OutNew)
                    {
                        if(task.TaskType == (int)TaskOutboundTypeEnum.OutInventory|| task.TaskType == (int)TaskOutboundTypeEnum.OutPick)//异常出库 ç©ºè½¦å‡ºåº“
                        {
                            task.TaskState = (int)TaskOutStatusEnum.OutCancel;
                            //源地址恢复到有货
                            locationsrc.LocationStatus = (int)LocationStatusEnum.InStock;
                            //更新状态为任务取消
                            UpdateTaskStatus(task.TaskId, task.TaskState);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"出库任务取消");
                            _locationInfoRepository.UpdateData(locationsrc);
                            isBack = true;
                        }
                        else if(task.TaskType == (int)TaskRelocationTypeEnum.Relocation)//移库
                        {
                            task.TaskState = (int)TaskOutStatusEnum.OutCancel;
                            //源地址恢复到有货
                            locationsrc.LocationStatus = (int)LocationStatusEnum.InStock;
                            //需要将目标地址恢复空闲状态
                            locationdsc.LocationStatus = (int)LocationStatusEnum.Free;
                            //更新状态为任务取消
                            UpdateTaskStatus(task.TaskId, task.TaskState);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"出库任务取消");
                            _locationInfoRepository.UpdateData(locationsrc);
                            _locationInfoRepository.UpdateData(locationdsc);
                            isBack = true;
                        }
                        else
                        {
                            return WebResponseContent.Instance.Error($"上料任务不允计取消!");
                        }
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error($"该任务状态不允计取消!");
                    }
                }
                //任务取消回调MES
                if (isBack)
                {
                    MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 3 };
                    MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                    if (res != null && res.code != 0)
                    {
                        ServiceLogger.WriteDebug("ForceCompleteTask", $"任务取消回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        content = WebResponseContent.Instance.Error($"任务取消回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                    }
                    else
                    {
                        ServiceLogger.WriteDebug("ForceCompleteTask", $"任务取消回传MES成功!,任务号:【{taskNum}】");
                        content = WebResponseContent.Instance.Error($"任务取消回传MES成功!,任务号:【{taskNum}】");
                    }
                }
                else
                {
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
@@ -840,17 +1114,34 @@
                        _unitOfWorkManage.CommitTran();
                        //出库完成,回传WMS
                        //回传到WMS
                        MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                        MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                        if (res != null && res.code != 0)
                        if (task.TaskType == (int)TaskOutboundTypeEnum.OutPick)
                        {
                            content = WebResponseContent.Instance.Error($"大堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                            MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                            if (res != null && res.code != 0)
                            {
                                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成空车出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                                content = WebResponseContent.Instance.Error($"大堆垛机完成空车出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            }
                        }
                        else
                        {
                            MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                            MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                            if (res != null && res.code != 0)
                            {
                                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成异常出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                                content = WebResponseContent.Instance.Error($"大堆垛机完成异常出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        //任务执行失败,货位状态还原
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                        content = WebResponseContent.Instance.Error($"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
@@ -880,16 +1171,25 @@
                        //入库完成,回传MES  å…¥åº“完成回传task.NextAddress ä¹‹å‰101请求时存的新任务号
                        MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = int.Parse(task.NextAddress), status = 6 };
                        string inparam = JsonConvert.SerializeObject(sendcmd);
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成入库任务后回传MES入参:{inparam}");
                        MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                        if (res != null && res.code != 0)
                        {
                            ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成入库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            content = WebResponseContent.Instance.Error($"大堆垛机完成入库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        }
                        else
                        {
                            ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成入库任务后回传MES成功!,任务号:【{taskNum}】");
                        }
                    }
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机执行入库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                        content = WebResponseContent.Instance.Error($"大堆垛机执行入库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
                }
@@ -902,7 +1202,7 @@
                        srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                        Dt_LocationInfo tarLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                        srcLocation.LocationStatus = (int)LocationStatusEnum.InStock;
                        tarLocation.LocationStatus = (int)LocationStatusEnum.InStock;
                        UpdateTaskStatus(task.TaskId, (int)TaskOutStatusEnum.SC_OutFinish);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成");
@@ -917,9 +1217,12 @@
                        //移库完成,回传MES
                        //回传到WMS
                        MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                        string inparam = JsonConvert.SerializeObject(sendcmd);
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成出库任务后回传MES入参:{inparam}");
                        MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                        if (res != null && res.code != 0)
                        {
                            ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            content = WebResponseContent.Instance.Error($"大堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        }
@@ -927,6 +1230,7 @@
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                        content = WebResponseContent.Instance.Error($"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
                }
@@ -935,7 +1239,7 @@
                {
                    try
                    {
                        Dt_LocationInfo srcLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        //Dt_LocationInfo srcLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        //srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                        
@@ -950,59 +1254,72 @@
                        _unitOfWorkManage.CommitTran();
                        //上料完成,回传WMS
                        MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 };
                        string inparam = JsonConvert.SerializeObject(sendcmd);
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务回传MES入参{inparam}");
                        MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                        if (res != null && res.code != 0)
                        {
                            ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            content = WebResponseContent.Instance.Error($"小堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        }
                        else
                        {
                            //判断是否完成的最后一层,自动生成空车出库任务
                            string[] Levels = task.Remark.Split("-");
                            if (Levels.Length == 2)
                            {
                                if (!string.IsNullOrEmpty(Levels[0])&& !string.IsNullOrEmpty(Levels[1]))
                                {
                                    //如果当前提取层数等于总层料,则表示料车所有的层数取完
                                    if(Convert.ToInt16(Levels[0])== Convert.ToInt16(Levels[1]))
                                    {
                                        string[] SourceCodes = task.SourceAddress.Split("-");
                                        string startPlan = "";
                                        if (SourceCodes.Length == 4)
                                        {
                                            startPlan= "101"+ SourceCodes[2].Substring(1,2);
                                        }
                                        DeliveryPlan send = new DeliveryPlan { startPlan = startPlan, isQuit = false, CarId = task.PalletCode };
                                        ApiInvoke.DeliveryPlanCMD(send);//回调MES接口生成空车出库任务
                                    }
                                }
                        //else
                        //{
                        //    //判断是否完成的最后一层,自动生成空车出库任务
                        //    string[] Levels = task.Remark.Split("-");
                        //    if (Levels.Length == 2)
                        //    {
                        //        if (!string.IsNullOrEmpty(Levels[0])&& !string.IsNullOrEmpty(Levels[1]))
                        //        {
                        //            //如果当前提取层数等于总层料,则表示料车所有的层数取完
                        //            if(Convert.ToInt16(Levels[0])== Convert.ToInt16(Levels[1]))
                        //            {
                        //                string[] SourceCodes = task.SourceAddress.Split("-");
                        //                string startPlan = "";
                        //                if (SourceCodes.Length == 4)
                        //                {
                        //                    startPlan = "101" + SourceCodes[2].Substring(1, 2);
                        //                }
                        //                DeliveryPlan send = new DeliveryPlan { startPlan = startPlan, isQuit = false, CarId = task.PalletCode };
                        //                string inparam2 = JsonConvert.SerializeObject(send);
                        //                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务回传MES入参{inparam2}");
                        //                ApiInvoke.DeliveryPlanCMD(send);//回调MES接口生成空车出库任务
                        //                æ‰€æœ‰çš„层数都取完,需要把暂存位状态改为空闲状态
                        //                srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                        //                _locationInfoRepository.UpdateData(srcLocation);
                        //            }
                        //        }
                              
                            }
                        }
                        //    }
                        //}
                    }
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.StackTrace}】");
                        content = WebResponseContent.Instance.Error($"小堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
                }
                else
                {
                    ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】");
                    throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】");
                }
                content = WebResponseContent.Instance.OK();
                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"任务完成成功,任务号:【{taskNum}】");
                content = WebResponseContent.Instance.OK($"任务完成成功,任务号:【{taskNum}】");
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error($"任务完成异常,任务号:【{taskNum}】");
                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"任务完成异常,任务号:【{taskNum}】{ex.Message}");
                content = WebResponseContent.Instance.Error($"任务完成异常,任务号:【{taskNum}】{ex.Message}");
            }
            return content;
        }
        /// <summary>
        /// æ¢å¤æŒ‚起任务
        /// </summary>