From f4f475fd3c0e066ad82cdc61707f0e8e19583a02 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期四, 25 七月 2024 14:51:43 +0800
Subject: [PATCH] 进入工序时要增加判断过站是否按流程设置,增加非法过站防呆 增加生产不良记录用于记录发现的不良的管理 工序节点跟节点设置增加是否允许不良品进站的字段

---
 Tiger.Api/appsettings.json                    |    2 
 Tiger.Api/Language.db                         |    0 
 Tiger.Api/Tiger.Api.csproj                    |    8 
 Tiger.Business.MES/Transaction/CollectNode.cs |   46 ++++--
 Tiger.Business.MES/Transaction/PackingNode.cs |   55 +++++--
 Tiger.Business/Tiger.Business.csproj          |    8 
 Tiger.Business.MES/Transaction/Position.cs    |    4 
 Tiger.Business/MES/Biz.WorkBatch.cs           |  245 ++++++++++++++++++++++++++++++++++
 Tiger.Business/MES/Biz.WorkStep.cs            |    2 
 Tiger.Business.MES/Transaction/TestNode.cs    |   46 ++++--
 10 files changed, 351 insertions(+), 65 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 1aea177..497f745 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Api/Tiger.Api.csproj b/Tiger.Api/Tiger.Api.csproj
index e63e72f..4768d89 100644
--- a/Tiger.Api/Tiger.Api.csproj
+++ b/Tiger.Api/Tiger.Api.csproj
@@ -1,10 +1,10 @@
 锘�<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup Label="Globals">
-    <SccProjectName>SAK</SccProjectName>
-    <SccProvider>SAK</SccProvider>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccLocalPath>SAK</SccLocalPath>
+    <SccProjectName></SccProjectName>
+    <SccProvider></SccProvider>
+    <SccAuxPath></SccAuxPath>
+    <SccLocalPath></SccLocalPath>
     <Platforms>AnyCPU;x86</Platforms>
   </PropertyGroup>
 
diff --git a/Tiger.Api/appsettings.json b/Tiger.Api/appsettings.json
index 9e9f493..e10cd01 100644
--- a/Tiger.Api/appsettings.json
+++ b/Tiger.Api/appsettings.json
@@ -63,5 +63,5 @@
     "WillMsgDelay": 5,
     "WillMsgExpiry": 300
   },
-  "RunInterface": true
+  "RunInterface": false
 }
\ No newline at end of file
diff --git a/Tiger.Business.MES/Transaction/CollectNode.cs b/Tiger.Business.MES/Transaction/CollectNode.cs
index 8c89e62..2bea459 100644
--- a/Tiger.Business.MES/Transaction/CollectNode.cs
+++ b/Tiger.Business.MES/Transaction/CollectNode.cs
@@ -161,11 +161,37 @@
         {
             try
             {
+                var curNode = CurBatch.GetNode(PostCode);
+                //鍒ゆ柇宸ュ崟瀹炴椂鐘舵�佸垽鏂�
+                var woStatus = CurBatch.CheckStatus();
+                if (!woStatus.IsSuccessed)
+                {
+                    return woStatus;
+                }
+                //闈炴硶杩囩珯闃插憜锛氳繘鍏ュ伐搴忔椂瑕佸鍔犲垽鏂潯鐮佹槸鍚︽寜娴佺▼杩囩珯
+                var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.WORK_ORDER == CurBatch.WO.ORDER_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,
+                };
+                var canGotoNext = CurBatch.CanGotoNext(input, wipSN, curNode);
+                if (!canGotoNext.IsSuccessed)
+                {
+                    return canGotoNext;
+                }
+
                 //褰撳伐姝ュ垪琛ㄤ负绌猴紝鍒欐墽琛屽綋鍓嶅伐搴忕殑蹇呰閫昏緫褰撲綔绗竴涓伐搴忚妭鐐癸紝瀹屾垚鍚庢寜闇�姹傚垱寤哄悗缁殑宸ユ鍒楄〃
                 if (Steps.IsNullOrEmpty())
                 {
-                    var curNode = CurBatch.GetNode(PostCode);
-
                     //缁戝畾鏉$爜鍒板伐鍗�
                     if (!CurBatch.WoSNs.Any(q => q.SN == input.SN))
                     {
@@ -176,26 +202,12 @@
                             STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(),
                         });
                     }
