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