Admin
2026-01-18 b593c2d4ada3244f4a256ca18a23c3fef609f234
ÏîÄ¿´úÂë/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();
                        //进行下发给堆垛机任务