-                    var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN);
+                    var woSN = CurBatch.WoSNs.First(q => q.SN == input.SN);
                     woSN.AUTH_ORG = CurBatch.WO.AUTH_ORG;
                     woSN.AUTH_PROD = CurLine.LINE_CODE;
                     woSN.BATCH_NO = CurBatch.Batch.BATCH_NO;
 
                     //鏉$爜杩囩珯
-                    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_ORG = CurBatch.WO.AUTH_ORG;
                     wipSN.AUTH_PROD = CurLine.LINE_CODE;
                     wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS;
diff --git a/Tiger.Business.MES/Transaction/PackingNode.cs b/Tiger.Business.MES/Transaction/PackingNode.cs
index 4699985..20b6f99 100644
--- a/Tiger.Business.MES/Transaction/PackingNode.cs
+++ b/Tiger.Business.MES/Transaction/PackingNode.cs
@@ -161,11 +161,46 @@
         {
             try
             {
+                var curNode = CurBatch.GetNode(PostCode);
+                //鍒ゆ柇宸ュ崟瀹炴椂鐘舵�佸垽鏂�
+                var woStatus = CurBatch.CheckStatus();
+                if (!woStatus.IsSuccessed)
+                {
+                    return woStatus;
+                }
+                //闈炴硶杩囩珯闃插憜锛氳繘鍏ュ伐搴忔椂瑕佸鍔犲垽鏂潯鐮佹槸鍚︽寜娴佺▼杩囩珯
+                var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().Where(q => q.SN == input.SN && q.WORK_ORDER == CurBatch.WO.ORDER_NO).IncludesAllFirstLayer().First() ?? 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,
+                };
+                var canGotoNext = CurBatch.CanGotoNext(input, wipSN, curNode);
+                if (!canGotoNext.IsSuccessed)
+                {
+                    return canGotoNext;
+                }
+                //if (nextNodes.Any(q => q.ID == curNode.ID))
+                //{
+                //    action.IsSuccessed = false;
+                //    action.Data.CurWO = CurBatch.WO.ORDER_NO;
+                //    action.Data.CurBatch = CurBatch.Batch.BATCH_NO;
+                //    action.LocaleMsg = new($"鏉$爜[{wipSN.SN}]杩囩珯鎵弿閿欒锛岃鍏堥�氳繃浠ヤ笅宸ュ簭锛歿string.Join(", ", nextNodes.Select(q => q.NODE_NAME))}");
+                //    action.LocaleMsg = new("MES.Transaction.PackingNode.NotNextNodeException", wipSN.SN, string.Join(", ", nextNodes.Select(q => q.NODE_NAME)));
+                //    return action;
+                //}
+
                 //褰撳伐姝ュ垪琛ㄤ负绌猴紝鍒欐墽琛屽綋鍓嶅伐搴忕殑蹇呰閫昏緫褰撲綔绗竴涓伐搴忚妭鐐癸紝瀹屾垚鍚庢寜闇�姹傚垱寤哄悗缁殑宸ユ鍒楄〃
                 if (Steps.IsNullOrEmpty())
                 {
-                    var curNode = CurBatch.GetNode(PostCode);
-
                     //缁戝畾鏉$爜鍒板伐鍗�
                     if (!CurBatch.WoSNs.Any(q => q.SN == input.SN))
 	                {
@@ -176,26 +211,12 @@
 	                        STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(),
 	                    });
 	                }
-	                var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN);
+	                var woSN = CurBatch.WoSNs.First(q => q.SN == input.SN);
                     woSN.AUTH_ORG = CurBatch.WO.AUTH_ORG;
                     woSN.AUTH_PROD = CurLine.LINE_CODE;
                     woSN.BATCH_NO = CurBatch.Batch.BATCH_NO;
                     
 	                //鏉$爜杩囩珯
-	                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_ORG = CurBatch.WO.AUTH_ORG;
                     wipSN.AUTH_PROD = CurLine.LINE_CODE;
 	                wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS;
diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index b217619..435eb9f 100644
--- a/Tiger.Business.MES/Transaction/Position.cs
+++ b/Tiger.Business.MES/Transaction/Position.cs
@@ -178,7 +178,7 @@
         /// <summary>
         /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃
         /// </summary>
