From 00e64cba66377cb75c9c947908627fe9f631746e Mon Sep 17 00:00:00 2001
From: Admin <Admin@ADMIN>
Date: 星期三, 21 一月 2026 13:53:14 +0800
Subject: [PATCH] '手动上传'

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs |  254 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 173 insertions(+), 81 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..6b305e7 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,46 +55,72 @@
             _locationInfoService = locationInfoService;
             _taskService=taskService;
         }
-
+        private static readonly object _taskProcessLock = new object();
+        private const int TASK_PROCESS_TIMEOUT = 3000; // 3绉掕秴鏃�
 
         public Task StartAsync(CancellationToken cancellationToken)
         {
             _timer = new Timer(DoWorkWheel, null, TimeSpan.Zero, TimeSpan.FromSeconds(3));
             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)
         {
-            // 瀹氫箟鐘舵�佸父閲忥紝閬垮厤榄旀硶鏁板瓧
-            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 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;
 
-            // 鑾峰彇宸烽亾瓒呰繃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 || (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}");
+            }
+            finally
+            {
+                // 蹇呴』閲婃斁閿侊紝鍚﹀垯浼氬鑷存閿�
+                Monitor.Exit(_taskProcessLock);
+            }
+
+
         }
 
         private void ProcessInAndNewTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks, HashSet<string> excludedRoadways)
@@ -109,38 +135,50 @@
             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(inAndNewTasks.Count > 0)
             {
-                // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夋鍦ㄦ墽琛岀殑浠诲姟
-                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));
+                foreach (var task in inAndNewTasks)
+                {
+                    // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夋鍦ㄦ墽琛岀殑浠诲姟
+                    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 (hasExecutingTask)
+                        continue;
 
-                //鍒ゆ柇鏄惁闇�瑕佺Щ搴�
-                WebResponseContent webResponse=JudgmentIsRelocations(task);
-                if (!webResponse.Status) continue;
+                    if (task.TaskStatus == OUT_NEW)
+                    {
+                        bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress);
+                        if (SCNewTasks)
+                            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);
+                    //鍒ゆ柇鏄惁闇�瑕佺Щ搴�
+                    WebResponseContent webResponse = JudgmentIsRelocations(task);
+                    if (!webResponse.Status) continue;
 
-                UpdateTaskStatus(task, result,
-                    successStatus: task.TaskStatus == PLC_IN_FINISH ? SC_IN_EXECUTING : SC_OUT_EXECUTING,1);
+
+                    // 涓嬪彂鍫嗗灈鏈轰换鍔�
+                    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);
+                }
             }
+
+            
         }
 
         private void ProcessOutFinishTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
@@ -151,30 +189,61 @@
             var outFinishTasks = tasksToProcess
                 .Where(x => x.TaskStatus == SC_OUT_FINISH)
                 .ToList();
-
-            foreach (var task in outFinishTasks)
+            if(outFinishTasks.Count > 0)
             {
-                // 妫�鏌ュ悓涓�宸烽亾鏄惁鏈夊叾浠栧凡瀹屾垚鐨勪换鍔�
-                bool hasOtherFinishTask = allTasks.Any(x =>
-                    x.Roadway == task.Roadway &&
-                    x.TaskStatus == SC_OUT_FINISH &&
-                    x.TaskId != task.TaskId);
+                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;
+                    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,
-                    "");
+                    // 涓嬪彂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);
+                    UpdateTaskStatus(task, result, PLC_OUT_EXECUTING, 2);
+                }
+            }
+
+            
+        }
+
+        private void ProcessInPalltask(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
+        {
+            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)
+            {
+                foreach (var task in outFinishTasks)
+                {
+                    // 涓嬪彂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);
+                }
             }
         }
 
@@ -186,9 +255,14 @@
                 task.TaskStatus = successStatus;
                 if(task.TaskStatus== (int)OutTaskStatusEnum.SC_OutExecuting)
                 {
-                    string Result = MesOutTaskStatusEnum.鍑哄簱寮�濮�.GetDescription();
+                    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
@@ -220,17 +294,20 @@
         /// <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;
+                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();
@@ -245,17 +322,29 @@
                         int.Parse(TransferTask.PalletType),
                         TransferTask.CurrentAddress,
                         TransferTask.NextAddress,
-                        TransferTask.TargetAddress);
+                        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);
@@ -328,11 +417,12 @@
                         _taskService.AddData(task);
                         _locationInfoService.UpdateData(dt_Locations);
                         _stockInfoService.UpdateData(dt_StockInfo);
-                        //_stockInfoService.Repository.AddData(dt_StockInfo);
                         _unitOfWorkManage.CommitTran();
 
+
+                        return webResponse.Error("宸茬敓鎴愮Щ搴撲换鍔�");
                         //杩涜涓嬪彂缁欏爢鍨涙満浠诲姟
-                        WCSginseng result = _taskService.SC_IssueTasks(
+                        /*WCSginseng result = _taskService.SC_IssueTasks(
                             task.TaskId,
                             int.Parse(task.Roadway),
                             task.TaskNum,
@@ -343,13 +433,15 @@
                             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
                     {

--
Gitblit v1.9.3