| | |
| | | namespace HH.WCS.Mobox3.YNJT_BZP.core { |
| | | internal class WCSCore { |
| | | public static void OperateAgvTaskStatus(AgvTaskState model) { |
| | | LogHelper.Info($"AGV任务状态反馈,入参:{JsonConvert.SerializeObject(model)}", "AGV"); |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(model.No)) |
| | |
| | | break; |
| | | } |
| | | } |
| | | else if (model.State == 2001) |
| | | else if (model.State == 1002) |
| | | { |
| | | //申请新终点 |
| | | string endLoc = AGVApplyEndLoc(model.No); |
| | | //查询当前终点是等待区,则查询入库agv接驳位 |
| | | var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC); |
| | | if (waitLoc != null) |
| | | { |
| | | string endLoc = AGVApplyEndLoc(model.No); |
| | | |
| | | |
| | | } |
| | | |
| | | //如果不是等待区货位,则查询终点货位是否是入库接驳位 |
| | | var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC); |
| | | if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1) |
| | | { |
| | | //是则查询WCS的任务执行情况 |
| | | var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE ,"WCS"); |
| | | if (wcsTask != null) |
| | | { |
| | | bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7); |
| | | if (existAction) |
| | | { |
| | | //如果WCS反馈7取消任务,则rfid校验失败,生成新任务到异常区,并变更agv任务号、起点、终点 |
| | | var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); |
| | | var endLoc = WMSHelper.getErrorBufferAreaLoc(); |
| | | if (endLoc != null) |
| | | { |
| | | LocationHelper.UnLockLoc(mst.S_END_LOC); |
| | | mst.S_END_LOC = endLoc.S_CODE; |
| | | mst.S_END_AREA = endLoc.S_AREA_CODE; |
| | | |
| | | WMSHelper.UpdateTaskEnd(mst); |
| | | WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("", "AGV"); |
| | | } |
| | | } |
| | | |
| | | existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 3); |
| | | if (existAction) |
| | | { |
| | | //WCS反馈3已取货,则agv任务正常结束 |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | |
| | | /// <param name="taskNo"></param> |
| | | public static string AGVApplyEndLoc(string taskNo) |
| | | { |
| | | LogHelper.Info("【agv申请终点】", "AGV"); |
| | | string endLocCode = null; |
| | | LogHelper.Info($"任务号:{taskNo},AGV等待区申请终点", "AGV"); |
| | | var cst = WCSHelper.GetTask(taskNo); |
| | | if (cst != null && cst.N_B_STATE < 3) |
| | | 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 == "虚拟货位") |
| | | if (mst != null && mst.N_B_STATE < 2 && mst.S_END_LOC == "虚拟货位") |
| | | { |
| | | var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); |
| | | if (container != null) |
| | | 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) |
| | | 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) |
| | | foreach (var locCode in locCodes) |
| | | { |
| | | // 胎圈入库,下发母拖出库任务 \ 帘布、内衬入库,下发托盘回库任务 |
| | | if (mst.S_TYPE.Contains("入库")) |
| | | agvLoc = LocationHelper.GetLoc(locCode); |
| | | if (agvLoc != null && agvLoc.C_ENABLE == "Y") |
| | | { |
| | | 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(endLoc.S_CODE, 1); |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV"); |
| | | return agvLoc.S_CODE; |
| | | } |
| | | 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"); |
| | | } |
| | | |
| | | LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV"); |
| | | } |
| | | else |
| | | else |
| | | { |
| | | LogHelper.Info("没有可用的入库接驳位", "AGV"); |
| | | LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | else |
| | | { |
| | | LogHelper.Info("没有空余的货位", "AGV"); |
| | | LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},AGV任务的容器:{cst.S_CNTR_CODE}不存在", "AGV"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},AGV任务已申请终点,请勿重复申请", "AGV"); |
| | | } |
| | | } |
| | | return endLocCode; |
| | | else |
| | | { |
| | | LogHelper.Info($"任务号:{taskNo},AGV任务已完成或取消", "AGV"); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |