From 541572199581a80979ec3b62245eb522542a7b15 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 12 一月 2026 10:34:17 +0800
Subject: [PATCH] 更新AGV任务取消

---
 项目代码/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs          |    8 ++
 项目代码/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs       |   25 ++++++
 项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs            |  112 ++++++++++++++++++++++++++++
 项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs                 |   28 +++++++
 项目代码/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs          |    3 
 项目代码/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs |    2 
 项目代码/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs   |   10 ++
 项目代码/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs                 |    5 +
 8 files changed, 191 insertions(+), 2 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs"
index cb9060a..8cc86f6 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs"
@@ -70,5 +70,10 @@
         /// </summary>
         [Description("涓�鏈熸挱绉嶅涓嬪彂")]
         Phase1PickOrderInfoRequest,
+        /// <summary>
+        /// AGV浠诲姟鍙栨秷
+        /// </summary>
+        [Description("AGV浠诲姟鍙栨秷")]
+        AgvTaskCancel
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs"
index 47f085d..a3c444b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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; }
+    }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs"
index 4b6b360..5339170 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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);
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs"
index 8aad03a..a29cf1d 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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浠诲姟鍙�")]
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs"
index ae54415..8207280 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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鏀捐
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs"
index 6f16b36..59c1943 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs"
index 47c5b5f..1493897 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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($"鏈壘鍒板彂閫丄GV浠诲姟鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                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;
+        }
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
index fe591f7..c94b3ea 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/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}璐т綅鐘舵�佷笉姝g‘");
+                    }
+                    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>

--
Gitblit v1.9.3