From b593c2d4ada3244f4a256ca18a23c3fef609f234 Mon Sep 17 00:00:00 2001
From: Admin <Admin@ADMIN>
Date: 星期日, 18 一月 2026 17:31:48 +0800
Subject: [PATCH] 最新

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs |   88 ++++++++++++++++++++++++++++---------------
 1 files changed, 57 insertions(+), 31 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 a9286e1..2f45c56 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"
@@ -55,7 +55,8 @@
             _locationInfoService = locationInfoService;
             _taskService=taskService;
         }
-
+        private static readonly object _taskProcessLock = new object();
+        private const int TASK_PROCESS_TIMEOUT = 3000; // 3绉掕秴鏃�
 
         public Task StartAsync(CancellationToken cancellationToken)
         {
@@ -64,37 +65,56 @@
         }
         private void DoWorkWheel(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;
+            if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT))
+            {
+                return;
+            }
 
-            // 鑾峰彇褰撳墠浠诲姟鏁版嵁
-            List<Dt_Task> allTasks = _taskService.Repository.QueryData();
+            try
+            {
+                // 瀹氫箟鐘舵�佸父閲忥紝閬垮厤榄旀硶鏁板瓧
+                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;
 
-            // 鑾峰彇宸烽亾瓒呰繃3涓换鍔$殑璺
-            HashSet<string> excludedRoadways = allTasks
-                .Where(x => x.NumberSsuances > 3)
-                .Select(x => x.Roadway)
-                .Distinct()
-                .ToHashSet();
+                // 鑾峰彇褰撳墠浠诲姟鏁版嵁
+                List<Dt_Task> allTasks = _taskService.Repository.QueryData();
 
-            // 杩囨护闇�瑕佸鐞嗙殑浠诲姟
-            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();
+                // 鑾峰彇宸烽亾瓒呰繃3涓换鍔$殑璺
+                HashSet<string> excludedRoadways = allTasks
+                    .Where(x => x.NumberSsuances > 3)
+                    .Select(x => x.Roadway)
+                    .Distinct()
+                    .ToHashSet();
 
-            // 鎸夌姸鎬佸垎缁勫鐞嗭紝鍑忓皯閲嶅鏌ヨ
-            ProcessInAndNewTasks(tasksToProcess, allTasks, excludedRoadways);   //涓嬪彂鍫嗗灈鏈�
-            ProcessOutFinishTasks(tasksToProcess, allTasks);    //涓嬪彂杈撻�佺嚎浠诲姟
+                // 杩囨护闇�瑕佸鐞嗙殑浠诲姟
+                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);    //涓嬪彂杈撻�佺嚎浠诲姟
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"浠诲姟澶勭悊寮傚父锛歿ex.Message}");
+            }
+            finally
+            {
+                // 蹇呴』閲婃斁閿侊紝鍚﹀垯浼氬鑷存閿�
+                Monitor.Exit(_taskProcessLock);
+            }
+
+
         }
 
         private void ProcessInAndNewTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks, HashSet<string> excludedRoadways)
@@ -118,10 +138,17 @@
                     x.Roadway == task.Roadway &&
                     (x.TaskStatus == SC_IN_EXECUTING ||
                      x.TaskStatus == SC_OUT_EXECUTING ||
-                     x.TaskStatus == RELOCATION_EXECUTING));
+                     x.TaskStatus == RELOCATION_EXECUTING || x.TaskStatus == RELOCCATION_NEW));
 
                 if (hasExecutingTask)
                     continue;
+
+                if(task.TaskStatus == OUT_NEW)
+                {
+                    bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress);
+                    if (SCNewTasks)
+                        continue;
+                }
 
                 //鍒ゆ柇鏄惁闇�瑕佺Щ搴�
                 WebResponseContent webResponse=JudgmentIsRelocations(task);
@@ -223,7 +250,7 @@
             WebResponseContent content = new WebResponseContent();
             try
             {
-                string Locationcodeadd = dt_Task.TaskType == (int)TaskTypeEnum.Inbound ? dt_Task.NextAddress : dt_Task.CurrentAddress;
+                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();
@@ -328,7 +355,6 @@
                         _taskService.AddData(task);
                         _locationInfoService.UpdateData(dt_Locations);
                         _stockInfoService.UpdateData(dt_StockInfo);
-                        //_stockInfoService.Repository.AddData(dt_StockInfo);
                         _unitOfWorkManage.CommitTran();
 
                         //杩涜涓嬪彂缁欏爢鍨涙満浠诲姟

--
Gitblit v1.9.3