From f4ce2bcaa377c5fe869c0e8f0e1640cee3f8a400 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期一, 04 十一月 2024 14:47:50 +0800
Subject: [PATCH] 增加在线产品异常下线功能

---
 Tiger.Api/Language.db                          |    0 
 Tiger.Business.MES/Transaction/YadaPacking.cs  |    3 
 Tiger.Business.MES/Transaction/CollectNode.cs  |    1 
 Tiger.Business.MES/Transaction/PackingNode.cs  |    3 
 Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs     |    8 
 Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs   |   10 +
 Tiger.Business.MES/Common/WoContext.cs         |    2 
 Tiger.Business.MES/Transaction/TestNode.cs     |   89 +++++++++++++-
 Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs     |   18 +-
 Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs     |   24 ++-
 Tiger.Business.MES/Common/WorkBatch.cs         |  129 +++++++++++++++++++--
 Tiger.Business.MES/WorkAction/PackingAction.cs |   20 +-
 Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs    |   25 ++-
 13 files changed, 267 insertions(+), 65 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index e41a479..704ae6b 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.MES/Common/WoContext.cs b/Tiger.Business.MES/Common/WoContext.cs
index fda4192..0cb1963 100644
--- a/Tiger.Business.MES/Common/WoContext.cs
+++ b/Tiger.Business.MES/Common/WoContext.cs
@@ -128,6 +128,7 @@
                                 BATCH_NO = woSN.BATCH_NO,
                                 HOLD_FLAG = "N",
                                 FINISHED_FLAG = "N",
+                                UNBIND_FLAG = "N",
                                 INV_FLAG = "N",
                                 DFT_FLAG = "N",
                                 DFT_COUNT = 0,
@@ -188,6 +189,7 @@
                                 BATCH_NO = woSN.BATCH_NO,
                                 HOLD_FLAG = "N",
                                 FINISHED_FLAG = "N",
+                                UNBIND_FLAG = "N",
                                 INV_FLAG = "N",
                                 DFT_FLAG = "N",
                                 DFT_COUNT = 0,
diff --git a/Tiger.Business.MES/Common/WorkBatch.cs b/Tiger.Business.MES/Common/WorkBatch.cs
index ad9ff06..50e3fe1 100644
--- a/Tiger.Business.MES/Common/WorkBatch.cs
+++ b/Tiger.Business.MES/Common/WorkBatch.cs
@@ -10,6 +10,8 @@
 using Tiger.IBusiness;
 using Tiger.Model.Entitys.MES.Position;
 using Tiger.Business.MES;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
+using Org.BouncyCastle.Ocsp;
 
 namespace Tiger.Business
 {
@@ -60,17 +62,17 @@
             return this;
         }
 
-        public void Update()
+        public void Update(bool updateAll = false)
         {
             var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
             var batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.BATCH_NO == Batch.BATCH_NO).First();
             if (WoContext.WoBatchDic.ContainsKey(batch.BATCH_NO))
             {
-                if (wo.STATUS > BIZ_MES_WO.STATUSs.Working.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
+                if (wo.STATUS < BIZ_MES_WO.STATUSs.Release.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
                 {
                     WoContext.WoBatchDic.Remove(Batch.BATCH_NO);
                 }
-                else if(wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME)
+                else if(updateAll || wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME)
                 {
                     GetBatchInfo();
                 }
@@ -160,21 +162,20 @@
                 action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnumDesc<BIZ_MES_WO.STATUSs>());
             }
             //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
-            //if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
-            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= Batch.PLAN_QTY)
             {
                 action.IsSuccessed = false;
                 action.Data.SetValue(this, null);
                 //action.LocaleMsg = new($"宸ュ崟鎵规[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
-                action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), Batch.SCRAP_QTY, Batch.PLAN_QTY);
+                action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), Batch.PLAN_QTY);
             }
             //宸ュ崟鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
-            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY)
+            if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q =>q.WORK_ORDER == WO.ORDER_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= 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);
+                action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), WO.PLAN_QTY);
             }
 
             return action;
@@ -420,7 +421,7 @@
                     {
                         //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
                         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))
+                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                              ).ToList();
                         foreach (var prepID in prepIDs)
                         {
@@ -461,13 +462,13 @@
             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)
