xiaojiao
2026-01-12 c3b60d865c3457c35054446e81b352e93e00a696
ÏîÄ¿´úÂë/WCS/WIDESEA_WCSServer/WIDESEA_WCS/Jobs/ConveyorLine/OutboundArea/ReInboundRequestAction.cs
@@ -1,11 +1,14 @@
using HslCommunication;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.Tools;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
@@ -14,6 +17,7 @@
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_WCS.WCSClient;
using static System.Collections.Specialized.BitVector32;
namespace WIDESEA_WCS.Jobs.ConveyorLine.OutboundArea
{
@@ -87,6 +91,123 @@
        //    }
        //}
        //获取任务,生成入库任务
        public static void RGV_InboundKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client)
        {
            Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.Find(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint) && r.wcstask_type ==
                                TaskType.TaskType_Empty_Pallet_Inbound.ToString() && r.wcstask_state == TaskState.TaskState_Empty_In_PLC_Finished.ToString()).OrderBy(x => x.wcstask_dispatcherTime).FirstOrDefault();
            if (inboundTask != null)
            {
                //判断是否有货,有托盘条码
                string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), inboundTask.wcstask_startLocation).ToString();
                bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), inboundTask.wcstask_startLocation).ToString());
                if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load && inboundTask.wcstask_barcode== barcode)
                {
                    //查找是否有该托盘条码任务,如果没有则进行添加RGV任务
                    Dt_TaskRGVinfo rgvInfo = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == inboundTask.wcstask_barcode
                && r.rgvtask_wcsTaskNumber == inboundTask.wcstask_taskNumber);
                    if (null == rgvInfo)
                    {
                        string rgvTaskType = RGVTaskType.RgvTaskType_Inbound.ToString();
                        rgvInfo = GetRGVTask(taskRGVinfoRepository, inboundTask, rgvTaskType);
                        taskRGVinfoRepository.Add(rgvInfo, true);
                        inboundTask.wcstask_state = TaskState.TaskState_RGV_Received.ToString();
                        taskWCSinfoRepository.Update(inboundTask, x => x.wcstask_state, true);
                    }
                }
            }
        }
        //空托盘入库任务下发判断
        public static void ReInboundKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client)
        {
            try
            {
                //获取是否有货
                bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString());
                string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString();
                if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load)
                {
                    //根据对应的托盘条码进行去下发任务
                    Dt_TaskWCSinfo inboundTask = taskWCSinfoRepository.Find(r => r.wcstask_barcode == barcode)
                    .Where(r => r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()
                    && (r.wcstask_state == TaskState.TaskState_Assigned.ToString() || r.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())).FirstOrDefault();
                    if(inboundTask != null)
                    {
                        if(inboundTask.wcstask_state == TaskState.TaskState_Assigned.ToString())
                        {
                            ReInAssignedKTP(taskWCSinfoRepository, client, inboundTask);
                        }
                        else
                        {
                            ReInboundRequestStationAction(taskWCSinfoRepository, client, inboundTask);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog.Info(ReInboundRequestStationNo).Write($"{DateTime.Now}回库站台任务下发,调度失败:{ex.Message}", ReInboundRequestStationNo);
                throw;
            }
        }
        public static void ReInAssignedKTP(IDt_TaskWCSinfoRepository taskWCSinfoRepository,  PLCClient client, Dt_TaskWCSinfo wcsInfo)
        {
            try
            {
                //获取车轴出库
                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)
                {
                    //判断是否有对应层的出库任务,
                    int Assrscount = executingTask.Count(x => x.wcstask_endLocation == wcsInfo.wcstask_startLocation
                    && (x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
                    || x.wcstask_state == TaskState.TaskState_Assigned.ToString()
                    || x.wcstask_state != TaskState.TaskState_Empty_Out_Line_Executing.ToString()));
                    if (Assrscount == 0)
                    {
                        ReInboundRequestStationAction(taskWCSinfoRepository, client, wcsInfo);
                    }
                }
                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)
                    {
                        //可以进行判断下发入库任务
                        int Assrscount = executingTask.Count(x => x.wcstask_endLocation == wcsInfo.wcstask_startLocation && (x.wcstask_state != TaskState.TaskState_Box_Out_Line_Executing.ToString()
                        || x.wcstask_state == TaskState.TaskState_Assigned.ToString()) && x.wcstask_state != TaskState.TaskState_Empty_Out_Line_Executing.ToString());
                        if (Assrscount == 0)
                        {
                            ReInboundRequestStationAction(taskWCSinfoRepository, client, wcsInfo);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog.Info(ReInboundRequestStationNo).Write($"{DateTime.Now}回库站台任务下发,调度失败:{ex.Message}", ReInboundRequestStationNo);
                throw;
            }
        }
        public static void ReInboundRequestStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client, Dt_TaskWCSinfo wcsInfo)
@@ -100,7 +221,11 @@
                    int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString());
                    if ((logicValue == 1 || logicValue == 2))
                    {
                        client.WriteValue(CLineInfoDBName.R_Line_TargetPosition.ToString(), ReInboundRequestStationNo, wcsInfo.wcstask_endPoint);
                        client.WriteValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), ReInboundRequestStationNo, wcsInfo.wcstask_taskNumber);
                        WriteTaskInfo.WriteTaskInfoAction(wcsInfo, client, lineCode);
                        client.WriteValue(CLineInfoDBName.W_Line_PLCDispatch.ToString(), ReInboundRequestStationNo, 2);
                    }
                    string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString();
                    if (!wcsInfo.wcstask_barcode.Equals(rfidResult))
@@ -110,14 +235,22 @@
                    if (logicValue == 3)
                    {
                        //启动任务
                        client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);
                        bool logicbool= client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1);
                        if (logicbool)
                        {
                            if (wcsInfo.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())
                                return;
                            wcsInfo.wcstask_state = TaskState.TaskState_HoisterExecuting.ToString();
                            wcsInfo.wcstask_dispatcherTime = DateTime.Now;
                            taskWCSinfoRepository.Update(wcsInfo, true);
                        }
                    }
                    else if (logicValue == 4 || logicValue == 5)
                    {
                        //提升机执行中
                        if (wcsInfo.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString())
                        if (wcsInfo.wcstask_state == TaskState.TaskState_Empty_In_PLC_Finished.ToString())
                            return;
                        wcsInfo.wcstask_state = TaskState.TaskState_HoisterExecuting.ToString();
                        wcsInfo.wcstask_state = TaskState.TaskState_Empty_In_PLC_Finished.ToString();
                        wcsInfo.wcstask_dispatcherTime = DateTime.Now;
                        taskWCSinfoRepository.Update(wcsInfo, true);
                    }