xiaojiao
2026-03-23 f02d3a8ffc05a10a64859b2a16d5d43c8abb0fb9
ÏîÄ¿´úÂë/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs
@@ -3,10 +3,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Common.LogEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.Tools;
using WIDESEA_Core.Utilities;
@@ -24,8 +26,10 @@
        /// <summary>
        /// å‡ºåº“的层
        /// </summary>
        private static List<string> OutboundStationLayerNo = new List<string>() { "60100", "60200", "60300", "60400", "60500", "60600", "60700"};
        //入库托盘申请站台
        private static List<string> OutboundStationLayerNo = new List<string>() { "60101", "60102", "60103", "60104", "60105", "60106", "60107" };
        /// <summary>
        /// å…¥åº“托盘申请站台
        /// </summary>
        private static string ReInboundRequestStationNo = "90101";
        //出库站台交互
        //private static string OutboundStationNo = "90201";
@@ -38,6 +42,84 @@
        /// <param name="client"></param>
        public static string currentModel = "Inbound";
        static int flag = 0;
        // åŽ‹è£…å°ç¼“å­˜ä½å­—å…¸
        public static Dictionary<string, string> PlatformDict = new Dictionary<string, string>
        {
            ["70101"] = "80101",
            ["70103"] = "80103",
            ["70104"] = "80104",
            ["70106"] = "80106"
        };
        // å‡ºåº“区域校准缓存架校准
        public static void OutboundAreaJZ(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
        {
            // å‡ºåº“区的出库任务 åˆ°ç¼“存架子了 å°±è¦æŠŠä»»åŠ¡å·å’Œæ‰˜ç›˜å·å†™å…¥åˆ°å¯¹åº”å±‚çš„ç¼“å­˜æž¶
            List<Dt_TaskWCSinfo> executingTasks = taskWCSinfoRepository.Find(r => (
            r.wcstask_state == TaskState.TaskState_Box_Out_RGV_Finished.ToString() ||
            r.wcstask_state == TaskState.TaskState_Empty_Out_RGV_Finished.ToString())
            && endStationNo.Contains(r.wcstask_endPoint)).ToList();
            foreach (var item in executingTasks)
            {
                bool LoadSleep = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item.wcstask_startPoint.ToString()).ToString());
                int ReadNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), item.wcstask_startPoint.ToString()).ToString());
                int ReadBarcode = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.wcstask_startPoint.ToString()).ToString());
                if (LoadSleep && (ReadNumber == 0 || ReadBarcode == 0))
                {
                    //写入托盘条码
                    bool writeTaskNumber = client.WriteValue(CLineInfoDBName.W_Line_TaskNumber.ToString(), item.wcstask_startPoint, item.wcstask_taskNumber);
                    bool writeBarcode = client.WriteValue(CLineInfoDBName.W_Line_Barcode.ToString(), item.wcstask_startPoint, item.wcstask_barcode);
                }
            }
            foreach (var item in OutboundStationLayerNo)
            {
                bool LoadSleep = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item.ToString()).ToString());
                int ReadNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), item.ToString()).ToString());
                int ReadBarcode = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.ToString()).ToString());
                Dt_TaskWCSinfo dt_TaskWCSinfo = taskWCSinfoRepository.Find(r =>
                r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()
                && r.wcstask_state == TaskState.TaskState_Assigned.ToString()
                && r.wcstask_startPoint == 90101.ToString()
                && r.wcstask_endPoint == item
                && r.wcstask_barcode == ReadBarcode.ToString()
                && r.wcstask_taskNumber == ReadNumber
                ).FirstOrDefault();
                if (LoadSleep && dt_TaskWCSinfo != null)
                {
                    // è¯æ˜Žè´§ç‰©å·²ç»åˆ°äº†ç¼“存架 ä½†ä»»åŠ¡çŠ¶æ€æ²¡æœ‰æ”¹å˜ è¿˜æ˜¯æ–°å»ºçŠ¶æ€ å°±è¦æ”¹ä¸º TaskState.TaskState_Empty_In_PLC_Finished.ToString()
                    dt_TaskWCSinfo.wcstask_state = TaskState.TaskState_Empty_In_PLC_Finished.ToString();
                    taskWCSinfoRepository.Update(dt_TaskWCSinfo, true);
                    string str = $"出库区域 ç©ºæ‰˜ç›˜å›žåº“ æ‰˜ç›˜éƒ½åˆ°ç¼“存架子 ä½†ä»»åŠ¡çŠ¶æ€æ²¡å˜ {DateTime.Now}【{dt_TaskWCSinfo.wcstask_state}】,托盘号:{dt_TaskWCSinfo.wcstask_barcode},任务号:{dt_TaskWCSinfo.wcstask_taskNumber}";
                    LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                }
            }
            // è¿™é‡Œè¦å†™ä¸€ä¸ª æœ‰ä¸€äº›æ‰˜ç›˜å·²ç»å‡ºåˆ°å¤–面去了 ä½†çŠ¶æ€è¿˜æ˜¯æå‡æœºè¿è¡Œä¸­ å¯¼è‡´åŽé¢çš„发不出去
            Dt_TaskWCSinfo OutTask = taskWCSinfoRepository.Find(r =>
            r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()
            && endStationNo.Contains(r.wcstask_endPoint)
            ).FirstOrDefault();
            if (OutTask != null)
            {
                double secondsPassend = (DateTime.Now - OutTask.wcstask_dispatcherTime.Value).TotalSeconds;
                if (secondsPassend > 38) // å¦‚果大于38秒 è¿˜æ²¡ç”¨æå‡æœºå®Œæˆ å°±è¦æ‰‹åЍ
                {
                    string state = TaskState.TaskState_Box_Out_Line_Executing.ToString();
                    if (OutTask.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString())
                    {
                        state = TaskState.TaskState_Empty_Out_Line_Executing.ToString();
                    }
                    OutTask.wcstask_state = state;
                    OutTask.wcstask_dispatcherTime = DateTime.Now;
                    taskWCSinfoRepository.Update(OutTask, true);
                    string str = $"出库区 å‡ºåº“ æå‡æœºå·²ç»å†…的托盘已经出去 ä½†çŠ¶æ€è¿˜æ˜¯æå‡æœºæ‰§è¡Œä¸­... {DateTime.Now},托盘号:{OutTask.wcstask_barcode},任务号:{OutTask.wcstask_taskNumber}";
                    LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                }
            }
        }
        public static void OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
        {
            try
@@ -45,64 +127,14 @@
                //出库完成
                OutboundCompleteAction(taskWCSinfoRepository, client);  //压装出库口任务完成
                //空托入库申请
                InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
                //测试阶段注释的内容(后续需要使用的)
                //增加补丁.增加车存储中有问题.再写
                /*int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), "OutboundArea").ToString());
                if (logicValue == 4)
                {
                    string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), "OutboundArea").ToString();
                    if (!string.IsNullOrEmpty(rfidResult) && !"0".Equals(rfidResult))
                    {
                        Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == rfidResult
                        && (r.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString()
                        || r.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString()));
                        if (null != wcsInfo)
                        {
                            //提升机层
                            string hoisterLayer = client.ReadValue(CLineInfoDBName.R_Line_Layer.ToString(), hoisterResultNo).ToString();
                            string[] locationArray = wcsInfo.wcstask_startLocation.Split('-');
                            if (int.Parse(locationArray[0]).ToString() == hoisterLayer)
                            {
                                Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == wcsInfo.wcstask_barcode);
                                if (null == rgvTask)
                                {
                                    flag++;//避免刚完成重复写
                                    if (flag == 10)
                                    {
                                        WriteRGVState(client, false);
                                        WriteRGVState(client, true);
                                        flag = 0;
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    flag = 0;
                }*/
                //测试阶段注释的内容*/
                //查询出库至压装台的任务有多少进行中
                List<Dt_TaskWCSinfo> executingTask = taskWCSinfoRepository.Find(r => (r.wcstask_state != TaskState.TaskState_Assigned.ToString()
                 && (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint))));
                if (executingTask.Count < 4)
                //生成可下发的RGV任务,至缓存口
                List<Dt_TaskWCSinfo> executingTask = taskWCSinfoRepository.Find(r => r.wcstask_state != TaskState.TaskState_Assigned.ToString()
                 && endStationNo.Contains(r.wcstask_endPoint));
                // è¿™é‡Œè¦å†™ä¸€ä¸ªé€»è¾‘,就是我获取的任务,只有对应的站台为空,我才能下发,这样改的话,空托盘入库也要改
                if (executingTask.Count < 8)    //小于8,则可生成去这边的任务
                {
                    //直接将任务添加到AGV任务
                    Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client);
                    Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client);
                    if (null != outboundTask)
                    {
                        //查找是否有该托盘条码任务,如果没有则进行添加RGV任务
@@ -112,14 +144,9 @@
                        if (null == rgvInfo)
                        {
                            string rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
                            //空托盘回库
                            if (outboundTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
                                rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
                            //轴承出库
                            else if (outboundTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString())
                            if (outboundTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString())
                                || outboundTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
                                rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString();
                            rgvInfo = GetRGVTask(taskRGVinfoRepository, outboundTask, rgvTaskType);
                            taskRGVinfoRepository.Add(rgvInfo, true);
@@ -130,58 +157,23 @@
                    }
                }
                //提升机运行的任务
                Dt_TaskWCSinfo hisTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()
                && (OutboundStationLayerNo.Contains(r.wcstask_startPoint) || OutboundStationLayerNo.Contains(r.wcstask_endPoint)));
                if (null != hisTask)
                {
                    string[] locationArray = null;
                    //空托盘回库
                    if (hisTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
                    {
                        locationArray = hisTask.wcstask_endLocation.Split('-');
                        //RGV上报取货完成直接执行下一个
                        Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == hisTask.wcstask_taskNumber);
                        if (null != rgvTask && "2" == rgvTask.rgvtask_backup_2)
                        {
                            if (rgvTask.rgvtask_taskType.Contains(RGVTaskType.RgvTaskType_Inbound.ToString()))
                            {
                                Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
                                TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_RGV_Received.ToString());
                                if (null != inboundTask)
                                    ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
                                else
                                    OutboundRequestAction(taskWCSinfoRepository, client);
                                return;
                            }
                        }
                        string hoisterTaskNumber = client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), hoisterResultNo).ToString();
                        string hoisterBarcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), hoisterResultNo).ToString();
                        //避免提升机还没取就停止了
                        if (string.IsNullOrEmpty(hoisterTaskNumber) || string.IsNullOrEmpty(hoisterBarcode))
                            return;
                    }
                    //轴承出库
                    else if (hisTask.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) || hisTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
                    {
                        locationArray = hisTask.wcstask_startLocation.Split('-');
                    }
                }
                else
                {
                    Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
                    TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_RGV_Received.ToString());
                    if (null != inboundTask)
                        ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
                    else
                        OutboundRequestAction(taskWCSinfoRepository, client);   //提升机出库的流程
                }
                //缓存口(缓存架)至输送线
                OutboundCZ_PLC(taskWCSinfoRepository, taskRGVinfoRepository, client);
                //空托入库申请(生成了空托入库任务)
                InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
                //空托到缓存口(缓存架)
                ReInboundKTP(taskWCSinfoRepository, client);
                //空托入库口,生成RGV任务,进行入库
                RGV_InboundKTP(taskWCSinfoRepository, taskRGVinfoRepository, client);
            }
            catch (Exception ex)
            {
                WriteLog.Info("OutboundArea").Write($"{ DateTime.Now }出库区域调度失败:{ex.Message}", "OutboundArea");
                WriteLog.Info("OutboundArea").Write($"{DateTime.Now}出库区域调度失败:{ex.Message}", "OutboundArea");
            }
        }
        public static bool WriteRGVState(PLCClient client, bool value)
