From 1581189aad05d97267d240a65e0215f4946130e5 Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期四, 12 三月 2026 15:29:30 +0800
Subject: [PATCH] feat: 新增异常任务处理按钮 fix: 修复任务取消bug,按照分组取消。 refactor: 重构日志为文本,减少数据库压力

---
 项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs |  159 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 132 insertions(+), 27 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 e8403f1..6887160 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;
@@ -120,6 +121,7 @@
             {
                 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());
@@ -252,6 +254,7 @@
                 {
                     _taskExecuteDetailService.AddTaskExecuteDetail(new List<int>() { task.TaskNum }, "鍒涘缓鍏ュ簱浠诲姟");
                 }
+                WriteLog.Write_Log("鍏ュ簱浠诲姟涓嬪彂", "瀹瑰櫒鍏ュ簱浠诲姟娣诲姞浠诲姟", "娣诲姞浠诲姟", $"浠诲姟锛歿task.ToJson()}");
                 content.OK("鎴愬姛");
             }
             catch (Exception ex)
@@ -487,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("鎴愬姛");
                 }
             }
@@ -542,7 +546,7 @@
                 BaseDal.UpdateData(task);
 
                 _taskExecuteDetailService.AddTaskExecuteDetail(task, task.ExceptionMessage);
-
+                WriteLog.Write_Log("鏇存柊浠诲姟寮傚父淇℃伅", "鏇存柊浠诲姟鎺ュ彛", "鏇存柊浠诲姟", $"浠诲姟锛歿task.ToJson()}");
                 content = WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
@@ -645,6 +649,7 @@
         {
             try
             {
+                WriteLog.Write_Log("鎺ュ彈WMS鎵嬪姩瀹屾垚浠诲姟", "鎺ュ彈WMS鎵嬪姩瀹屾垚浠诲姟鎺ュ彛", "浠诲姟鍙�", $"浠诲姟鍙凤細{taskNum}");
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                 if (task != null)
                 {
@@ -667,6 +672,7 @@
             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()
@@ -676,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();
@@ -695,6 +702,7 @@
             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()
@@ -704,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();
@@ -724,6 +733,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)//鍑哄簱浠诲姟瀹屾垚閫昏緫
                 {
@@ -752,7 +762,7 @@
                         CompleteType = 1
                     };
                     string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
-                    
+
                     _unitOfWorkManage.BeginTran();
                     _locationInfoRepository.UpdateData(locationInfo);
                     BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
@@ -760,6 +770,7 @@
                     _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}";
                 }
@@ -781,7 +792,7 @@
                         CompleteType = 2
                     };
                     string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
-                    
+
                     Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                     if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
                     {
@@ -797,6 +808,7 @@
                     _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}";
                 }
@@ -819,6 +831,7 @@
             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}涓嶅瓨鍦�");
@@ -877,6 +890,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)//鍑哄簱浠诲姟瀹屾垚閫昏緫
                 {
@@ -914,38 +928,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)

--
Gitblit v1.9.3