wangxinhui
2026-01-12 541572199581a80979ec3b62245eb522542a7b15
更新AGV任务取消
已修改8个文件
193 ■■■■■ 文件已修改
项目代码/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -70,5 +70,10 @@
        /// </summary>
        [Description("一期播种墙下发")]
        Phase1PickOrderInfoRequest,
        /// <summary>
        /// AGV任务取消
        /// </summary>
        [Description("AGV任务取消")]
        AgvTaskCancel
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs
@@ -123,4 +123,32 @@
        /// </summary>
        public List<MissionDataItem> MissionData { get; set; }
    }
    public class AgvTaskCancelDTO
    {
        /// <summary>
        /// è¯·æ±‚id
        /// </summary>
        public string RequestId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç¼–å·
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// èŠ‚ç‚¹ç¼–å·
        /// </summary>
        public string Position { get; set; }
        /// <summary>
        /// å–消模式
        /// </summary>
        public string CancelMode { get; set; }
        /// <summary>
        /// å–消原因
        /// </summary>
        public string Reason { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -171,9 +171,12 @@
        /// AGV状态查询调用及WMS故障上报
        /// </summary>
        void AgvSearchStatus();
        WebResponseContent AgvCancelTask(AgvTaskCancelDTO taskModel, APIEnum SendTask = APIEnum.AgvTaskCancel);
        /// <summary>
        /// é‡ç½®æ‰€æœ‰å¼‚常任务
        /// </summary>
        WebResponseContent ResetAllExceptionTask(int taskNum);
        WebResponseContent TaskCancel(List<TaskCancel> taskCancels);
        WebResponseContent TaskCancelCompleted(int taskNum);
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -144,6 +144,14 @@
        public int Grade { get; set; }
        /// <summary>
        /// æ˜¯å¦å–消
        /// </summary>
        [ImporterHeader(Name = "是否取消")]
        [ExporterHeader(DisplayName = "是否取消")]
        [SugarColumn(IsNullable = false, ColumnDescription = "是否取消")]
        public int IsCancel { get; set; }
        /// <summary>
        /// WMS任务
        /// </summary>
        [ImporterHeader(Name = "WMS任务号")]
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -65,7 +65,15 @@
                        break;
                    case nameof(AGVStatusEnum.PICKER_SEND):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.TaskCompleted(task.TaskNum);
                        Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x=>x.PickStationCode==task.NextAddress);
                        if (task.IsCancel>0 && stationManger!=null && stationManger.StationCode!= agvUpdateDTO.CurrentPosition)
                        {
                            _taskService.TaskCancelCompleted(task.TaskNum);
                        }
                        else
                        {
                            _taskService.TaskCompleted(task.TaskNum);
                        }
                        break;
                    case nameof(AGVStatusEnum.WAITFEEDBACK):
                        //AGV放行
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -170,7 +170,7 @@
        [HttpPost, HttpGet, Route("CancelTask"), AllowAnonymous]
        public WebResponseContent CancelTask([FromBody] List<TaskCancel> taskCancels)
        {
            return WebResponseContent.Instance.Error();
            return Service.TaskCancel(taskCancels); ;
        }
        /// <summary>
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -149,5 +149,30 @@
            }
            
        }
        public WebResponseContent AgvCancelTask(AgvTaskCancelDTO taskModel, APIEnum SendTask = APIEnum.AgvTaskCancel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到发送AGV任务接口,请检查接口配置");
                string request = JsonConvert.SerializeObject(taskModel, settings);
                string response = HttpHelper.Post(apiAddress, request);
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>() ?? throw new Exception("AGV任务发送未返回结果");
                if (agvContent.Success)
                {
                    content.OK();
                }
                else
                {
                    content.Error(agvContent.Message);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -22,6 +22,7 @@
using NPOI.XSSF.UserModel;
using RYB_PTL_API;
using SqlSugar;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices.Protocols;
using System.Linq;
@@ -808,6 +809,117 @@
            return content;
        }
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆ
        /// </summary>
        /// <returns></returns>
        public WebResponseContent TaskCancelCompleted(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//出库任务完成逻辑
                {
                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
                    {
                        return content.Error($"{locationInfo.LocationCode}货位状态不正确");
                    }
                    task.TaskState = TaskStatusEnum.Cancel.ObjToInt();
                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    _locationInfoRepository.UpdateData(locationInfo);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                    _unitOfWorkManage.CommitTran();
                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.InStock, LocationChangeType.InboundCompleted, task.TaskNum);
                    content.OK();
                }
                else
                {
                    content.Error($"未找到出库任务{taskNum}");
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆ
        /// </summary>
        /// <returns></returns>
        public WebResponseContent TaskCancel(List<TaskCancel> taskCancels)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (taskCancels==null || taskCancels.Count<=0)
                {
                    return content.Error("传入不能为空");
                }
                //获取所有料箱
                List<Dt_Task> outTasks = BaseDal.QueryData(x=>x.TaskType==TaskTypeEnum.Outbound.ObjToInt());
                List<Dt_Task> cancelTasks = new List<Dt_Task>();
                List<Dt_Task> cancelTasksCompleted = new List<Dt_Task>();
                //判断是否有任务存在
                foreach (var item in taskCancels)
                {
                    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode== item.ContainerCode);
                    if (taskExist==null)
                    {
                        content.Message += $"{item.ContainerCode}任务不存在";
                        continue;
                    }
                    if (taskExist.TaskState==TaskStatusEnum.AGV_TakeFinish.ObjToInt())
                    {
                        taskExist.IsCancel = 1;
                        cancelTasks.Add(taskExist);
                    }
                    else if(taskExist.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
                    {
                        cancelTasksCompleted.Add(taskExist);
                    }
                    else
                    {
                        return content.Error($"任务取消失败{item.TaskCode}任务状态不可取消!");
                    }
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(cancelTasks);
                foreach (var item in cancelTasksCompleted)
                {
                    WebResponseContent responseContent = TaskCancelCompleted(item.TaskNum);
                    if (!responseContent.Status)
                    {
                        throw new Exception(responseContent.Message);
                    }
                }
                _unitOfWorkManage.CommitTran();
                cancelTasks.AddRange(cancelTasksCompleted);
                foreach (var item in cancelTasks)
                {
                    AgvTaskCancelDTO agvTaskCancel = new AgvTaskCancelDTO()
                    {
                        RequestId= DateTime.Now.ToString("yyMMddHHmmssfff"),
                        MissionCode=item.GroupId,
                        ContainerCode=item.PalletCode,
                        Position="",
                        CancelMode= "CTU_REDIRECT_START",
                        Reason=""
                    };
                    AgvCancelTask(agvTaskCancel);
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// äºŒæœŸæ’­ç§å¢™å›žä¼ 
        /// </summary>
        /// <returns></returns>