-        /// <param name="curNode"></param>
+        /// <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();
@@ -189,6 +189,7 @@
                 {
                     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);
@@ -203,6 +204,7 @@
                         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);
diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index 9bbc31d..b40764f 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -162,11 +162,37 @@
         {
             try
             {
+                var curNode = CurBatch.GetNode(PostCode);
+                //鍒ゆ柇宸ュ崟瀹炴椂鐘舵�佸垽鏂�
+                var woStatus = CurBatch.CheckStatus();
+                if (!woStatus.IsSuccessed)
+                {
+                    return woStatus;
+                }
+                //闈炴硶杩囩珯闃插憜锛氳繘鍏ュ伐搴忔椂瑕佸鍔犲垽鏂潯鐮佹槸鍚︽寜娴佺▼杩囩珯
+                var wipSN = Biz.Db.Queryable<MES_WIP_DATA>().First(q => q.SN == input.SN && q.WORK_ORDER == CurBatch.WO.ORDER_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,
+                };
+                var canGotoNext = CurBatch.CanGotoNext(input, wipSN, curNode);
+                if (!canGotoNext.IsSuccessed)
+                {
+                    return canGotoNext;
+                }
+
                 //褰撳伐姝ュ垪琛ㄤ负绌猴紝鍒欐墽琛屽綋鍓嶅伐搴忕殑蹇呰閫昏緫褰撲綔绗竴涓伐搴忚妭鐐癸紝瀹屾垚鍚庢寜闇�姹傚垱寤哄悗缁殑宸ユ鍒楄〃
                 if (Steps.IsNullOrEmpty())
                 {
-                    var curNode = CurBatch.GetNode(PostCode);
-
                     //缁戝畾鏉$爜鍒板伐鍗�
                     if (!CurBatch.WoSNs.Any(q => q.SN == input.SN))
                     {
@@ -177,26 +203,12 @@
                             STATUS = BIZ_MES_WO_SN.STATUSs.NotInput.GetValue(),
                         });
                     }
-                    var woSN = CurBatch.WoSNs.FirstOrDefault(q => q.SN == input.SN);
+                    var woSN = CurBatch.WoSNs.First(q => q.SN == input.SN);
                     woSN.AUTH_ORG = CurBatch.WO.AUTH_ORG;
                     woSN.AUTH_PROD = CurLine.LINE_CODE;
                     woSN.BATCH_NO = CurBatch.Batch.BATCH_NO;
 
                     //鏉$爜杩囩珯
-                    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_ORG = CurBatch.WO.AUTH_ORG;
                     wipSN.AUTH_PROD = CurLine.LINE_CODE;
                     wipSN.STATUS = wipSN.STATUS > 0 ? MES_WIP_DATA.STATUSs.OK.GetValue() : wipSN.STATUS;
diff --git a/Tiger.Business/MES/Biz.WorkBatch.cs b/Tiger.Business/MES/Biz.WorkBatch.cs
index 03c5d0d..458f609 100644
--- a/Tiger.Business/MES/Biz.WorkBatch.cs
+++ b/Tiger.Business/MES/Biz.WorkBatch.cs
@@ -14,6 +14,7 @@
 using Tiger.Business.MES;
 using Org.BouncyCastle.Ocsp;
 using Tiger.Model.Entitys.MES.Position;
+using static System.Net.Mime.MediaTypeNames;
 
 namespace Tiger.Business
 {
@@ -30,6 +31,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; }
@@ -56,21 +58,87 @@
             /// <returns></returns>
             public WorkBatch Init(string lineCode)
             {
+                LineCode = lineCode;
                 WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).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).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>
+            /// <returns></returns>
+            public ApiAction<SubmitOutput> CheckStatus()
+            {
+                var action = new ApiAction<SubmitOutput>(true);
+
+                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).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.CurWO = WO.ORDER_NO;
+                    action.Data.CurBatch = Batch.BATCH_NO;
+                    //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.CurWO = WO.ORDER_NO;
+                    action.Data.CurBatch = Batch.BATCH_NO;
+                    //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());
+                }
+
+                return action;
             }
 
             /// <summary>
@@ -150,6 +218,177 @@
             }
 
             /// <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>();