+                                                                && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && 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")
+                if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
                 {
                     var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == next.ID);
                     //鍚庣画宸ュ簭鏄惎鐢ㄧ殑锛屽垯娣诲姞
@@ -521,7 +522,7 @@
                     {
                         //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
                         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))
+                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.UNBIND_FLAG != "Y" && h.NODE_ID == e.TGT_NODE && h.IsFinished))
                                                              ).ToList();
                         foreach (var prepID in prepIDs)
                         {
@@ -569,6 +570,110 @@
             return result;
         }
 
+        /// <summary>
+        /// 浠庡伐鍗曚腑绉婚櫎姝e湪鐢熶骇鐨勬潯鐮�
+        /// </summary>
+        /// <param name="wipList"></param>
+        /// <returns></returns>
+        public ApiAction RemoveWipSn(List<MES_WIP_DATA> wipList, string user)
+        {
+            var action = UnbindWipSnFromWO(WO, wipList, user);
+            //绉婚櫎鎴愬姛鍒欏鐞嗗伐鍗曠紦瀛樹腑鐨勬暟鎹�
+            if (action.IsSuccessed)
+            {
+                Update(true);
+            }
+
+            return action;
+        }
+
+        /// <summary>
+        /// 浠庡伐鍗曚腑瑙g粦姝e湪鐢熶骇鐨勬潯鐮�
+        /// </summary>
+        /// <param name="wo"></param>
+        /// <param name="wipList"></param>
+        /// <returns></returns>
+        public static ApiAction UnbindWipSnFromWO(BIZ_MES_WO wo, List<MES_WIP_DATA> wipList, string user)
+        {
+            var action = new ApiAction();
+
+            var wipIDs = wipList.Select(q => q.ID);
+            var batchs = wipList.Where(q => !q.BATCH_NO.IsNullOrEmpty()).GroupBy(q => new { q.BATCH_NO }).Select(g => new { 
+                g.Key.BATCH_NO, 
+                Qty = g.Count(),
+                FinishQty = g.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue()),
+            });
+            var db = Biz.Db;
+            var dbTran = db.UseTran(() =>
+            {
+                //BIZ_MES_WO
+                wo.INPUT_QTY -= wipList.Count;
+                wo.OUTPUT_QTY -= wipList.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue());
+                wo.SCRAP_QTY += wipList.Count;
+                db.Updateable(wo, user).UpdateColumns(q => new { q.INPUT_QTY, q.OUTPUT_QTY, q.SCRAP_QTY, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand();
+                //BIZ_MES_WO_BATCH
+                foreach (var batch in batchs)
+                {
+                    db.Updateable<BIZ_MES_WO_BATCH>(user)
+                         .SetColumns(q => q.INPUT_QTY == q.INPUT_QTY - batch.Qty)
+                         .SetColumns(q => q.OUTPUT_QTY == q.OUTPUT_QTY - batch.FinishQty)
+                         .SetColumns(q => q.SCRAP_QTY == q.SCRAP_QTY + batch.Qty)
+                         .Where(q => q.BATCH_NO == q.BATCH_NO)
+                         .ExecuteCommand();
+                }
+                //BIZ_MES_WO_SN
+                db.Updateable<BIZ_MES_WO_SN>(user)
+                            .SetColumns(q => q.STATUS == BIZ_MES_WO_SN.STATUSs.Offline.GetValue())
+                            .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
+                            .ExecuteCommand();
+                //MES_WIP_DATA & MES_WIP_HIS
+                var wipHiss = new List<MES_WIP_HIS>();
+                foreach (var wipSN in wipList.Where(q => q.STATUS != MES_WIP_DATA.STATUSs.Offline.GetValue()))
+                {
+                    wipSN.STATUS = MES_WIP_DATA.STATUSs.Offline.GetValue();
+                    wipSN.UNBIND_FLAG = "Y";
+                    wipSN.NODE_ID = "";
+                    wipSN.NODE_NAME = "涓嬬嚎閫�搴�";
+                    wipSN.OPERATION_TIME = DateTime.Now;
+                    var his = new MES_WIP_HIS(wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]涓嬬嚎");
+                    wipHiss.Add(his);
+                }
+                db.Storageable(wipList, user).ExecuteCommand();
+                db.Storageable(wipHiss, user).ExecuteCommand();
+                db.Updateable<MES_WIP_HIS>(user)
+                           .SetColumns(q => q.UNBIND_FLAG == "Y")
+                           .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
+                           .ExecuteCommand();
+                //MES_WIP_PKG
+                var curpkg = db.Queryable<MES_WIP_PKG>().Where(q => wipIDs.Contains(q.WIP_ID)).ToList();
+                db.Deleteable(curpkg).ExecuteCommand();
+                var pkgs = new List<MES_WIP_PKG>();
+                do
+                {
+                    var parentSns = curpkg.Where(q => !q.PARENT_SN.IsNullOrEmpty()).Select(q => q.PARENT_SN).Distinct();
+                    curpkg = db.Queryable<MES_WIP_PKG>().Where(q => parentSns.Contains(q.SN)).ToList();
+                    foreach (var pkg in curpkg)
+                    {
+                        pkg.QTY = db.Queryable<MES_WIP_PKG>().Where(q => q.PARENT_SN == pkg.SN).Sum(q => q.QTY);
+                        pkgs.Add(pkg);
+                    }
+                }
+                while (curpkg.Any());
+                db.Updateable(curpkg, user).ExecuteCommand();
+                //MES_WIP_DFT锛屽湪涓婁粨搴撹閰嶅拰缁翠慨涔嬪墠锛屽厛鎶婁笉鑹褰曟爣璁颁负宸插鐞�
+                db.Updateable<MES_WIP_DFT>(user)
+                           .SetColumns(q => q.STATUS == MES_WIP_DFT.STATUSs.Resolved.GetValue())
+                           .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID))
+                           .ExecuteCommand();
+            });
+            if (!dbTran.IsSuccess)
+            {
+                //鎶涘嚭寮傚父
+                throw dbTran.ErrorException;
+            }
+
+            return action;
+        }
         #endregion
 
         /// <summary>