@@ -217,37 +209,43 @@
            List<Dt_TaskWCSinfo> listTask = taskWCSinfoRepository.Find(r => r.wcstask_state == TaskState.TaskState_Assigned.ToString() &&
          (r.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || r.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString())
          && OutboundStationLayerNo.Contains(r.wcstask_startPoint)).OrderBy(r => r.wcstask_createTime).ToList();//
          && endStationNo.Contains(r.wcstask_endPoint)).OrderBy(r => r.wcstask_createTime).ToList();//
            foreach (var item in listTask.GroupBy(r => r.wcstask_endPoint))
            {
                Dt_TaskWCSinfo wcsTask = item.OrderBy(r => r.wcstask_createTime).FirstOrDefault();
                if (null != wcsTask)
                {
                    //判断压装台是否有货
                    bool yzflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), wcsTask.wcstask_endPoint).ToString());
                    bool yznoflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), wcsTask.wcstask_endPoint).ToString());
                    if (!yzflag || yznoflag)
                    //判断压装台是否有货  ä¹Ÿå°±æ˜¯åˆ¤æ–­80101那边
                    bool yzflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), PlatformDict[wcsTask.wcstask_endPoint]).ToString());
                    bool yznoflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), PlatformDict[wcsTask.wcstask_endPoint]).ToString());
                    if (yzflag || !yznoflag)
                        continue;
                    //判断缓存架是否有货
                    //判断缓存架是否有货
                    bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), wcsTask.wcstask_startPoint).ToString());
                    bool noflag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_NoLoadSleep.ToString(), wcsTask.wcstask_startPoint).ToString());
                    if (!flag || noflag)
                    if (flag || !noflag)
                        continue;
                    //同一层有执行中的任务不添加
                    Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => (r.wcstask_startPoint == wcsTask.wcstask_startPoint || r.wcstask_endPoint == wcsTask.wcstask_endPoint)
                    && (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
                    //Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r =>
                    //(r.wcstask_startPoint == wcsTask.wcstask_startPoint || r.wcstask_endPoint == wcsTask.wcstask_endPoint)
                    //&& (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
                    //if (null != executingTask)
                    //    continue;
                    // è‚–ä½¼ å°†ä¸Šé¢ä¿®æ”¹æˆä¸‹é¢
                    Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r =>
                    (r.wcstask_startPoint == wcsTask.wcstask_startPoint)
                    && (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString()));
                    if (null != executingTask)
                        continue;
                    List<Dt_TaskWCSinfo> listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == wcsTask.wcstask_endPoint &&
                    r.wcstask_state != TaskState.TaskState_Assigned.ToString());
                    string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), wcsTask.wcstask_endPoint).ToString();
                    if (string.IsNullOrEmpty(barcode) || "0".Equals(barcode))
                    {
                        if (null != listTarget && listTarget.Count > 1)
@@ -270,48 +268,6 @@
                    }
                }
            }
            //foreach (var item in listTask)
            //{
            //    //同一层有执行中的任务不添加
            //    Dt_TaskWCSinfo executingTask = taskWCSinfoRepository.FindFirst(r => (r.wcstask_startPoint == item.wcstask_startPoint || r.wcstask_endPoint == item.wcstask_endPoint)
            //    && (r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
            //    if (null != executingTask)
            //        continue;
            //    //同一目标位置的不能同时出
            //    //  Dt_TaskWCSinfo endTask = taskWCSinfoRepository.FindFirst(r => r.wcstask_endPoint == item.wcstask_endPoint &&
            //    //(r.wcstask_state == TaskState.TaskState_RGV_Received.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()));
            //    //  if (null != endTask)
            //    //      continue;
            //    List<Dt_TaskWCSinfo> listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == item.wcstask_endPoint &&
            //    r.wcstask_state != TaskState.TaskState_Assigned.ToString());
            //    string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), item.wcstask_endPoint).ToString();
            //    if (string.IsNullOrEmpty(barcode) || "0".Equals(barcode))
            //    {
            //        if (null != listTarget && listTarget.Count > 1)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
            //            break;
            //        }
            //    }
            //    else
            //    {
            //        if (null != listTarget && listTarget.Count > 0)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
            //            break;
            //        }
            //    }
            //}
            return wcsInfo;
        }
