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