diff --git a/Tiger.Business.MES/Transaction/CollectNode.cs b/Tiger.Business.MES/Transaction/CollectNode.cs
index 38aef47..70534f5 100644
--- a/Tiger.Business.MES/Transaction/CollectNode.cs
+++ b/Tiger.Business.MES/Transaction/CollectNode.cs
@@ -268,6 +268,7 @@
                             HOLD_FLAG = "N",
                             REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                             FINISHED_FLAG = "N",
+                            UNBIND_FLAG = "N",
                             INV_FLAG = "N",
                             DFT_FLAG = "N",
                             DFT_COUNT = 0,
diff --git a/Tiger.Business.MES/Transaction/PackingNode.cs b/Tiger.Business.MES/Transaction/PackingNode.cs
index 3d6c852..fd01834 100644
--- a/Tiger.Business.MES/Transaction/PackingNode.cs
+++ b/Tiger.Business.MES/Transaction/PackingNode.cs
@@ -308,6 +308,7 @@
                             HOLD_FLAG = "N",
                             REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                             FINISHED_FLAG = "N",
+                            UNBIND_FLAG = "N",
                             INV_FLAG = "N",
                             DFT_FLAG = "N",
                             DFT_COUNT = 0,
@@ -670,7 +671,7 @@
                         var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                         var wo = _pkgList.First().WORK_ORDER;
                         //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
-                        db.Updateable<MES_WIP_HIS>()
+                        db.Updateable<MES_WIP_HIS>(UserCode)
                             .SetColumns(q => q.TRAY_SN == curPkg.Item.Package.SN)
                             .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == curPkg.Item.Package.SN)
diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index dbe6279..d334a8d 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -1,13 +1,6 @@
 锘縰sing Rhea.Common;
-using Tiger.IBusiness;
 using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
+using Tiger.IBusiness;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
 
@@ -269,6 +262,7 @@
                             HOLD_FLAG = "N",
                             REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                             FINISHED_FLAG = "N",
+                            UNBIND_FLAG = "N",
                             INV_FLAG = "N",
                             DFT_FLAG = "N",
                             DFT_COUNT = 0,
@@ -413,8 +407,16 @@
                                 LOCK_BATCH = wipSN.LOCK_BATCH,
                                 WIP_ID = wipSN.ID,
                             };
+                            wipSN.Defects.Add(defect);
                             CurDefects.Add(defect);
                         }
