From 01a5cb6f77739630a88fc2f95be694b53ade0d41 Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期五, 19 七月 2024 14:14:47 +0800 Subject: [PATCH] 工步修改为支持并行执行行为,优化工步执行逻辑 --- Tiger.Business.MES/Transaction/TestNode.cs | 302 ++++++++++++++++++++++++++++++------------------- 1 files changed, 184 insertions(+), 118 deletions(-) diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs index e704a65..3e2ad80 100644 --- a/Tiger.Business.MES/Transaction/TestNode.cs +++ b/Tiger.Business.MES/Transaction/TestNode.cs @@ -35,18 +35,18 @@ /// </summary> /// <param name="input"></param> /// <returns></returns> - public async Task<ApiAction> Submit(SubmitInput input) + public async Task<ApiAction<SubmitOutput>> Submit(SubmitInput input) { - var action = new ApiAction(); + var action = new ApiAction<SubmitOutput>(); try { - //宸ユ鍒楄〃涓虹┖鏃讹紝璁や负闇�瑕佸厛鎵弿杩囩珯鏉$爜 - if (Steps.IsNullOrEmpty()) + //宸ユ鍒楄〃涓虹┖鎴栬�呭伐搴忚妭鐐瑰伐姝ユ湁鏈畬鎴愭椂锛屼紭鍏堝畬鎴愬伐搴忚妭鐐瑰伐姝� + if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps) { //鍏堝垽鏂綋鍓嶅伐鍗曚笉涓虹┖涓斿綋鍓嶅矖浣嶅湪褰撳墠宸ュ崟鏄笉鏄绔欙紝濡傛灉鏄垯涓嶅厑璁稿彉鏇村綋鍓嶅伐鍗曪紝灏濊瘯鎶婃潯鐮佺粦瀹氬埌褰撳墠宸ュ崟 if (!CurBatch.IsNullOrEmpty() && CurBatch.IsFirstNode(PostCode)) { - action = ScanSn(action, input); + action = NodeSubmit(action, input); return action; } //褰撳墠宀椾綅鍦ㄥ綋鍓嶅伐鍗曚笉鏄绔欙紝鍒欐煡鎵炬潯鐮佸凡缁戝畾鐨勫伐鍗曞綋浣滃綋鍓嶅伐鍗� @@ -64,12 +64,13 @@ var result = await SelectOrder(new() { AuthOption = input.AuthOption, OrderNo = wosn.Batch.ORDER_NO }); if (!result.IsSuccessed) { - action = result; + action.IsSuccessed = result.IsSuccessed; + action.LocaleMsg = result.LocaleMsg; return action; } } //鏉$爜杩囩珯 - action = ScanSn(action, input); + action = NodeSubmit(action, input); return action; } //鏌ユ壘涓嶅埌鏉$爜宸茬粦瀹氱殑宸ュ崟 @@ -95,20 +96,47 @@ } } //瀹屾垚绗竴姝ワ紝鍚庡紑濮嬫墽琛屽綋鍓嶅伐搴忕殑琛屼负鍒楄〃 - else if (Steps.First().IsFinished && !IsFinishAllSteps) + //瀹屾垚宸ュ簭鑺傜偣宸ユ鍚庯紝鍚庡紑濮嬫墽琛屽綋鍓嶅伐搴忕殑琛屼负宸ユ + else if (IsFinishNodeSteps && !IsFinishAllSteps) { - var curStep = Steps.Where(q => q.ID == input.StepID).FirstOrDefault(); - if (!curStep.IsNullOrEmpty()) + var submitStep = Steps.Where(q => q.ID == input.CurStepID && !q.IsFinished).FirstOrDefault(); + if (submitStep.IsNullOrEmpty()) { - var result = curStep.Submit(input); - result.Data.StepID = curStep.ID; - result.Data.IsFinished = IsFinishAllSteps; - result.Data.CurStep = CurStep; + action = BeginNextActionStep(input); + return action; + } + else + { + var result = submitStep.Submit(input); + //濡傛灉褰撳墠宸ユ宸插畬鎴愶紝寮�濮嬫墽琛屼笅涓�宸ユ + if (result.IsSuccessed && submitStep.IsFinished) + { + result = BeginNextActionStep(input); + } + //濡傛灉褰撳墠宸ユ鏈畬鎴� + else + { + //琛屼负鎵ц鍑洪敊锛屽伐姝ヨ閲嶇疆 + if (Steps.IsNullOrEmpty()) + { + result.LocaleMsg = new(Biz.T(result.LocaleMsg, input.Locale) + Biz.T(Biz.L("MES.Transaction.Position.RescanSN"), input.Locale)); + } + else + { + result.Data.IsFinished = IsFinishAllSteps; + result.Data.CurWO = CurBatch.WO.ORDER_NO; + result.Data.CurBatch = CurBatch.Batch.BATCH_NO; + result.Data.CurNode = CurStep.NodeAct.ACT_NAME; + result.Data.StepActCode = CurStep.NodeAct.ACT_CODE; + result.Data.NextStepID = CurStep.ID; + } + } + //濡傛灉鎵�鏈夊伐姝ラ兘瀹屾垚 if (IsFinishAllSteps) { - return DoIfFinishAllSteps(result.ToApiAction()); + return DoIfFinishAllSteps(result); } - return result.ToApiAction(); + return result; } } //娌℃湁鍙墽琛岀殑宸ユ @@ -125,130 +153,168 @@ } /// <summary> - /// 鎵弿杩囩珯鏉$爜 + /// 宸ュ簭鑺傜偣宸ユ鎻愪氦鏁版嵁 /// </summary> /// <param name="action"></param> /// <param name="input"></param> /// <returns></returns> - public ApiAction ScanSn(ApiAction action, SubmitInput input) + public ApiAction<SubmitOutput> NodeSubmit(ApiAction<SubmitOutput> action, SubmitInput input) { try { - //缁戝畾鏉$爜鍒板伐鍗� - if (!CurBatch.WoSNs.Any(q => q.SN == input.SN)) + //褰撳伐姝ュ垪琛ㄤ负绌猴紝鍒欐墽琛屽綋鍓嶅伐搴忕殑蹇呰閫昏緫褰撲綔绗竴涓伐搴忚妭鐐癸紝瀹屾垚鍚庢寜闇�姹傚垱寤哄悗缁殑宸ユ鍒楄〃 + if (Steps.IsNullOrEmpty()) { - CurBatch.WoSNs.Add(new() + //缁戝畾鏉$爜鍒板伐鍗� + if (!CurBatch.WoSNs.Any(q => q.SN == input.SN)) { - WORK_ORDER = CurBatch.Batch.ORDER_NO, - SN = input.SN, - STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(), - BATCH_NO = CurBatch.Batch.BATCH_NO, - }); - } - var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN); - var curNode = CurBatch.GetNode(PostCode); - - //鏉$爜杩囩珯 - var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.BATCH_NO == CurBatch.Batch.BATCH_NO) ?? new MES_WIP_DATA() - { - SN = input.SN, - STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(), - ITEM_CODE = CurBatch.WO.ITEM_CODE, - WORK_ORDER = CurBatch.Batch.ORDER_NO, - BATCH_NO = CurBatch.Batch.BATCH_NO, - HOLD_FLAG = "N", - REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N", - FINISHED_FLAG = "N", - INV_FLAG = "N", - DFT_FLAG = "N", - DFT_COUNT = 0, - }; - wipSN.AUTH_PROD = CurLine.LINE_CODE; - wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS; - wipSN.ROT_CODE = CurBatch.WO.ROUTE_CODE; - wipSN.NODE_ID = curNode.ID; - wipSN.NODE_NAME = curNode.NODE_NAME; - wipSN.FTY_CODE = CurFactory.FTY_CODE; - wipSN.WS_CODE = CurWorkshop.WS_CODE; - wipSN.LINE_CODE = CurLine.LINE_CODE; - wipSN.POST_CODE = CurPosition.POST_CODE; - wipSN.OPER_CODE = curNode.OPER_CODE; - wipSN.SEGMENT = curNode.SEGMENT; - wipSN.OPERATION_TIME = DateTime.Now; - wipSN.SFTS_CODE = CurLine.SFTS_CODE; - //wipSN.SFT_CODE = CurBatch.WO.ROUTE_CODE; - //wipSN.PRD_CODE = CurBatch.WO.ROUTE_CODE; - CurBatch.StartWorking(UserCode); - - //濡傛灉鏄姇鍏ョ珯 - if (curNode.IS_INPUT == "Y") - { - woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Inputed.GetValue(); - wipSN.STATUS = MES_WIP_DATA.STATUSs.Input.GetValue(); - wipSN.INLINE_DATE = DateTime.Now; - } - //濡傛灉鏄骇鍑虹珯 - if (curNode.IS_OUTPUT == "Y") - { - woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Finished.GetValue(); - wipSN.STATUS = MES_WIP_DATA.STATUSs.Finished.GetValue(); - wipSN.OUTLINE_DATE = DateTime.Now; - } - //濡傛灉鏈夋彁浜や笉鑹� - if (!input.DFT_CODE.IsNullOrEmpty()) - { - wipSN.STATUS = MES_WIP_DATA.STATUSs.NG.GetValue(); - wipSN.DFT_FLAG = "Y"; - wipSN.DFT_COUNT++; - wipSN.DFT_CODE = input.DFT_CODE; - } - - CurWipSNHis = new MES_WIP_HIS(CurWipSN = wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]鍦ㄥ矖浣峓{wipSN.POST_CODE}]杩囩珯宸ュ簭[{wipSN.NODE_NAME}]鎴愬姛"); - - //鍒濆鍖栧伐姝ュ垪琛� - Steps.Clear(); - var curStep = new Biz.WorkStep(curNode.ID, IWorkStep.Types.Node) - { - Sequence = Steps.Count + 1, - Node = curNode, - DBSubmitAction = () => - { - var db = GetCommitDB(); - db.Storageable(woSN, UserCode).ExecuteCommand(); - db.Storageable(wipSN, UserCode).ExecuteCommand(); - db.Storageable(CurWipSNHis, UserCode).ExecuteCommand(); + CurBatch.WoSNs.Add(new() + { + WORK_ORDER = CurBatch.Batch.ORDER_NO, + SN = input.SN, + STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(), + BATCH_NO = CurBatch.Batch.BATCH_NO, + }); } - }; - Steps.Add(curStep); + var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN); + var curNode = CurBatch.GetNode(PostCode); - //濡傛灉褰撳墠宸ュ簭鑺傜偣鏈夎涓哄垯娣诲姞鍒板伐姝ュ垪琛� - var acts = CurBatch.NodeActs.Where(q => q.NODE_ID == curNode.ID).ToList(); - foreach (var act in acts) - { - Steps.Add(new Biz.WorkStep(act.ID, IWorkStep.Types.Action) + //鏉$爜杩囩珯 + var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.BATCH_NO == CurBatch.Batch.BATCH_NO) ?? new MES_WIP_DATA() { + SN = input.SN, + STATUS = MES_WIP_DATA.STATUSs.Init.GetValue(), + ITEM_CODE = CurBatch.WO.ITEM_CODE, + WORK_ORDER = CurBatch.Batch.ORDER_NO, + BATCH_NO = CurBatch.Batch.BATCH_NO, + HOLD_FLAG = "N", + REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N", + FINISHED_FLAG = "N", + INV_FLAG = "N", + DFT_FLAG = "N", + DFT_COUNT = 0, + }; + wipSN.AUTH_PROD = CurLine.LINE_CODE; + wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS; + wipSN.ROT_CODE = CurBatch.WO.ROUTE_CODE; + wipSN.NODE_ID = curNode.ID; + wipSN.NODE_NAME = curNode.NODE_NAME; + wipSN.FTY_CODE = CurFactory.FTY_CODE; + wipSN.WS_CODE = CurWorkshop.WS_CODE; + wipSN.LINE_CODE = CurLine.LINE_CODE; + wipSN.POST_CODE = CurPosition.POST_CODE; + wipSN.OPER_CODE = curNode.OPER_CODE; + wipSN.SEGMENT = curNode.SEGMENT; + wipSN.OPERATION_TIME = DateTime.Now; + wipSN.SFTS_CODE = CurLine.SFTS_CODE; + //wipSN.SFT_CODE = CurBatch.WO.ROUTE_CODE; + //wipSN.PRD_CODE = CurBatch.WO.ROUTE_CODE; + CurBatch.StartWorking(UserCode); + + //濡傛灉鏄姇鍏ョ珯 + if (curNode.IS_INPUT == "Y") + { + woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Inputed.GetValue(); + wipSN.STATUS = MES_WIP_DATA.STATUSs.Input.GetValue(); + wipSN.INLINE_DATE = DateTime.Now; + } + //濡傛灉鏄骇鍑虹珯 + if (curNode.IS_OUTPUT == "Y") + { + woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Finished.GetValue(); + wipSN.STATUS = MES_WIP_DATA.STATUSs.Finished.GetValue(); + wipSN.OUTLINE_DATE = DateTime.Now; + } + //濡傛灉鏈夋彁浜や笉鑹� + if (!input.DFT_CODE.IsNullOrEmpty()) + { + wipSN.STATUS = MES_WIP_DATA.STATUSs.NG.GetValue(); + wipSN.DFT_FLAG = "Y"; + wipSN.DFT_COUNT++; + wipSN.DFT_CODE = input.DFT_CODE; + } + + CurWipSNHis = new MES_WIP_HIS(CurWipSN = wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]鍦ㄥ矖浣峓{wipSN.POST_CODE}]杩囩珯宸ュ簭[{wipSN.NODE_NAME}]鎴愬姛"); + + //鍒濆鍖栧伐姝ュ垪琛� + Steps.Clear(); + var curStep = new Biz.WorkStep(IWorkStep.Types.Node, this) + { + NodeID = curNode.ID, Sequence = Steps.Count + 1, Node = curNode, - NodeAct = act, - Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID), - }); + DBSubmitAction = () => + { + var db = GetCommitDB(); + db.Storageable(woSN, UserCode).ExecuteCommand(); + db.Storageable(wipSN, UserCode).ExecuteCommand(); + db.Storageable(CurWipSNHis, UserCode).ExecuteCommand(); + } + }; + Steps.Add(curStep); + + //鏈夐渶瑕佸垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝� + + //鏈�鍚庢坊鍔犲綋鍓嶅伐搴忕殑琛屼负宸ユ + GenerateSteps(curStep); + + //瀹屾垚绗竴涓伐搴忚妭鐐瑰伐姝� + curStep.IsFinished = true; + CurStep = curStep; + } + else if (!IsFinishNodeSteps) + { + var curStep = Steps.Where(q => q.Type == IWorkStep.Types.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); + + //瀹屾垚褰撳墠宸ュ簭鑺傜偣宸ユ + curStep.IsFinished = true; + CurStep = curStep; } - //瀹屾垚褰撳墠宸ュ簭鑺傜偣 - curStep.IsFinished = true; //鏈畬鎴愭墍鏈夊伐姝� if (!IsFinishAllSteps) { - var next = Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).First(); - var result = next.Begin(this); - result.Data.StepID = next.ID; - result.Data.IsFinished = IsFinishAllSteps; - result.Data.CurStep = CurStep; - return result.ToApiAction(); + var result = new ApiAction<SubmitOutput>(); + //鏈畬鎴愭墍鏈夊伐搴忚妭鐐瑰伐姝� + if (!IsFinishNodeSteps) + { + var next = Steps.Where(q => q.Type == IWorkStep.Types.Node && !q.IsFinished).OrderBy(q => q.Sequence).First(); + //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃 + NextSteps.Clear(); + NextSteps.Add(next); + //鏍规嵁鍚庣画宸ユ杩斿洖ApiAction + result.Data.IsFinished = IsFinishAllSteps; + result.Data.CurWO = CurBatch.WO.ORDER_NO; + result.Data.CurBatch = CurBatch.Batch.BATCH_NO; + result.Data.CurNode = CurStep.Node.NODE_NAME; + result.Data.NextStepID = next.ID; + + //鏍规嵁宸ュ簭鑺傜偣宸ユ鐨勫簭鍙疯繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず + switch (next.Sequence) + { + case 2: + //action.LocaleMsg = new($"璇锋墽琛岀浜屾"); + result.LocaleMsg = new("MES.Transaction.TestNode.绗簩姝ユ搷浣滄彁绀�"); + break; + default: + break; + } + } + //宸插畬鎴愭墍鏈夊伐搴忚妭鐐瑰伐姝ワ紝寮�濮嬫墽琛岃涓哄伐姝� + else + { + result = BeginNextActionStep(input); + } + return result; } //宸插畬鎴愭墍鏈夊伐姝� else { + action.Data.IsFinished = IsFinishAllSteps; + action.Data.CurWO = CurBatch.WO.ORDER_NO; + action.Data.CurBatch = CurBatch.Batch.BATCH_NO; + action.Data.CurNode = CurStep.Node.NODE_NAME; + action.Data.NextStepID = ""; action = DoIfFinishAllSteps(action); } } @@ -265,7 +331,7 @@ /// </summary> /// <param name="action"></param> /// <returns></returns> - public ApiAction DoIfFinishAllSteps(ApiAction action) + public ApiAction<SubmitOutput> DoIfFinishAllSteps(ApiAction<SubmitOutput> action) { //淇濆瓨鏁版嵁搴� var dbTran = GetCommitDB().UseTran(() => -- Gitblit v1.9.3