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/Position.cs | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 156 insertions(+), 4 deletions(-) diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs index 4d046eb..fd494ab 100644 --- a/Tiger.Business.MES/Transaction/Position.cs +++ b/Tiger.Business.MES/Transaction/Position.cs @@ -10,9 +10,7 @@ using System.Threading.Tasks; using Tiger.Model; using static Tiger.Business.Biz; -using Org.BouncyCastle.Ocsp; using Tiger.Model.Entitys.MES.Position; -using MailKit.Search; namespace Tiger.Business.MES.Transaction { @@ -56,8 +54,11 @@ public MES_WIP_DATA CurWipSN { get; set; } public MES_WIP_HIS CurWipSNHis { get; set; } public List<WorkStep> Steps { get; set; } = new(); - public bool IsFinishAllSteps => Steps.Any() && !Steps.Any(q => !q.IsFinished); - public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0; + public WorkStep CurStep { get; set; } + public List<WorkStep> NextSteps { get; set; } = new(); + public bool IsFinishNodeSteps => !Steps.Any(q => q.Type == IWorkStep.Types.Node && !q.IsFinished); + public bool IsFinishAllSteps => !Steps.Any() || !Steps.Any(q => !q.IsFinished); + //public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0; private DbClient CommitDB; #endregion Propertys & Variables @@ -128,6 +129,157 @@ CurWipSN = null; } + /// <summary> + /// 鐢熸垚浼犲叆宸ユ鍚庣画鐨勮涓哄埌宸ユ鍒楄〃 + /// </summary> + /// <param name="parent"></param> + public void GenerateSteps(WorkStep parent) + { + //閫掑綊娣诲姞鎵�鏈夊伐姝� + AddNextActToSteps(parent); + //璋冩暣宸ユ鐨勫簭鍙� + //while (CurBatch.Edges.Any(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence <= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence)) + //{ + // var edges = CurBatch.Edges.Where(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence >= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence).ToList(); + // foreach (var edge in edges) + // { + // var source = Steps.First(s => s.NodeID == edge.SRC_NODE); + // var target = Steps.First(s => s.NodeID == edge.TGT_NODE); + // target.Sequence = source.Sequence + 1; + // } + //} + } + + /// <summary> + /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃 + /// </summary> + /// <param name="curNode"></param> + private void AddNextActToSteps(WorkStep parent) + { + var edges = CurBatch.Edges.Where(q => q.SRC_NODE == parent.NodeID && CurBatch.NodeActs.Any(a => a.NODE_ID == parent.Node.ID && a.ID == q.TGT_NODE)).ToList(); + foreach (var edge in edges) + { + var act = CurBatch.NodeActs.First(q => q.ID == edge.TGT_NODE); + if (Steps.Any(q => q.NodeID == act.ID)) + { + var next = Steps.First(q => q.NodeID == act.ID); + next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1); + next.PrepNodeIDs.AddRange(parent.PrepNodeIDs); + next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList(); + AddNextActToSteps(next); + } + else + { + var next = new WorkStep(IWorkStep.Types.Action, this) + { + NodeID = act.ID, + Sequence = parent.Sequence + 1, + Node = parent.Node, + NodeAct = act, + Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID), + }; + next.PrepNodeIDs.AddRange(parent.PrepNodeIDs); + next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList(); + Steps.Add(next); + AddNextActToSteps(next); + } + } + } + + /// <summary> + /// 鏍规嵁浼犲叆鐨勫伐姝ワ紝杩斿洖涓嬩竴姝ュ彲鎵ц鐨勫伐姝ュ垪琛� + /// </summary> + /// <param name="curStep"></param> + public List<WorkStep> GetNextSteps(WorkStep curStep) + { + var result = new List<WorkStep>(); + var nextSteps = Steps.Where(q => !q.IsFinished + && CurBatch.Edges.Any(e => e.SRC_NODE == curStep.NodeID && e.TGT_NODE == q.NodeID) + ).ToList(); + //灏濊瘯灏嗗綋鍓嶅伐姝ョ殑鍚庣画宸ユ娣诲姞鍒板彲浠ユ墽琛岀殑宸ユ鍒楄〃 + foreach (var step in nextSteps) + { + //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛� + if (!Steps.Any(q => step.PrepNodeIDs.Any(id => id == q.NodeID && !q.IsFinished))) + { + result.Add(step); + } + } + //濡傛灉褰撳墠宸ユ娌℃湁鍙墽琛岀殑鍚庣画宸ユ锛屽垯鍦ㄥ墠缃伐姝ユ煡鎵捐繕鏈夋病鏈夊悗缁伐姝ユ病瀹屾垚鐨勫伐姝ワ紝鏈夊垯鎵ц + if (!result.Any()) + { + //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯鍏堝畬鎴愭湭瀹屾垚鐨勫墠缃伐姝� + var prepIDs = curStep.PrepNodeIDs.Where(id => CurBatch.Edges.Any(e => e.SRC_NODE == id && Steps.Any(q => !q.IsFinished && e.TGT_NODE == q.NodeID))).ToList(); + var prepSteps = Steps.Where(q => prepIDs.Contains(q.NodeID)).OrderByDescending(q => q.Sequence).ToList(); + while (prepSteps.Any() && !result.Any()) + { + var prep = prepSteps.First(); + var prepNext = GetNextSteps(prep); + if (prepNext.Any()) + { + result = prepNext; + } + else + { + prepSteps.Remove(prep); + } + } + + } + return result.OrderBy(q => q.NodeAct.ACT_NAME).ToList(); + } + + /// <summary> + /// 寮�濮嬫墽琛屼笅涓�琛屼负宸ユ + /// </summary> + /// <param name="input"></param> + public ApiAction<SubmitOutput> BeginNextActionStep(SubmitInput input) + { + var result = new ApiAction<SubmitOutput>(); + //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃 + NextSteps = GetNextSteps(CurStep); + //灏濊瘯鏈夋病鏈夊彲浠ョ洿鎺ュ紑濮嬬殑鍚庣画宸ユ + foreach (var step in NextSteps) + { + var canBegin = step.TryBegin(input); + //濡傛灉鍚庣画宸ユ鍙互鐩存帴寮�濮嬪垯鐩存帴鎵ц + if (canBegin.IsSuccessed) + { + CurStep = step; + NextSteps = GetNextSteps(CurStep); + result = canBegin; + 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; + + return result; + } + } + + //鏍规嵁鍚庣画宸ユ杩斿洖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.StepActCode = CurStep.NodeAct.ACT_CODE; + result.Data.NextStepID = ""; + + //鏍规嵁鍚庣画鍙墽琛屽伐姝ュ垪琛ㄨ繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず + if (NextSteps.Count == 1) + { + result.LocaleMsg = NextSteps.First().GetBeginMsg(); + } + else + { + result.LocaleMsg = new(T(L("MES.Transaction.Position.PleaseSelectNextStep"), input.Locale) + "\r\n" + + string.Join("\r\n", NextSteps.Select(q => " >> " + T(q.GetBeginMsg(), input.Locale)))); + } + return result; + } + #endregion Functions public override bool Close(bool needSaveHistoryLog = false) -- Gitblit v1.9.3