From 5d55a31d8ce95e511ffb408f38ed06e81742b67e Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期五, 27 三月 2026 16:17:30 +0800
Subject: [PATCH] 1

---
 项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs |  561 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 416 insertions(+), 145 deletions(-)

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 062769d..6c99934 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"
@@ -23,6 +23,7 @@
 using RYB_PTL_API;
 using SqlSugar;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Diagnostics.CodeAnalysis;
 using System.DirectoryServices.Protocols;
 using System.Linq;
@@ -90,7 +91,7 @@
 
         public List<int> TaskRelocationTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 900 && x < 1000).ToList();
 
-        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository,ILocationInfoRepository locationInfoRepository,IUnitOfWorkManage unitOfWorkManage, ILocationInfoService locationInfoService,ILocationStatusChangeRecordService locationStatusChangeRecordService,IErrorInfoRepository errorInfoRepository) : base(BaseDal)
+        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository, ILocationInfoRepository locationInfoRepository, IUnitOfWorkManage unitOfWorkManage, ILocationInfoService locationInfoService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IErrorInfoRepository errorInfoRepository) : base(BaseDal)
         {
             _mapper = mapper;
             _cacheService = cacheService;
@@ -103,7 +104,7 @@
             _locationInfoRepository = locationInfoRepository;
             _unitOfWorkManage = unitOfWorkManage;
             _locationInfoService = locationInfoService;
-            _locationStatusChangeRecordService=locationStatusChangeRecordService;
+            _locationStatusChangeRecordService = locationStatusChangeRecordService;
             _errorInfoRepository = errorInfoRepository;
         }
         static object lock_taskReceive = new object();
@@ -120,19 +121,20 @@
             {
                 lock (lock_taskReceive)
                 {
+                    WriteLog.Write_Log("鍏ュ簱浠诲姟涓嬪彂", "WMS鍏ュ簱浠诲姟鎺ユ敹鍙傛暟", "鎺ユ敹鍙傛暟", $"鍙傛暟锛歿taskDTO.ToJson()}");
                     List<Dt_Task> tasks = new List<Dt_Task>();
-                    List<Dt_Task> taskOlds = BaseDal.QueryData(x=> taskDTO.Tasks.Select(x => x.TaskDescribe.ContainerCode).Contains(x.PalletCode));
-                    List<Dt_LocationInfo> locationInfos = _locationInfoRepository.GetCanOut(taskDTO.Tasks.Select(x=>x.TaskDescribe.ContainerCode).ToList());
+                    List<Dt_Task> taskOlds = BaseDal.QueryData(x => taskDTO.Tasks.Select(x => x.TaskDescribe.ContainerCode).Contains(x.PalletCode));
+                    List<Dt_LocationInfo> locationInfos = _locationInfoRepository.GetCanOut(taskDTO.Tasks.Select(x => x.TaskDescribe.ContainerCode).ToList());
                     List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData();
                     ////涓嬪彂浠诲姟缁�
                     //string taskGroup= taskDTO.TaskGroupCode.IsNullOrEmpty() ? Guid.NewGuid().ToString().Replace("-","") : taskDTO.TaskGroupCode;
-                    foreach (var item in taskDTO.Tasks.OrderBy(x=>x.TaskDescribe.ToStationCode))
+                    foreach (var item in taskDTO.Tasks.OrderBy(x => x.TaskDescribe.ToStationCode))
                     {
                         if (item.TaskDescribe.ToStationCode.IsNullOrEmpty()) throw new Exception($"浠诲姟{item.TaskCode}鍑哄簱鐩爣鎿嶄綔鍙颁笉鑳戒负绌�");
                         //鑾峰彇鎿嶄綔鍙�
                         Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.PickStationCode == item.TaskDescribe.ToStationCode);
                         if (stationManger == null) throw new Exception($"浠诲姟{item.TaskCode}鍑哄簱鐩爣鎿嶄綔鍙皗item.TaskDescribe.ToStationCode}涓嶅瓨鍦�");
-                        Dt_Task? taskOld = taskOlds.FirstOrDefault(x=>x.PalletCode==item.TaskDescribe.ContainerCode);
+                        Dt_Task? taskOld = taskOlds.FirstOrDefault(x => x.PalletCode == item.TaskDescribe.ContainerCode);
                         if (taskOld != null)
                         {
                             errorMsg += $"鏂欑{taskOld.PalletCode}" + (taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() ? "鍏ュ簱浠诲姟宸插瓨鍦�;" : "鍑哄簱浠诲姟宸插瓨鍦�;");
@@ -145,7 +147,7 @@
                             errorMsg += $"鏂欑{item.TaskDescribe.ContainerCode}涓嶅瓨鍦�;";
                             content.FailData.Add(new BinCodeObj() { Bincode = item.TaskDescribe.ContainerCode });
                             continue;
-                        };
+                        }
                         Dt_LocationInfo? noOutLocation = locationInfos.FirstOrDefault(x => (x.LocationStatus != LocationStatusEnum.InStock.ObjToInt() || x.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) && x.PalletCode == item.TaskDescribe.ContainerCode);
                         if (noOutLocation != null)
                         {
@@ -169,7 +171,7 @@
 
                     locationInfos.ForEach(x =>
                     {
-                        x.LocationStatus=LocationStatusEnum.Lock.ObjToInt();
+                        x.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
                     });
                     //娣诲姞浠诲姟鏇存柊璐т綅鏁版嵁
                     _unitOfWorkManage.BeginTran();
@@ -177,11 +179,11 @@
                     _locationInfoRepository.UpdateData(locationInfos);
                     _unitOfWorkManage.CommitTran();
                     _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "鎺ユ敹WMS浠诲姟");
-                    if (tasks.Count>0)
+                    if (tasks.Count > 0)
                     {
                         _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.InStock, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, tasks);
                     }