+                    }
+
+                    //浜у搧琚垽鏂笉鑹悗涓嬬嚎锛屽苟浠庡伐鍗曚腑绉婚櫎姝e湪鐢熶骇鐨勬潯鐮�
+                    if (CurDefects.Any() && curNodeSetting.IF_DFT_OFFLINE == "Y")
+                    {
+                        woStatus.Data.ShortMsg = new("浜у搧涓嬬嚎", ShortMessage.Types.Error);
+                        return OfflineIfDefect(action, wipSNs, input.Locale);
                     }
 
                     //宸ュ崟寮�宸�
@@ -622,7 +624,7 @@
             SaveStepsCommitActionToDB(endAction);
 
             //淇濆瓨鎴愬姛锛岃繑鍥炶繃绔欐秷鎭�
-            CurOperInfo(locale).InputQty += CurWipSNs.Count;
+            operInfo.InputQty += CurWipSNs.Count;
             action.Data.OperInfo = operInfo;
             action.Data.ShortMsg = new(CurWipSNs.Any(q => q.DFT_FLAG == "Y") ? "涓嶈壇杩囩珯" : "鑹搧杩囩珯", ShortMessage.Types.Success);
             //action.LocaleMsg = new($"宸ュ崟[{CurWipSN.WORK_ORDER}]鐨勬潯鐮乕{CurWipSN.SN}]鍦ㄥ矖浣峓{CurWipSN.POST_CODE}]宸ュ簭[{CurWipSN.NODE_NAME}]杩囩珯鎴愬姛锛岀姸鎬乕{CurWipSN.STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>()}]");
@@ -640,6 +642,75 @@
         }
 
         /// <summary>
+        /// 浜у搧琚垽鏂笉鑹悗涓嬬嚎
+        /// </summary>
+        /// <param name="action"></param>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> OfflineIfDefect(ApiAction<SubmitOutput> action, List<MES_WIP_DATA> wipSNs, string locale)
+        {
+            var operInfo = SetOperNodeInfo(CurOperInfo(locale));
+            operInfo.CurNode = wipSNs.FirstOrDefault()?.NODE_NAME;
+            operInfo.NextNode = "涓嬬嚎閫�搴�";
+
+            //鏇存柊宸ュ崟鏉$爜鏄庣粏淇℃伅
+            var woSNs = CurBatch.WoSNs.Where(q => wipSNs.Any(w => q.WIP_ID == w.ID)).ToList();
+            foreach (var woSN in woSNs)
+            {
+                woSN.STATUS = BIZ_MES_WO_SN.STATUSs.Offline.GetValue();
+            }
+
+            //鏉$爜涓嬬嚎
+            foreach (var wipSN in wipSNs)
+            {
+                wipSN.STATUS = MES_WIP_DATA.STATUSs.Offline.GetValue();
+                wipSN.UNBIND_FLAG = "Y";
+            }
+
+            var wipHiss = new List<MES_WIP_HIS>();
+            foreach (var wipSN in wipSNs)
+            {
+                var his = new MES_WIP_HIS(wipSN, $"宸ュ崟[{wipSN.WORK_ORDER}]鏉$爜[{wipSN.SN}]鍦ㄥ矖浣峓{wipSN.POST_CODE}]宸ュ簭[{wipSN.NODE_NAME}]鍥犱笉鑹痆{wipSN.Defects.FirstOrDefault()?.DFT_NAME}]涓嬬嚎锛圱ransId锛� {TransID} 锛�");
+                wipSN.History.Add(his);
+                wipHiss.Add(his);
+            }
+
+            //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+            var _woSns = woSNs.Clone();
+            var _wipSns = wipSNs.Clone();
+            var _wipHiss = wipHiss.Clone();
+            var _defect = CurDefects.Clone();
+            //浣跨敤缁熶竴鐨勪簨鍔B瀵硅薄
+            var db = GetCommitDB();
+            //淇濆瓨鏁版嵁搴�
+            var dbTran = db.UseTran(() =>
+            {
+                //鏁版嵁淇濆瓨閫昏緫
+                db.Storageable(_woSns, UserCode).ExecuteCommand();
+                db.Storageable(_wipSns, UserCode).ExecuteCommand();
+                db.Storageable(_wipHiss, UserCode).ExecuteCommand();
+                db.Storageable(_defect, UserCode).ExecuteCommand();
+            });
+            if (!dbTran.IsSuccess)
+            {
+                //鎶涘嚭寮傚父
+                throw dbTran.ErrorException;
+            }
+
+            //浠庡伐鍗曚腑绉婚櫎姝e湪鐢熶骇鐨勬潯鐮�
+            CurBatch.RemoveWipSn(wipSNs, UserCode);
+
+            //淇濆瓨鎴愬姛锛岃繑鍥炶繃绔欐秷鎭�
+            action.Data.OperInfo = operInfo;
+            action.Data.ShortMsg = new("涓嬬嚎閫�搴�", ShortMessage.Types.Warning);
+            //action.LocaleMsg = new($"宸ュ崟[0]鐨勬潯鐮乕1]鍦ㄥ矖浣峓2]宸ュ簭[3]鍥犱笉鑹痆4]涓嬬嚎锛岀姸鎬乕5]");
+            action.LocaleMsg = new("MES.Transaction.TestNode.OfflineIfDefect", wipSNs.First().WORK_ORDER, CurSN, wipSNs.First().POST_CODE, wipSNs.First().NODE_NAME, wipSNs.First().Defects.FirstOrDefault()?.DFT_NAME, wipSNs.First().STATUS.GetEnumDesc<MES_WIP_DATA.STATUSs>());
+
+            //閲嶇疆宸ュ簭
+            ResetNode();
+            return action;
+        }
+
+        /// <summary>
         /// 娴嬭瘯宸ュ簭锛氳幏鍙栧伐搴忎笉鑹唬鐮�
         /// </summary>
         /// <returns></returns>
