From 40f71192f067a48fff730a52fa8f47a1b69ba59d Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期一, 13 十月 2025 17:28:00 +0800
Subject: [PATCH] 支持跨楼层与AGV搬运任务,优化货位管理新增跨楼层与AGV搬运任务相关页面、API及服务逻辑,支持任务状态更新与多任务类型处理。 更新货位管理功能,支持批量创建货位及批量记录货位状态变动。 重构任务状态更新逻辑,增强事务处理能力,优化代码结构。 调整页面配置与文档布局,新增常量与枚举以支持新功能。 修复部分任务状态处理中的潜在问题。
---
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs | 246 +++++++++++++++++++++++++++++++++++-------------
1 files changed, 179 insertions(+), 67 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
index 0df6834..9e2d51d 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -341,7 +341,7 @@
/// <returns></returns>
public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task)
{
- WebResponseContent content = new WebResponseContent();
+ WebResponseContent? content = new WebResponseContent();
try
{
int oldState = task.TaskState;
@@ -353,6 +353,8 @@
if (task.TaskState == (int)TaskOutStatusEnum.AGV_OutFinish)
{
+ CompletedTask(task.TaskNum);
+
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
@@ -374,56 +376,51 @@
int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
task.TaskState = nextStatus;
- //if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish)
- //{
- // #region 鍏ュ簱璋冪敤鎺ュ彛鑾峰彇璐т綅鍦板潃
+ if (task.TaskState == (int)TaskInStatusEnum.Line_InFinish)
+ {
+ #region 鍏ュ簱璋冪敤鎺ュ彛鑾峰彇璐т綅鍦板潃
- // // TODO: 璋冪敤鎺ュ彛鑾峰彇璐т綅鍦板潃
- // // 鍒涘缓璇锋眰瀵硅薄
- // var taskDto = new RequestTaskDto()
- // {
- // Position = task.NextAddress,
- // PalletCode = task.PalletCode,
- // };
+ var taskDto = new RequestTaskDto()
+ {
+ Position = task.NextAddress,
+ PalletCode = task.PalletCode,
+ };
- // // 鑾峰彇WMSip鍦板潃
- // var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
- // var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue;
- // var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.RequestLocation).FirstOrDefault()?.ConfigValue;
- // if (wmsBasez == null || requestLocation == null)
- // {
- // throw new InvalidOperationException("WMS IP 鏈厤缃�");
- // }
- // var wmsIpAddrss = wmsBasez + requestLocation;
+ // 鑾峰彇WMSip鍦板潃
+ var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+ var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue;
+ var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.RequestLocation).FirstOrDefault()?.ConfigValue;
+ if (wmsBasez == null || requestLocation == null)
+ {
+ throw new InvalidOperationException("WMS IP 鏈厤缃�");
+ }
+ var wmsIpAddrss = wmsBasez + requestLocation;
- // // 鍙戦�佽姹傚苟绛夊緟鍝嶅簲
- // var abc = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result;
- // if (abc == null)
- // return content.Error();
- // // 鍙嶅簭鍒楀寲鍝嶅簲鍐呭
- // content = JsonConvert.DeserializeObject<WebResponseContent>(abc);
+ // 鍙戦�佽姹傚苟绛夊緟鍝嶅簲
+ var abc = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result;
+ if (abc == null)
+ return content.Error();
+ // 鍙嶅簭鍒楀寲鍝嶅簲鍐呭
+ content = JsonConvert.DeserializeObject<WebResponseContent>(abc);
+ LogFactory.WriteError($"Info_鑾峰彇璐т綅", $"鑾峰彇璐т綅,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙凤細銆恵task.PalletCode}銆戣繑鍥炲弬鏁般�恵JsonConvert.SerializeObject(content)}銆憑Environment.NewLine}{Environment.NewLine}");
- // QuartzLogger.WriteLogToFile($"Info_鑾峰彇璐т綅", $"鑾峰彇璐т綅,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙凤細銆恵task.PalletCode}銆戣繑鍥炲弬鏁般�恵JsonConvert.SerializeObject(content)}銆憑Environment.NewLine}{Environment.NewLine}");
+ // 妫�鏌ョ姸鎬佸苟杩斿洖
+ if (!content.Status)
+ {
+ return content;
+ }
+ // 鍙嶅簭鍒楀寲浠诲姟鏁版嵁
+ var taskResult = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
- // // 妫�鏌ョ姸鎬佸苟杩斿洖
- // if (!content.Status)
- // {
- // return content;
- // }
+ task.CurrentAddress = task.NextAddress;
+ task.NextAddress = taskResult.TargetAddress;
+ task.TargetAddress = task.NextAddress;
- // // 鍙嶅簭鍒楀寲浠诲姟鏁版嵁
- // var taskResult = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
-
- // task.CurrentAddress = task.NextAddress;
- // task.NextAddress = taskResult.TargetAddress;
- // task.TargetAddress = task.NextAddress;
-
- // #endregion 鍏ュ簱璋冪敤鎺ュ彛鑾峰彇璐т綅鍦板潃
- //}
- //else
- if (task.TaskState == (int)TaskInStatusEnum.SC_InFinish)
+ #endregion 鍏ュ簱璋冪敤鎺ュ彛鑾峰彇璐т綅鍦板潃
+ }
+ else if (task.TaskState == (int)TaskInStatusEnum.SC_InFinish)
{
if (App.User.UserId > 0)
{
@@ -440,7 +437,8 @@
BaseDal.DeleteData(task);
_taskHtyRepository.AddData(task_Hty);
}
- }else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.CarryGroup)
+ }
+ else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.CarryGroup)
{
int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskAGVCarryStatusEnum>();
@@ -448,6 +446,114 @@
if (task.TaskState == (int)TaskAGVCarryStatusEnum.AGV_CarryFinish)
{
+ task.ModifyDate = DateTime.Now;
+ task.Modifier = "System";
+
+ Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
+ task_Hty.TaskId = 0;
+
+ BaseDal.DeleteData(task);
+ _taskHtyRepository.AddData(task_Hty);
+ }
+ }
+ else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.AcrossFloorGroup)
+ {
+ int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskAcrossFloorStatusEnum>();
+
+ task.TaskState = nextStatus;
+
+ if (task.TaskState == (int)TaskAcrossFloorStatusEnum.SecondCarryFinish)
+ {
+ CompletedTask(task.TaskNum);
+
+ task.TaskState = (int)TaskAcrossFloorStatusEnum.SecondCarryFinish;
+ task.ModifyDate = DateTime.Now;
+ task.Modifier = "System";
+
+ Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
+ task_Hty.TaskId = 0;
+
+ BaseDal.DeleteData(task);
+ _taskHtyRepository.AddData(task_Hty);
+ }
+
+ if (task.TaskState == (int)TaskAcrossFloorStatusEnum.FirstCarryFinish)
+ {
+ Dt_StationManager stationManager = new Dt_StationManager();
+ string TaskTemplate = string.Empty;
+ if (task.Floor == "1F")
+ {
+ stationManager = _stationManagerRepository.QueryFirst(x => x.stationType == 5 && x.stationFloor == "2F");
+ TaskTemplate = "BBB";
+ }
+ else
+ {
+ stationManager = _stationManagerRepository.QueryFirst(x => x.stationType == 5 && x.stationFloor == "1F");
+ TaskTemplate = "CCC";
+ }
+
+ var taskDto = new RequestAcrossFloorTaskDto()
+ {
+ NextAddress = task.NextAddress,
+ PalletCode = task.PalletCode,
+ TaskNum = task.TaskNum
+ };
+
+ // 鑾峰彇WMSip鍦板潃
+ var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+ var wmsBasez = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue;
+ var requestLocation = configz.Where(x => x.ConfigKey == SysConfigKeyConst.AcrossFloorTask).FirstOrDefault()?.ConfigValue;
+ if (wmsBasez == null || requestLocation == null)
+ {
+ throw new InvalidOperationException("WMS IP 鏈厤缃�");
+ }
+ var wmsIpAddrss = wmsBasez + requestLocation;
+
+ var abc = HttpHelper.PostAsync(wmsIpAddrss, taskDto.ToJsonString()).Result;
+ if (abc == null)
+ return content.Error();
+ content = JsonConvert.DeserializeObject<WebResponseContent>(abc);
+
+ if (!content.Status)
+ {
+ return content;
+ }
+
+ // 鍙嶅簭鍒楀寲浠诲姟鏁版嵁
+ var taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
+
+ Dt_Task taskNew = _mapper.Map<Dt_Task>(taskDTO);
+ task.Creater = "WMS";
+
+ taskNew.CurrentAddress = stationManager.stationChildCode;
+
+ taskNew.NextAddress = task.TargetAddress;
+
+ taskNew.Floor = stationManager.stationFloor;
+
+ taskNew.AGVSign = "";
+
+ task.TaskState = (int)TaskAcrossFloorStatusEnum.FirstCarryFinish;
+ task.ModifyDate = DateTime.Now;
+ task.Modifier = "System";
+
+ Dt_Task_Hty task_Hty = _mapper.Map<Dt_Task_Hty>(task);
+ task_Hty.TaskId = 0;
+
+ BaseDal.DeleteData(task);
+ _taskHtyRepository.AddData(task_Hty);
+
+ BaseDal.AddData(taskNew);
+
+ SendAgvTask(TaskTemplate, taskNew.TaskNum);
+ return content.OK();
+ }
+
+ if (task.TaskState == (int)TaskAGVCarryStatusEnum.AGV_CarryFinish)
+ {
+
+ CompletedTask(task.TaskNum);
+
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
@@ -479,7 +585,7 @@
// 鑾峰彇WMSip鍦板潃
var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
- var updateTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.UpdateTask)?.ConfigValue;
+ var updateTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.UpdateTaskStatus)?.ConfigValue;
if (wmsBase == null || updateTask == null)
{
throw new InvalidOperationException("WMS IP 鏈厤缃�");
@@ -500,6 +606,29 @@
return content;
}
+ public void CompletedTask(int taskNum)
+ {
+ #region WMS鍚屾浠诲姟瀹屾垚
+
+ var keys = new Dictionary<string, object>()
+ {
+ {"taskNum", taskNum}
+ };
+ // 鑾峰彇WMSip鍦板潃
+ var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+ var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
+ var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue;
+ if (wmsBase == null || completeTask == null)
+ {
+ throw new InvalidOperationException("WMS IP 鏈厤缃�");
+ }
+ var wmsIpAddress = wmsBase + completeTask;
+
+ var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result;
+
+ #endregion WMS鍚屾浠诲姟瀹屾垚
+ }
+
/// <summary>
/// 浠诲姟瀹屾垚
/// </summary>
@@ -513,29 +642,9 @@
var task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
- #region WMS鍚屾浠诲姟瀹屾垚
-
- //var keys = new Dictionary<string, object>()
- //{
- // {"taskNum", taskNum}
- //};
- //// 鑾峰彇WMSip鍦板潃
- //var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
- //var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
- //var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue;
- //if (wmsBase == null || completeTask == null)
- //{
- // throw new InvalidOperationException("WMS IP 鏈厤缃�");
- //}
- //var wmsIpAddress = wmsBase + completeTask;
-
- //var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result;
-
- #endregion WMS鍚屾浠诲姟瀹屾垚
if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
{
- var station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == task.NextAddress);
int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
task.TaskState = nextStatus;
@@ -549,7 +658,8 @@
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
{
- //todo 鍚屾鍒癢MS
+ CompletedTask(task.TaskNum);
+
int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
task.TaskState = nextStatus;
task.ModifyDate = DateTime.Now;
@@ -562,8 +672,10 @@
_taskHtyRepository.AddData(task_Hty);
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍫嗗灈鏈哄叆搴撳畬鎴�");
}
- else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
+ else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup && task.TaskState == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
{
+ CompletedTask(task.TaskNum);
+
int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
task.TaskState = nextStatus;
task.ModifyDate = DateTime.Now;
--
Gitblit v1.9.3