-                    content.OK(errorMsg.IsNullOrEmpty()? "鎴愬姛": errorMsg);
+                    content.OK(errorMsg.IsNullOrEmpty() ? "鎴愬姛" : errorMsg);
                 }
             }
             catch (Exception ex)
@@ -190,7 +192,7 @@
             }
             return content;
         }
-        
+
         /// <summary>
         /// 瀹瑰櫒鍏ュ簱鍒涘缓浠诲姟
         /// </summary>
@@ -204,8 +206,9 @@
                 Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.PalletCode == containerFlowDTO.ContainerCode);
                 if (locationInfo != null) throw new Exception($"搴撲綅鏂欑鍙穥containerFlowDTO.ContainerCode}宸插瓨鍦�");
                 Dt_Task taskOld = BaseDal.QueryFirst(x => x.PalletCode == containerFlowDTO.ContainerCode);
-                if (taskOld !=null && taskOld.PalletCode == containerFlowDTO.ContainerCode && taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() && taskOld.TaskState == TaskStatusEnum.CL_Executing.ObjToInt() && taskOld.DeviceCode == deviceCode)
+                if (taskOld != null && taskOld.PalletCode == containerFlowDTO.ContainerCode && taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() && taskOld.TaskState == TaskStatusEnum.CL_Executing.ObjToInt() && taskOld.DeviceCode == deviceCode)
                 {
+                    //Thread.Sleep(500);
                     return content.OK();
                 }
                 if (taskOld != null && taskOld.PalletCode == containerFlowDTO.ContainerCode && taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() && taskOld.TaskState == TaskStatusEnum.CL_Executing.ObjToInt() && taskOld.DeviceCode != deviceCode)
@@ -221,9 +224,9 @@
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { taskOld.TaskNum }, $"{oldSlotCode}鎹㈣嚦{containerFlowDTO.SlotCode}鍏ュ簱");
                     return content.OK();
                 }
-                else if(taskOld != null)
+                else if (taskOld != null)
                 {
-                    throw new Exception($"鏂欑鍙穥containerFlowDTO.ContainerCode}" + (taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() ? "鍏ュ簱AGV鎵ц涓�": "鍑哄簱AGV鎵ц涓�"));
+                    throw new Exception($"鏂欑鍙穥containerFlowDTO.ContainerCode}" + (taskOld.TaskType == TaskTypeEnum.Inbound.ObjToInt() ? "鍏ュ簱AGV鎵ц涓�" : "鍑哄簱AGV鎵ц涓�"));
                 }
                 Dt_LocationInfo? noInLocation = locationInfos.FirstOrDefault(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt());
                 if (noInLocation == null) throw new Exception($"鍙敤璐т綅涓嶈冻!");
@@ -240,9 +243,9 @@
                 task.Roadway = noInLocation.RoadwayNo;
                 task.DeviceCode = stationManger.StationDeviceCode;
                 task.TaskState = TaskStatusEnum.CL_Executing.ObjToInt();
-                
+
                 //娣诲姞浠诲姟
-                BaseDal.AddData(task);
+                int taskId = BaseDal.AddData(task);
                 if (type > 0)
                 {
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, "鎵嬪姩鎸夐挳鍏ュ簱");
@@ -251,6 +254,7 @@
                 {
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, "鍒涘缓鍏ュ簱浠诲姟");
                 }
+                WriteLog.Write_Log("鍏ュ簱浠诲姟涓嬪彂", "瀹瑰櫒鍏ュ簱浠诲姟娣诲姞浠诲姟", "娣诲姞浠诲姟", $"浠诲姟锛歿task.ToJson()}");
                 content.OK("鎴愬姛");
             }
             catch (Exception ex)
@@ -462,14 +466,14 @@
         /// 鐢宠鍏ュ簱
         /// </summary>
         /// <returns></returns>