diff --git a/Tiger.Business.MES/Transaction/YadaPacking.cs b/Tiger.Business.MES/Transaction/YadaPacking.cs
index e6d4df5..360084e 100644
--- a/Tiger.Business.MES/Transaction/YadaPacking.cs
+++ b/Tiger.Business.MES/Transaction/YadaPacking.cs
@@ -323,6 +323,7 @@
                             HOLD_FLAG = "N",
                             REWORK_FLAG = CurBatch.WO.ORDER_TYPE == BIZ_MES_WO.ORDER_TYPEs.Rework.GetValue() ? "Y" : "N",
                             FINISHED_FLAG = "N",
+                            UNBIND_FLAG = "N",
                             INV_FLAG = "N",
                             DFT_FLAG = "N",
                             DFT_COUNT = 0,
@@ -685,7 +686,7 @@
                         var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
                         var wo = _pkgList.First().WORK_ORDER;
                         //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
-                        db.Updateable<MES_WIP_HIS>()
+                        db.Updateable<MES_WIP_HIS>(UserCode)
                             .SetColumns(q => q.TRAY_SN == curPkg.Item.Package.SN)
                             .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == curPkg.Item.Package.SN)
diff --git a/Tiger.Business.MES/WorkAction/PackingAction.cs b/Tiger.Business.MES/WorkAction/PackingAction.cs
index 6b1447e..ee6f046 100644
--- a/Tiger.Business.MES/WorkAction/PackingAction.cs
+++ b/Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -895,28 +895,28 @@
                         var actID = _pkgList.First().ACT_ID;
                         var wo = _pkgList.First().WORK_ORDER;
                         //鍖呰淇℃伅淇濆瓨鍒板湪鍒跺搧淇℃伅琛�
-                        db.Updateable<MES_WIP_DATA>()
+                        db.Updateable<MES_WIP_DATA>(CurPosition.UserCode)
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                             .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                             .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.ID))
                             .ExecuteCommand();
                         //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
-                        db.Updateable<MES_WIP_HIS>()
+                        db.Updateable<MES_WIP_HIS>(CurPosition.UserCode)
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                             .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                             .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && wipIDs.Contains(q.WIP_ID))
                             .ExecuteCommand();
                         //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц涓鸿褰�
-                        db.Updateable<MES_WIP_ACT>()
+                        db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                             .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                             .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && wipIDs.Contains(q.WIP_ID))
                             .ExecuteCommand();
                         //鍖呰淇℃伅淇濆瓨鍒板伐鍗曟潯鐮佹槑缁嗚〃
-                        db.Updateable<BIZ_MES_WO_SN>()
+                        db.Updateable<BIZ_MES_WO_SN>(CurPosition.UserCode)
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                             .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                             .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
@@ -945,7 +945,7 @@
                             var actID = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).ACT_ID;
                             var wo = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).WORK_ORDER;
                             //鍖呰淇℃伅淇濆瓨鍒板湪鍒跺搧淇℃伅琛�
-                            db.Updateable<MES_WIP_DATA>()
+                            db.Updateable<MES_WIP_DATA>(CurPosition.UserCode)
                                 .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                 .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                 .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
@@ -953,20 +953,20 @@
                                 .ExecuteCommand();
                             //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
                             var endOperCode = CurPkg.IsReachedEndNode ? "EndNode" : "NotReachedEndNode";
-                            db.Updateable<MES_WIP_HIS>()
+                            db.Updateable<MES_WIP_HIS>(CurPosition.UserCode)
                                 .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                 .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                 .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                                 .Where(q => q.WORK_ORDER == wo && (q.NODE_ID == nodeID || q.OPER_CODE == endOperCode) && wipIDs.Contains(q.WIP_ID))
                                 .ExecuteCommand();
                             //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц涓鸿褰�
-                            db.Updateable<MES_WIP_ACT>()
+                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                 .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                 .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                                 .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
                                 .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && wipIDs.Contains(q.WIP_ID))
                                 .ExecuteCommand();
-                            db.Updateable<MES_WIP_ACT>()
+                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                 .SetColumns(q => q.ACT_VALUE_1 == (CurPkg.IsFinished ? "Y" : "N"))
                                 .SetColumns(q => q.ACT_VALUE_2 == CurPkg.ToJson())
                                 .SetColumns(q => q.ACT_VALUE_3 == (CurPkg.IsFinished ? LabelDic[CurPkg.Item.PKG_LEVEL].ToJson() : ""))
@@ -974,7 +974,7 @@
                                 .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == actID && q.WIP_ID == _lastWipID)
                                 .ExecuteCommand();
                             var InStoreLabel = CurPkg.IsFinished ? CurPkg.InStoreLabel?.ToJson() : "";
-                            db.Updateable<MES_WIP_ACT>()
+                            db.Updateable<MES_WIP_ACT>(CurPosition.UserCode)
                                 .SetColumns(q => q.ACT_VALUE_1 == (CurPkg.IsFinished ? "Y" : "N"))
                                 .SetColumns(q => q.ACT_VALUE_2 == CurPkg.ToJson())
                                 .SetColumns(q => q.ACT_VALUE_3 == InStoreLabel)
@@ -982,7 +982,7 @@
                                 .Where(q => q.WORK_ORDER == wo && q.NODE_ID == nodeID && q.ACT_ID == CurPkg.InStoreActID && q.WIP_ID == _lastWipID)
                                 .ExecuteCommand();
                             //鍖呰淇℃伅淇濆瓨鍒板伐鍗曟潯鐮佹槑缁嗚〃
-                            db.Updateable<BIZ_MES_WO_SN>()
+                            db.Updateable<BIZ_MES_WO_SN>(CurPosition.UserCode)
                                 .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                                 .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
                                 .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
diff --git a/Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs b/Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs
index d364797..07a17d4 100644
--- a/Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs
+++ b/Tiger.Model.Net/Entitys/MES/BIZ_MES_WO_SN.cs
@@ -64,9 +64,9 @@
         [DisplayName("鐗╂枡缂栫爜")]
         public string ITEM_CODE { get; set; }
         /// <summary>
-        /// 鐘舵��(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Scrap宸叉姤搴�)
+        /// 鐘舵��(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Offline寮傚父涓嬬嚎|4Scrap宸叉姤搴�)
         /// </summary>
-        [DisplayName("鐘舵��(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Scrap宸叉姤搴�)")]
+        [DisplayName("鐘舵��(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Offline寮傚父涓嬬嚎|4Scrap宸叉姤搴�)")]
         public int STATUS { get; set; }
         /// <summary>
         /// 澶囨敞
@@ -108,7 +108,7 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Scrap宸叉姤搴�)
+        /// 鏋氫妇锛氱姸鎬�(0NotInput鏈姇鍏1Inputed宸叉姇鍏2Finished宸插畬宸3Offline寮傚父涓嬬嚎|4Scrap宸叉姤搴�)
         /// </summary>
         public enum STATUSs
         {
@@ -118,8 +118,10 @@
             Inputed = 1,
             [Description("宸插畬宸�")]
             Finished = 2,
+            [Description("寮傚父涓嬬嚎")]
+            Offline = 3,
             [Description("宸叉姤搴�")]
-            Scrap = 3,
+            Scrap = 4,
         }
         #endregion
 
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs
index 69ea248..59e596b 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_ACT.cs
@@ -39,9 +39,9 @@
         [DisplayName("杩囩珯鏉$爜")]
         public string SN { get; set; }
         /// <summary>
