| | |
| | | /// <summary> |
| | | /// 根据传入的条码过站信息和下一站的目标工序,判断条码是否能进入下一站 |
| | | /// </summary> |
| | | /// <param name="input"></param> |
| | | /// <param name="wipSN"></param> |
| | | /// <param name="nextNode"></param> |
| | | /// <param name="input">本次提交的数据</param> |
| | | /// <param name="wipSN">当前的条码过站记录</param> |
| | | /// <param name="nextNode">要进入的目标工序</param> |
| | | /// <returns></returns> |
| | | public ApiAction<SubmitOutput> CanGotoNext(SubmitInput input, MES_WIP_DATA wipSN, MES_WO_NODE nextNode) |
| | | { |
| | | var action = new ApiAction<SubmitOutput>(); |
| | | var action = new ApiAction<SubmitOutput>(new SubmitOutput()); |
| | | |
| | | //条码在本工单第一次过站 |
| | | if (wipSN.NODE_ID.IsNullOrEmpty()) |
| | |
| | | action.Data.CurWO = WO.ORDER_NO; |
| | | action.Data.CurBatch = Batch.BATCH_NO; |
| | | var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y"); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | return action; |
| | | } |
| | | } |
| | |
| | | { |
| | | var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID); |
| | | var curSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID); |
| | | //进入维修:如果目标工序是维修工序则判断当前条码在本工单有没有未维修的不良记录且当前工序节点有没有连线到维修工序,有则允许,没有则报错 |
| | | if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue()) |
| | | //进入维修:如果目标工序是维修工序则判断当前条码在本工单有未维修的不良记录且当前工序节点有连线到维修工序,则允许进入维修工序 |
| | | if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue() |
| | | && wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) |
| | | && Edges.Any(q => q.SRC_NODE == curNode.ID && q.TGT_NODE == nextNode.ID)) |
| | | { |
| | | //if (nextNode.IS_FIRST_NODE == "Y") |
| | | //{ |
| | | // action.IsSuccessed = true; |
| | | //} |
| | | //else |
| | | //{ |
| | | // action.IsSuccessed = false; |
| | | // action.Data.CurWO = WO.ORDER_NO; |
| | | // action.Data.CurBatch = Batch.BATCH_NO; |
| | | // var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y"); |
| | | // action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | // return action; |
| | | //} |
| | | action.IsSuccessed = true; |
| | | return action; |
| | | } |
| | | //维修回流:如果条码的当前工序是维修工序,则认为是维修回流 |
| | | else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue()) |
| | | { |
| | | //if (nextNode.IS_FIRST_NODE == "Y") |
| | | //{ |
| | | // action.IsSuccessed = true; |
| | | //} |
| | | //else |
| | | //{ |
| | | // action.IsSuccessed = false; |
| | | // action.Data.CurWO = WO.ORDER_NO; |
| | | // action.Data.CurBatch = Batch.BATCH_NO; |
| | | // var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y"); |
| | | // action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | // return action; |
| | | //} |
| | | //查找所有可以回流的工序 |
| | | var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID) |
| | | && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList(); |
| | | |
| | | //可回流的工序包含目标工序且条码在维修站选择的回流工序为空或者等于目标工序,则允许进站 |
| | | if (reflowNodes.Any(q => q.ID == nextNode.ID) && (wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == nextNode.NODE_NAME)) |
| | | { |
| | | action.IsSuccessed = true; |
| | | return action; |
| | | } |
| | | else |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.Data.CurWO = WO.ORDER_NO; |
| | | action.Data.CurBatch = Batch.BATCH_NO; |
| | | var nextList = reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME); |
| | | action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, wipSN.SN, curNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | return action; |
| | | } |
| | | } |
| | | //不良品入站:如果产品有不良记录且目标工序不允许不良品入站,则报错 |
| | | else if (wipSN.Defects.Any(q => q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) && curSetting.ALLOW_DFT_IN != "Y") |
| | | //不良品入站:如果产品有不良记录且目标工序不是维修工序且不允许不良品入站,则报错 |
| | | else if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) |
| | | && curSetting.ALLOW_DFT_IN != "Y" && nextNode.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue()) |
| | | { |
| | | action.IsSuccessed = false; |
| | | action.Data.CurWO = WO.ORDER_NO; |
| | |
| | | action.Data.CurWO = WO.ORDER_NO; |
| | | action.Data.CurBatch = Batch.BATCH_NO; |
| | | var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | return action; |
| | | } |
| | | //如果当前工序没有必须执行的后续工序,则在前置工序查找还有没有后续工序没完成的工序,有则尝试执行 |
| | |
| | | action.Data.CurWO = WO.ORDER_NO; |
| | | action.Data.CurBatch = Batch.BATCH_NO; |
| | | var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); |
| | | return action; |
| | | } |
| | | } |