From 9d61089faffa09e2f0149c6e10ef725b657c7d1e Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期三, 11 九月 2024 20:07:31 +0800
Subject: [PATCH] 投入增加工单总数验证

---
 Tiger.Business/MES/Biz.WorkBatch.cs |  324 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 315 insertions(+), 9 deletions(-)

diff --git a/Tiger.Business/MES/Biz.WorkBatch.cs b/Tiger.Business/MES/Biz.WorkBatch.cs
index 03c5d0d..425ea44 100644
--- a/Tiger.Business/MES/Biz.WorkBatch.cs
+++ b/Tiger.Business/MES/Biz.WorkBatch.cs
@@ -6,13 +6,9 @@
 using System.Text;
 using System.Threading.Tasks;
 using Rhea.Common;
-using System.Net;
 using System.Linq;
-using Newtonsoft.Json;
 using Tiger.IBusiness;
-using Microsoft.AspNetCore.Http;
 using Tiger.Business.MES;
-using Org.BouncyCastle.Ocsp;
 using Tiger.Model.Entitys.MES.Position;
 
 namespace Tiger.Business
@@ -20,7 +16,7 @@
     public partial class Biz
     {
         /// <summary>
-        /// 宸ュ崟鎵规
+        /// 鐢熶骇涓殑宸ュ崟鎵规
         /// </summary>
         public partial class WorkBatch : IWorkBatch, IDisposable
         {
@@ -30,6 +26,7 @@
             }
             #region Propertys & Variables
             public string OrderNo { get; set; }
+            public string LineCode { get; set; }
             public BIZ_MES_WO WO { get; set; }
             public BAS_ITEM Product { get; set; }
             public BIZ_MES_WO_BATCH Batch { get; set; }
@@ -43,6 +40,7 @@
             public List<MES_WO_NODE_POST> NodePosts { get; set; }
             public List<MES_WO_NODE_DFTG> NodeDftgs { get; set; }
             public List<BAS_DEFECT_GRP> DefectGroups { get; set; }
+            public List<BAS_DEFECT> Defects => DefectGroups.SelectMany(q => q.Defects).ToList();
             /// <summary>
             /// 浜嬪姟閿�
             /// </summary>
@@ -56,21 +54,104 @@
             /// <returns></returns>
             public WorkBatch Init(string lineCode)
             {
-                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).First();
+                LineCode = lineCode;
+                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
                 Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).First();
-                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == lineCode 
-                                        && (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
+                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode &&
+                                    (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
                 Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();    
                 WoSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                 Edges = Biz.Db.Queryable<MES_WO_EDGE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+                Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
                 NodeSets = Biz.Db.Queryable<MES_WO_OPER>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                 NodeActs = Biz.Db.Queryable<MES_WO_NODE_ACT>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
                 ActionSets = Biz.Db.Queryable<MES_WO_ACTION>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                 NodePosts = Biz.Db.Queryable<MES_WO_NODE_POST>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                 NodeDftgs = Biz.Db.Queryable<MES_WO_NODE_DFTG>().Where(q => q.WORK_ORDER == OrderNo).ToList();
                 DefectGroups = Biz.Db.Queryable<BAS_DEFECT_GRP>().IncludesAllFirstLayer().ToList();
+
+                //宸ュ簭鑺傜偣鎺掑簭
+                var first = Nodes.First(q => q.IS_FIRST_NODE == "Y");
+                first.Sequence = 1;
+                NodeSorting(first);
+
                 return this;
+            }
+
+            /// <summary>
+            /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃
+            /// </summary>
+            /// <param name="parent"></param>
+            private void NodeSorting(MES_WO_NODE parent)
+            {
+                var edges = Edges.Where(q => q.SRC_NODE == parent.ID && Nodes.Any(a => a.ID == q.TGT_NODE)).ToList();
+                foreach (var edge in edges)
+                {
+                    var next = Nodes.First(q => q.ID == edge.TGT_NODE);
+                    //鎺掗櫎缁翠慨宸ュ簭
+                    if (next.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1);
+                        //濡傛灉鐖惰妭鐐瑰惎鐢ㄤ笖涓嶅彲璺崇珯锛屽垯娣诲姞涓轰笅涓�涓伐搴忕殑鍓嶇疆宸ュ簭
+                        var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == parent.ID);
+                        if (!setting.IsNullOrEmpty() && setting.IS_ACTIVE == "Y" && setting.CAN_SKIP != "Y")
+	                    {
+                            next.PrepNodeIDs.Add(parent.ID);
+	                    }
+                        //缁ф壙鐖剁粨鐐圭殑鍓嶇疆宸ュ簭
+                        next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
+                        next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
+                        NodeSorting(next);
+                    }
+                }
+            }
+
+            /// <summary>
+            /// 妫�鏌ュ伐鍗曞湪褰撳墠宸ュ簭鑺傜偣鏄惁鍙互鐢熶骇
+            /// </summary>
+            /// <param name="curNode"></param>
+            /// <returns></returns>
+            public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode)
+            {
+                var action = new ApiAction<SubmitOutput>(new SubmitOutput(), true);
+
+                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
+                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode).First();
+                //宸ュ崟鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
+                if (Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    //action.LocaleMsg = new($"宸ュ崟鎵规[{Batch.BATCH_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
+                    action.LocaleMsg = new("MES.WorkBatch.WoBatchStatusCanNotWork", Batch.BATCH_NO, Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName());
+                }
+                //宸ュ崟鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
+                if (WO.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && WO.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue())
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    //action.LocaleMsg = new($"宸ュ崟[{WO.ORDER_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
+                    action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
+                }
+                //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
+                //if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+                if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    action.LocaleMsg = new($"宸ュ崟鎵规[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
+                    action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), Batch.SCRAP_QTY, Batch.PLAN_QTY);
+                }
+                //宸ュ崟鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
+                if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY)
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    action.LocaleMsg = new($"宸ュ崟[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
+                    action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WO.SCRAP_QTY, WO.PLAN_QTY);
+                }
+
+                return action;
             }
 
             /// <summary>
