From 4f2fb79143f0545e96f114c92e1da733b2d9716a Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期六, 07 二月 2026 21:31:05 +0800
Subject: [PATCH] 1
---
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs | 371 +++++++++++++++-------------------------------------
1 files changed, 107 insertions(+), 264 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 6c8aeb1..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,135 +40,135 @@
{
private readonly ILogger<WMSCruJob> _logger;
private Timer _timer;
+ private Timer _timer2;
private readonly ITaskService _taskService;
private readonly ILocationInfoService _locationInfoService;
private readonly IStockInfoService _stockInfoService;
private readonly IUnitOfWorkManage _unitOfWorkManage;
-
+ public WMSCruJob(ILogger<WMSCruJob> logger, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService,
+ ITaskService taskService)
+ {
+ _logger = logger;
+ _unitOfWorkManage = unitOfWorkManage;
+ _stockInfoService = stockInfoService;
+ _locationInfoService = locationInfoService;
+ _taskService=taskService;
+ }
+ private static readonly object _taskProcessLock = new object();
+ 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;
}
- private void DoWorkWheel(object state)
+
+ //鍫嗗灈鏈洪槦鍒�
+ private void SCProcessNextDevice(object state)
{
- // 瀹氫箟鐘舵�佸父閲忥紝閬垮厤榄旀硶鏁板瓧
- const int PLC_IN_FINISH = (int)InTaskStatusEnum.PLC_InFinish;
- 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;
-
- // 鑾峰彇褰撳墠浠诲姟鏁版嵁
- List<Dt_Task> allTasks = _taskService.Repository.QueryData();
-
- // 鑾峰彇宸烽亾瓒呰繃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) &&
- !excludedRoadways.Contains(x.Roadway))
- .ToList();
-
- // 鎸夌姸鎬佸垎缁勫鐞嗭紝鍑忓皯閲嶅鏌ヨ
- ProcessInAndNewTasks(tasksToProcess, allTasks, excludedRoadways); //涓嬪彂鍫嗗灈鏈�
- ProcessOutFinishTasks(tasksToProcess, allTasks); //涓嬪彂杈撻�佺嚎浠诲姟
- }
-
- private void ProcessInAndNewTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks, HashSet<string> excludedRoadways)
- {
- 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();
-
- foreach (var task in inAndNewTasks)
+ if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT)) return;
+ try
{
- // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夋鍦ㄦ墽琛岀殑浠诲姟
- 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 (_deviceQueueSC.Count == 0)
+ return;
- if (hasExecutingTask)
- continue;
+ int deviceId = _deviceQueueSC.Dequeue();
- //鍒ゆ柇鏄惁闇�瑕佺Щ搴�
- WebResponseContent webResponse=JudgmentIsRelocations(task);
- if (!webResponse.Status) continue;
-
- // 涓嬪彂鍫嗗灈鏈轰换鍔�
- 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);
-
- UpdateTaskStatus(task, result,
- successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING,1);
+ try
+ {
+ SCDoDeviceWork(deviceId);
+ _deviceQueueSC.Enqueue(deviceId);
+ PLCDoDeciceWork();
+ }
+ catch (Exception ex)
+ {
+ _deviceQueueSC.Enqueue(deviceId);
+ Console.WriteLine($"璁惧 {deviceId} 鎵ц澶辫触: {ex.Message}");
+ }
+ }
+ finally
+ {
+ Monitor.Exit(_taskProcessLock);
}
}
- private void ProcessOutFinishTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
+ //鎵ц鏂规硶
+ private void SCDoDeviceWork(int deviceId)
{
- 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();
-
- foreach (var task in outFinishTasks)
+ 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;
+ try
{
- // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夊叾浠栧凡瀹屾垚鐨勪换鍔�
- bool hasOtherFinishTask = allTasks.Any(x =>
- x.Roadway == task.Roadway &&
- x.TaskStatus == SC_OUT_FINISH &&
- x.TaskId != task.TaskId);
+ //鍒ゆ柇褰撳墠鍫嗗灈鏈烘槸鍚︽湁鎵ц浠诲姟
+ if (_taskService.CurrentTaskProgress(deviceId.ToString())) return;
+ // 鑾峰彇褰撳墠鍫嗗灈鏈轰换鍔�
+ List<Dt_Task> taskList = _taskService.GetaskQueue(deviceId.ToString());
+ if (taskList.Count == 0) return;
- if (hasOtherFinishTask)
- continue;
+ foreach (Dt_Task task in taskList)
+ {
+ WebResponseContent webResponse = JudgmentIsRelocations(task);
+ if (!webResponse.Status)
+ {
+ WriteLog.Write_Log("WMS_绉诲簱鏁呴殰", $"绉诲簱杩斿洖澶辫触鍐呭", "澶辫触", $"绉诲簱澶辫触,鍘熷洜锛歿webResponse.Message}");
+ return;
+ }
- // 涓嬪彂PLC浠诲姟
- WCSginseng result = _taskService.PLC_IssueTasks(
- task.TaskId,
- int.Parse(task.Roadway),
- task.TaskNum,
- task.PalletCode,
- int.Parse(task.PalletType),
- task.CurrentAddress,
- task.NextAddress,
- "");
+ 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);
- UpdateTaskStatus(task, result, PLC_OUT_EXECUTING,2);
+ UpdateTaskStatus(task, result,
+ successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING, 1);
+ return;
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"浠诲姟澶勭悊寮傚父锛歿ex.Message}");
}
}
+ private void PLCDoDeciceWork()
+ {
+ try
+ {
+ // 鑾峰彇褰撳墠浠诲姟鏁版嵁
+ List<Dt_Task> allTasks = _taskService.GetaskQueuePLC();
+ if (allTasks.Count == 0) return;
+ foreach (var task in allTasks)
+ {
+ // 涓嬪彂PLC浠诲姟
+ 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)
@@ -177,7 +177,7 @@
task.TaskStatus = successStatus;
if(task.TaskStatus== (int)OutTaskStatusEnum.SC_OutExecuting)
{
- string Result = MesOutTaskStatusEnum.鍑哄簱寮�濮�.GetDescription();
+ string Result = MesOutTaskStatusEnum.Start.GetDescription();
//璋冨彇涓婃父绯荤粺鍙嶉寮�濮嬩换鍔�
_taskService.OutStoreDocCallback(task.TaskNum,Result, "鎿嶄綔鎴愬姛");
}
@@ -185,12 +185,14 @@
else
{
task.Remark = result.Message;
- task.NumberSsuances++;
+ //task.NumberSsuances++;
}
_taskService.Repository.UpdateData(task);
}
+
+
public Task StopAsync(CancellationToken cancellationToken)
{
@@ -201,165 +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)
- {
- 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();
- if (shallowLocation.LocationStatus != (int)(int)LocationStatusEnum.InStock) return content.Error();
-
- //鍒ゆ柇鏄惁鏈夌Щ搴撲换鍔�
- 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,
- TransferTask.TargetAddress);
- if (result.IsSuccess)
- {
- return content.OK();
- }
- else
- {
- WriteLog.GetLog("鍒ゆ柇宸烽亾鍐呯Щ搴�").Write($"涓嬪彂鍫嗗灈鏈轰换鍔″け璐ワ紝鍘熷洜锛歿result.Message}", $"鐢熸垚绉诲簱浠诲姟:GenerateTransferTask");
- 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);
- //_stockInfoService.Repository.AddData(dt_StockInfo);
- _unitOfWorkManage.CommitTran();
-
- //杩涜涓嬪彂缁欏爢鍨涙満浠诲姟
- 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)
- {
- 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