-        public WebResponseContent RequestInTask(string stationCode,string barCode)
+        public WebResponseContent RequestInTask(string stationCode, string barCode)
         {
             WebResponseContent content = new WebResponseContent();
             try
             {
                 lock (lock_requestInTask)
                 {
-                    Dt_Task task = BaseDal.QueryFirst(x => x.PalletCode == barCode && x.TaskType==TaskTypeEnum.Inbound.ObjToInt() && x.NextAddress == stationCode && x.TaskState == TaskStatusEnum.CL_Executing.ObjToInt());
+                    Dt_Task task = BaseDal.QueryFirst(x => x.PalletCode == barCode && x.TaskType == TaskTypeEnum.Inbound.ObjToInt() && x.NextAddress == stationCode && x.TaskState == TaskStatusEnum.CL_Executing.ObjToInt());
                     if (task == null) throw new Exception($"{barCode}鏂欑鏈壘鍒颁换鍔�!");
                     Dt_LocationInfo? locationInfo = _locationInfoService.AssignLocation();
                     if (locationInfo == null) throw new Exception($"鍙敤璐т綅涓嶈冻!");
@@ -486,6 +490,7 @@
                     _unitOfWorkManage.CommitTran();
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, $"鍒嗛厤璐т綅{locationInfo.LocationCode}");
                     _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Free, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation, task.TaskNum);
+                    WriteLog.Write_Log("鍏ュ簱浠诲姟涓嬪彂", "鐢宠鍏ュ簱鎺ュ彛", "鏇存柊浠诲姟", $"浠诲姟锛歿task.ToJson()}");
                     content.OK("鎴愬姛");
                 }
             }
@@ -541,7 +546,7 @@
                 BaseDal.UpdateData(task);
 
                 _taskExecuteDetailService.AddTaskExecuteDetail(task, task.ExceptionMessage);
-
+                WriteLog.Write_Log("鏇存柊浠诲姟寮傚父淇℃伅", "鏇存柊浠诲姟鎺ュ彛", "鏇存柊浠诲姟", $"浠诲姟锛歿task.ToJson()}");
                 content = WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
@@ -634,7 +639,7 @@
             return content;
         }
 
-        
+
         /// <summary>
         /// 鎺ュ彈WMS鎵嬪姩瀹屾垚浠诲姟
         /// </summary>