@@ -150,6 +231,231 @@
             }
 
             /// <summary>
+            /// 鏍规嵁浼犲叆鐨勬潯鐮佽繃绔欎俊鎭拰涓嬩竴绔欑殑鐩爣宸ュ簭锛屽垽鏂潯鐮佹槸鍚﹁兘杩涘叆涓嬩竴绔�
+            /// </summary>
+            /// <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>(new SubmitOutput());
+
+                //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
+                if (wipSN.NODE_ID.IsNullOrEmpty())
+                {
+                    if (nextNode.IS_FIRST_NODE == "Y")
+                    {
+                        action.IsSuccessed = true;
+                        return action;
+                    }
+                    else
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.SetValue(this, null);
+                        var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
+                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.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;
+                    }
+                }
+                //鏉$爜宸叉湁杩囩珯璁板綍
+                else
+                {
+                    var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
+                    var curSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID);
+                    var nextSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == nextNode.ID);
+                    //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁杩炵嚎鍒扮淮淇伐搴忥紝鍒欏厑璁歌繘鍏ョ淮淇伐搴�
+                    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))
+                    {
+                        action.IsSuccessed = true;
+                        return action;
+                    }
+                    //缁翠慨鍥炴祦锛氬鏋滄潯鐮佺殑褰撳墠宸ュ簭鏄淮淇伐搴忥紝鍒欒涓烘槸缁翠慨鍥炴祦
+                    else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
+                        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.SetValue(this, null);
+                            var nextList = reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME);
+                            action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, input.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.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) 
+                         && nextSetting.ALLOW_DFT_IN != "Y" && nextNode.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.SetValue(this, null);
+                        action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, input.SN);
+                        return action;
+                    }
+                    //姝e父宸ュ簭杩囩珯
+                    else
+                    {
+                        //娣诲姞鏉$爜褰撳墠宸ュ簭鐨勪笅涓�涓彲鎵ц宸ュ簭
+                        var nextNodes = GetNextNodes(curNode, wipSN);
+                        //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
+                        if (nextNodes.Any(q => q.ID == nextNode.ID))
+                        {
+                            action.IsSuccessed = true;
+                            return action;
+                        }
+
+                        //濡傛灉褰撳墠宸ュ簭鏈夊繀椤绘墽琛岀殑鍚庣画宸ュ簭锛屽垯鎶ラ敊
+                        if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
+                        {
+                            action.IsSuccessed = false;
+                            action.Data.SetValue(this, null);
+                            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", input.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;
+                        }
+                        //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏皾璇曟墽琛�
+                        else
+	                    {
+                            //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
+                            var prepIDs = curNode.PrepNodeIDs.Where(id =>
+                                                                 Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
+                                                                 ).ToList();
+                            foreach (var prepID in prepIDs)
+                            {
+                                //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
+                                var prep = Nodes.First(q => q.ID == prepID);
+                                var next = GetNextNodes(prep, wipSN);
+                                nextNodes.AddRange(next);
+                            }
+
+                            //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
+                            if (nextNodes.Any(q => q.ID == nextNode.ID))
+                            {
+                                action.IsSuccessed = true;
+                                return action;
+                            }
+                            else
+                            {
+                                action.IsSuccessed = false;
+                                action.Data.SetValue(this, null);
+                                var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y"));
+                                action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.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;
+                            }
+                        }
+                    }
+                }
+
+                return action;
+            }
+
+            /// <summary>
+            /// 娣诲姞鑺傜偣鐨勪笅涓�涓彲鎵ц鑺傜偣
+            /// </summary>
+            /// <param name="parent"></param>
+            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param>
+            private List<MES_WO_NODE> GetNextNodes(MES_WO_NODE parent, MES_WIP_DATA wipSN)
+            {
+                var result = new List<MES_WO_NODE>();
+                var nextNodes = Nodes.Where(q => q.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue()
+                                                                    && Edges.Any(e => e.SRC_NODE == parent.ID && e.TGT_NODE == q.ID)
+                                                                    && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == q.ID && h.IsFinished)
+                                                                 ).ToList();
+                //灏濊瘯灏嗗綋鍓嶅伐搴忕殑鍚庣画宸ュ簭娣诲姞鍒板彲浠ユ墽琛岀殑宸ュ簭鍒楄〃
+                foreach (var next in nextNodes)
+                {
+                    //鏌ユ壘鏈夋病鏈夊墠缃伐搴忔壘涓嶅埌宸茶壇鍝佽繃绔欑殑鍘嗗彶璁板綍锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛�
+                    if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
+                    {
+                        var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == next.ID);
+                        //鍚庣画宸ュ簭鏄惎鐢ㄧ殑锛屽垯娣诲姞
+                        if (!result.Any(q => q.ID == next.ID) && setting.IS_ACTIVE == "Y")
+                        {
+                        	result.Add(next);
+                        }
+                        //鍚庣画宸ュ簭鏄笉鍚敤鎴栬�呭彲璺崇珯锛屽垯缁х画娣诲姞鍏跺悗缁伐搴�
+                        if (!setting.IsNullOrEmpty() && (setting.IS_ACTIVE != "Y" || setting.CAN_SKIP == "Y"))
+                        {
+                            result.AddRange(GetNextNodes(next, wipSN));
+                        }
+                    }
+                }
+
+                return result;
+            }
+
+            /// <summary>
+            /// 鏍规嵁浼犲叆鐨勬潯鐮佽繑鍥炰笅涓�绔欏彲杩涘叆杩涘叆鐨勭洰鏍囧伐搴�
+            /// </summary>
+            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曞拰鐢熶骇涓嶈壇璁板綍淇℃伅</param>
+            /// <returns></returns>
+            public List<MES_WO_NODE> GetNextNodes(MES_WIP_DATA wipSN)
+            {
+                var result = new List<MES_WO_NODE>();
+
+                //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
+                if (wipSN.NODE_ID.IsNullOrEmpty())
+                {
+                    result.AddRange(Nodes.Where(q => q.IS_FIRST_NODE == "Y"));
+                }
+                //鏉$爜宸叉湁杩囩珯璁板綍
+                else
+                {
+                    var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
+                    //鏉$爜鍦ㄧ淮淇伐搴忥紝杩斿洖鍙洖娴佸伐搴�
+                    if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
+                        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();
+                        result.AddRange(reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME));
+                    }
+                    else
+                    {
+                        //寰�涓嬫煡鎵炬潯鐮佸綋鍓嶅伐搴忕殑涓嬩竴涓彲鎵ц宸ュ簭
+                        var nextNodes = GetNextNodes(curNode, wipSN);
+                        //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏皾璇曞湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏姞鍏�
+                        if (!nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
+                        {
+                            //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
+                            var prepIDs = curNode.PrepNodeIDs.Where(id =>
+                                                                 Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
+                                                                 ).ToList();
+                            foreach (var prepID in prepIDs)
+                            {
+                                //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
+                                var prep = Nodes.First(q => q.ID == prepID);
+                                var next = GetNextNodes(prep, wipSN);
+                                nextNodes.AddRange(next);
+                            }
+                        }
+                        result.AddRange(nextNodes);
+                        //濡傛灉褰撳墠鏉$爜鏄笉鑹垯鍙繑鍥炲厑璁镐笉鑹繘绔欑殑宸ュ簭鍜屽伐搴忚繛鎺ョ殑缁翠慨宸ュ簭
+                        if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()))
+                        {
+                            result.RemoveAll(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.ALLOW_DFT_IN != "Y"));
+                            //鍔犲叆宸ュ簭杩炴帴鐨勭淮淇伐搴�
+                            var repairNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID) && q.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue());
+                            result.AddRange(repairNodes);
+                        }
+                    }
+                }
+
+                return result;
+            }
+
+            /// <summary>
             /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭涓嶈壇浠g爜
             /// </summary>
             /// <param name="postCode"></param>

--
Gitblit v1.9.3