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; using WIDESEA_Services; using WIDESEA_Services.IRepositories; using WIDESEA_Services.Repositories; using WIDESEA_Services.Services; using WIDESEA_WCS.WCSClient; namespace WIDESEA_WCS.Jobs.ConveyorLine.OutboundArea { public partial class OutboundAreaDispatch { /// /// 出库区空托盘回库 /// /// /// //public static void ReInboundRequestStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client, string barcode) //{ // try // { // //查询任务 // Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()); // if (null == wcsInfo) // { // //当前存在未完成的任务 // wcsInfo = taskWCSinfoRepository.FindFirst(r => OutboundStationLayerNo.Contains(r.wcstask_endPoint)); // if (null != wcsInfo) // return; // //申请入库任务 // WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode); // if (content.Status) // { // WmsTaskInfo wmsTask = JsonConvert.DeserializeObject(content.Data.ToString()); // wcsInfo = CommonFunction.AddWCSEmptyInboundTask(wmsTask, taskWCSinfoRepository); // taskWCSinfoRepository.Add(wcsInfo, true); // } // else // throw new Exception("入库申请失败:" + content.Message); // } // string lineCode = "ReIboundArea"; // if (null != wcsInfo) // { // //读取逻辑控制值 // int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); // if ((logicValue == 1 || logicValue == 2)) // { // WriteTaskInfo.WriteTaskInfoAction(wcsInfo, client, lineCode); // } // string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); // if (!wcsInfo.wcstask_barcode.Equals(rfidResult)) // return; // logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); // //说明站台已经收到任务数据,等待WCS的启动指令 // if (logicValue == 3) // { // //启动任务 // client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1); // } // else if (logicValue == 4 || logicValue == 5) // { // //提升机执行中 // if (wcsInfo.wcstask_state == TaskState.TaskState_HoisterExecuting.ToString()) // return; // if (!WriteRGVState(client, true)) // return; // wcsInfo.wcstask_state = TaskState.TaskState_HoisterExecuting.ToString(); // wcsInfo.wcstask_dispatcherTime = DateTime.Now; // taskWCSinfoRepository.Update(wcsInfo, true); // } // } // } // catch (Exception ex) // { // WriteLog.Info(ReInboundRequestStationNo).Write($"{ DateTime.Now }回库站台调度失败:{ex.Message}", ReInboundRequestStationNo); // } //} //获取任务,生成入库任务 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 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()); if (LineExecucount >= 4) { //判断是否有对应层的出库任务, 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())); 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_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())); 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) { try { string lineCode = "ReIboundArea"; if (null != wcsInfo) { //读取逻辑控制值 int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); if ((logicValue == 1 || logicValue == 2)) { WriteTaskInfo.WriteTaskInfoAction(wcsInfo, client, lineCode); } string rfidResult = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); if (!wcsInfo.wcstask_barcode.Equals(rfidResult)) return; logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); //说明站台已经收到任务数据,等待WCS的启动指令 if (logicValue == 3) { //启动任务 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_Empty_In_PLC_Finished.ToString()) return; wcsInfo.wcstask_state = TaskState.TaskState_Empty_In_PLC_Finished.ToString(); wcsInfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(wcsInfo, true); } } } catch (Exception ex) { WriteLog.Info(ReInboundRequestStationNo).Write($"{ DateTime.Now }回库站台调度失败:{ex.Message}", ReInboundRequestStationNo); } } } }