using HslCommunication; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using WIDESEA_Common; 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.InboundArea { public partial class InboundAreaDispatch { public static string[] InboundStationNo = new string[] { "50301", "50302", "50303", "50304", "50305", "50306", "50307"}; public static void InboundStationAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client) { foreach (var item in InboundStationNo) { //bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); //if (!flag) // continue; InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item); MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O"); } } public static void InboundStationAction_YJ(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, bool leftState) { if (leftState) { foreach (var item in OutboundStationNo) { //bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); //if (!flag) // continue; InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item); MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O_YJ");// } } else { foreach (var item in InboundStationNo) { //bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), item).ToString()); //if (!flag) // continue; InboundLineTaskComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item); MeasureOutboundStationComplete(taskWCSinfoRepository, taskRGVinfoRepository, client, item, "Measure_O");//_YJ } } } /// /// 入库任务到达线体完成 /// /// /// /// private static void InboundLineTaskComplete(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station) { try { int taskNumber = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_TaskNumber.ToString(), station).ToString()); string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), station).ToString(); bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), station).ToString()); if (!flag) return; Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_taskNumber == taskNumber && x.wcstask_barcode == barcode); if (wcsInfo != null && (wcsInfo.wcstask_state != TaskState.TaskState_ConveyorLineFinish.ToString() && wcsInfo.wcstask_state != TaskState.TaskState_RGV_Received.ToString())) { var currentdt_taskinfo = taskWCSinfoRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (currentdt_taskinfo != null) currentdt_taskinfo.State = EntityState.Detached; //检查任务的目的货位的层数是否和站台层数一致 string toLayer = wcsInfo.wcstask_endLocation.Substring(0, 2); string stationLayer = station.Substring(3, 2); if (toLayer == stationLayer) { string state = string.Empty; //空托和实托的入库 if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Inbound.ToString() || wcsInfo.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString() || wcsInfo.wcstask_type == TaskType.TaskType_ErrorCheckBackIn.ToString() || wcsInfo.wcstask_type == TaskType.TaskType_CheckBackIn.ToString() ) state = TaskState.TaskState_ConveyorLineFinish.ToString(); //测量回库 else if (wcsInfo.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString() && wcsInfo.wcstask_state == TaskState.TaskState_Measure_Back_Line_Executing.ToString()) state = TaskState.TaskState_Measure_Back_Line_Finished.ToString(); WebResponseContent content = WMSApi.PostTaskStateToWMS(barcode, state); if (content.Status) { Dt_TaskRGVinfo _tmpRgvInfo = taskRGVinfoRepository.FindFirst(x => x.rgvtask_barCode == wcsInfo.wcstask_barcode); if (_tmpRgvInfo == null) { //在此生成RGV任务 Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo(); rgvInfo.rgvtask_taskId = GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString(); rgvInfo.rgvtask_taskType = RGVTaskType.RgvTaskType_Inbound.ToString(); rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString(); rgvInfo.rgvtask_priorityCode = wcsInfo.wcstask_grade.ToString(); rgvInfo.rgvtask_startNode = station; rgvInfo.rgvtask_endNode = wcsInfo.wcstask_endLocation; rgvInfo.rgvtask_wcsTaskNumber = wcsInfo.wcstask_taskNumber; rgvInfo.rgvtask_barCode = wcsInfo.wcstask_barcode; rgvInfo.rgvtask_msgTime = DateTime.Now; rgvInfo.rgvtask_areaCode = "InboundArea"; taskRGVinfoRepository.Add(rgvInfo, true); } wcsInfo.wcstask_state = state; wcsInfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(wcsInfo, true); } } else { string str = $"{DateTime.Now}托盘号:{barcode},入库口检查失败:任务层{toLayer},站台层{stationLayer}"; WriteLog.Info(station).Write(str, station); } } } catch (Exception ex) { WriteLog.Info(station).Write($"{ DateTime.Now }入库任务到达线体完成调度失败:{ex.Message}", station); } } /// /// 出库测量任务,当穿梭车放货后的处理逻辑 /// /// /// /// /// private static void MeasureOutboundStationComplete(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client, string station, string lineCode) { try { var currentdt_taskinfo = taskWCSinfoRepository.DbContext.ChangeTracker.Entries().FirstOrDefault(); if (currentdt_taskinfo != null) currentdt_taskinfo.State = EntityState.Detached; //找对应任务类型:TaskType_Box_Pallet_Measure_Out,并且状态为TaskState_RGV_Finished的任务 Dt_TaskWCSinfo taskWCSinfo = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() && x.wcstask_state == TaskState.TaskState_RGV_Finished.ToString() && x.wcstask_startPoint.Contains(station)); if (null == taskWCSinfo) { //bool flag = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), station).ToString()); //if (flag) //{ // Dt_TaskWCSinfo executing = taskWCSinfoRepository.FindFirst(x => x.wcstask_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() && // x.wcstask_state == TaskState.TaskState_Measure_Out_Line_Executing.ToString() && x.wcstask_startPoint.Contains(station)); //} return; } //string lineCode = "Measure_O"; int taskNumber = taskWCSinfo.wcstask_taskNumber; //查看线体状态,准备给线体下发任务信息 读取逻辑控制值 int logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); //说明工位在等待调度,准备下发任务 if (logicValue == 1 || logicValue == 2) { if (!taskWCSinfo.wcstask_state.Contains("Executing")) WriteTaskInfo.WriteTaskInfoAction(taskWCSinfo, client, lineCode); } string barcode = client.ReadValue(CLineInfoDBName.W_Line_Barcode.ToString(), lineCode).ToString(); if (!taskWCSinfo.wcstask_barcode.Equals(barcode)) return; logicValue = int.Parse(client.ReadValue(CLineInfoDBName.R_Line_Logic.ToString(), lineCode).ToString()); if (logicValue == 3) { //启动任务 client.WriteValue(CLineInfoDBName.W_Line_Logic.ToString(), lineCode, 1); } else if (logicValue == 4 || logicValue == 5) { if (taskWCSinfo.wcstask_state == TaskState.TaskState_ConveyorLineExecuting.ToString()) return; string str = string.Empty; //启动成功后,在此更新任务状态、上报WMS任务状态 WebResponseContent content = WMSApi.PostTaskStateToWMS(taskWCSinfo.wcstask_barcode, TaskState.TaskState_Measure_Out_Line_Executing.ToString()); if (content.Status) { taskWCSinfo.wcstask_state = TaskState.TaskState_Measure_Out_Line_Executing.ToString(); taskWCSinfo.wcstask_dispatcherTime = DateTime.Now; taskWCSinfoRepository.Update(taskWCSinfo, true); str = $" { DateTime.Now }上报WMS更新任务状态成功【TaskState_Measure_Out_Line_Executing】,托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber}"; } else str = $" { DateTime.Now }上报WMS更新任务状态失败【TaskState_Measure_Out_Line_Executing】,托盘号:{taskWCSinfo.wcstask_barcode},任务号:{ taskWCSinfo.wcstask_taskNumber},原因:{content.Message}"; WriteLog.Info(station).Write(str, station); } } catch (Exception ex) { WriteLog.Info(station).Write($"{ DateTime.Now }测量出库起始站台调度失败:{ex.Message}", station); } } } }