From bfcd7f5b405e431a5c07fe3fa77d74c892d4e66b Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期四, 19 三月 2026 15:52:42 +0800
Subject: [PATCH] fix: 修复出入库冲突拦截,系统位置与实际位置的映射和修复
---
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs | 384 +++++++++---------------------------------------------
1 files changed, 63 insertions(+), 321 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs"
index 6b305e7..56c1438 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs"
@@ -40,6 +40,7 @@
{
private readonly ILogger<WMSCruJob> _logger;
private Timer _timer;
+ private Timer _timer2;
private readonly ITaskService _taskService;
private readonly ILocationInfoService _locationInfoService;
private readonly IStockInfoService _stockInfoService;
@@ -56,113 +57,74 @@
_taskService=taskService;
}
private static readonly object _taskProcessLock = new object();
- private const int TASK_PROCESS_TIMEOUT = 3000; // 3绉掕秴鏃�
+ private const int TASK_PROCESS_TIMEOUT = 1000; // 2绉掕秴鏃�
+ private readonly Queue<int> _deviceQueueSC = new Queue<int>();
public Task StartAsync(CancellationToken cancellationToken)
{
- _timer = new Timer(DoWorkWheel, null, TimeSpan.Zero, TimeSpan.FromSeconds(3));
+ // 鍒濆鍖栬澶囬槦鍒楋紙1-5锛�
+ for (int i = 1; i <= 5; i++)
+ {
+ _deviceQueueSC.Enqueue(i);
+ }
+
+ _timer = new Timer(SCProcessNextDevice, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
+ //_timer2 = new Timer(PLCDoDeciceWork, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
return Task.CompletedTask;
}
- public static List<string> InStationareaList = new List<string>() { "1113", "1114", "1115", "1116", "1117", "1118", "1119", "1120", "1121", "1122" };
-
- private void DoWorkWheel(object state)
+ //鍫嗗灈鏈洪槦鍒�
+ private void SCProcessNextDevice(object state)
{
- if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT))
- {
- return;
- }
-
+ if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT)) return;
try
{
- // 瀹氫箟鐘舵�佸父閲忥紝閬垮厤榄旀硶鏁板瓧
- const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish;
- const int PLC_IN_InNew = (int)InTaskStatusEnum.InNew;
- const int OUT_NEW = (int)OutTaskStatusEnum.OutNew;
- const int SC_OUT_FINISH = (int)OutTaskStatusEnum.SC_OutFinish;
- const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting;
- const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting;
- const int RELOCATION_EXECUTING = (int)RelocationTaskStatusEnum.RelocationExecuting;
- const int PLC_OUT_EXECUTING = (int)OutTaskStatusEnum.PLC_OutExecuting;
+ if (_deviceQueueSC.Count == 0)
+ return;
- // 鑾峰彇褰撳墠浠诲姟鏁版嵁
- List<Dt_Task> allTasks = _taskService.Repository.QueryData();
+ int deviceId = _deviceQueueSC.Dequeue();
- // 鑾峰彇宸烽亾瓒呰繃3涓换鍔$殑璺
- HashSet<string> excludedRoadways = allTasks
- .Where(x => x.NumberSsuances > 3)
- .Select(x => x.Roadway)
- .Distinct()
- .ToHashSet();
-
- // 杩囨护闇�瑕佸鐞嗙殑浠诲姟
- List<Dt_Task> tasksToProcess = allTasks
- .Where(x =>
- (x.TaskStatus == PLC_IN_FINISH ||
- x.TaskStatus == OUT_NEW ||
- x.TaskStatus == SC_OUT_FINISH || (x.TaskStatus == PLC_IN_InNew && InStationareaList.Contains(x.SourceAddress))) &&
- !excludedRoadways.Contains(x.Roadway))
- .ToList();
-
- // 鎸夌姸鎬佸垎缁勫鐞嗭紝鍑忓皯閲嶅鏌ヨ
- ProcessInAndNewTasks(tasksToProcess, allTasks, excludedRoadways); //涓嬪彂鍫嗗灈鏈�
- ProcessOutFinishTasks(tasksToProcess, allTasks); //涓嬪彂杈撻�佺嚎浠诲姟
- ProcessInPalltask(tasksToProcess, allTasks);
-
- }
- catch (Exception ex)
- {
- Console.WriteLine($"浠诲姟澶勭悊寮傚父锛歿ex.Message}");
+ try
+ {
+ SCDoDeviceWork(deviceId);
+ _deviceQueueSC.Enqueue(deviceId);
+ PLCDoDeciceWork();
+ }
+ catch (Exception ex)
+ {
+ _deviceQueueSC.Enqueue(deviceId);
+ Console.WriteLine($"璁惧 {deviceId} 鎵ц澶辫触: {ex.Message}");
+ }
}
finally
{
- // 蹇呴』閲婃斁閿侊紝鍚﹀垯浼氬鑷存閿�
Monitor.Exit(_taskProcessLock);
}
-
-
}
- private void ProcessInAndNewTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks, HashSet<string> excludedRoadways)
+ //鎵ц鏂规硶
+ private void SCDoDeviceWork(int deviceId)
{
const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish;
- const int OUT_NEW = (int)OutTaskStatusEnum.OutNew;
const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting;
const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting;
- const int RELOCATION_EXECUTING = (int)RelocationTaskStatusEnum.RelocationExecuting;
- const int RELOCCATION_NEW = (int)RelocationTaskStatusEnum.RelocationNew;
-
- var inAndNewTasks = tasksToProcess
- .Where(x => x.TaskStatus == PLC_IN_FINISH || x.TaskStatus == OUT_NEW).OrderBy(x=>x.CreateDate)
- .ToList();
- if(inAndNewTasks.Count > 0)
+ try
{
- foreach (var task in inAndNewTasks)
+ //鍒ゆ柇褰撳墠鍫嗗灈鏈烘槸鍚︽湁鎵ц浠诲姟
+ if (_taskService.CurrentTaskProgress(deviceId.ToString())) return;
+ // 鑾峰彇褰撳墠鍫嗗灈鏈轰换鍔�
+ List<Dt_Task> taskList = _taskService.GetaskQueue(deviceId.ToString());
+ if (taskList.Count == 0) return;
+
+ foreach (Dt_Task task in taskList)
{
- // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夋鍦ㄦ墽琛岀殑浠诲姟
- bool hasExecutingTask = allTasks.Any(x =>
- x.TaskId != task.TaskId &&
- x.Roadway == task.Roadway &&
- (x.TaskStatus == SC_IN_EXECUTING ||
- x.TaskStatus == SC_OUT_EXECUTING ||
- x.TaskStatus == RELOCATION_EXECUTING));
-
- if (hasExecutingTask)
- continue;
-
- if (task.TaskStatus == OUT_NEW)
+ WebResponseContent webResponse = JudgmentIsRelocations(task);
+ if (!webResponse.Status)
{
- bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress);
- if (SCNewTasks)
- continue;
+ WriteLog.Write_Log("WMS_绉诲簱鏁呴殰", $"绉诲簱杩斿洖澶辫触鍐呭", "澶辫触", $"绉诲簱澶辫触,鍘熷洜锛歿webResponse.Message}");
+ return;
}
- //鍒ゆ柇鏄惁闇�瑕佺Щ搴�
- WebResponseContent webResponse = JudgmentIsRelocations(task);
- if (!webResponse.Status) continue;
-
-
- // 涓嬪彂鍫嗗灈鏈轰换鍔�
WCSginseng result = _taskService.SC_IssueTasks(
task.TaskId,
int.Parse(task.Roadway),
@@ -175,78 +137,38 @@
UpdateTaskStatus(task, result,
successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING, 1);
+ return;
}
}
-
-
- }
-
- private void ProcessOutFinishTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
- {
- const int SC_OUT_FINISH = (int)OutTaskStatusEnum.SC_OutFinish;
- const int PLC_OUT_EXECUTING = (int)OutTaskStatusEnum.PLC_OutExecuting;
-
- var outFinishTasks = tasksToProcess
- .Where(x => x.TaskStatus == SC_OUT_FINISH)
- .ToList();
- if(outFinishTasks.Count > 0)
+ catch (Exception ex)
{
- foreach (var task in outFinishTasks)
- {
- // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夊叾浠栧凡瀹屾垚鐨勪换鍔�
- bool hasOtherFinishTask = allTasks.Any(x =>
- x.Roadway == task.Roadway &&
- x.TaskStatus == SC_OUT_FINISH &&
- x.TaskId != task.TaskId);
-
- if (hasOtherFinishTask)
- continue;
-
- // 涓嬪彂PLC浠诲姟
- WCSginseng result = _taskService.PLC_IssueTasks(
- task.TaskId,
- int.Parse(task.Roadway),
- task.TaskNum,
- task.PalletCode,
- int.Parse(task.PalletType),
- task.CurrentAddress,
- task.NextAddress,
- "");
-
- UpdateTaskStatus(task, result, PLC_OUT_EXECUTING, 2);
- }
+ Console.WriteLine($"浠诲姟澶勭悊寮傚父锛歿ex.Message}");
}
-
-
}
- private void ProcessInPalltask(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
+ private void PLCDoDeciceWork()
{
- const int PLC_IN_InNew = (int)InTaskStatusEnum.InNew;
- const int PLC_PLC_INEXECUTING = (int)InTaskStatusEnum.PLC_InExecuting;
- var outFinishTasks = tasksToProcess
- .Where(x => x.TaskStatus == PLC_IN_InNew && InStationareaList.Contains(x.SourceAddress))
- .ToList();
- if(outFinishTasks.Count > 0)
+ try
{
- foreach (var task in outFinishTasks)
+ // 鑾峰彇褰撳墠浠诲姟鏁版嵁
+ List<Dt_Task> allTasks = _taskService.GetaskQueuePLC();
+ if (allTasks.Count == 0) return;
+ foreach (var task in allTasks)
{
// 涓嬪彂PLC浠诲姟
- WCSginseng result = _taskService.PLC_IssueTasks(
- task.TaskId,
- int.Parse(task.Roadway),
- task.TaskNum,
- task.PalletCode,
- int.Parse(task.PalletType),
- task.CurrentAddress,
- task.NextAddress,
- "");
-
- UpdateTaskStatus(task, result, PLC_PLC_INEXECUTING, 2);
+ WCSginseng result = _taskService.PLC_IssueTasks(task.TaskId, task.WarehouseId, task.TaskNum, task.PalletCode, int.Parse(task.PalletType), task.CurrentAddress, task.NextAddress, "");
+ UpdateTaskStatus(task, result, (int)OutTaskStatusEnum.PLC_OutExecuting, 2);
}
}
+ catch (Exception ex)
+ {
+ Console.WriteLine($"鍫嗗灈鏈哄畬鎴愶紝涓嬪彂杈撻�佺嚎鎵ц浠诲姟澶辫触锛� 鍘熷洜: {ex.Message}");
+ }
}
+
+
+ //淇敼鐘舵��
private void UpdateTaskStatus(Dt_Task task, WCSginseng result, int successStatus,int statype)
{
if (result.IsSuccess)
@@ -258,22 +180,19 @@
string Result = MesOutTaskStatusEnum.Start.GetDescription();
//璋冨彇涓婃父绯荤粺鍙嶉寮�濮嬩换鍔�
_taskService.OutStoreDocCallback(task.TaskNum,Result, "鎿嶄綔鎴愬姛");
- }else if(task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting)
- {
- string Result = MesInTaskStatusEnum.Start.GetDescription();
- //璋冨彇涓婃父绯荤粺鍙嶉寮�濮嬩换鍔�
- _taskService.InStoreDocCallback(task.TaskNum, Result, "鎿嶄綔鎴愬姛",task.PalletCode,"");
}
}
else
{
task.Remark = result.Message;
- task.NumberSsuances++;
+ //task.NumberSsuances++;
}
_taskService.Repository.UpdateData(task);
}
+
+
public Task StopAsync(CancellationToken cancellationToken)
{
@@ -284,183 +203,6 @@
public void Dispose()
{
throw new NotImplementedException();
- }
-
- /// <summary>
- /// 鍒ゆ柇宸烽亾鍐呯Щ搴�
- /// </summary>
- /// <param name="TaskNum"></param>
- /// <param name="SourceAddress"></param>
- /// <returns></returns>
- public WebResponseContent JudgmentIsRelocations(Dt_Task dt_Task)
- {
- const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish;
- const int SC_IN_EXECUTING = (int)InTaskStatusEnum.SC_IntExecuting;
- const int SC_OUT_EXECUTING = (int)OutTaskStatusEnum.SC_OutExecuting;
- WebResponseContent content = new WebResponseContent();
- try
- {
- string Locationcodeadd = dt_Task.TaskType == (int)TaskTypeEnum.Inbound ? dt_Task.NextAddress: dt_Task.CurrentAddress ;
-
- Dt_LocationInfo dt_Location = _locationInfoService.Repository.QueryData(x => x.LocationCode == Locationcodeadd).FirstOrDefault();
- if (dt_Location.Depth == 1 || dt_Location.RoadwayNo == "5") return content.OK();
- int locrow = judgmentRow(dt_Location.RoadwayNo, dt_Location.Row);
- Dt_LocationInfo shallowLocation = _locationInfoService.Repository.QueryData(x => x.RoadwayNo == dt_Location.RoadwayNo && x.Row == locrow && x.Layer == dt_Location.Layer && x.Column == dt_Location.Column).FirstOrDefault();
- if (shallowLocation.LocationStatus == (int)LocationStatusEnum.Free) return content.OK();
-
-
- //鍒ゆ柇鏄惁鏈夌Щ搴撲换鍔�
- var TransferTask = _taskService.Repository.QueryData(x=>x.TaskStatus== (int)RelocationTaskStatusEnum.RelocationNew && x.CurrentAddress== shallowLocation.LocationCode).FirstOrDefault();
- if(TransferTask != null)
- {
- //杩涜涓嬪彂缁欏爢鍨涙満浠诲姟
- WCSginseng result = _taskService.SC_IssueTasks(
- TransferTask.TaskId,
- int.Parse(TransferTask.Roadway),
- TransferTask.TaskNum,
- TransferTask.PalletCode,
- int.Parse(TransferTask.PalletType),
- TransferTask.CurrentAddress,
- TransferTask.NextAddress,
- dt_Task.TargetAddress);
- if (result.IsSuccess)
- {
- TransferTask.TaskStatus = (int)RelocationTaskStatusEnum.RelocationExecuting;
- _taskService.UpdateData(TransferTask);
- return content.OK();
- }
- else
- {
- UpdateTaskStatus(dt_Task, result,
- successStatus: dt_Task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING, 1);
-
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"涓嬪彂鍫嗗灈鏈轰换鍔″け璐ワ紝鍘熷洜锛歿result.Message}", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- return content.Error();
- }
- }
-
- var CuttTransferTask = _taskService.Repository.QueryData(x => x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew).FirstOrDefault();
- //鍒ゆ柇褰撳墠鏄惁鏈夌Щ搴撲换鍔�
- if (CuttTransferTask!=null) return content.Error();
-
-
- if (shallowLocation.LocationStatus != (int)LocationStatusEnum.InStock) return content.Error();
-
- //鐢熸垚绉诲簱浠诲姟锛岃繘琛屼笅鍙�
- return content =GenerateTransferTask(shallowLocation.LocationCode);
- }
- catch (Exception ex)
- {
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"鍒ゆ柇绉诲簱澶辫触锛屽師鍥狅細{ex.Message}", $"鍒ゆ柇宸烽亾鍐呯Щ搴撴柟娉�:JudgmentIsRelocations");
- return content.Error();
-
- }
- }
-
- private int judgmentRow(string RoadwayNo,int locrow)
- {
- if (RoadwayNo == "1" || RoadwayNo == "3")
- {
- return locrow == 1 ? 2 : 3;
- }
- else if (RoadwayNo == "2" || RoadwayNo == "4")
- {
- return locrow == 5 ? 6 : 7;
- }
- else
- {
- return 0;
- }
- }
-
- public WebResponseContent GenerateTransferTask(string shallowLocation)
- {
- WebResponseContent webResponse=new WebResponseContent();
- try
- {
- Dt_LocationInfo OriginalLocation = _locationInfoService.Repository.QueryData(x => x.LocationCode == shallowLocation).FirstOrDefault();
- Dt_StockInfo dt_StockInfo = _stockInfoService.Repository.QueryData(x => x.LocationCode == shallowLocation).FirstOrDefault();
- Dt_LocationInfo newLocation = _locationInfoService.GetLocation(OriginalLocation.RoadwayNo, OriginalLocation.LocationType);
- List<Dt_LocationInfo> dt_Locations = new List<Dt_LocationInfo>();
-
- MES_parameter mES_Parame = _taskService.ApplicationChangeStorageLocation(dt_StockInfo.PalletCode, OriginalLocation.LocationCode, newLocation.LocationCode);
- if (mES_Parame != null)
- {
- if (mES_Parame.Result == "Y")
- {
- //杩涜鐢熸垚浠诲姟锛屼笅鍙戜换鍔¤嚦MES
- Dt_Task task = new Dt_Task();
- task.TaskNum = "0";
- task.PalletCode = dt_StockInfo.PalletCode;
- task.PalletType = dt_StockInfo.PalletType;
- task.Roadway = OriginalLocation.RoadwayNo;
- task.TaskType = (int)TaskTypeEnum.Relocation;
- task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationNew;
- task.SourceAddress = OriginalLocation.LocationCode;
- task.TargetAddress = newLocation.LocationCode;
- task.CurrentAddress = OriginalLocation.LocationCode;
- task.NextAddress = newLocation.LocationCode;
- task.WarehouseId = OriginalLocation.WarehouseId;
- task.OrderNo = "";
- task.Grade = 1;
- task.Creater = "MES";
- task.CreateDate = DateTime.Now;
-
- OriginalLocation.LocationStatus = (int)LocationStatusEnum.Lock;
- newLocation.LocationStatus = (int)LocationStatusEnum.Lock;
- dt_StockInfo.StockStatus = (int)StockStatusEmun.绉诲簱閿佸畾;
-
- dt_Locations.Add(OriginalLocation);
- dt_Locations.Add(newLocation);
-
- _unitOfWorkManage.BeginTran();
- _taskService.AddData(task);
- _locationInfoService.UpdateData(dt_Locations);
- _stockInfoService.UpdateData(dt_StockInfo);
- _unitOfWorkManage.CommitTran();
-
-
- return webResponse.Error("宸茬敓鎴愮Щ搴撲换鍔�");
- //杩涜涓嬪彂缁欏爢鍨涙満浠诲姟
- /*WCSginseng result = _taskService.SC_IssueTasks(
- task.TaskId,
- int.Parse(task.Roadway),
- task.TaskNum,
- task.PalletCode,
- int.Parse(task.PalletType),
- task.CurrentAddress,
- task.NextAddress,
- task.TargetAddress);
- if (result.IsSuccess)
- {
- task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationExecuting;
- _taskService.UpdateData(task);
- return webResponse.OK();
- }
- else
- {
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"涓嬪彂鍫嗗灈鏈轰换鍔″け璐ワ紝鍘熷洜锛歿result.Message}", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- return webResponse.Error();
- }*/
- }
- else
- {
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"鐢宠鍌ㄤ綅寮傚姩锛孧ES涓嶅厑璁哥Щ鍔�", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- return webResponse.Error();
- }
- }
- else
- {
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"鐢宠鍌ㄤ綅寮傚姩锛孧ES杩斿洖涓虹┖", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- return webResponse.Error();
- }
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"鐢熸垚绉诲簱浠诲姟澶辫触锛歿ex.Message}", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- return webResponse.Error();
- }
}
}
}
--
Gitblit v1.9.3