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