@@ -644,6 +649,7 @@
         {
             try
             {
+                WriteLog.Write_Log("鎺ュ彈WMS鎵嬪姩瀹屾垚浠诲姟", "鎺ュ彈WMS鎵嬪姩瀹屾垚浠诲姟鎺ュ彛", "浠诲姟鍙�", $"浠诲姟鍙凤細{taskNum}");
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                 if (task != null)
                 {
@@ -663,9 +669,10 @@
         /// <returns></returns>
         public WebResponseContent AgvTaskFlow(string code)
         {
-            WebResponseContent content=new WebResponseContent();
+            WebResponseContent content = new WebResponseContent();
             try
             {
+                WriteLog.Write_Log("AGV浠诲姟鏀捐", "AGV浠诲姟鏀捐鎺ュ彛", "鏂欑鍙�", $"鏂欑锛歿code}");
                 string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.AgvTaskFlow.ToString())?.ApiAddress;
                 if (string.IsNullOrEmpty(url)) throw new Exception($"{code},鏈壘鍒癆GV浠诲姟鏀捐鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
                 AgvTaskFlowDTO agvTaskFlowDTO = new AgvTaskFlowDTO()
@@ -675,6 +682,7 @@
                 };
                 string request = JsonConvert.SerializeObject(agvTaskFlowDTO, settings);
                 string response = HttpHelper.Post(url, request);
+                WriteLog.Write_Log("AGV浠诲姟鏀捐鎺ュ彛璇锋眰AGV", "AGV浠诲姟鏀捐鎺ュ彛", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
                 AgvResponseContent agvResponse = JsonConvert.DeserializeObject<AgvResponseContent>(response) ?? throw new Exception($"{code},鏈帴鏀跺埌AGV浠诲姟鏀捐杩斿洖鍊�");
                 if (!agvResponse.Success) throw new Exception($"鏂欑{code},AGV浠诲姟鏀捐閿欒,淇℃伅:{agvResponse.Message}");
                 content.OK();
@@ -689,11 +697,12 @@
         /// WMS鏂欑鍒拌揪鎷i�変綅涓婃姤
         /// </summary>
         /// <returns></returns>
-        public WebResponseContent WMSPickUp(string stationCode,string pickCode)
+        public WebResponseContent WMSPickUp(string stationCode, string pickCode)
         {
             WebResponseContent content = new WebResponseContent();
             try
             {
+                WriteLog.Write_Log("WMS鏂欑鍒拌揪鎷i�変綅涓婃姤", "WMS鏂欑鍒拌揪鎷i�変綅涓婃姤鎴愭帴鍙�", "淇℃伅", $"鎷i�変綅锛歿stationCode}锛屾枡绠憋細{pickCode}");
                 string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSPickArrivedUp.ToString())?.ApiAddress;
                 if (string.IsNullOrEmpty(url)) throw new Exception($"鏈壘鍒癢MS鏂欑鍒拌揪鎷i�変綅涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
                 ContainerArriveDTO containerArriveDTO = new ContainerArriveDTO()
@@ -703,6 +712,7 @@
                 };
                 string request = JsonConvert.SerializeObject(containerArriveDTO, settings);
                 string response = HttpHelper.Post(url, request);
+                WriteLog.Write_Log("涓婃姤WMS鏂欑鍒拌揪", "涓婃姤WMS鏂欑鍒拌揪", "淇℃伅", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
                 WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{pickCode},鏈帴鏀跺埌WMS鏂欑鍒拌揪鎷i�変綅涓婃姤杩斿洖鍊�");
                 if (wMSResponse.Code != "0") throw new Exception($"鏂欑{pickCode}WMS鏂欑鍒拌揪鎷i�変綅涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}");
                 content.OK();
@@ -713,6 +723,9 @@
             }
             return content;
         }
+        // 鍦ㄧ被涓坊鍔犻潤鎬侀攣瀵硅薄
+        private static readonly object _taskCompleteLock = new object();
+
         /// <summary>
         /// 浠诲姟瀹屾垚
         /// </summary>
@@ -721,93 +734,212 @@
         public WebResponseContent TaskCompleted(int taskNum)
         {
             WebResponseContent content = new WebResponseContent();
-            try
+
+            // 浣跨敤閿佺‘淇濆悓涓�浠诲姟涓嶄細骞跺彂澶勭悊
+            lock (_taskCompleteLock)
             {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//鍑哄簱浠诲姟瀹屾垚閫昏緫
+                try
                 {
-                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x=>x.PalletCode==task.PalletCode);
-                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+                    WriteLog.Write_Log("浠诲姟瀹屾垚", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟鍙�", $"浠诲姟锛歿taskNum}");
+
+                    // 鍐嶆鏌ヨ浠诲姟鐘舵�侊紝闃叉鍦ㄩ攣绛夊緟鏈熼棿浠诲姟鐘舵�佸凡鏀瑰彉
+                    Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+                    if (task == null)
                     {
-                        return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
+                        return content.Error($"浠诲姟{taskNum}涓嶅瓨鍦�");
                     }
-                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
-                    locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
-                    locationInfo.PalletCode = "";
-                    //鏂欑鍑哄簱瀹屾垚涓婃姤缁橶MS
-                    string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
-                    if (string.IsNullOrEmpty(url))
+
+                    // 妫�鏌ヤ换鍔$姸鎬侊紝閬垮厤閲嶅瀹屾垚
+                    if (task.TaskState == TaskStatusEnum.Finish.ObjToInt())
                     {
-                        _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
-                        UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
-                        return content.Error($"{taskNum},鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                        return content.Error($"浠诲姟{taskNum}宸插畬鎴愶紝璇峰嬁閲嶅鎿嶄綔");
                     }
-                    ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
+
+                    if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//鍑哄簱浠诲姟瀹屾垚閫昏緫
                     {
-                        TaskCode = task.TaskNum.ToString(),
-                        ContainerCode = task.PalletCode,
-                        StationCode = task.TargetAddress,
-                        LocationCode = task.SourceAddress,
-                        CompleteType = 1
-                    };
-                    string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
-                    
-                    _unitOfWorkManage.BeginTran();
-                    _locationInfoRepository.UpdateData(locationInfo);
-                    BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
-                    _unitOfWorkManage.CommitTran();
-                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, task.TaskNum);
-                    //璋冪敤鎺ュ彛
-                    string response = HttpHelper.Post(url, request);
-                    WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍑哄簱涓婃姤杩斿洖鍊�");
-                    if (wMSResponse.Code != "0") content.Message=$"鍑哄簱浠诲姟{task.TaskNum}WMS鍑哄簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+                        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.Finish.ObjToInt();
+                        locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+                        locationInfo.PalletCode = "";
+                        //鏂欑鍑哄簱瀹屾垚涓婃姤缁橶MS
+                        string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
+                        if (string.IsNullOrEmpty(url))
+                        {
+                            _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                            UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                            return content.Error($"{taskNum},鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                        }
+                        ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
+                        {
+                            TaskCode = task.TaskNum.ToString(),
+                            ContainerCode = task.PalletCode,
+                            StationCode = task.TargetAddress,
+                            LocationCode = task.SourceAddress,
+                            CompleteType = 1
+                        };
+                        string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
+
+                        _unitOfWorkManage.BeginTran();
+                        _locationInfoRepository.UpdateData(locationInfo);
+                        BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+                        _unitOfWorkManage.CommitTran();
+                        _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, task.TaskNum);
+                        //璋冪敤鎺ュ彛
+                        string response = HttpHelper.Post(url, request);
+                        WriteLog.Write_Log("WMS鍑哄簱浠诲姟瀹屾垚鍥炰紶", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟淇℃伅", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
+                        WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍑哄簱涓婃姤杩斿洖鍊�");
+                        if (wMSResponse.Code != "0") content.Message = $"鍑哄簱浠诲姟{task.TaskNum}WMS鍑哄簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+                    }
+                    else if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//鍏ュ簱浠诲姟瀹屾垚閫昏緫
+                    {
+                        string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
+                        if (string.IsNullOrEmpty(url))
+                        {
+                            _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                            UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                            return content.Error($"{taskNum},鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+                        }
+                        ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
+                        {
+                            TaskCode = task.TaskNum.ToString(),
+                            ContainerCode = task.PalletCode,
+                            StationCode = task.SourceAddress,
+                            LocationCode = task.TargetAddress,
+                            CompleteType = 2
+                        };
+                        string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
+
+                        Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+                        if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+                        {
+                            return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
+                        }
+                        task.TaskState = TaskStatusEnum.Finish.ObjToInt();
+                        locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+                        locationInfo.PalletCode = task.PalletCode;
+                        _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);
+                        //璋冪敤鎺ュ彛
+                        string response = HttpHelper.Post(url, request);
+                        WriteLog.Write_Log("WMS鍏ュ簱浠诲姟瀹屾垚鍥炰紶", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟淇℃伅", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
+                        WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍏ュ簱涓婃姤杩斿洖鍊�");
+                        if (wMSResponse.Code != "0") content.Message = $"鍏ュ簱浠诲姟{task.TaskNum}WMS鍏ュ簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+                    }
+                    content.OK("浠诲姟瀹屾垚");
                 }
-                else if(task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//鍏ュ簱浠诲姟瀹屾垚閫昏緫
+                catch (Exception ex)
                 {
-                    string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
-                    if (string.IsNullOrEmpty(url))
-                    {
-                        _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
-                        UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
-                        return content.Error($"{taskNum},鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
-                    }
-                    ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
-                    {
-                        TaskCode = task.TaskNum.ToString(),
-                        ContainerCode = task.PalletCode,
-                        StationCode = task.SourceAddress,
-                        LocationCode = task.TargetAddress,
-                        CompleteType = 2
-                    };
-                    string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
-                    
-                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
-                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
-                    {
-                        return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
-                    }
-                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
-                    locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
-                    locationInfo.PalletCode = task.PalletCode;
-                    _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);
-                    //璋冪敤鎺ュ彛
-                    string response = HttpHelper.Post(url, request);
-                    WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍏ュ簱涓婃姤杩斿洖鍊�");
-                    if (wMSResponse.Code != "0") content.Message = $"鍏ュ簱浠诲姟{task.TaskNum}WMS鍏ュ簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+                    _unitOfWorkManage.RollbackTran();
+                    content.Error(ex.Message);
                 }
-                content.OK("浠诲姟瀹屾垚");
+                return content;
             }
-            catch (Exception ex)
-            {
-                _unitOfWorkManage.RollbackTran();
-                content.Error(ex.Message);
-            }
-            return content;
         }
+        ///// <summary>
+        ///// 浠诲姟瀹屾垚
+        ///// </summary>
+        ///// <param name="taskNum"></param>
+        ///// <returns></returns>
+        //public WebResponseContent TaskCompleted(int taskNum)
+        //{
+        //    WebResponseContent content = new WebResponseContent();
+        //    try
+        //    {
+        //        WriteLog.Write_Log("浠诲姟瀹屾垚", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟鍙�", $"浠诲姟锛歿taskNum}");
+        //        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.Finish.ObjToInt();
+        //            locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+        //            locationInfo.PalletCode = "";
+        //            //鏂欑鍑哄簱瀹屾垚涓婃姤缁橶MS
+        //            string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
+        //            if (string.IsNullOrEmpty(url))
+        //            {
+        //                _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //                UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //                return content.Error($"{taskNum},鏈壘鍒癢MS鍑哄簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //            }
+        //            ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
+        //            {
+        //                TaskCode = task.TaskNum.ToString(),
+        //                ContainerCode = task.PalletCode,
+        //                StationCode = task.TargetAddress,
+        //                LocationCode = task.SourceAddress,
+        //                CompleteType = 1
+        //            };
+        //            string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
+
+        //            _unitOfWorkManage.BeginTran();
+        //            _locationInfoRepository.UpdateData(locationInfo);
+        //            BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+        //            _unitOfWorkManage.CommitTran();
+        //            _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, LocationStatusEnum.Lock, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, task.TaskNum);
+        //            //璋冪敤鎺ュ彛
+        //            string response = HttpHelper.Post(url, request);
+        //            WriteLog.Write_Log("WMS鍑哄簱浠诲姟瀹屾垚鍥炰紶", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟淇℃伅", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
+        //            WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍑哄簱涓婃姤杩斿洖鍊�");
+        //            if (wMSResponse.Code != "0") content.Message = $"鍑哄簱浠诲姟{task.TaskNum}WMS鍑哄簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+        //        }
+        //        else if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//鍏ュ簱浠诲姟瀹屾垚閫昏緫
+        //        {
+        //            string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInOutBoundBack.ToString())?.ApiAddress;
+        //            if (string.IsNullOrEmpty(url))
+        //            {
+        //                _taskExecuteDetailService.AddTaskExecuteDetail(task, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //                UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //                return content.Error($"{taskNum},鏈壘鍒癢MS鍏ュ簱涓婃姤鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+        //            }
+        //            ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
+        //            {
+        //                TaskCode = task.TaskNum.ToString(),
+        //                ContainerCode = task.PalletCode,
+        //                StationCode = task.SourceAddress,
+        //                LocationCode = task.TargetAddress,
+        //                CompleteType = 2
+        //            };
+        //            string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
+
+        //            Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+        //            if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+        //            {
+        //                return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
+        //            }
+        //            task.TaskState = TaskStatusEnum.Finish.ObjToInt();
+        //            locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+        //            locationInfo.PalletCode = task.PalletCode;
+        //            _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);
+        //            //璋冪敤鎺ュ彛
+        //            string response = HttpHelper.Post(url, request);
+        //            WriteLog.Write_Log("WMS鍏ュ簱浠诲姟瀹屾垚鍥炰紶", "浠诲姟瀹屾垚鎺ュ彛", "浠诲姟淇℃伅", $"璇锋眰锛歿request}锛屽洖浼狅細{response}");
+        //            WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{taskNum},鏈帴鏀跺埌WMS鍏ュ簱涓婃姤杩斿洖鍊�");
+        //            if (wMSResponse.Code != "0") content.Message = $"鍏ュ簱浠诲姟{task.TaskNum}WMS鍏ュ簱涓婃姤閿欒,淇℃伅:{wMSResponse.Msg}";
+        //        }
+        //        content.OK("浠诲姟瀹屾垚");
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        _unitOfWorkManage.RollbackTran();
+        //        content.Error(ex.Message);
+        //    }
+        //    return content;
+        //}
         /// <summary>
         /// 浜哄伐鎵嬪姩鍙栨秷鎸囧畾浠诲姟
         /// </summary>
@@ -818,36 +950,42 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
+                WriteLog.Write_Log("浠诲姟鍙栨秷鎺ユ敹", "浜哄伐鎵嬪姩鍙栨秷鎸囧畾浠诲姟", "浠诲姟鍙�", $"浠诲姟锛歿taskNum}");
                 // 1. 鑾峰彇浠诲姟淇℃伅
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null)return content.Error($"浠诲姟{taskNum}涓嶅瓨鍦�");
+                if (task == null) return content.Error($"浠诲姟{taskNum}涓嶅瓨鍦�");
 
                 TaskTypeGroup group = task.TaskType.GetTaskTypeGroup();
                 if (group == TaskTypeGroup.InboundGroup)// 鍏ュ簱浠诲姟鍙栨秷
                 {
                     // 鑾峰彇鐩爣璐т綅
                     Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
-                    if (locationInfo == null)return content.Error($"鐩爣璐т綅{task.TargetAddress}涓嶅瓨鍦�");
-                    // 楠岃瘉璐т綅鐘舵��
-                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
-                        return content.Error($"{task.TargetAddress}璐т綅鐘舵�佸紓甯革紝鏃犳硶鍙栨秷");
-
-                    // 鎭㈠璐т綅鐘舵��
-                    locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); // 鎭㈠涓虹┖闂茬姸鎬�
-                    locationInfo.PalletCode = ""; // 娓呯┖鎵樼洏鍙�
-                    // 鏇存柊鏁版嵁搴�
+                    if (locationInfo != null)
+                    {
+                        locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); // 鎭㈠涓虹┖闂茬姸鎬�
+                        locationInfo.PalletCode = ""; // 娓呯┖鎵樼洏鍙�
+                        _unitOfWorkManage.BeginTran();
+                        _locationInfoRepository.UpdateData(locationInfo);
+                        _unitOfWorkManage.CommitTran();
+                        content.OK("浠诲姟鍙栨秷鎴愬姛");
+                    }
                     _unitOfWorkManage.BeginTran();
-                    _locationInfoRepository.UpdateData(locationInfo);
                     BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
                     _unitOfWorkManage.CommitTran();
+                    //return content.Error($"鐩爣璐т綅{task.TargetAddress}涓嶅瓨鍦�");
+                    // 楠岃瘉璐т綅鐘舵��
+                    //if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+                    //    return content.Error($"{task.TargetAddress}璐т綅鐘舵�佸紓甯革紝鏃犳硶鍙栨秷");
+
+                    // 鎭㈠璐т綅鐘舵��
+
+                    // 鏇存柊鏁版嵁搴�
+                    //_unitOfWorkManage.BeginTran();
+                    //_locationInfoRepository.UpdateData(locationInfo);
+                    //BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+                    //_unitOfWorkManage.CommitTran();
                     // 璁板綍鐘舵�佸彉鏇�
-                    _locationStatusChangeRecordService.AddLocationStatusChangeRecord(
-                        locationInfo,
-                        LocationStatusEnum.Lock,
-                        LocationStatusEnum.Free,
-                        LocationChangeType.InboundCancelled,
-                        task.TaskNum
-                    );
+
                     content.OK("浠诲姟鍙栨秷鎴愬姛");
                 }
                 else
@@ -876,6 +1014,7 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
+                WriteLog.Write_Log("浠诲姟鍙栨秷鎺ユ敹", "浠诲姟鍙栨秷鎺ュ彛", "浠诲姟鍙�", $"浠诲姟锛歿taskNum}");
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                 if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//鍑哄簱浠诲姟瀹屾垚閫昏緫
                 {
@@ -913,38 +1052,129 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
-                if (taskCancels==null || taskCancels.Count<=0)
+                // 鍙傛暟楠岃瘉
+                if (taskCancels == null || taskCancels.Count == 0)
                 {
-                    return content.Error("浼犲叆涓嶈兘涓虹┖");
+                    return content.Error("浼犲叆鍙傛暟涓嶈兘涓虹┖");
                 }
-                //鑾峰彇鎵�鏈夋枡绠�
-                List<Dt_Task> outTasks = BaseDal.QueryData(x=>x.TaskType==TaskTypeEnum.Outbound.ObjToInt());
+
+                WriteLog.Write_Log("浠诲姟鍙栨秷鎺ユ敹", "浠诲姟鍙栨秷鎺ュ彛", "浠诲姟鍙栨秷", $"浠诲姟锛歿taskCancels.ToJson()}");
+
+                // 鑾峰彇鎵�鏈夊嚭搴撲换鍔★紙鍙煡璇竴娆★級
+                List<Dt_Task> outTasks = BaseDal.QueryData(x =>
+                    x.TaskType == TaskTypeEnum.Outbound.ObjToInt());
+
+                if (outTasks.Count == 0)
+                {
+                    return content.Error("鏈壘鍒板搴旂殑浠诲姟");
+                }
+
+                // 鎸塆roupId鍒嗙粍澶勭悊
+                var tasksByGroup = outTasks.GroupBy(x => x.GroupId)
+                                           .Where(g => !string.IsNullOrEmpty(g.Key))
+                                           .ToDictionary(g => g.Key, g => g.ToList());
+
                 List<Dt_Task> cancelTasks = new List<Dt_Task>();
                 List<Dt_Task> cancelTasksCompleted = new List<Dt_Task>();
-                //鍒ゆ柇鏄惁鏈変换鍔″瓨鍦�
-                foreach (var item in taskCancels)
+                // 鏀堕泦鎵�鏈夐渶瑕佹鏌ョ殑浠诲姟缁�
+                var groupsToCheck = new List<List<Dt_Task>>();
+
+                foreach (var taskCancel in taskCancels)
                 {
-                    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode== item.ContainerCode);
-                    if (taskExist==null)
+                    // 鎵惧埌璇ヤ换鍔℃墍鍦ㄧ殑缁�
+                    var group = tasksByGroup.Values.FirstOrDefault(g =>
+                        g.Any(t => t.PalletCode == taskCancel.ContainerCode));
+
+                    if (group != null && !groupsToCheck.Contains(group))
                     {
-                        content.Message += $"{item.ContainerCode}浠诲姟涓嶅瓨鍦�";
-                        continue;
+                        groupsToCheck.Add(group);
                     }
-                    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}浠诲姟鐘舵�佷笉鍙彇娑堬紒");
-                    }
-                    
                 }
+                // 楠岃瘉浠诲姟鐘舵��
+                foreach (var group in groupsToCheck)
+                {
+                    var firstTask = group.FirstOrDefault();
+                    if (firstTask == null) continue;
+
+                    // 妫�鏌ョ粍鍐呮墍鏈変换鍔$姸鎬�
+                    foreach (var task in group)
+                    {
+                        if (task.TaskState == TaskStatusEnum.AGV_TakeFinish.ObjToInt())
+                        {
+                            task.IsCancel = 1;
+                            cancelTasks.Add(task);
+                        }
+                        else if (task.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
+                        {
+                            cancelTasksCompleted.Add(task);
+                        }
+                        else
+                        {
+                            return content.Error($"浠诲姟鍙栨秷澶辫触{task.PalletCode}浠诲姟鐘舵�佷笉鍙彇娑堬紒");
+                        }
+                    }
+                }
+                //WriteLog.Write_Log("浠诲姟鍙栨秷鎺ユ敹", "浠诲姟鍙栨秷鎺ュ彛", "浠诲姟鍙栨秷", $"浠诲姟锛歿taskCancels.ToJson()}");
+                //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>();
+                //HashSet<string> processedGroups = new HashSet<string>();
+                ////鍒ゆ柇鏄惁鏈変换鍔″瓨鍦�
+                //foreach (var item in taskCancels)
+                //{
+                //    Dt_Task? taskExist = outTasks.FirstOrDefault(x=>x.PalletCode == item.ContainerCode);
+                //    if (taskExist==null)
+                //    {
+                //        content.Message += $"{item.ContainerCode}浠诲姟涓嶅瓨鍦�";
+                //        WriteLog.Write_Log("浠诲姟鍙栨秷鎺ユ敹", "浠诲姟鍙栨秷鎺ュ彛", "浠诲姟涓嶅瓨鍦�", $"浠诲姟锛歿item.ContainerCode}");
+                //        continue;
+                //    }
+                //    if (string.IsNullOrEmpty(taskExist.GroupId))
+                //    {
+                //        continue;
+                //    }
+                //    processedGroups.Add(taskExist.GroupId);
+                //    //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}浠诲姟鐘舵�佷笉鍙彇娑堬紒");
+                //    //}
+                //}
+                //// 鍙栨秷鏁翠釜缁�
+                //foreach(var processed in processedGroups)
+                //{
+                //    List<Dt_Task> groupTask = BaseDal.QueryData(x => x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.GroupId == processed);
+                //    foreach (var group in groupTask)
+                //    {
+                //        if (group.TaskState == TaskStatusEnum.AGV_TakeFinish.ObjToInt())
+                //        {
+                //            group.IsCancel = 1;
+                //            cancelTasks.Add(group);
+                //        }
+                //        else if (group.TaskState == TaskStatusEnum.AGV_Executing.ObjToInt())
+                //        {
+                //            cancelTasksCompleted.Add(group);
+                //        }
+                //        else
+                //        {
+                //            return content.Error($"浠诲姟鍙栨秷澶辫触{group.PalletCode}浠诲姟鐘舵�佷笉鍙彇娑堬紒");
+                //        }
+                //    }
+                //}
+
                 _unitOfWorkManage.BeginTran();
                 BaseDal.UpdateData(cancelTasks);
                 foreach (var item in cancelTasksCompleted)
@@ -961,12 +1191,12 @@
                 {
                     AgvTaskCancelDTO agvTaskCancel = new AgvTaskCancelDTO()
                     {
-                        RequestId= DateTime.Now.ToString("yyMMddHHmmssfff"),
-                        MissionCode=item.GroupId,
-                        ContainerCode=item.PalletCode,
-                        Position="",
-                        CancelMode= "CTU_REDIRECT_START",
-                        Reason=""
+                        RequestId = DateTime.Now.ToString("yyMMddHHmmssfff"),
+                        MissionCode = item.GroupId,
+                        ContainerCode = item.PalletCode,
+                        Position = "",
+                        CancelMode = "CTU_REDIRECT_START",
+                        Reason = ""
                     };
                     AgvCancelTask(agvTaskCancel);
                 }
@@ -1137,5 +1367,46 @@
             return content;
         }
 
+        public WebResponseContent WmsRecovery()
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                // 鍒犻櫎绗竴涓紓甯�
+                // 鎸夊垱寤烘椂闂村崌搴忚幏鍙栫涓�鏉¤褰�
+                var orderBy = new Dictionary<string, OrderByType>
+                {
+                    { "CreateDate", OrderByType.Asc }
+                };
+                Dt_ErrorInfo errorInfo = _errorInfoRepository.QueryFirst(x => true, orderBy);
+                if (errorInfo == null)
+                {
+                    return content.Error("褰撳墠娌℃湁寮傚父浠诲姟");
+                }
+                // 鑾峰彇绗竴涓紓甯革紙鎸夊垱寤烘椂闂存帓搴忥級
+                _unitOfWorkManage.BeginTran();
+                _errorInfoRepository.DeleteData(errorInfo);
+                _unitOfWorkManage.CommitTran();
+                // 涓婃姤鎭㈠
+                string? apiErrorBack = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSErrorBack.ToString())?.ApiAddress;
+                if (string.IsNullOrEmpty(apiErrorBack)) throw new Exception($"鏈壘鍒癢MS鏁呴殰涓婃姤,璇锋鏌ユ帴鍙i厤缃�");
+                TaskError taskError = new TaskError()
+                {
+                    MsgID = errorInfo.Id,
+                    StationCode = errorInfo.StationCode,
+                    MsgCode = 0,
+                    Msg = "鎭㈠"
+                };
+                string reqErrorBack = JsonConvert.SerializeObject(taskError, settings);
+                HttpHelper.Post(apiErrorBack, reqErrorBack);
+                return content.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return content.Error(ex.Message);
+                throw new Exception(ex.Message);
+            }
+        }
     }
 }

--
Gitblit v1.9.3