xiaojiao
2026-01-12 c3b60d865c3457c35054446e81b352e93e00a696
ÏîÄ¿´úÂë/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,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
@@ -45,64 +57,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,11 +74,7 @@
                        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();
@@ -130,54 +88,19 @@
                    }
                }
                //提升机运行的任务
                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)
            {
@@ -224,18 +147,17 @@
                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 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)
@@ -243,75 +165,42 @@
                    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(listTarget != null && listTarget.Count >= 2)
                    {
                        if (null != listTarget && listTarget.Count > 1)
                            continue;
                        else
                        {
                            wcsInfo = wcsTask;
                            break;
                        }
                        continue;
                    }
                    else
                    {
                        if (null != listTarget && listTarget.Count > 0)
                            continue;
                        else
                        {
                            wcsInfo = wcsTask;
                            break;
                        }
                        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 > 2)
                    //        continue;
                    //    else
                    //    {
                    //        wcsInfo = wcsTask;
                    //        break;
                    //    }
                    //}
                    //else
                    //{
                    //    if (null != listTarget && listTarget.Count > 1)
                    //        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 > 1)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
            //            break;
            //        }
            //    }
            //    else
            //    {
            //        if (null != listTarget && listTarget.Count > 0)
            //            continue;
            //        else
            //        {
            //            wcsInfo = item;
            //            break;
            //        }
            //    }
            //}
            return wcsInfo;
        }
@@ -337,66 +226,104 @@
        {
            try
            {
                string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                //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 (!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)
                    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)
                    {
                        //有出库任务,不能下发
                        Dt_TaskRGVinfo executingRgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_areaCode == "OutboundArea"
                        && OutboundStationLayerNo.Contains(r.rgvtask_endNode));
                        if (null != executingRgvTask)
                            return;
                        //当前存在未完成的任务   å…¥åº“
                        wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint));
                        if (null != wcsInfo)
                        //在此完成该空托出库任务
                        WebResponseContent content = taskWCSinfoRepository.DbContextBeginTransaction(() =>
                        {
                            Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == wcsInfo.wcstask_taskNumber);
                            if (null != rgvTask)
                            //上报WMS任务完成
                            content = WMSApi.TellWmsTaskFinished(IsTask.wcstask_barcode);
                            if (content.Status)
                            {
                                //取货完成
                                if ("2" != rgvTask.rgvtask_backup_2)
                                    return;
                                //移动任务到历史表
                                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
                                return;
                        }
                                throw new Exception($"{DateTime.Now}上报WMS任务完成出错,原因:【{content.Message}】");
                        //申请入库任务
                        WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode);
                            return content;
                        });
                        string str = string.Empty;
                        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();
                            });
                        }
                            str = $" {DateTime.Now}上报WMS出库完成成功,【手动干扰出库没有到达指定压装台点位,手动拿回90101】【TaskState_ConveyorLineExecuting】,托盘号:{IsTask.wcstask_barcode},任务号:{IsTask.wcstask_taskNumber}";
                        else
                            throw new Exception("入库申请失败:" + content.Message);
                            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))
                    {
                        Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString());
                        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);
                                }
                                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)
                                {
                                    //申请入库任务
                                    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);
                                    }
                                    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);
            }
        }