using HH.WCS.JunzhouNongfu.device; using HH.WCS.Mobox3.YNJT_BZP.api; using HH.WCS.Mobox3.YNJT_BZP.dispatch; using HH.WCS.Mobox3.YNJT_BZP.models; using HH.WCS.Mobox3.YNJT_BZP.process; using HH.WCS.Mobox3.YNJT_BZP.util; using HH.WCS.Mobox3.YNJT_BZP.wms; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.X509; using S7.Net; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Runtime.Remoting.Metadata.W3cXsd2001; using System.Threading.Tasks; using static HH.WCS.Mobox3.YNJT_BZP.api.AgvController; using static HH.WCS.Mobox3.YNJT_BZP.api.ApiModel; using static HH.WCS.Mobox3.YNJT_BZP.dispatch.GtDispatch; namespace HH.WCS.Mobox3.YNJT_BZP.core { internal class WCSCore { public static void OperateAgvTaskStatus(AgvTaskState model) { try { if (string.IsNullOrEmpty(model.No)) { LogHelper.Info("任务号为空", "AGV"); } else { var TN_Task = WCSHelper.GetTask(model.No); if (TN_Task != null) { bool isExist = WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, model.State); if (!isExist) { WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); if (model.State <= 7) { //有任务号请求 switch (model.State) { case 1: WCSHelper.Begin(TN_Task); break; #region MyRegion case 3: WCSHelper.UpdateStatus(TN_Task, "开始取货"); break; case 4: WCSHelper.UpdateStatus(TN_Task, "取货完成"); TaskProcess.OperateStatus(TN_Task, 4); break; case 5: WCSHelper.UpdateStatus(TN_Task, "开始卸货"); break; case 6: TaskProcess.OperateStatus(TN_Task, 6); WCSHelper.UpdateStatus(TN_Task, "卸货完成"); break; #endregion case 2: WCSHelper.End(TN_Task); var cntrItemRels = ContainerHelper.GetCntrItemRel(TN_Task.S_CNTR_CODE); if (cntrItemRels.Count > 0) { string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay); string ydate_shiftName = ""; if (shift == "III") { ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift; } else { ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift; } WmsToGtLokasiModel wmsToGtLokasiModel = new WmsToGtLokasiModel() { ydate_shiftName = ydate_shiftName, bc_entried = cntrItemRels[0].S_CG_ID, loc_from = TN_Task.S_START_LOC, loc_to = TN_Task.S_END_LOC, qty = 1, lot = 1, scantime = TN_Task.T_CREATE.ToString("yyyy-MM-dd HH:mm:ss"), pic = model.ForkliftNo }; GtDispatch.agvTaskFeedback(wmsToGtLokasiModel); } break; case 7: //判断是否收到过强制取消,有就不做任何处理 if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17)) { TaskProcess.OperateStatus(TN_Task, 7); WCSHelper.Cancel(TN_Task); } break; } } else if (model.State == 2001) { //申请新终点 string endLoc = AGVApplyEndLoc(model.No); } else { //安全请求等 TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); } } } } } catch (Exception ex) { LogHelper.Info($"agv回报错误,错误原因:{ex.Message}", "AGV"); } } /// /// 创建最后一个任务 /// /// /// /// 1.入库 2.出库 /// public static bool createLastTask(string startLocCode , WMSTask mst ,int actType) { LogHelper.Info("创建下一段任务", "WMS"); var startLoc = LocationHelper.GetLoc(startLocCode); if (startLoc != null) { string cntrCode = ""; string scheduleType = ""; if (actType == 1) { var locCntrRels = LocationHelper.GetLocCntr(startLocCode); if (locCntrRels.Count > 0) { foreach (var cntr in locCntrRels) { cntrCode = cntrCode + ","+ cntr.S_CNTR_CODE; } cntrCode = cntrCode.Substring(1, cntrCode.Length-1); } scheduleType = "WCS"; } if (actType == 2) { cntrCode = mst.S_CNTR_CODE; scheduleType = "AGV"; } // 创建一段入库任务 WCSTask wcsTask = new WCSTask() { S_OP_NAME = mst.S_OP_DEF_NAME, S_OP_CODE = mst.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = cntrCode, S_TYPE = mst.S_TYPE + "-2", S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = mst.S_END_LOC, S_END_AREA = mst.S_END_AREA, S_SCHEDULE_TYPE = scheduleType, N_PRIORITY = mst.N_PRIORITY, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、接驳点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); WMSHelper.UpdateTaskEnd(mst); return true; } } return false; } /// /// 任务分发,根据调度类型发给不同的调度系统 /// internal static void Dispatch() { var db = new SqlHelper().GetInstance(); //查询任务 //获取所有等待的任务 var list = WCSHelper.GetWaitingTaskList(); if (list.Count > 0) { foreach (var task in list) { if (!TaskProcess.Intercept(task)) { //使用自定义任务推送 TaskProcess.SendTask(task); } } } } /// /// agv申请终点 /// /// public static string AGVApplyEndLoc(string taskNo) { LogHelper.Info("【agv申请终点】", "AGV"); string endLocCode = null; var cst = WCSHelper.GetTask(taskNo); if (cst != null && cst.N_B_STATE < 3) { var mst = WMSHelper.GetWmsTask(cst.S_OP_CODE); if (mst != null && mst.N_B_STATE < 2 && mst.S_END_LOC == "虚拟货位") { var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); if (container != null) { var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE); if (endLoc != null) { Location agvLoc = null; var locCodes = Settings.getAgvJBLocList(1, endLoc.N_ROADWAY, 1); if (locCodes.Count > 0) { agvLoc = LocationHelper.GetLoc(locCodes[0]); } if (agvLoc != null && agvLoc.C_ENABLE == "Y") { var wcsTask = WCSHelper.GetTaskByStartAndEnd(agvLoc.S_CODE); if (wcsTask == null && agvLoc.N_LOCK_STATE == 0) { // 胎圈入库,下发母拖出库任务 \ 帘布、内衬入库,下发托盘回库任务 if (mst.S_TYPE.Contains("入库")) { if (agvLoc.N_CURRENT_NUM == 1) { var locCntrRels = LocationHelper.GetLocCntr(agvLoc.S_CODE); if (locCntrRels.Count > 0) { var container1 = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE); if (container1.N_TYPE == 0) { if (container.N_TYPE == 4 || container.N_TYPE == 5) { ApiHelper.baseTrayInStockAgv(agvLoc.S_CODE, mst.S_CODE); } } else { LogHelper.Info($"接驳位:{agvLoc.S_CODE},存在非母拖容器", "AGV"); } } else { LogHelper.Info($"接驳位:{agvLoc.S_CODE}的当前数量与容器数量不匹配", "AGV"); } } else if (agvLoc.N_CURRENT_NUM == 0) { if (container.N_TYPE == 6) { ApiHelper.baseTrayOutStockAgv(agvLoc.S_CODE, mst.S_CODE); } } else { return endLocCode; } } cst.S_END_LOC = agvLoc.S_CODE; cst.S_END_AREA = agvLoc.S_AREA_CODE; WCSHelper.UpdateTaskEnd(cst); mst.S_END_LOC = endLoc.S_CODE; mst.S_END_AREA = endLoc.S_AREA_CODE; WMSHelper.UpdateTaskEnd(mst); LocationHelper.LockLoc(agvLoc.S_CODE, 1); LocationHelper.LockLoc(endLoc.S_CODE, 1); endLocCode = agvLoc.S_CODE; } else { LogHelper.Info("接驳位当前有任务未完成,请稍等", "AGV"); } } else { LogHelper.Info("没有可用的入库接驳位", "AGV"); } } else { LogHelper.Info("没有空余的货位", "AGV"); } } } } return endLocCode; } } }