-        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
-        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)")]
+        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)")]
         public int STATUS { get; set; }
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -248,7 +248,7 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
         public enum STATUSs
         {
@@ -264,14 +264,16 @@
             Repair = 4,
             [Description("宸插畬宸�")]
             Finished = 5,
-            [Description("宸叉姤搴�")]
-            Scrap = 6,
             [Description("宸插叆搴�")]
-            InStorage = 7,
+            InStorage = 6,
             [Description("宸叉嫆鏀�")]
-            Reject = 8,
+            Reject = 7,
             [Description("宸插嚭璐�")]
-            Shipped = 9,
+            Shipped = 8,
+            [Description("寮傚父涓嬬嚎")]
+            Offline = 9,
+            [Description("宸叉姤搴�")]
+            Scrap = 10,
         }
 
         /// <summary>
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
index 41f15df..caa05ca 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
@@ -29,9 +29,9 @@
         [DisplayName("杩囩珯鏉$爜")]
         public string SN { get; set; }
         /// <summary>
-        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
-        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)")]
+        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�))")]
         public int STATUS { get; set; }
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -108,6 +108,11 @@
         /// </summary>
         [DisplayName("杩斿伐鏍囪")]
         public string REWORK_FLAG { get; set; }
+        /// <summary>
+        /// 瑙g粦鏍囪(鍥犲紓甯镐笅绾垮鑷村綋鍓嶈褰曚粠宸ュ崟鐢熶骇鏁版嵁涓Щ闄わ紝涓嶅弬涓庡伐鑹烘祦绋嬭绠楀拰鏁版嵁缁熻)
+        /// </summary>
+        [DisplayName("瑙g粦鏍囪(鍥犲紓甯镐笅绾垮鑷村綋鍓嶈褰曚粠宸ュ崟鐢熶骇鏁版嵁涓Щ闄わ紝涓嶅弬涓庡伐鑹烘祦绋嬭绠楀拰鏁版嵁缁熻)")]
+        public string UNBIND_FLAG { get; set; }
         /// <summary>
         /// 鏄惁瀹屽伐
         /// </summary>