@@ -333,70 +289,204 @@
            return rgvInfo;
        }
        // åªç”¨ä¸€ä¸ªå­—典:Key=托盘号,Value=Tuple<锁对象, æœ€åŽä½¿ç”¨æ—¶é—´>
        // Tuple<object, DateTime>:Item1=锁对象,Item2=最后使用时间
        private static readonly Dictionary<string, Tuple<object, DateTime>> BarcodeLockDict = new Dictionary<string, Tuple<object, DateTime>>();
        private static readonly object GlobalLock = new object(); // ä¿æŠ¤å­—典的全局锁
        private const int ExpireMinutes = 1; // è¿‡æœŸæ—¶é—´ï¼š1分钟
        /// <summary>
        /// èŽ·å–æ‰˜ç›˜å·ä¸“å±žé”ï¼ˆå•å­—å…¸+1分钟过期+懒清理)
        /// </summary>
        private static object GetBarcodeLock(string barcode)
        {
            lock (GlobalLock) // å…¨å±€é”ä¿æŠ¤å­—典操作
            {
                // ========== ç¬¬ä¸€æ­¥ï¼šæ‡’清理(每次获取锁时,清理超过1分钟的闲置托盘号) ==========
                var expiredBarcodes = BarcodeLockDict
                    .Where(kv => (DateTime.Now - kv.Value.Item2).TotalMinutes > ExpireMinutes)
                    .Select(kv => kv.Key)
                    .ToList();
                foreach (var expiredBarcode in expiredBarcodes)
                {
                    BarcodeLockDict.Remove(expiredBarcode);
                }
                // ========== ç¬¬äºŒæ­¥ï¼šå¤„理当前托盘号的锁和时间 ==========
                if (!BarcodeLockDict.ContainsKey(barcode))
                {
                    // æ— è¯¥æ‰˜ç›˜å·ï¼šæ–°å¢žé”å¯¹è±¡+当前时间
                    BarcodeLockDict[barcode] = Tuple.Create(new object(), DateTime.Now);
                }
                // è¿”回当前托盘号的锁对象
                return BarcodeLockDict[barcode].Item1;
            }
        }
        public static void InboundRequestAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
        {
            try
            {
                string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                int R_Line_PLCDispatch = int.Parse(client.ReadValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo).ToString());
                bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString());
                if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load)
                if (R_Line_PLCDispatch == 1 && load)
                {
                    Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString());
                    if (null == wcsInfo)
                    {
                        //有出库任务,不能下发
                        Dt_TaskRGVinfo executingRgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_areaCode == "OutboundArea"
                        && OutboundStationLayerNo.Contains(r.rgvtask_endNode));
                        if (null != executingRgvTask)
                            return;
                    string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                        //当前存在未完成的任务   å…¥åº“
                        wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint));
                        if (null != wcsInfo)
                    if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode))
                    {
                        if (int.Parse(barcode) < 800000 || int.Parse(barcode) > 890000)
                        {
                            Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == wcsInfo.wcstask_taskNumber);
                            if (null != rgvTask)
                            return;
                        }
                        object barcodeLock = GetBarcodeLock(barcode);
                        lock (barcodeLock)
                        {
                            Dt_TaskWCSinfo IsTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == barcode
                            && (x.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString() || x.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString())
                            && (x.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString() || x.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString())
                            && (endStationNo.Contains(x.wcstask_endPoint)));
                            if (IsTask != null)
                            {
                                //取货完成
                                if ("2" != rgvTask.rgvtask_backup_2)
                                    return;
                                // è¿™é‡Œè¦åŠ ä¸€ä¸ªåˆ¤æ–­ï¼Œå¦‚æžœæ‹¿å›žæ¥çš„ç©ºæ‰˜ç›˜æ˜¯800001,但是我有一条这个托盘的任务是800001还没有到指定的压装台,所以我要完成这个任务
                                // åœ¨æ­¤å®Œæˆè¯¥ç©ºæ‰˜å‡ºåº“任务
                                WebResponseContent content = taskWCSinfoRepository.DbContextBeginTransaction(() =>
                                {
                                    //上报WMS任务完成
                                    content = WMSApi.TellWmsTaskFinished(IsTask.wcstask_barcode,IsTask.wcstask_backUp_2);
                                    if (content.Status)
                                    {
                                        //移动任务到历史表
                                        Dt_TaskWCSinfo_HtyRepository taskWCSinfo_HtyRepository = new Dt_TaskWCSinfo_HtyRepository(taskWCSinfoRepository.DbContext);
                                        IsTask.wcstask_state = TaskState.TaskState_Finished.ToString();
                                        CommonFunction.AddWcsTaskToHistory(IsTask, taskWCSinfoRepository, taskWCSinfo_HtyRepository);
                                    }
                                    else
                                        throw new Exception($"{DateTime.Now}上报WMS任务完成出错,原因:【{content.Message}】");
                                    return content;
                                });
                                string str = string.Empty;
                                if (content.Status)
                                    str = $" {DateTime.Now}上报WMS出库完成成功,【手动干扰出库没有到达指定压装台点位,手动拿回90101】【TaskState_ConveyorLineExecuting】,托盘号:{IsTask.wcstask_barcode},任务号:{IsTask.wcstask_taskNumber}";
                                else
                                    str = $" {DateTime.Now}上报WMS出库完成失败【手动干扰出库没有到达指定压装台点位,手动拿回90101】【TaskState_ConveyorLineExecuting】,托盘号:{IsTask.wcstask_barcode},任务号:{IsTask.wcstask_taskNumber}";
                                WriteLog.Info(IsTask.wcstask_endPoint).Write(str, IsTask.wcstask_endPoint);
                                LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                            }
                            Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode);
                            if (null == wcsInfo)
                            {
                                //获取车轴出库
                                List<Dt_TaskWCSinfo> executingTask = taskWCSinfoRepository.Find(r => (r.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString()) ||
                                    r.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString())) && endStationNo.Contains(r.wcstask_endPoint));
                                //获取有多少条出库的任务
                                int LineExecucount = executingTask.Count(x => x.wcstask_state == TaskState.TaskState_Box_Out_Line_Executing.ToString()
                                || x.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString());
                                if (LineExecucount >= 8)
                                {
                                    //判断是否有对应层的出库任务,
                                    //申请入库任务
                                    WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
                                    if (content.Status)
                                    {
                                        //WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
                                        //wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
                                        //taskWCSinfoRepository.Add(wcsInfo, true);
                                        //client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 2);
                                        try
                                        {
                                            WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
                                            wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
                                            taskWCSinfoRepository.Add(wcsInfo, true);
                                        }
                                        catch (Exception)
                                        {
                                            string str = $"这里可能是出现了并发的情况托盘码 åœ¨æ·»åŠ çš„æ—¶å€™æ‹¦æˆªçš„ã€{wcsInfo.wcstask_barcode}】" +
                                                         $"任务号【{wcsInfo.wcstask_taskNumber}】,任务状态:【{wcsInfo.wcstask_state}】";
                                            LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                                            //throw;
                                        }
                                    }
                                    else
                                    {
                                        if (content.Message.Contains("当前托盘号已存在库里"))
                                        {
                                            client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 4);
                                        }
                                        throw new Exception("入库申请失败:" + content.Message);
                                    }
                                }
                                else
                                {
                                    //判断有多少条在缓存架的
                                    int RGV_Finishedcount = executingTask.Count(x =>
                                    x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
                                    && x.wcstask_state != TaskState.TaskState_Empty_Out_Line_Executing.ToString()
                                    && x.wcstask_state != TaskState.TaskState_Assigned.ToString());
                                    if (RGV_Finishedcount == 0)
                                    {
                                        // æ ¸å¿ƒï¼šèŽ·å–å½“å‰æ‰˜ç›˜å·çš„ä¸“å±žé”ï¼ŒåŒä¸€æ‰˜ç›˜å·ä¸²è¡Œå¤„ç†
                                        //申请入库任务
                                        WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
                                        if (content.Status)
                                        {
                                            try
                                            {
                                                WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
                                                wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
                                                taskWCSinfoRepository.Add(wcsInfo, true);
                                            }
                                            catch (Exception)
                                            {
                                                string str = $"这里可能是出现了并发的情况托盘码,在添加的时候拦截的【{wcsInfo.wcstask_barcode}】" +
                                                             $"任务号【{wcsInfo.wcstask_taskNumber}】,任务状态:【{wcsInfo.wcstask_state}】";
                                                LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                                                //throw;
                                            }
                                        }
                                        else
                                        {
                                            if (content.Message.Contains("当前托盘号已存在库里"))
                                            {
                                                client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 4);
                                            }
                                            else if (content.Message.Contains("暂无货位可分配"))
                                            {
                                            }
                                            else
                                            {
                                                throw new Exception("入库申请失败:" + content.Message);
                                            }
                                        }
                                    }
                                }
                            }
                            else
                                return;
                        }
                        //申请入库任务
                        WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
                        if (content.Status)
                        {
                            WmsTaskInfo wmsTask = JsonConvert.DeserializeObject<WmsTaskInfo>(content.Data.ToString());
                            wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository);
                            string rgvTaskType = string.Empty;
                            if (wcsInfo.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Inbound.ToString()))
                                rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
                            //轴承出库
                            else if (wcsInfo.wcstask_type.Equals(TaskType.TaskType_Box_Pallet_Outbound.ToString())
                                || wcsInfo.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString()))
                                rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString();
                            taskWCSinfoRepository.DbContextBeginTransaction(() =>
                            {
                                Dt_TaskRGVinfo rgvInfo = GetRGVTask(taskRGVinfoRepository, wcsInfo, rgvTaskType);
                                taskRGVinfoRepository.Add(rgvInfo, true);
                                wcsInfo.wcstask_state = TaskState.TaskState_RGV_Received.ToString();
                                taskWCSinfoRepository.Add(wcsInfo, true);
                                return content.OK();
                            });
                                string str = $"这里可能是出现了并发的情况托盘码 åœ¨æŸ¥è¯¢çš„æ—¶å€™æ‹¦æˆªçš„【{wcsInfo.wcstask_barcode}】" +
                                        $"任务号【{wcsInfo.wcstask_taskNumber}】,任务状态:【{wcsInfo.wcstask_state}】";
                                LogRecord.WriteLog(LogEnum.Errer, str.ToString());
                            }
                        }
                        else
                            throw new Exception("入库申请失败:" + content.Message);
                    }
                    else
                    {
                        throw new Exception("入库申请失败:读取到的空托盘条码为空,读取内容:" + barcode);
                    }
                }
            }
            catch (Exception ex)
            {
                client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 3);
                Console.Out.WriteLine(DateTime.Now + ex.Message);
            }
        }