+
+                //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
+                if (wipSN.NODE_ID.IsNullOrEmpty())
+                {
+                    if (nextNode.IS_FIRST_NODE == "Y")
+                    {
+                        action.IsSuccessed = true;
+                        return action;
+                    }
+                    else
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.CurWO = WO.ORDER_NO;
+                        action.Data.CurBatch = Batch.BATCH_NO;
+                        var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
+                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, 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);
+                    //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁娌℃湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁娌℃湁杩炵嚎鍒扮淮淇伐搴忥紝鏈夊垯鍏佽锛屾病鏈夊垯鎶ラ敊
+                    if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        //if (nextNode.IS_FIRST_NODE == "Y")
+                        //{
+                        //    action.IsSuccessed = true;
+                        //}
+                        //else
+                        //{
+                        //    action.IsSuccessed = false;
+                        //    action.Data.CurWO = WO.ORDER_NO;
+                        //    action.Data.CurBatch = Batch.BATCH_NO;
+                        //    var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
+                        //    action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                        //    return action;
+                        //}
+                    }
+                    //缁翠慨鍥炴祦锛氬鏋滄潯鐮佺殑褰撳墠宸ュ簭鏄淮淇伐搴忥紝鍒欒涓烘槸缁翠慨鍥炴祦
+                    else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                    {
+                        //if (nextNode.IS_FIRST_NODE == "Y")
+                        //{
+                        //    action.IsSuccessed = true;
+                        //}
+                        //else
+                        //{
+                        //    action.IsSuccessed = false;
+                        //    action.Data.CurWO = WO.ORDER_NO;
+                        //    action.Data.CurBatch = Batch.BATCH_NO;
+                        //    var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
+                        //    action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, 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.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) && curSetting.ALLOW_DFT_IN != "Y")
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.CurWO = WO.ORDER_NO;
+                        action.Data.CurBatch = Batch.BATCH_NO;
+                        action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, wipSN.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.CurWO = WO.ORDER_NO;
+                            action.Data.CurBatch = Batch.BATCH_NO;
+                            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", wipSN.SN, 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.CurWO = WO.ORDER_NO;
+                                action.Data.CurBatch = Batch.BATCH_NO;
+                                var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y"));
+                                action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", wipSN.SN, 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)))
+                    {
+                        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>
             /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭涓嶈壇浠g爜
             /// </summary>
             /// <param name="postCode"></param>
diff --git a/Tiger.Business/MES/Biz.WorkStep.cs b/Tiger.Business/MES/Biz.WorkStep.cs
index 5ac5564..10afd43 100644
--- a/Tiger.Business/MES/Biz.WorkStep.cs
+++ b/Tiger.Business/MES/Biz.WorkStep.cs
@@ -32,12 +32,12 @@
             public string ID { get; set; } = Guid.NewGuid().ToString("N");
             public string NodeID { get; set; } 
             public IWorkStep.Types Type { get; set; }
-            public int Sequence { get; set; }
             public MES_WO_NODE Node { get; set; }
             public MES_WO_NODE_ACT NodeAct { get; set; }
             public MES_WO_ACTION Setting { get; set; }
             public IPosition CurPosition { get; set; }
             public IWorkAction CurAction { get; set; }
+            public int Sequence { get; set; }
             public List<string> PrepNodeIDs { get; set; } = new();
             private bool _IsFinished = false;
             public bool IsFinished
diff --git a/Tiger.Business/Tiger.Business.csproj b/Tiger.Business/Tiger.Business.csproj
index fbae5f4..82ac5cf 100644
--- a/Tiger.Business/Tiger.Business.csproj
+++ b/Tiger.Business/Tiger.Business.csproj
@@ -1,10 +1,10 @@
 锘�<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup Label="Globals">
-    <SccProjectName>SAK</SccProjectName>
-    <SccProvider>SAK</SccProvider>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccLocalPath>SAK</SccLocalPath>
+    <SccProjectName></SccProjectName>
+    <SccProvider></SccProvider>
+    <SccAuxPath></SccAuxPath>
+    <SccLocalPath></SccLocalPath>
     <Platforms>AnyCPU;x86</Platforms>
   </PropertyGroup>
 

--
Gitblit v1.9.3