From 3678120ac63c176b5f261ef12e67c4ce7f1b320f Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期四, 25 七月 2024 21:44:25 +0800
Subject: [PATCH] 增加维修入站跟维修回流的判断

---
 Tiger.Business.MES/Transaction/Position.cs |  187 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 183 insertions(+), 4 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index 4d046eb..435eb9f 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
 {
@@ -41,6 +39,9 @@
             //if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.FactoryNotExistsException", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
             if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑宸ュ巶[{CurWorkshop.FTY_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炲伐鍘�", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
 
+            //鍔犺浇褰撳墠浜х嚎鐨勭彮鍒�
+            CurShiftSys = Biz.Db.Queryable<MES_SHIFT_SYS>().Where(q => q.SFTS_CODE == CurLine.SFTS_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Shifts).First();
+
             return this;
         }
 
@@ -51,13 +52,17 @@
         public MES_WORKSHOP CurWorkshop { get; set; }
         public MES_LINE CurLine { get; set; }
         public MES_POSITION CurPosition { get; set; }
+        public MES_SHIFT_SYS CurShiftSys { get; set; }
         public WorkBatch CurBatch { get; set; }
         public IWorkBatch WorkBatch => CurBatch;
         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
 
@@ -120,6 +125,27 @@
         }
 
         /// <summary>
+        /// 鑾峰彇褰撳墠鏃堕棿鎵�灞炵殑鐝埗鐝鏃舵
+        /// </summary>
+        public ShiftPeriod GetShiftPeriodForNow()
+        {
+            var time = DateTime.Now.ToString("HHmm").ToInt32();
+            foreach (var shift in CurShiftSys.Shifts)
+            {
+                var period = shift.Periods.Where(q => q.PRD_BEGIN <= time && time <= q.PRD_END).FirstOrDefault();
+                if (!period.IsNullOrEmpty())
+                {
+                    var result = new ShiftPeriod();
+                    result.ShiftSys = CurShiftSys;
+                    result.Shift = shift;
+                    result.Period = period;
+                    return result;
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
         /// 閲嶇疆褰撳墠宸ユ
         /// </summary>
         public void ResetSteps()
@@ -128,6 +154,159 @@
             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="parent"></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.Add(parent.NodeID);
+                    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.Add(parent.NodeID);
+                    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