Admin
2026-01-21 00e64cba66377cb75c9c947908627fe9f631746e
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WMSCruJob.cs
@@ -63,6 +63,9 @@
            _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)
        {
            if (!Monitor.TryEnter(_taskProcessLock, TASK_PROCESS_TIMEOUT))
@@ -74,6 +77,7 @@
            {
                // å®šä¹‰çŠ¶æ€å¸¸é‡ï¼Œé¿å…é­”æ³•æ•°å­—
                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;
@@ -96,13 +100,15 @@
                    .Where(x =>
                        (x.TaskStatus == PLC_IN_FINISH ||
                         x.TaskStatus == OUT_NEW ||
                         x.TaskStatus == SC_OUT_FINISH) &&
                         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)
            {
@@ -129,45 +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 || x.TaskStatus == RELOCCATION_NEW));
                if (hasExecutingTask)
                    continue;
                if(task.TaskStatus == OUT_NEW)
                foreach (var task in inAndNewTasks)
                {
                    bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress);
                    if (SCNewTasks)
                    // æ£€æŸ¥åŒä¸€å··é“是否有正在执行的任务
                    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)
                    {
                        bool SCNewTasks = allTasks.Any(x => x.TaskStatus != OUT_NEW && x.TargetAddress == task.TargetAddress);
                        if (SCNewTasks)
                            continue;
                    }
                    //判断是否需要移库
                    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);
                }
                //判断是否需要移库
                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);
            }
        }
        private void ProcessOutFinishTasks(List<Dt_Task> tasksToProcess, List<Dt_Task> allTasks)
@@ -178,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);
                }
            }
        }
@@ -213,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
@@ -247,6 +294,9 @@
        /// <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
            {
@@ -257,7 +307,7 @@
                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();
@@ -272,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);
@@ -357,8 +419,10 @@
                        _stockInfoService.UpdateData(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,
@@ -369,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
                    {