xiaojiao
2026-03-26 02dd21ca9a064b98aacfdc8c6ffec5a2b575967d
ÏîÄ¿´úÂë/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/RGV/RgvDispatchJob.cs
@@ -30,13 +30,11 @@
    [DisallowConcurrentExecution]
    public partial class RgvDispatchJob : JobBase, IJob
    {
        /// <summary>
        /// RGV(有轨小车)调度
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
@@ -44,6 +42,9 @@
                var executeLog = ExecuteJob(context, () => Run(context));
            });
        }
        public static bool TempHK = false; // æ˜¯å¦ç©ºæ‰˜ç›˜å›žåº“优先
        public static int HKNumber = 0;  // ç©ºæ‰˜ç›˜å›žåº“的数量 å¦‚果已经回了四个了 é‚£å°±ä¸èƒ½é™åˆ¶å‡ºåº“的了
        string[] endStationNo = new string[] { "70101", "70103", "70104", "70106" };
        public string Run(IJobExecutionContext context)
        {
            using (VOLContext dbCcontext = new VOLContext())
@@ -70,11 +71,24 @@
                List<int> currentLayer = new List<int>();
                foreach (var item in rgvData.data)
                {
                    if (item.rgvId == "1")
                    {
                        client.WriteValue(CLineInfoDBName.RGV01.ToString(), item.status);
                    }
                    if (item.rgvId == "2")
                    {
                        client.WriteValue(CLineInfoDBName.RGV02.ToString(), item.status);
                    }
                    if (item.rgvId == "3")
                    {
                        client.WriteValue(CLineInfoDBName.RGV03.ToString(), item.status);
                    }
                    //0离线 1正常 2故障
                    if (item.status != 1)
                        carCount++;
                    else
                        currentLayer.Add(item.layer);
                }
                if (carCount == 3)
                {
@@ -144,10 +158,30 @@
                        {
                            //手动任务
                            if (rgvTask.rgvtask_wcsTaskNumber == 0 && rgvTask.rgvtask_taskId == "0")
                            {
                                SendRGVTaskAction(rgvTask, wcsInfo, taskRGVinfoRepository, taskWCSinfoRepository);
                            else
                                continue;
                            }
                            continue;
                        }
                        // è¿™é‡ŒåŠ ä¸€ä¸ªåˆ¤æ–­ï¼Œæ¯”å¦‚æˆ‘æœ‰ä¸¤ä¸ªä»»åŠ¡åŽ»70101 æˆ‘任务A先下发 ç†åº”先到70101 ä½†å¯èƒ½ä»»åŠ¡A受rgv换层的影响 ä»»åŠ¡B å…ˆåˆ°å‡ºåº“区的缓存架 å¯¼è‡´B先过去到了70101那边
                        // è¿™é‡Œè¦åˆ¤æ–­ å¦‚果我任务B的RGV任务要下发的时候,判断前面是否有任务,如果有,判断这个任务是否已到达缓存架或者是任务出库输送线执行中才能下发
                        if (endStationNo.Contains(wcsInfo.wcstask_endPoint)) // è¯æ˜Žæ˜¯åŽ»åŽ‹è£…å°çš„
                        {
                            Dt_TaskWCSinfo WcsTask = taskWCSinfoRepository.FindFirst(x =>
                            x.wcstask_endPoint == wcsInfo.wcstask_endPoint
                            && x.wcstask_taskNumber != wcsInfo.wcstask_taskNumber
                            && x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString()
                            && x.wcstask_state != TaskState.TaskState_Assigned.ToString()
                            && x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
                            && x.wcstask_state != TaskState.TaskState_HoisterExecuting.ToString()
                            );
                            if (WcsTask != null)
                            {
                                continue;
                            }
                        }
                        //再做一个保护,查看对应的放货站台上是有有货,即读取站台是否处于负载待机的状态,如果是,说明有东西
                        if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() ||
@@ -162,9 +196,44 @@
                            //穿梭车放货站台
                            string targetStation = wcsInfo.wcstask_endLocation;
                            //判断有到当前放货位置的就不执行
                            Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_endPoint == targetStation && r.wcstask_id != wcsInfo.wcstask_id);
                            if (null != executingTask)
                            Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r =>
                            r.wcstask_endPoint == targetStation
                            && r.wcstask_id != wcsInfo.wcstask_id
                            && r.wcstask_state != TaskState.TaskState_Assigned.ToString());
                            if (null != executingTask) // è¿™ä¸ªåˆ¤æ–­ä¸»è¦æ˜¯åˆ¤æ–­ç©ºæ‰˜ç›˜å›žåº“çš„ å¦‚果空托盘回库到60101 é‚£å‡ºåº“到60101的就不能下发
                            {
                                continue;
                            }
                            // è¿™é‡ŒèŽ·å–ä¸€ä¸ªç©ºæ‰˜ç›˜å›žåº“çš„ï¼Œå¦‚æžœæˆ‘çš„ç©ºæ‰˜å·²ç»åœ¨å¤–é¢æŽ’é˜Ÿå¾ˆé•¿äº† é‚£æˆ‘就不能下发库的任务了
                            // è¿™é‡Œè¦è¯»å–一个信号
                            int Return_Quantity = int.Parse(client.ReadValue(CLineInfoDBName.Return_Quantity.ToString()).ToString());
                            if (Return_Quantity >= 8) // åªè¦ç©ºæ‰˜ç›˜åœ¨è·¯ä¸Šçš„æ•°é‡ >= 8 é‚£ä¹ˆå›žç©ºæ‰˜ç›˜çš„优先级就要提高了
                            {
                                TempHK = true;
                            }
                            if (HKNumber == 4)
                            {
                                TempHK = false;
                                HKNumber = 0;
                            }
                            if (TempHK)
                            {
                                if ((wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || wcsInfo.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString())
                                    && wcsInfo.wcstask_state == TaskState.TaskState_Assigned.ToString()
                                    && endStationNo.Contains(wcsInfo.wcstask_endPoint))
                                {
                                    continue;
                                }
                            }
                            // å¦‚果四个站台同时有负载,那我就要把我的TempHK ç»™è®¾ç½®ä¸ºTrue å½“设置为True了 æˆ‘就会进入一个条件
                            //if (rgvTask.rgvtask_areaCode.Equals("OutboundArea"))
                            //{
@@ -185,7 +254,8 @@
                                    continue;
                                else
                                {
                                    Dt_TaskRGVinfo currentTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_endNode == rgvTask.rgvtask_endNode && r.rgvtask_taskStatus != RGVTaskState.RgvTaskState_Wait_Send.ToString());
                                    Dt_TaskRGVinfo currentTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_endNode == rgvTask.rgvtask_endNode
                                    && r.rgvtask_taskStatus != RGVTaskState.RgvTaskState_Wait_Send.ToString());
                                    if (null != currentTask)
                                        continue;
                                }
@@ -195,7 +265,7 @@
                            //此处查看当前正在进行的测量任务条数,需要控制数量,线体缓存数量有限,测量需要时间,暂定3个
                            //此处查看当前正在进行的测量任务条数,需要控制数量,线体缓存数量有限,测量需要时间,暂定2个
                            if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
                            {
                                List<Dt_TaskWCSinfo> measureList = taskWCSinfoRepository.Find(x =>
@@ -207,6 +277,8 @@
                                    continue;
                                }
                            }
                        }
                        SendRGVTaskAction(rgvTask, wcsInfo, taskRGVinfoRepository, taskWCSinfoRepository);
                    }