xiaojiao
2026-01-12 c3b60d865c3457c35054446e81b352e93e00a696
ÏîÄ¿´úÂë/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/OutboundAreaDispathAction.cs
@@ -8,6 +8,7 @@
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;
@@ -26,7 +27,9 @@
        /// å‡ºåº“的层
        /// </summary>
        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";
@@ -39,6 +42,14 @@
        /// <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 OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
        {
            try
@@ -49,7 +60,8 @@
                //生成可下发的RGV任务,至缓存口
                List<Dt_TaskWCSinfo> executingTask = taskWCSinfoRepository.Find(r => r.wcstask_state != TaskState.TaskState_Assigned.ToString()
                 && endStationNo.Contains(r.wcstask_endPoint));
                if (executingTask.Count < 4)    //小于4,则可生成去这边的任务
                // è¿™é‡Œè¦å†™ä¸€ä¸ªé€»è¾‘,就是我获取的任务,只有对应的站台为空,我才能下发,这样改的话,空托盘入库也要改
                if (executingTask.Count < 8)    //小于8,则可生成去这边的任务
                {
                    //直接将任务添加到AGV任务
                    Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client);
@@ -76,13 +88,13 @@
                    }
                }
                //缓存口至输送线
                //缓存口(缓存架)至输送线
                OutboundCZ_PLC(taskWCSinfoRepository, taskRGVinfoRepository, client);
                
                //空托入库申请(生成了空托入库任务)
                InboundRequestAction(taskWCSinfoRepository, taskRGVinfoRepository, client);
                //空托到缓存口
                //空托到缓存口(缓存架)
                ReInboundKTP(taskWCSinfoRepository, client);
                //空托入库口,生成RGV任务,进行入库
@@ -135,9 +147,9 @@
                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());
                    //判断压装台是否有货  ä¹Ÿå°±æ˜¯åˆ¤æ–­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;
@@ -147,82 +159,48 @@
                    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()));
                    if (null != executingTask)
                        continue;
                    List<Dt_TaskWCSinfo> listTarget = taskWCSinfoRepository.Find(r => r.wcstask_endPoint == wcsTask.wcstask_endPoint &&
                    r.wcstask_state != TaskState.TaskState_Assigned.ToString());
                    if(listTarget != null && listTarget.Count >= 2)
                    {
                        continue;
                    }
                    else
                    {
                        wcsInfo = wcsTask;
                    }
                    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)
                            continue;
                        else
                        {
                            wcsInfo = wcsTask;
                            break;
                        }
                    }
                    else
                    {
                        if (null != listTarget && listTarget.Count > 0)
                            continue;
                        else
                        {
                            wcsInfo = wcsTask;
                            break;
                        }
                    }
                }
            }
            //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 > 2)
                    //        continue;
                    //    else
                    //    {
                    //        wcsInfo = wcsTask;
                    //        break;
                    //    }
                    //}
                    //else
            //    {
            //        if (null != listTarget && listTarget.Count > 1)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
                    //        wcsInfo = wcsTask;
            //            break;
            //        }
            //    }
            //    else
            //    {
            //        if (null != listTarget && listTarget.Count > 0)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
            //            break;
            //        }
            //    }
            //}
                }
            }
            return wcsInfo;
        }
@@ -248,12 +226,41 @@
        {
            try
            {
                string barcode = "901010";
                //string barcode = "901010";
                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 (R_Line_PLCDispatch ==1 && load)
                {
                    //string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                    string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                    // è¿™é‡Œè¦åŠ ä¸€ä¸ªåˆ¤æ–­ï¼Œå¦‚æžœæ‹¿å›žæ¥çš„ç©ºæ‰˜ç›˜æ˜¯800001,但是我有一条这个托盘的任务是800001还没有到指定的压装台,所以我要完成这个任务
                    Dt_TaskWCSinfo IsTask = taskWCSinfoRepository.FindFirst(x => x.wcstask_barcode == barcode && x.wcstask_state == TaskState.TaskState_Empty_Out_Line_Executing.ToString());
                    if (IsTask != null)
                    {
                        //在此完成该空托出库任务
                        WebResponseContent content = taskWCSinfoRepository.DbContextBeginTransaction(() =>
                        {
                            //上报WMS任务完成
                            content = WMSApi.TellWmsTaskFinished(IsTask.wcstask_barcode);
                            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);
                    }
                    
                    if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode))
                    {
@@ -265,8 +272,8 @@
                                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());
                            if (LineExecucount >= 4)
                            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)
                            {
                                //判断是否有对应层的出库任务,
                                //申请入库任务
@@ -276,18 +283,18 @@
                                    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);
                                    //client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 2);
                                }
                                else
                                {
                                    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)
                                {
@@ -298,13 +305,12 @@
                                        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);
                                        //client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 2);
                                    }
                                    else
                                    {
                                        throw new Exception("入库申请失败:" + content.Message);
                                    }
                                }
                            }
                        }