using HslCommunication; using Newtonsoft.Json; 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 { /// /// 出库的层 /// private static List OutboundStationLayerNo = new List() { "60100", "60200", "60300", "60400", "60500", "60600", "60700"}; //入库托盘申请站台 private static string ReInboundRequestStationNo = "90101"; //出库站台交互 //private static string OutboundStationNo = "90201"; //提升机编号 private static string hoisterResultNo = "90100"; /// /// 出库区调度 /// /// /// public static string currentModel = "Inbound"; static int flag = 0; public static void OutboundAreaDispathAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client) { try { //出库完成 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 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) { //直接将任务添加到AGV任务 Dt_TaskWCSinfo outboundTask = GetOutboundTask(taskWCSinfoRepository, client); if (null != outboundTask) { //查找是否有该托盘条码任务,如果没有则进行添加RGV任务 Dt_TaskRGVinfo rgvInfo = taskRGVinfoRepository.FindFirst(r => r.rgvtask_barCode == outboundTask.wcstask_barcode && r.rgvtask_wcsTaskNumber == outboundTask.wcstask_taskNumber); 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()) || outboundTask.wcstask_type.Equals(TaskType.TaskType_Empty_Pallet_Outbound.ToString())) rgvTaskType = RGVTaskType.RgvTaskType_Outbound.ToString(); rgvInfo = GetRGVTask(taskRGVinfoRepository, outboundTask, rgvTaskType); taskRGVinfoRepository.Add(rgvInfo, true); outboundTask.wcstask_state = TaskState.TaskState_RGV_Received.ToString(); taskWCSinfoRepository.Update(outboundTask, x => x.wcstask_state, true); } } } //提升机运行的任务 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); //提升机出库的流程 } } catch (Exception ex) { WriteLog.Info("OutboundArea").Write($"{ DateTime.Now }出库区域调度失败:{ex.Message}", "OutboundArea"); } } public static bool WriteRGVState(PLCClient client, bool value) { client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value); string rel = string.Empty; for (int i = 0; i < 50; i++) { rel = client.ReadValue(CLineInfoDBName.W_System_RGVState.ToString()).ToString(); if (value == bool.Parse(rel)) break; else { client.WriteValue(CLineInfoDBName.W_System_RGVState.ToString(), value); Thread.Sleep(88); } } rel = client.ReadValue(CLineInfoDBName.W_System_RGVState.ToString()).ToString(); if (value != bool.Parse(rel)) Console.Out.WriteLine($"{DateTime.Now}写入车存储中{value}失败."); return bool.Parse(rel); } /// /// 查询是否有可出的出库任务 /// /// /// /// public static Dt_TaskWCSinfo GetOutboundTask(IDt_TaskWCSinfoRepository taskWCSinfoRepository, PLCClient client) { Dt_TaskWCSinfo wcsInfo = null; List listTask = taskWCSinfoRepository.Find(r => r.wcstask_state == TaskState.TaskState_Assigned.ToString() && (r.wcstask_type == TaskType.TaskType_Box_Pallet_Outbound.ToString() || r.wcstask_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString()) && OutboundStationLayerNo.Contains(r.wcstask_startPoint)).OrderBy(r => r.wcstask_createTime).ToList();// foreach (var item in listTask.GroupBy(r => r.wcstask_endPoint)) { 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) continue; //判断缓存架是否有货 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) 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 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 (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 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; } public static Dt_TaskRGVinfo GetRGVTask(IDt_TaskRGVinfoRepository taskRGVinfoRepository, Dt_TaskWCSinfo wcsTask, string rgvTaskType) { Dt_TaskRGVinfo rgvInfo = new Dt_TaskRGVinfo(); rgvInfo.rgvtask_taskId = GetTaskNumber.GetRgvTaskNumber(taskRGVinfoRepository).ToString(); rgvInfo.rgvtask_taskType = rgvTaskType; rgvInfo.rgvtask_taskStatus = RGVTaskState.RgvTaskState_Wait_Send.ToString(); rgvInfo.rgvtask_priorityCode = wcsTask.wcstask_grade.ToString(); rgvInfo.rgvtask_startNode = wcsTask.wcstask_startLocation; rgvInfo.rgvtask_endNode = wcsTask.wcstask_endLocation; rgvInfo.rgvtask_wcsTaskNumber = wcsTask.wcstask_taskNumber; rgvInfo.rgvtask_barCode = wcsTask.wcstask_barcode; rgvInfo.rgvtask_creator = wcsTask.wcstask_creator; rgvInfo.rgvtask_msgTime = DateTime.Now; rgvInfo.rgvtask_areaCode = "OutboundArea"; return rgvInfo; } public static void InboundRequestAction(IDt_TaskWCSinfoRepository taskWCSinfoRepository, IDt_TaskRGVinfoRepository taskRGVinfoRepository, PLCClient client) { try { string barcode = client.ReadValue(CLineInfoDBName.R_Line_Barcode.ToString(), ReInboundRequestStationNo).ToString(); bool load = bool.Parse(client.ReadValue(CLineInfoDBName.R_Line_LoadSleep.ToString(), ReInboundRequestStationNo).ToString()); if (!string.IsNullOrEmpty(barcode) && !"0".Equals(barcode) && load) { Dt_TaskWCSinfo wcsInfo = taskWCSinfoRepository.FindFirst(r => r.wcstask_barcode == barcode && r.wcstask_type == TaskType.TaskType_Empty_Pallet_Inbound.ToString()); if (null == wcsInfo) { //有出库任务,不能下发 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) { Dt_TaskRGVinfo rgvTask = taskRGVinfoRepository.FindFirst(r => r.rgvtask_wcsTaskNumber == wcsInfo.wcstask_taskNumber); if (null != rgvTask) { //取货完成 if ("2" != rgvTask.rgvtask_backup_2) return; } else return; } //申请入库任务 WebResponseContent content = WMSApi.PostInboundRequstToWMS(barcode); if (content.Status) { WmsTaskInfo wmsTask = JsonConvert.DeserializeObject(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(); }); } else throw new Exception("入库申请失败:" + content.Message); } } } catch (Exception ex) { Console.Out.WriteLine(DateTime.Now + ex.Message); } } } }