From 531c6e89dc07bb6997e6249a6cd9f53a9bd474a5 Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 23 三月 2026 10:31:54 +0800
Subject: [PATCH] 出库逻辑变更
---
项目代码/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs | 267 ++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 182 insertions(+), 85 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
index 202738c..b2b9f9c 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -102,6 +102,7 @@
}
}
}
+ private readonly static object lockerCompleted = new object();
/// <summary>
/// 浠诲姟瀹屾垚
/// </summary>
@@ -109,22 +110,25 @@
{
try
{
- Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
- if (task != null)
+ lock (lockerCompleted)
{
- task.TaskState = TaskStatusEnum.Finish.ObjToInt();
- BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
+ if (task != null)
+ {
+ task.TaskState = TaskStatusEnum.Finish.ObjToInt();
+ BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ }
+ string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
+ if (string.IsNullOrEmpty(url))
+ {
+ _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+ UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+ return WebResponseContent.Instance.Error($"{taskNum},鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
+ }
+ string responseStr = HttpHelper.Get(url + "?taskNum=" + taskNum);
+ WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? WebResponseContent.Instance.Error($"{taskNum},鏈帴鏀跺埌浠诲姟瀹屾垚杩斿洖鍊�");
+ return content;
}
- string? url = apiInfos.FirstOrDefault(x => x.ApiCode == APIEnum.FeedBackWMSTaskCompleted.ToString())?.ApiAddress;
- if (string.IsNullOrEmpty(url))
- {
- _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
- UpdateTaskExceptionMessage(taskNum, $"鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
- return WebResponseContent.Instance.Error($"{taskNum},鏈壘鍒癢MS浠诲姟瀹屾垚鎺ュ彛,璇锋鏌ユ帴鍙i厤缃�");
- }
- string responseStr = HttpHelper.Get(url + "?taskNum=" + taskNum);
- WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? WebResponseContent.Instance.Error($"{taskNum},鏈帴鏀跺埌浠诲姟瀹屾垚杩斿洖鍊�");
- return content;
}
catch (Exception ex)
{
@@ -151,6 +155,11 @@
else if(task.TaskState == (int)TaskStatusEnum.AGV_Executing)
{
task.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
+
+ }else if(task.TaskState == (int)TaskStatusEnum.AGV_Exception)
+ {
+ task.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
+ task.Remark = "";
}
else
{
@@ -234,9 +243,18 @@
//鍏ュ簱
if (taskTypeGroup == TaskTypeGroup.InboundGroup)
{
- task.CurrentAddress = router.StartPosi;
- task.NextAddress = router.NextPosi;
- task.DeviceCode = router.ChildPosiDeviceCode;
+ if (router.NextPosi == "AGV" && router.StartPosi=="AGV") //鍙夎溅AGV鎼繍鍏ュ簱
+ {
+ task.CurrentAddress = item.SourceAddress;
+ task.NextAddress = item.TargetAddress;
+ task.DeviceCode = router.ChildPosiDeviceCode;
+ }
+ else
+ {
+ task.CurrentAddress = router.StartPosi;
+ task.NextAddress = router.NextPosi;
+ task.DeviceCode = router.ChildPosiDeviceCode;
+ }
}
else //鍑哄簱
{
@@ -247,8 +265,7 @@
}
else
{
- //鎴愬搧鐮佸灈浠诲姟鐢熸垚
- if (taskTypeGroup == TaskTypeGroup.InboundGroup && !task.Roadway.Contains("YL"))
+ if (taskTypeGroup == TaskTypeGroup.InboundGroup && !task.Roadway.Contains("YL")) //鎴愬搧鐮佸灈浠诲姟鐢熸垚
{
task.CurrentAddress = router.StartPosi;
task.NextAddress = "";
@@ -281,7 +298,10 @@
if (routers.Count == 1)
{
task.NextAddress = router.NextPosi;
- task.DeviceCode = router.ChildPosi;
+ if (task.Roadway.Contains("StackPlate"))
+ task.DeviceCode = router.ChildPosiDeviceCode;
+ else
+ task.DeviceCode = router.ChildPosi;
}
}
@@ -302,17 +322,15 @@
}
/// <summary>
- /// 鏍规嵁鎵樼洏鍙枫�佽捣濮嬪湴鍧�鍚慦MS璇锋眰浠诲姟
+ /// 鏍规嵁缁堢偣鍦板潃鍚慦MS璇锋眰浠诲姟
/// </summary>
- /// <param name="palletCode">鎵樼洏鍙�</param>
- /// <param name="sourceAddress">璧峰鍦板潃</param>
/// <returns></returns>
- public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "")
+ public WebResponseContent RequestPlateOutTask(string targetAddress)
{
WebResponseContent content = new WebResponseContent();
try
{
- Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == sourceAddress);
+ Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == targetAddress);
if (stationManger == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒扮珯鍙颁俊鎭�");
@@ -322,29 +340,15 @@
{
return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
}
- string responseStr = "";
- if (!string.IsNullOrEmpty(materielBoxCode))
- {
- responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}&materielBoxCode={materielBoxCode}");
- }
- else
- {
- responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}");
- }
- WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
- if (responseContent != null && responseContent.Status && responseContent.Data != null)
- {
- WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
- if (taskDTO != null)
- {
- content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
- }
- }
+ string responseStr = HttpHelper.Get($"{address}/api/Task/PlateOutbound?stationCode={targetAddress}");
+
+ WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("缁撴灉杩斿洖涓虹┖");
+ content = responseContent;
}
catch (Exception ex)
{
- content = WebResponseContent.Instance.Error(ex.Message);
+ content.Error(ex.Message);
}
return content;
}
@@ -366,7 +370,7 @@
return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
}
string responseStr = HttpHelper.Get($"{address}/api/Task/RequestYLWMSTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}&taskNum{taskNum}");
- WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
+ WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("缁撴灉杩斿洖涓虹┖");
if (responseContent != null && responseContent.Status && responseContent.Data != null)
{
WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
@@ -377,13 +381,13 @@
}
else
{
- content = responseContent ?? content.Error("缁撴灉閿欒");
+ content = responseContent;
}
}
catch (Exception ex)
{
- content = WebResponseContent.Instance.Error(ex.Message);
+ content.Error(ex.Message);
}
return content;
}
@@ -392,7 +396,7 @@
/// </summary>
public WebResponseContent YLPurchaseBoxing(string palletCode, decimal weight = 0, decimal thickness = 0, decimal wide = 0,string stationCode="")
{
- WebResponseContent? content = new WebResponseContent();
+ WebResponseContent content = new WebResponseContent();
try
{
string address = AppSettings.Get("WMSApiAddress");
@@ -401,7 +405,7 @@
return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
}
string responseStr = HttpHelper.Get($"{address}/api/Task/YLPurchaseBoxing?palletCode={palletCode}&weight={weight}&thickness={thickness}&wide={wide}&stationCode={stationCode}");
- WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
+ WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("缁撴灉杩斿洖涓虹┖");
content = responseContent;
@@ -436,7 +440,7 @@
}
catch (Exception ex)
{
- content = WebResponseContent.Instance.Error(ex.Message);
+ content.Error(ex.Message);
}
return content;
}
@@ -456,16 +460,15 @@
return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
}
string responseStr = HttpHelper.Get($"{address}/api/Task/AssignYLRoadwayNo?palletCode={palletCode}&wide={wide}&thickness={thickness}&weight={weight}");
- WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
- if (responseContent != null && responseContent.Status && responseContent.Data != null)
- {
- content = responseContent;
- }
+
+ WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("缁撴灉杩斿洖涓虹┖");
+
+ content = responseContent;
}
catch (Exception ex)
{
- content = WebResponseContent.Instance.Error(ex.Message);
+ content.Error(ex.Message);
}
return content;
}
@@ -476,40 +479,30 @@
/// <param name="sourceAddress">璧峰鍦板潃</param>
/// /// <param name="roadWay">宸烽亾</param>
/// <returns></returns>
- public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress,string roadWay="", int taskType=630, int taskNum = 0, string targetAddress = "")
+ public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress,string roadWay="", int taskType=630)
{
WebResponseContent content = new WebResponseContent();
try
{
- //string address = AppSettings.Get("WMSApiAddress");
- //if (string.IsNullOrEmpty(address))
- //{
- // return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
- //}
- //string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}");
- //WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
- //if (responseContent != null && responseContent.Status && responseContent.Data != null)
- //{
- // WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
- // if (taskDTO != null)
- // {
- WMSTaskDTO? taskDTO = new WMSTaskDTO()
+ string address = AppSettings.Get("WMSApiAddress");
+ if (string.IsNullOrEmpty(address))
{
- TaskNum = taskNum ==0 ? DateTime.Now.ToString("mmss").ObjToInt(): taskNum,
- PalletCode= palletCode,
- RoadWay= roadWay,
- TaskType= taskType,
- PalletType=1,
- TaskStatus= TaskStatusEnum.New.ObjToInt(),
- SourceAddress= sourceAddress,
- TargetAddress= targetAddress,
- WarehouseId=2,
- Grade=0,
- };
- content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
- // }
- //}
-
+ return WebResponseContent.Instance.Error($"鏈壘鍒癢MSApi鍦板潃");
+ }
+ string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}");
+ WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("缁撴灉杩斿洖涓虹┖");
+ if (responseContent.Status && responseContent.Data != null)
+ {
+ WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
+ if (taskDTO != null)
+ {
+ content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
+ }
+ }
+ else
+ {
+ content = responseContent;
+ }
}
catch (Exception ex)
{
@@ -627,6 +620,34 @@
return "";
}
/// <summary>
+ /// 鍚慦MS鎴愬搧鍏ュ簱鎵爜璇锋眰鏇存柊鏉$爜
+ /// </summary>
+ /// <param name="taskNum">浠诲姟鍙�</param>
+ /// <returns></returns>
+ /// <exception cref="Exception"></exception>
+ public WebResponseContent RequestInBoundPalletCode(int taskNum,string barCode)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ string address = AppSettings.Get("WMSApiAddress");
+ if (string.IsNullOrEmpty(address)) throw new Exception("鏈壘鍒癢MSApi鍦板潃");
+ string responseStr = HttpHelper.Get($"{address}/api/Task/InBoundPalletCode?taskNum={taskNum}&barCode={barCode}");
+ WebResponseContent responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr) ?? throw new Exception("鏈敹鍒拌繑鍥炲弬鏁�");
+ if (!responseContent.Status)
+ {
+ return responseContent;
+ }
+ content.OK();
+ }
+ catch (Exception ex)
+ {
+ content.Error(ex.Message);
+ }
+ return content;
+
+ }
+ /// <summary>
/// 鍚慦MS鐢宠鍑哄簱AGV缁堢偣
/// </summary>
/// <param name="taskNum">浠诲姟鍙�</param>
@@ -679,6 +700,77 @@
return BaseDal.QueryFirst(x => x.DeviceCode == deviceNo && x.TaskState == (int)TaskStatusEnum.SC_Execute, TaskOrderBy);
else
return BaseDal.QueryFirst(x => x.DeviceCode == deviceNo && x.CurrentAddress == currentAddress && x.TaskState == (int)TaskStatusEnum.SC_Execute, TaskOrderBy);
+ }
+ private static int OldorNew = 0;
+ /// <summary>
+ /// 鍘熸枡搴撲换鍔℃煡璇�
+ /// </summary>
+ /// <param name="deviceNo">璁惧缂栧彿</param>
+ /// <param name="currentAddress">褰撳墠鍦板潃</param>
+ /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns>
+ public Dt_Task QueryStackerYLTask(string deviceNo,TaskTypeGroup? taskTypeGroup= null)
+ {
+ if (taskTypeGroup == null)
+ {
+ Dt_Task taskSend = BaseDal.QueryFirst(x => x.DeviceCode == deviceNo && x.TaskState == (int)TaskStatusEnum.SC_Execute && x.TaskType != TaskTypeEnum.OldYLOutbound.ObjToInt(), TaskOrderBy);
+ if (taskSend == null)
+ {
+ OldorNew = 1;
+ List<Dt_Task> specificTasks = BaseDal.QueryData(t => t.DeviceCode == deviceNo && t.TaskState == (int)TaskStatusEnum.SC_Execute && t.TaskType == TaskTypeEnum.OldYLOutbound.ObjToInt()).OrderBy(t => t.CreateDate.Date)
+ .ThenBy(t => t.Grade)
+ .ThenBy(t => t.TaskNum)
+ .ToList();
+ if (specificTasks.Any())
+ {
+ //鏍规嵁鏃堕棿绛涙煡涓ユ牸鎺掑簭
+ Dt_Task taskCheck = BaseDal.QueryData(t => t.TaskState == (int)TaskStatusEnum.SC_Execute && t.TaskType == TaskTypeEnum.OldYLOutbound.ObjToInt()).OrderBy(t => t.CreateDate.Date)
+ .ThenBy(t => t.Grade)
+ .ThenBy(t => t.TaskNum)
+ .FirstOrDefault();
+ Dt_Task taskCheckSend = specificTasks.FirstOrDefault();
+ if (taskCheck.CreateDate.Date == taskCheckSend.CreateDate.Date && taskCheckSend.Grade <= taskCheck.Grade)
+ {
+ taskSend = taskCheckSend;
+ }
+ }
+ }
+ else
+ {
+ OldorNew = 0;
+ }
+ return taskSend;
+ }
+ else
+ {
+ Dt_Task taskSend = null;
+ if (OldorNew == 0)
+ {
+ OldorNew = 1;
+ List<Dt_Task> specificTasks = BaseDal.QueryData(t => t.DeviceCode == deviceNo && t.TaskState == (int)TaskStatusEnum.SC_Execute && t.TaskType == TaskTypeEnum.OldYLOutbound.ObjToInt()).OrderBy(t => t.CreateDate.Date)
+ .ThenBy(t => t.Grade)
+ .ThenBy(t => t.TaskNum)
+ .ToList();
+ if (specificTasks.Any())
+ {
+ //鏍规嵁鏃堕棿绛涙煡涓ユ牸鎺掑簭
+ Dt_Task taskCheck = BaseDal.QueryData(t => t.TaskState == (int)TaskStatusEnum.SC_Execute && t.TaskType == TaskTypeEnum.OldYLOutbound.ObjToInt()).OrderBy(t => t.CreateDate.Date)
+ .ThenBy(t => t.Grade)
+ .ThenBy(t => t.TaskNum)
+ .FirstOrDefault();
+ Dt_Task taskCheckSend = specificTasks.FirstOrDefault();
+ if (taskCheck.CreateDate.Date == taskCheckSend.CreateDate.Date && taskCheckSend.Grade <= taskCheck.Grade)
+ {
+ taskSend = taskCheckSend;
+ }
+ }
+ }
+ else
+ {
+ OldorNew = 0;
+ taskSend = BaseDal.QueryFirst(x => x.DeviceCode == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskType != TaskTypeEnum.OldYLOutbound.ObjToInt() && x.TaskState == (int)TaskStatusEnum.SC_Execute, TaskOrderBy);
+ }
+ return taskSend;
+ }
}
/// <summary>
@@ -960,6 +1052,11 @@
nextStatus = TaskStatusEnum.SC_Executing;
}
}
+ else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
+ {
+ task.TaskState = (int)TaskStatusEnum.SC_Executing;
+ nextStatus = TaskStatusEnum.SC_Executing;
+ }
else
{
throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�");
--
Gitblit v1.9.3