| | |
| | | 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; |
| | | using static HH.WCS.Mobox3.YNJT_BZP.util.Settings; |
| | | |
| | | namespace HH.WCS.Mobox3.YNJT_BZP.core { |
| | | internal class WCSCore { |
| | |
| | | var wmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); |
| | | if (wmsTask != null && wmsTask.N_B_STATE < 2) |
| | | { |
| | | WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | if (model.State <= 7) |
| | | { |
| | | //有任务号请求 |
| | |
| | | var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC); |
| | | if (waitLoc != null) |
| | | { |
| | | var endLoc = AGVApplyEndLoc(model.No); |
| | | LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车变更终点:{endLoc.S_CODE}", "AGV"); |
| | | // 通知AGV更改终点 |
| | | ChangeParamModel paramModel = new ChangeParamModel() |
| | | if (TN_Task.S_TYPE.Contains("入库")) |
| | | { |
| | | task_no = model.No, |
| | | param_no = 0, |
| | | param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;400;0;2" |
| | | }; |
| | | LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV"); |
| | | /* NDCApi.ChangeOrderParam(paramModel);*/ |
| | | var endLoc = AGVApplyEndLoc(model.No); |
| | | if (endLoc != null) |
| | | { |
| | | LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车变更终点:{endLoc.S_CODE}", "AGV"); |
| | | // 通知AGV更改终点 |
| | | ChangeParamModel paramModel = new ChangeParamModel() |
| | | { |
| | | task_no = model.No, |
| | | param_no = 0, |
| | | param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;400;0;2" |
| | | }; |
| | | LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV"); |
| | | /* NDCApi.ChangeOrderParam(paramModel);*/ |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else if (model.State == 1004) |
| | |
| | | // 卸货后等待 |
| | | // 查询终点货位是否是入库接驳位 |
| | | var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC); |
| | | if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1) |
| | | if (agvJBLoc != null && agvJBLoc.action == 1) |
| | | { |
| | | //是则查询WCS的任务执行情况 |
| | | var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS"); |
| | | var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS" , wmsTask.S_TYPE); |
| | | if (wcsTask != null) |
| | | { |
| | | bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7); |
| | |
| | | mst.S_END_LOC = endLoc.S_CODE; |
| | | mst.S_END_AREA = endLoc.S_AREA_CODE; |
| | | |
| | | var newWcsTask = WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2, "入库异常区任务"); |
| | | var newWcsTask = WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2, "出库异常区任务"); |
| | | LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车改道终点:{newWcsTask.S_END_LOC}", "AGV"); |
| | | if (newWcsTask != null) |
| | | { |
| | |
| | | //安全请求等 |
| | | TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | } |
| | | |
| | | WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | private static readonly object emptyTrayInLock = new object(); // 静态锁对象 |
| | | |
| | | /// <summary> |
| | | /// agv申请终点 |
| | |
| | | var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); |
| | | if (container != null) |
| | | { |
| | | var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE); |
| | | if (endLoc != null) |
| | | string itemCode = null; |
| | | var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE); |
| | | if (cntrItemRels.Count > 0) |
| | | { |
| | | Location agvLoc = null; |
| | | var locCodes = Settings.getAgvJBLocList(1, endLoc.N_ROADWAY, 1); |
| | | if (locCodes.Count > 0) |
| | | // 满料托盘入库 |
| | | itemCode = cntrItemRels[0].S_ITEM_CODE; |
| | | var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1, itemCode); |
| | | if (endLoc != null) |
| | | { |
| | | foreach (var locCode in locCodes) |
| | | Location agvLoc = null; |
| | | var locCodes = Settings.getAgvJBLocList( endLoc.N_ROADWAY, 1); |
| | | if (locCodes.Count > 0) |
| | | { |
| | | agvLoc = LocationHelper.GetLoc(locCode); |
| | | if (agvLoc != null && agvLoc.C_ENABLE == "Y") |
| | | foreach (var locCode in locCodes) |
| | | { |
| | | LogHelper.Info($"检测AGV接驳位:{locCode}设备是否可用", "AGV"); |
| | | agvLoc = LocationHelper.GetLoc(locCode); |
| | | if (agvLoc != null && agvLoc.C_ENABLE == "Y") |
| | | { |
| | | 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(endLoc.S_CODE, 1); |
| | | |
| | | cst.S_END_LOC = agvLoc.S_CODE; |
| | | cst.S_END_AREA = agvLoc.S_AREA_CODE; |
| | | LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV"); |
| | | return agvLoc; |
| | | } |
| | | } |
| | | LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // 空托盘回库 |
| | | lock (emptyTrayInLock) |
| | | { |
| | | var emptyTrayBuffers = WMSHelper.getEmptyTrayBufferList(); |
| | | if (emptyTrayBuffers.Count > 0) |
| | | { |
| | | var emptyTray = emptyTrayBuffers.Where(a => a.TRAY_TYPE == container.N_TYPE).OrderBy(a => a.T_CREATE).FirstOrDefault(); |
| | | if (emptyTray != null) |
| | | { |
| | | var endLoc = LocationHelper.GetLoc(emptyTray.END_LOC); |
| | | cst.S_END_LOC = endLoc.S_CODE; |
| | | cst.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WCSHelper.UpdateTaskEnd(cst); |
| | | |
| | | mst.S_END_LOC = endLoc.S_CODE; |
| | |
| | | WMSHelper.UpdateTaskEnd(mst); |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1); |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV"); |
| | | return agvLoc; |
| | | emptyTray.IS_CREATED = "Y"; |
| | | WMSHelper.updateEmptyTrayBuffer(emptyTray); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1); |
| | | if (endLoc != null) |
| | | { |
| | | Location agvLoc = null; |
| | | var locCodes = Settings.getAgvJBLocList(endLoc.N_ROADWAY, 1); |
| | | if (locCodes.Count > 0) |
| | | { |
| | | foreach (var locCode in locCodes) |
| | | { |
| | | agvLoc = LocationHelper.GetLoc(locCode); |
| | | if (agvLoc != null && agvLoc.C_ENABLE == "Y") |
| | | { |
| | | cst.S_END_LOC = agvLoc.S_CODE; |
| | | cst.S_END_AREA = agvLoc.S_AREA_CODE; |
| | | WCSHelper.UpdateTaskEnd(cst); |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV"); |
| | | mst.S_END_LOC = endLoc.S_CODE; |
| | | mst.S_END_AREA = endLoc.S_AREA_CODE; |
| | | WMSHelper.UpdateTaskEnd(mst); |
| | | LocationHelper.LockLoc(endLoc.S_CODE, 1); |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV"); |
| | | return agvLoc; |
| | | } |
| | | } |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV"); |
| | | } |
| | | } |
| | | else |