@@ -258,7 +263,7 @@
         [Navigate(NavigateType.OneToMany, nameof(MES_WIP_HIS.WIP_ID), nameof(ID), "GHOST_ROW = 0")]//ClassA琛ㄤ腑鐨凪ES_WIP_DATAId
         public List<MES_WIP_HIS> _History { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
         [SugarColumn(IsIgnore = true)]
-        public List<MES_WIP_HIS> History => _History ?? new List<MES_WIP_HIS>();
+        public List<MES_WIP_HIS> History => _History.Where(q => q.UNBIND_FLAG != "Y").ToList() ?? new List<MES_WIP_HIS>();
         [Navigate(NavigateType.OneToMany, nameof(MES_WIP_DFT.WIP_ID), nameof(ID), "GHOST_ROW = 0")]//ClassA琛ㄤ腑鐨凪ES_WIP_DATAId
         public List<MES_WIP_DFT> _Defects { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
         [SugarColumn(IsIgnore = true)]
@@ -277,7 +282,7 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
         public enum STATUSs
         {
@@ -293,14 +298,16 @@
             Repair = 4,
             [Description("宸插畬宸�")]
             Finished = 5,
-            [Description("宸叉姤搴�")]
-            Scrap = 6,
             [Description("宸插叆搴�")]
-            InStorage = 7,
+            InStorage = 6,
             [Description("宸叉嫆鏀�")]
-            Reject = 8,
+            Reject = 7,
             [Description("宸插嚭璐�")]
-            Shipped = 9,
+            Shipped = 8,
+            [Description("寮傚父涓嬬嚎")]
+            Offline = 9,
+            [Description("宸叉姤搴�")]
+            Scrap = 10,
         }
 
         /// <summary>
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs
index c4cd3b5..db0ac1f 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_DFT.cs
@@ -34,9 +34,9 @@
         [DisplayName("杩囩珯鏉$爜")]
         public string SN { get; set; }
         /// <summary>
-        /// 鐘舵��(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞�)
+        /// 鐘舵��(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞唡3Scrap宸叉姤搴�)
         /// </summary>
-        [DisplayName("鐘舵��(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞�)")]
+        [DisplayName("鐘舵��(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞唡3Scrap宸叉姤搴�)")]
         public int STATUS { get; set; }
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -263,7 +263,7 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞�)
+        /// 鏋氫妇锛氱姸鎬�(0WaitHandle寰呭鐞唡1Repairing缁翠慨涓瓅2Resolved宸插鐞唡3Scrap宸叉姤搴�)
         /// </summary>
         public enum STATUSs
         {
@@ -273,6 +273,8 @@
             Repairing = 1,
             [Description("宸插鐞�")]
             Resolved = 2,
+            [Description("宸叉姤搴�")]
+            Scrap = 3,
         }
 
         /// <summary>
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
index d38e16b..9dff33c 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
@@ -52,6 +52,7 @@
             SEGMENT = data.SEGMENT;
             HOLD_FLAG = data.HOLD_FLAG;
             REWORK_FLAG = data.REWORK_FLAG;
+            UNBIND_FLAG = data.UNBIND_FLAG;
             FINISHED_FLAG = data.FINISHED_FLAG;
             DFT_FLAG = data.DFT_FLAG;
             DFT_COUNT = data.DFT_COUNT;
@@ -92,9 +93,9 @@
         [DisplayName("杩囩珯鏉$爜")]
         public string SN { get; set; }
         /// <summary>
-        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
-        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)")]
+        [DisplayName("鐘舵��(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)")]
         public int STATUS { get; set; }
         /// <summary>
         /// 鐗╂枡缂栫爜
@@ -171,6 +172,11 @@
         /// </summary>
         [DisplayName("杩斿伐鏍囪")]
         public string REWORK_FLAG { get; set; }
+        /// <summary>
+        /// 瑙g粦鏍囪(鍥犲紓甯镐笅绾垮鑷村綋鍓嶈褰曚粠宸ュ崟鐢熶骇鏁版嵁涓Щ闄わ紝涓嶅弬涓庡伐鑹烘祦绋嬭绠楀拰鏁版嵁缁熻)
+        /// </summary>
+        [DisplayName("瑙g粦鏍囪(鍥犲紓甯镐笅绾垮鑷村綋鍓嶈褰曚粠宸ュ崟鐢熶骇鏁版嵁涓Щ闄わ紝涓嶅弬涓庡伐鑹烘祦绋嬭绠楀拰鏁版嵁缁熻)")]
+        public string UNBIND_FLAG { get; set; }
         /// <summary>
         /// 鏄惁瀹屽伐
         /// </summary>
@@ -341,7 +347,7 @@
 		*/
 
         /// <summary>
-        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6Scrap宸叉姤搴焲7InStorage宸插叆搴搢8Reject宸叉嫆鏀秥9Shipped宸插嚭璐�)
+        /// 鏋氫妇锛氱姸鎬�(0Init鍒濆鍖東1Input宸叉姇鍏2OK鑹搧杩囩珯|3NG涓嶈壇杩囩珯|4Repair缁翠慨涓瓅5Finished宸插畬宸6InStorage宸插叆搴搢7Reject宸叉嫆鏀秥8Shipped宸插嚭璐9Offline寮傚父涓嬬嚎|10Scrap宸叉姤搴�)
         /// </summary>
         public enum STATUSs
         {
@@ -357,14 +363,16 @@
             Repair = 4,
             [Description("宸插畬宸�")]
             Finished = 5,
-            [Description("宸叉姤搴�")]
-            Scrap = 6,
             [Description("宸插叆搴�")]
-            InStorage = 7,
+            InStorage = 6,
             [Description("宸叉嫆鏀�")]
-            Reject = 8,
+            Reject = 7,
             [Description("宸插嚭璐�")]
-            Shipped = 9,
+            Shipped = 8,
+            [Description("寮傚父涓嬬嚎")]
+            Offline = 9,
+            [Description("宸叉姤搴�")]
+            Scrap = 10,
         }
 
         /// <summary>

--
Gitblit v1.9.3