From 0c2a5ba3e7e2334f1cd69a66cc60cc0be0e4129c Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期二, 30 七月 2024 22:34:39 +0800
Subject: [PATCH] 包装工序功能以及一些一直问题的优化

---
 Tiger.Model.Net/Entitys/BAS/BAS_PKG_DTL.cs                       |   28 
 Tiger.Api/Controllers/Test/TestController.R.cs                   |   11 
 Tiger.Api/Language.db                                            |    0 
 Tiger.Business.MES/Transaction/CollectNode.cs                    |   12 
 Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs                      |   66 +-
 Tiger.Business.MES/Transaction/PackingNode.cs                    |   16 
 Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs |   71 +++
 Tiger.Business.MES/Transaction/TestNode.cs                       |   12 
 Tiger.Model.Net/Entitys/MES/MES_WIP_PKG.cs                       |  138 ++---
 Tiger.Model.Net/Entitys/MES/MES_WO_OPER.cs                       |   20 
 Tiger.Model.Net/Entitys/MES/MES_PROD_ACTION.cs                   |   46 +
 Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs                       |   14 
 Tiger.IBusiness/MES/WorkAction/IPackingAction.cs                 |   12 
 Tiger.Model.Net/Entitys/MES/MES_WO_ACTION.cs                     |  184 ++++---
 Tiger.Business.MES/WorkAction/PackingAction.cs                   |  536 +++++++++++++++++++++++++
 Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs                      |   13 
 Tiger.Model.Net/Entitys/MES/MES_PROD_OPER.cs                     |   28 +
 17 files changed, 959 insertions(+), 248 deletions(-)

diff --git a/Tiger.Api/Controllers/Test/TestController.R.cs b/Tiger.Api/Controllers/Test/TestController.R.cs
index bb1017a..7a4eedf 100644
--- a/Tiger.Api/Controllers/Test/TestController.R.cs
+++ b/Tiger.Api/Controllers/Test/TestController.R.cs
@@ -319,6 +319,17 @@
             Logger.Default.Info($"{begin:mmssfff} completed");
             return Ok($"{begin:mmssfff} completed");
         }
+
+        [HttpPost]
+        public async Task<IActionResult> MESSubmitAsync([FromBody] ApiAction<SubmitInput> action)
+        {
+            var data = action.Data.Data;
+
+            data?.ToString().JsonToObject<PackingActionInput>();
+            var result = JsonConvert.DeserializeObject<PackingActionInput>(data?.ToString() ?? "");
+
+            return Ok(result?.ToJson());
+        }
     }
 
     /// <summary>
diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index d84d21c..407e464 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.MES/Transaction/CollectNode.cs b/Tiger.Business.MES/Transaction/CollectNode.cs
index 1376324..f0e0bf1 100644
--- a/Tiger.Business.MES/Transaction/CollectNode.cs
+++ b/Tiger.Business.MES/Transaction/CollectNode.cs
@@ -126,9 +126,9 @@
                                 result.Data.IsFinished = IsFinishAllSteps;
                                 result.Data.CurWO = CurBatch.WO.ORDER_NO;
                                 result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                                result.Data.CurNode = CurStep.NodeAct.ACT_NAME;
-                                result.Data.StepActCode = CurStep.NodeAct.ACT_CODE;
-                                result.Data.NextStepID = CurStep.ID;
+                                result.Data.CurNode = CurStep?.NodeAct.ACT_NAME;
+                                result.Data.StepActCode = CurStep?.NodeAct.ACT_CODE;
+                                result.Data.NextStepID = CurStep?.ID;
                             }
                         }
                         //濡傛灉鎵�鏈夊伐姝ラ兘瀹屾垚
@@ -273,7 +273,7 @@
                     };
                     Steps.Add(curStep);
 
-                    //鏈夐渶瑕佸垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
+                    //鏈夐渶瑕佺敤鎴锋彁浜や俊鎭垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
 
                     //鏈�鍚庢坊鍔犲綋鍓嶅伐搴忕殑琛屼负宸ユ
                     GenerateSteps(curStep);
@@ -306,7 +306,7 @@
                         result.Data.IsFinished = IsFinishAllSteps;
                         result.Data.CurWO = CurBatch.WO.ORDER_NO;
                         result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                        result.Data.CurNode = CurStep.Node.NODE_NAME;
+                        result.Data.CurNode = CurStep?.Node.NODE_NAME;
                         result.Data.NextStepID = next.ID;
 
                         //鏍规嵁宸ュ簭鑺傜偣宸ユ鐨勫簭鍙疯繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず
@@ -333,7 +333,7 @@
                     action.Data.IsFinished = IsFinishAllSteps;
                     action.Data.CurWO = CurBatch.WO.ORDER_NO;
                     action.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                    action.Data.CurNode = CurStep.Node.NODE_NAME;
+                    action.Data.CurNode = CurStep?.Node.NODE_NAME;
                     action.Data.NextStepID = "";
                     action = DoIfFinishAllSteps(action);
                 }
diff --git a/Tiger.Business.MES/Transaction/PackingNode.cs b/Tiger.Business.MES/Transaction/PackingNode.cs
index a736c08..7d64f06 100644
--- a/Tiger.Business.MES/Transaction/PackingNode.cs
+++ b/Tiger.Business.MES/Transaction/PackingNode.cs
@@ -126,9 +126,9 @@
                                 result.Data.IsFinished = IsFinishAllSteps;
                                 result.Data.CurWO = CurBatch.WO.ORDER_NO;
                                 result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                                result.Data.CurNode = CurStep.NodeAct.ACT_NAME;
-                                result.Data.StepActCode = CurStep.NodeAct.ACT_CODE;
-                                result.Data.NextStepID = CurStep.ID;
+                                result.Data.CurNode = CurStep?.NodeAct.ACT_NAME;
+                                result.Data.StepActCode = CurStep?.NodeAct.ACT_CODE;
+                                result.Data.NextStepID = CurStep?.ID;
                             }
                         }
                         //濡傛灉鎵�鏈夊伐姝ラ兘瀹屾垚
@@ -273,7 +273,7 @@
 	                };
 	                Steps.Add(curStep);
 	
-	                //鏈夐渶瑕佸垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
+	                //鏈夐渶瑕佺敤鎴锋彁浜や俊鎭垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
 	
 	                //鏈�鍚庢坊鍔犲綋鍓嶅伐搴忕殑琛屼负宸ユ
 	                GenerateSteps(curStep);
@@ -306,15 +306,15 @@
                         result.Data.IsFinished = IsFinishAllSteps;
                         result.Data.CurWO = CurBatch.WO.ORDER_NO;
                         result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                        result.Data.CurNode = CurStep.Node.NODE_NAME;
+                        result.Data.CurNode = CurStep?.Node.NODE_NAME;
                         result.Data.NextStepID = next.ID;
-                        
+
                         //鏍规嵁宸ュ簭鑺傜偣宸ユ鐨勫簭鍙疯繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず
                         switch (next.Sequence)
                         {
                             case 2:
                                 //action.LocaleMsg = new($"璇锋墽琛岀浜屾");
-                                result.LocaleMsg = new("MES.Transaction.PackingNode.绗簩姝ユ搷浣滄彁绀�");
+                                result.LocaleMsg = new("MES.Transaction.CollectNode.绗簩姝ユ搷浣滄彁绀�");
                                 break;
                             default:
                                 break;
@@ -333,7 +333,7 @@
                     action.Data.IsFinished = IsFinishAllSteps;
                     action.Data.CurWO = CurBatch.WO.ORDER_NO;
                     action.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                    action.Data.CurNode = CurStep.Node.NODE_NAME;
+                    action.Data.CurNode = CurStep?.Node.NODE_NAME;
                     action.Data.NextStepID = "";
                     action = DoIfFinishAllSteps(action);
                 }
diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index 17ef458..80ca242 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -127,9 +127,9 @@
                                 result.Data.IsFinished = IsFinishAllSteps;
                                 result.Data.CurWO = CurBatch.WO.ORDER_NO;
                                 result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                                result.Data.CurNode = CurStep.NodeAct.ACT_NAME;
-                                result.Data.StepActCode = CurStep.NodeAct.ACT_CODE;
-                                result.Data.NextStepID = CurStep.ID;
+                                result.Data.CurNode = CurStep?.NodeAct.ACT_NAME;
+                                result.Data.StepActCode = CurStep?.NodeAct.ACT_CODE;
+                                result.Data.NextStepID = CurStep?.ID;
                             }
                         }
                         //濡傛灉鎵�鏈夊伐姝ラ兘瀹屾垚
@@ -274,7 +274,7 @@
                     };
                     Steps.Add(curStep);
 
-                    //鏈夐渶瑕佸垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
+                    //鏈夐渶瑕佺敤鎴锋彁浜や俊鎭垯娣诲姞宸ュ簭鑺傜偣鐨勫叾浠栧伐姝�
 
                     //鏈�鍚庢坊鍔犲綋鍓嶅伐搴忕殑琛屼负宸ユ
                     GenerateSteps(curStep);
@@ -307,7 +307,7 @@
                         result.Data.IsFinished = IsFinishAllSteps;
                         result.Data.CurWO = CurBatch.WO.ORDER_NO;
                         result.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                        result.Data.CurNode = CurStep.Node.NODE_NAME;
+                        result.Data.CurNode = CurStep?.Node.NODE_NAME;
                         result.Data.NextStepID = next.ID;
 
                         //鏍规嵁宸ュ簭鑺傜偣宸ユ鐨勫簭鍙疯繑鍥炵浉搴旂殑鎿嶄綔鎻愮ず
@@ -334,7 +334,7 @@
                     action.Data.IsFinished = IsFinishAllSteps;
                     action.Data.CurWO = CurBatch.WO.ORDER_NO;
                     action.Data.CurBatch = CurBatch.Batch.BATCH_NO;
-                    action.Data.CurNode = CurStep.Node.NODE_NAME;
+                    action.Data.CurNode = CurStep?.Node.NODE_NAME;
                     action.Data.NextStepID = "";
                     action = DoIfFinishAllSteps(action);
                 }
diff --git a/Tiger.Business.MES/WorkAction/PackingAction.cs b/Tiger.Business.MES/WorkAction/PackingAction.cs
new file mode 100644
index 0000000..312c526
--- /dev/null
+++ b/Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -0,0 +1,536 @@
+锘縰sing Rhea.Common;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tiger.IBusiness;
+using Tiger.Model;
+using Tiger.Model.Entitys.MES.Position;
+
+namespace Tiger.Business.MES.WorkAction
+{
+    public class PackingAction : IPackingAction
+    {
+        #region Propertys & Variables
+        #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public bool IsFinished { get; set; } = false;
+        public IWorkStep CurStep { get; set; }
+        public IPosition CurPosition { get; set; }
+        public MES_WO_NODE_ACT NodeAct { get; set; }
+        public MES_WO_ACTION Setting { get; set; }
+        #endregion
+        public BAS_PKG_RULE PkgRule { get; set; }
+        public WipPkg CurPkg { get; set; }
+        public WipPkgItem CurPkgItem { get; set; }
+        public PackingActionOutput CurPrint { get; set; }
+        public int PrintTimes = 0;
+        public Dictionary<int, BAS_LABEL_TEMP> LabelDic { get; set; }
+        public List<BAS_LABEL_PV> LabelPV { get; set; }
+        public int FinishLevel = 0;
+        #endregion Propertys & Variables
+
+        #region Functions
+        /// <summary>
+        /// 鍒濆鍖栧伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
+        {
+            #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            CurStep = curStep;
+            CurPosition = position;
+            NodeAct = nodeAct;
+            Setting = setting;
+            #endregion
+
+            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
+            //鏍规嵁琛屼负璁剧疆鑾峰彇澶氬眰鍖呰鐨勬爣绛炬墦鍗版ā鏉垮瓧鍏�
+            for (int i = 1; i < 10; i++)
+            {
+                var code = Setting.GetType().GetProperty($"OPTION_{i}")?.GetValue(Setting).ToString() ?? "";
+                var label = code.IsNullOrEmpty() ? null : Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == code).IncludesAllFirstLayer().First();
+                LabelDic.Add(i, label);
+            }
+            //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓紝鏈夊垯鑾峰彇褰撳墠鐨勫寘瑁呰褰�
+            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty())
+            {
+                CurPkg = (CurPosition.Context["CurPackage"] as WipPkg).Clone();
+            } 
+            else
+            {
+                var max = PkgRule.Details.OrderByDescending(q => q.PKG_LEVEL).First();
+                CurPkg = new WipPkg() 
+                { 
+                    RULE_CODE = PkgRule.RULE_CODE, 
+                    RULE_NAME = PkgRule.RULE_NAME,
+                    Item = new WipPkgItem()
+                    {
+                        PKG_CODE = max.PKG_CODE,
+                        PKG_NAME = max.PkgType.PKG_NAME,
+                        IS_MIN_PKG = max.PkgType.IS_MIN_PKG,
+                        PKG_LEVEL = max.PKG_LEVEL,
+                        PKG_QTY = max.PKG_QTY,
+                        LABEL_CODE = LabelDic[max.PKG_LEVEL].LABEL_CODE,
+                    }
+                };
+                WipPkgItem child = null;
+                foreach (var dtl in PkgRule.Details.OrderBy(q => q.PKG_LEVEL))
+                {
+                    if (1 < dtl.PKG_LEVEL && dtl.PKG_LEVEL < max.PKG_LEVEL)
+                    {
+                        var item = new WipPkgItem()
+                        {
+                            PKG_CODE = dtl.PKG_CODE,
+                            PKG_NAME = dtl.PkgType.PKG_NAME,
+                            IS_MIN_PKG = dtl.PkgType.IS_MIN_PKG,
+                            PKG_LEVEL = dtl.PKG_LEVEL,
+                            PKG_QTY = dtl.PKG_QTY,
+                            LABEL_CODE = LabelDic[dtl.PKG_LEVEL].LABEL_CODE,
+                        };
+                        if (!child.IsNullOrEmpty())
+                        {
+                            item.Items.Add(child);
+                        }
+                        child = item;
+                    }
+                }
+                CurPkg.Item.Items.Add(child);
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇琛屼负寮�濮嬬殑鎻愮ず淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Locale GetBeginMsg()
+        {
+            var min = PkgRule.Details.OrderBy(q => q.PKG_LEVEL).First();
+            //琛屼负璁惧畾鐨凮PTION_1鏄涓�灞傚寘瑁呯殑鏍囩妯℃澘浠g爜锛屽鏋滀负绌哄垯涓嶉渶瑕佹墦鍗�
+            if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
+            {
+                var msg = new Locale("MES.WorkAction.PackingAction.BeginMsg", min.PKG_LEVEL, min.PkgType.PKG_NAME, CurPosition.CurWipSN.SN);
+                //var msg = new Locale($"宸叉壂鎻忕{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮乕{CurPosition.CurWipSN.SN}]");
+                return msg;
+            }
+            else
+            {
+                var msg = new Locale("MES.WorkAction.PackingAction.BeginPrint", min.PKG_LEVEL, min.PkgType.PKG_NAME, LabelDic[min.PKG_LEVEL].LABEL_CODE, LabelDic[min.PKG_LEVEL].LABEL_NAME);
+                //var msg = new Locale($"寮�濮嬫墦鍗扮{min.PKG_LEVEL}灞傚寘瑁匸{min.PkgType.PKG_NAME}]鐨勬爣绛綶{LabelDic[min.PKG_LEVEL].LABEL_CODE}: {LabelDic[min.PKG_LEVEL].LABEL_NAME}]");
+                return msg;
+            }
+        }
+
+        /// <summary>
+        /// 灏濊瘯寮�濮嬫墽琛屽伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> TryBegin(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+            action.LocaleMsg = GetBeginMsg();
+
+            var min = PkgRule.Details.OrderBy(q => q.PKG_LEVEL).First();
+            //琛屼负璁惧畾鐨凮PTION_1-9鏄寘瑁呬笉鍚屽眰绾х殑鏍囩妯℃澘浠g爜锛屽鏋滀负绌哄垯涓嶉渶瑕佹墦鍗�
+            if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
+            {
+                input.Data = new PackingActionInput()
+                {
+                    ExecCode = "Scan",
+                    IsFinish = true,
+                    PkgLevel = min.PKG_LEVEL,
+                    PkgSN = CurPosition.CurWipSN.SN,
+                }.ToJson();
+                action = Submit(input);
+            }
+            else
+            {
+                //璁剧疆鎵撳嵃鍙橀噺鍊�
+                LabelDic[min.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[min.PKG_LEVEL]);
+
+                var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                data.ExecCode = "Print";
+                data.PkgLevel = min.PKG_LEVEL;
+                data.PrintLable = LabelDic[min.PKG_LEVEL];
+                CurPrint = data;
+                PrintTimes++;
+                action.Data.Data = data;
+                //action.LocaleMsg = new Locale($"寮�濮嬬{PrintTimes}娆℃墦鍗扮{min.PKG_LEVEL}灞傚寘瑁匸{min.PkgType.PKG_NAME}]鐨勬爣绛綶{LabelDic[min.PKG_LEVEL].LABEL_CODE}: {LabelDic[min.PKG_LEVEL].LABEL_NAME}]");
+                action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, min.PKG_LEVEL, min.PkgType.PKG_NAME, LabelDic[min.PKG_LEVEL].LABEL_CODE, LabelDic[min.PKG_LEVEL].LABEL_NAME);
+            }
+
+            //濡傛灉杩斿洖鎴愬姛鍒欒涓哄綋鍓嶈涓哄彲浠ュ紑濮嬫墽琛岋紝鍚﹀垯杩斿洖澶辫触
+            action.IsSuccessed = true;
+            return action;
+        }
+
+        /// <summary>
+        /// 宸ュ簭琛屼负鎻愪氦鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> Submit(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            var pInput = input.Data?.JsonToObject<PackingActionInput>();
+            switch (pInput.ExecCode)
+            {
+                //Scan锛氭壂鐮侊紝鎵弿褰撳墠鍖呰灞傜骇鐨勬潯鐮�
+                case "Scan":
+                    {
+                        //瀹㈡埛绔壂鎻忔垚鍔�
+                        if (pInput.IsFinish)
+                        {
+                            action = SavePkgData(input, action);
+                        }
+                        //瀹㈡埛绔壂鎻忓け璐�
+                        else
+                        {
+                            var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                            action.IsSuccessed = false;
+                            //action.LocaleMsg = new($"鏉$爜鎵弿澶辫触锛岃閲嶆柊鎵弿绗瑊dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮�");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.ScanFail", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
+                            return action;
+                        }
+                    }
+                    break;
+                //Print锛氭墦鍗帮紝鎵撳嵃褰撳墠鍖呰灞傜骇鐨勬爣绛�
+                case "Print":
+                    {
+                        var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                        //瀹㈡埛绔畬鎴愭墦鍗�
+                        if (pInput.IsFinish)
+                        {
+                            CurPrint = null;
+                            PrintTimes = 0;
+                            var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                            data.ExecCode = "Scan";
+                            data.PkgLevel = dtl.PKG_LEVEL;
+                            action.Data.Data = data;
+                            //action.LocaleMsg = new($"璇锋壂鎻忕{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮�");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
+                        } 
+                        //瀹㈡埛绔墦鍗板け璐�
+                        else
+                        {
+                            //濡傛灉鎵撳嵃澶辫触鍒欏皾璇曚笁娆¢噸鏂版墦鍗帮紝濡傛灉閮藉け璐ュ垯閲嶇疆宸ュ簭
+                            if (PrintTimes < 3 && !CurPrint.IsNullOrEmpty())
+                            {
+                                PrintTimes++;
+                                action.Data.Data = CurPrint;
+                                //action.LocaleMsg = new Locale($"寮�濮媨PrintTimes}娆℃墦鍗扮{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛綶{LabelDic[dtl.PKG_LEVEL].LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]");
+                                action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL].LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
+                            }
+                            else
+                            {
+                                CurPrint = null;
+                                PrintTimes = 0;
+                                action.IsSuccessed = false;
+                                //action.LocaleMsg = new($"灏濊瘯绗瑊PrintTimes}娆℃墦鍗扮{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛綶{LabelDic[dtl.PKG_LEVEL].LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]澶辫触锛屽伐搴忓凡閲嶇疆锛岃閲嶆柊鎵弿杩涚珯浜у搧鏉$爜");
+                                action.LocaleMsg = new("MES.WorkAction.PackingAction.PrintFail3Times", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL].LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
+                                CurPosition.ResetSteps();
+                            }
+                        }
+                    }
+                    break;
+                // Complete锛氬畬鎴愶紝瀹屾垚鍏ㄩ儴鍖呰鍚庣粨鏉熻涓�
+                case "Complete":
+                    {
+                        action = End();
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+            //濡傛灉琛屼负璁剧疆涓哄嚭閿欓渶瑕侀噸缃伐搴忔搷浣�
+            if (!action.IsSuccessed && NodeAct.NEED_RESET == "Y")
+            {
+                CurPosition.ResetSteps();
+            }
+            return action;
+        }
+
+        //淇濆瓨鍖呰淇℃伅
+        public ApiAction<SubmitOutput> SavePkgData(SubmitInput input, ApiAction<SubmitOutput> action)
+        {
+            var pInput = input.Data?.JsonToObject<PackingActionInput>();
+            try
+            {
+                //姝e湪澶勭悊鐨勫寘瑁呭眰绾ф槑缁�
+                var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == FinishLevel + 1);
+
+                //娌℃湁淇濆瓨杩囦换浣曞寘瑁呭眰绾х殑鏁版嵁锛屽垯鍏堝鐞嗘渶灏忓寘瑁呮暟鎹�
+                if (FinishLevel == 0)
+                {
+                    CurPkgItem = new WipPkgItem()
+                    {
+                        PKG_CODE = dtl.PKG_CODE,
+                        PKG_NAME = dtl.PkgType.PKG_NAME,
+                        IS_MIN_PKG = dtl.PkgType.IS_MIN_PKG,
+                        PKG_LEVEL = dtl.PKG_LEVEL,
+                        PKG_QTY = dtl.PKG_QTY,
+                        LABEL_CODE = LabelDic[dtl.PKG_LEVEL].LABEL_CODE,
+                        IsFinished = true,
+                        Package = new()
+                        {
+                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                            SN = pInput.PkgSN,
+                            PKG_TYPE = dtl.PkgType.PKG_NAME,
+                            ITEM_CODE = CurPosition.CurWipSN.ITEM_CODE,
+                            QTY = CurPosition.CurWipSN.QTY,
+                            UNIT = dtl.PkgType.PKG_NAME,
+                            WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                            BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                            ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                            NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                            NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                            FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                            WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                            LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                            POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                            OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                            SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                        }
+                    };
+                    FinishLevel++;
+                    action = SavePkgData(input, action);
+                }
+                //澶勭悊鍏朵粬鍖呰灞傜骇鏁版嵁
+                else 
+                {
+                    //瀹㈡埛绔彁浜ょ殑鍖呰灞傜骇绛変簬褰撳墠澶勭悊鐨勫寘瑁呭眰绾�
+                    if (pInput.PkgLevel == dtl.PKG_LEVEL)
+                    {
+                        CurPkgItem.IsFinished = true;
+                        CurPkgItem.Package = new()
+                        {
+                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                            SN = pInput.PkgSN,
+                            PKG_TYPE = dtl.PkgType.PKG_NAME,
+                            ITEM_CODE = CurPosition.CurWipSN.ITEM_CODE,
+                            QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
+                            UNIT = dtl.PkgType.PKG_NAME,
+                            WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                            BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                            ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                            NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                            NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                            FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                            WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                            LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                            POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                            OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                            SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                        };
+                        FinishLevel++;
+                        //瀹屾垚鍖呰鐨勫眰绾у皬浜庢渶澶栧眰鍖呰灞傜骇
+                        if (FinishLevel < PkgRule.Details.Max(q => q.PKG_LEVEL))
+                        {
+                            //褰撳墠澶勭悊鐨勫寘瑁呭眰绾у凡缁忓鐞嗗畬锛岀户缁線涓婁繚瀛�
+                            action = SavePkgData(input, action);
+                        }
+                        //鏈�澶栧眰鍖呰宸茬粡瀹屾垚鍖呰锛屼繚瀛樺寘瑁呮暟鎹埌鏁版嵁搴�
+                        else
+                        {
+                            action = SaveToDB();
+                        }
+                    }
+                    //褰撳墠澶勭悊鐨勫寘瑁呭眰绾у凡缁忓鐞嗗畬锛岀户缁線涓婁繚瀛�
+                    else if (pInput.PkgLevel == FinishLevel)
+                    {
+                        //鑾峰彇褰撳墠鐨勫寘瑁呮槑缁嗙殑涓婁竴灞傚寘瑁呭璞�
+                        WipPkgItem curItem = CurPkg.Item;
+                        while (curItem.PKG_LEVEL > dtl.PKG_LEVEL)
+                        {
+                            var next = curItem.Items.FirstOrDefault(q => !q.IsFinished);
+                            if (next.IsNullOrEmpty())
+                            {
+                                var nextDtl = PkgRule.Details.First(q => q.PKG_LEVEL == curItem.PKG_LEVEL - 1);
+                                next = new WipPkgItem()
+                                {
+                                    PKG_CODE = nextDtl.PKG_CODE,
+                                    PKG_NAME = nextDtl.PkgType.PKG_NAME,
+                                    IS_MIN_PKG = nextDtl.PkgType.IS_MIN_PKG,
+                                    PKG_LEVEL = nextDtl.PKG_LEVEL,
+                                    PKG_QTY = nextDtl.PKG_QTY,
+                                    LABEL_CODE = LabelDic[nextDtl.PKG_LEVEL].LABEL_CODE,
+                                };
+                                curItem.Items.Add(next);
+                            }
+                            curItem = next;
+                        }
+                        //娣诲姞褰撳墠鐨勫寘瑁呮槑缁嗗埌涓婁竴灞傚寘瑁呯殑鏄庣粏鍒楄〃
+                        curItem.Items.Add(CurPkgItem);
+                        CurPkgItem = curItem;
+
+                        //娣诲姞鏄庣粏鍚庡垽鏂綋鍓嶅寘瑁呭眰绾х殑鏄庣粏鏁伴噺鏄惁绛変簬鍖呰鏁伴噺锛岃嫢鐩哥瓑鍒欐爣璁板綋鍓嶅寘瑁呭眰绾т负瀹屾垚骞跺皾璇曟墦鍗版爣绛�
+                        if (CurPkgItem.Items.Count == CurPkgItem.PKG_QTY)
+                        {
+                            //琛屼负璁惧畾鐨凮PTION_1-9鏄寘瑁呬笉鍚屽眰绾х殑鏍囩妯℃澘浠g爜锛屽鏋滀负绌哄垯涓嶉渶瑕佹墦鍗�
+                            if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
+                            {
+                                var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                data.ExecCode = "Scan";
+                                data.PkgLevel = dtl.PKG_LEVEL;
+                                action.Data.Data = data;
+                                //action.LocaleMsg = new($"璇锋壂鎻忕{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮�");
+                                action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseScanLabel", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
+                            }
+                            else
+                            {
+                                //璁剧疆鎵撳嵃鍙橀噺鍊�
+                                LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL]);
+
+                                var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                data.ExecCode = "Print";
+                                data.PkgLevel = dtl.PKG_LEVEL;
+                                data.PrintLable = LabelDic[dtl.PKG_LEVEL];
+                                CurPrint = data;
+                                PrintTimes++;
+                                action.Data.Data = data;
+                                //action.LocaleMsg = new Locale($"寮�濮嬬{PrintTimes}娆℃墦鍗扮{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛綶{LabelDic[dtl.PKG_LEVEL].LABEL_CODE}: {LabelDic[dtl.PKG_LEVEL].LABEL_NAME}]");
+                                action.LocaleMsg = new Locale("MES.WorkAction.PackingAction.BeginPrint", PrintTimes, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL].LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);                
+                            }
+                        }
+                        //褰撳墠鍖呰灞傜骇鐨勬槑缁嗘暟閲忔湭杈惧埌鍖呰鏁伴噺锛屽垯瀹屾垚鏈鎵弿锛岀瓑寰呬笅涓骇鍝佽繘绔�
+                        else
+                        {
+                            action = End();
+                        }
+                    }
+                    //鏁版嵁寮傚父
+                    else
+                    {
+                        var pdtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                        action.IsSuccessed = false;
+                        //action.LocaleMsg = new($"瀹㈡埛绔彁浜ょ殑鍖呰灞傜骇[{pdtl.PKG_LEVEL}]({pdtl.PkgType.PKG_NAME})鏁版嵁涓嶆槸姝e湪澶勭悊鐨勫寘瑁呭眰绾{dtl.PKG_LEVEL}]({dtl.PkgType.PKG_NAME})锛屽伐搴忓凡閲嶇疆锛岃閲嶆柊鎵弿杩涚珯浜у搧鏉$爜");
+                        action.LocaleMsg = new("MES.WorkAction.PackingAction.SaveLevelNotMatchException", pdtl.PKG_LEVEL, pdtl.PkgType.PKG_NAME, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
+                        CurPosition.ResetSteps();
+                    }
+                }
+            }
+            catch (System.Exception ex)
+            {
+                var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                action.CatchExceptionWithLog(ex, $"鍖呰琛屼负锛氭壂鎻忕{dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮乕{input.SN}]鍚庝繚瀛樻暟鎹け璐�");
+                action.IsSuccessed = false;
+                //action.LocaleMsg = new($"鎵弿绗瑊dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮乕{input.SN}]鍚庝繚瀛樻暟鎹け璐ワ紝宸ュ簭宸查噸缃紝璇烽噸鏂版壂鎻忚繘绔欎骇鍝佹潯鐮�");
+                action.LocaleMsg = new("MES.WorkAction.PackingAction.SavePkgDataException", dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, input.SN);
+                CurPosition.ResetSteps();
+            }
+            return action;
+        }
+
+        private List<MES_WIP_PKG> GetPackageList(WipPkgItem parent)
+        {
+            List<MES_WIP_PKG> list = new() { parent.Package };
+            foreach (var item in parent.Items)
+            {
+                item.Package.PARENT_SN = parent.Package.SN;
+                list.AddRange(GetPackageList(item));
+            }
+            return list;
+        }
+
+        public ApiAction<SubmitOutput> SaveToDB()
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            var pkgList = GetPackageList(CurPkg.Item);
+
+            //淇濆瓨鏁版嵁搴�
+            var db = Biz.Db;
+            var dbTran = db.UseTran(() =>
+            {
+                db.Insertable(pkgList, CurPosition.UserCode).ExecuteCommand();
+            });
+            if (!dbTran.IsSuccess)
+            {
+                throw dbTran.ErrorException;
+            }
+
+            //鍒犻櫎宸ュ簭涓婁笅鏂囦腑鐨勫寘瑁呰褰�
+            CurPosition.Context.Remove("CurPackage");
+
+            var data = new PackingActionOutput() { PkgInfo = CurPkg };
+            data.ExecCode = "Complete";
+            data.PkgLevel = CurPkg.Item.PKG_LEVEL;
+            action.Data.Data = data;
+            //action.LocaleMsg = new($"绗瑊CurPkg.Item.PKG_LEVEL}灞傚寘瑁匸{CurPkg.Item.PKG_NAME}]宸茬粡鍏ㄩ儴瀹屾垚锛屼繚瀛樺寘瑁呮暟鎹�");
+            action.LocaleMsg = new("MES.WorkAction.PackingAction.PackageComplete", CurPkg.Item.PKG_LEVEL, CurPkg.Item.PKG_NAME);
+
+            return action;
+        }
+
+        /// <summary>
+        /// 缁撴潫鎵ц宸ュ簭琛屼负
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> End()
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            //璁板綍琛屼负鎿嶄綔璁板綍
+            var wipAct = new MES_WIP_ACT()
+            {
+                AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                HIS_ID = CurPosition.CurWipSNHis.ID,
+                SN = CurPosition.CurWipSN.SN,
+                STATUS = CurPosition.CurWipSN.STATUS,
+                ITEM_CODE = CurPosition.CurWipSN.ITEM_CODE,
+                WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                ACT_ID = NodeAct.ID,
+                ACT_NAME = NodeAct.ACT_NAME,
+                FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                TRAY_SN = CurPosition.CurWipSN.TRAY_SN,
+                OPERATION_TIME = DateTime.Now,
+                SFTS_CODE = CurPosition.CurWipSN.SFTS_CODE,
+                SFT_CODE = CurPosition.CurWipSN.SFT_CODE,
+                PRD_CODE = CurPosition.CurWipSN.PRD_CODE,
+                ACT_TYPE = NodeAct.ACT_TYPE,
+                ACT_SN = CurPosition.CurWipSN.SN,
+                ACT_RESULT = "Y",
+                TRACE_INFO = $"浜у搧鏉$爜[{CurPosition.CurWipSN.SN}]鍖呰瀹屾垚",
+            };
+
+            //淇濆瓨鏁版嵁
+            CurStep.DBSubmitAction = () =>
+            {
+                var db = CurPosition.GetCommitDB();
+                db.Storageable(wipAct, CurPosition.UserCode).ExecuteCommand();
+            };
+
+            //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓�
+            if (CurPosition.Context.ContainsKey("CurPackage"))
+            {
+                CurPosition.Context["CurPackage"] = CurPkg;
+            }
+            else
+            {
+                CurPosition.Context.Add("CurPackage", CurPkg);
+            }
+
+            IsFinished = true;
+            action.LocaleMsg = new($"浜у搧鏉$爜[{CurPosition.CurWipSN.SN}]鍖呰瀹屾垚");
+            action.LocaleMsg = new("MES.WorkAction.PackingAction.PackingSuccess", CurPosition.CurWipSN.SN);
+            return action;
+        }
+
+
+        #endregion Functions
+    }
+}
diff --git a/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs b/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
new file mode 100644
index 0000000..00a07cc
--- /dev/null
+++ b/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
@@ -0,0 +1,12 @@
+锘縰sing Newtonsoft.Json;
+using Rhea.Common;
+using System;
+using Tiger.Model;
+
+namespace Tiger.IBusiness
+{
+    public interface IPackingAction : IWorkAction
+    {
+
+    }
+}
diff --git a/Tiger.Model.Net/Entitys/BAS/BAS_PKG_DTL.cs b/Tiger.Model.Net/Entitys/BAS/BAS_PKG_DTL.cs
index d5295c7..1e1ad2f 100644
--- a/Tiger.Model.Net/Entitys/BAS/BAS_PKG_DTL.cs
+++ b/Tiger.Model.Net/Entitys/BAS/BAS_PKG_DTL.cs
@@ -46,17 +46,17 @@
         /// 澶囨敞
         /// </summary>
         public string REMARK { get; set; }
-		#endregion
+        #endregion
 
-		#region 铏氭嫙灞炴��
-		/*渚嬪瓙
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        #endregion
 
-		#region 澶栭敭灞炴��
-		/*渚嬪瓙
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
 		//涓�瀵逛竴澶栭敭瀵艰埅
 		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊AS_PKG_DTL绫婚噷闈㈢殑澶栭敭ID瀛楁
 		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
@@ -67,10 +67,12 @@
 		[Navigate(typeof(MappingClass), nameof(MappingClass.BAS_PKG_DTLId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
 		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-		#endregion
+        [Navigate(NavigateType.OneToOne, nameof(PKG_CODE), nameof(BAS_PKG_TYPE.PKG_CODE), "GHOST_ROW = 0")]//涓�瀵逛竴 ClassAId鏄疊IZ_MES_WO绫婚噷闈㈢殑澶栭敭ID瀛楁
+        public BAS_PKG_TYPE PkgType { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+        #endregion
 
-		#region 鏋氫妇鍙橀噺
-		/*渚嬪瓙
+        #region 鏋氫妇鍙橀噺
+        /*渚嬪瓙
 		public enum FieldNames
 		{
 			[Description("鏋氫妇鎻忚堪0")]
@@ -79,11 +81,11 @@
 			Enum1,
 		}
 		*/
-		#endregion
+        #endregion
 
-		#region 鍏叡鏂规硶
+        #region 鍏叡鏂规硶
 
-		#endregion
+        #endregion
 
-	}//endClass
+    }//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs b/Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs
index 97958f5..64916a1 100644
--- a/Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs
+++ b/Tiger.Model.Net/Entitys/BAS/BAS_PKG_RULE.cs
@@ -7,75 +7,77 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:包装规则定义
+	/// 瀹炰綋锛氬寘瑁呰鍒欏畾涔�
 	/// </summary>
 	[Description("Primary:ID")]
 	[Serializable]
 	[SugarTable("BAS_PKG_RULE")]
 	public class BAS_PKG_RULE : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:包装规则定义
+		/// 瀹炰綋锛氬寘瑁呰鍒欏畾涔�
 		/// </summary>
 		public BAS_PKG_RULE() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 包装规则编码
+		/// 鍖呰瑙勫垯缂栫爜
 		/// </summary>
 		public string RULE_CODE { get; set; }
 		/// <summary>
-		/// 包装规则名称
+		/// 鍖呰瑙勫垯鍚嶇О
 		/// </summary>
 		public string RULE_NAME { get; set; }
 		/// <summary>
-		/// 是否启用(Y/N)
+		/// 鏄惁鍚敤(Y/N)
 		/// </summary>
 		public string IS_ACTIVE { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
 		public string REMARK { get; set; }
-		#endregion
+        #endregion
 
-		#region 虚拟属性
-		/*例子
+        #region 铏氭嫙灞炴��
+        /*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
-		#endregion
+        #endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是BAS_PKG_RULE类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.BAS_PKG_RULEId))]//ClassA表中的BAS_PKG_RULEId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.BAS_PKG_RULEId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+        #region 澶栭敭灞炴��
+        /*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疊AS_PKG_RULE绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.BAS_PKG_RULEId))]//ClassA琛ㄤ腑鐨凚AS_PKG_RULEId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.BAS_PKG_RULEId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
-		#endregion
+        [Navigate(NavigateType.OneToMany, nameof(BAS_PKG_DTL.PKG_RULE_ID), nameof(ID), "GHOST_ROW = 0")]//ClassA琛ㄤ腑鐨凚AS_LABEL_TEMPId
+        public List<BAS_PKG_DTL> Details { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+        #endregion
 
-		#region 枚举变量
-		/*例子
+        #region 鏋氫妇鍙橀噺
+        /*渚嬪瓙
 		public enum FieldNames
 		{
-			[Description("枚举描述0")]
+			[Description("鏋氫妇鎻忚堪0")]
 			Enum0,
-			[Description("枚举描述1")]
+			[Description("鏋氫妇鎻忚堪1")]
 			Enum1,
 		}
 		*/
-		#endregion
+        #endregion
 
-		#region 公共方法
+        #region 鍏叡鏂规硶
 
-		#endregion
+        #endregion
 
-	}//endClass
+    }//endClass
 }
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/MES/MES_PROD_ACTION.cs b/Tiger.Model.Net/Entitys/MES/MES_PROD_ACTION.cs
index a2afbf0..bb6ee8c 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_PROD_ACTION.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_PROD_ACTION.cs
@@ -93,10 +93,15 @@
 		/// </summary>
 		[DisplayName("鏄惁鍚敤(Y/N)")]
 		public string IS_ACTIVE { get; set; }
-		/// <summary>
-		/// 璁剧疆鍊�1
-		/// </summary>
-		[DisplayName("璁剧疆鍊�1")]
+        /// <summary>
+        /// 鏄惁璁剧疆瀹屾垚(Y/N)
+        /// </summary>
+        [DisplayName("鏄惁璁剧疆瀹屾垚(Y/N)")]
+        public string SETUP_FINISH { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�1
+        /// </summary>
+        [DisplayName("璁剧疆鍊�1")]
 		public string OPTION_1 { get; set; }
 		/// <summary>
 		/// 璁剧疆鍊�2
@@ -118,15 +123,30 @@
 		/// </summary>
 		[DisplayName("璁剧疆鍊�5")]
 		public string OPTION_5 { get; set; }
-		/// <summary>
-		/// 鏄惁璁剧疆瀹屾垚(Y/N)
-		/// </summary>
-		[DisplayName("鏄惁璁剧疆瀹屾垚(Y/N)")]
-		public string SETUP_FINISH { get; set; }
-		/// <summary>
-		/// 澶囨敞
-		/// </summary>
-		[DisplayName("澶囨敞")]
+        /// <summary>
+        /// 璁剧疆鍊�6
+        /// </summary>
+        [DisplayName("璁剧疆鍊�6")]
+        public string OPTION_6 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�7
+        /// </summary>
+        [DisplayName("璁剧疆鍊�7")]
+        public string OPTION_7 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�8
+        /// </summary>
+        [DisplayName("璁剧疆鍊�8")]
+        public string OPTION_8 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�9
+        /// </summary>
+        [DisplayName("璁剧疆鍊�9")]
+        public string OPTION_9 { get; set; }
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        [DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/MES/MES_PROD_OPER.cs b/Tiger.Model.Net/Entitys/MES/MES_PROD_OPER.cs
index d047a37..32c33ed 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_PROD_OPER.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_PROD_OPER.cs
@@ -108,10 +108,30 @@
 		/// </summary>
 		[DisplayName("璁剧疆鍊�5")]
 		public string OPTION_5 { get; set; }
-		/// <summary>
-		/// 澶囨敞
-		/// </summary>
-		[DisplayName("澶囨敞")]
+        /// <summary>
+        /// 璁剧疆鍊�6
+        /// </summary>
+        [DisplayName("璁剧疆鍊�6")]
+        public string OPTION_6 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�7
+        /// </summary>
+        [DisplayName("璁剧疆鍊�7")]
+        public string OPTION_7 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�8
+        /// </summary>
+        [DisplayName("璁剧疆鍊�8")]
+        public string OPTION_8 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�9
+        /// </summary>
+        [DisplayName("璁剧疆鍊�9")]
+        public string OPTION_9 { get; set; }
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        [DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
index d2a4e8e..7100b39 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_DATA.cs
@@ -38,10 +38,15 @@
 		/// </summary>
 		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
-		/// <summary>
-		/// 宸ュ崟鍙�
-		/// </summary>
-		[DisplayName("宸ュ崟鍙�")]
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        [DisplayName("鏁伴噺")]
+        public double QTY { get; set; } = 1;
+        /// <summary>
+        /// 宸ュ崟鍙�
+        /// </summary>
+        [DisplayName("宸ュ崟鍙�")]
 		public string WORK_ORDER { get; set; }
 		/// <summary>
 		/// 宸ュ崟鎵规鍙�
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
index beb4332..4f525c3 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_HIS.cs
@@ -37,6 +37,7 @@
             SN = data.SN;
             STATUS = data.STATUS;
             ITEM_CODE = data.ITEM_CODE;
+			QTY = data.QTY;
             WORK_ORDER = data.WORK_ORDER;
             BATCH_NO = data.BATCH_NO;
             ROT_CODE = data.ROT_CODE;
@@ -93,10 +94,15 @@
 		/// </summary>
 		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
-		/// <summary>
-		/// 宸ュ崟鍙�
-		/// </summary>
-		[DisplayName("宸ュ崟鍙�")]
+        /// <summary>
+        /// 鏁伴噺
+        /// </summary>
+        [DisplayName("鏁伴噺")]
+        public double QTY { get; set; } = 1;
+        /// <summary>
+        /// 宸ュ崟鍙�
+        /// </summary>
+        [DisplayName("宸ュ崟鍙�")]
 		public string WORK_ORDER { get; set; }
 		/// <summary>
 		/// 宸ュ崟鎵规鍙�
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_PKG.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_PKG.cs
index 697192f..59f83d3 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WIP_PKG.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_PKG.cs
@@ -7,168 +7,154 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:生产包装记录
+	/// 瀹炰綋锛氱敓浜у寘瑁呰褰�
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("生产包装记录")]
+	[DisplayName("鐢熶骇鍖呰璁板綍")]
 	[Serializable]
 	[SugarTable("MES_WIP_PKG")]
 	public class MES_WIP_PKG : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:生产包装记录
+		/// 瀹炰綋锛氱敓浜у寘瑁呰褰�
 		/// </summary>
 		public MES_WIP_PKG() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 条码
+		/// 鏉$爜
 		/// </summary>
-		[DisplayName("条码")]
+		[DisplayName("鏉$爜")]
 		public string SN { get; set; }
 		/// <summary>
-		/// 父包装条码
+		/// 鐖跺寘瑁呮潯鐮�
 		/// </summary>
-		[DisplayName("父包装条码")]
+		[DisplayName("鐖跺寘瑁呮潯鐮�")]
 		public string PARENT_SN { get; set; }
 		/// <summary>
-		/// 包装类型(0OnePiece单件|1Container载具|2Carton箱|3Pallet栈板)
+		/// 鍖呰绫诲瀷
 		/// </summary>
-		[DisplayName("包装类型(0OnePiece单件|1Container载具|2Carton箱|3Pallet栈板)")]
-		public int PKG_TYPE { get; set; }
+		[DisplayName("鍖呰绫诲瀷")]
+		public string PKG_TYPE { get; set; }
 		/// <summary>
-		/// 物料编码
+		/// 鐗╂枡缂栫爜
 		/// </summary>
-		[DisplayName("物料编码")]
+		[DisplayName("鐗╂枡缂栫爜")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 数量
+		/// 鏁伴噺
 		/// </summary>
-		[DisplayName("数量")]
+		[DisplayName("鏁伴噺")]
 		public double QTY { get; set; }
 		/// <summary>
-		/// 单位
+		/// 鍗曚綅
 		/// </summary>
-		[DisplayName("单位")]
+		[DisplayName("鍗曚綅")]
 		public string UNIT { get; set; }
 		/// <summary>
-		/// 工单号
+		/// 宸ュ崟鍙�
 		/// </summary>
-		[DisplayName("工单号")]
+		[DisplayName("宸ュ崟鍙�")]
 		public string WORK_ORDER { get; set; }
 		/// <summary>
-		/// 工单批次号
+		/// 宸ュ崟鎵规鍙�
 		/// </summary>
-		[DisplayName("工单批次号")]
+		[DisplayName("宸ュ崟鎵规鍙�")]
 		public string BATCH_NO { get; set; }
 		/// <summary>
-		/// 工艺路线编码
+		/// 宸ヨ壓璺嚎缂栫爜
 		/// </summary>
-		[DisplayName("工艺路线编码")]
+		[DisplayName("宸ヨ壓璺嚎缂栫爜")]
 		public string ROT_CODE { get; set; }
 		/// <summary>
-		/// 工艺路线节点ID
+		/// 宸ヨ壓璺嚎鑺傜偣ID
 		/// </summary>
-		[DisplayName("工艺路线节点ID")]
+		[DisplayName("宸ヨ壓璺嚎鑺傜偣ID")]
 		public string NODE_ID { get; set; }
 		/// <summary>
-		/// 工艺路线节点名称
+		/// 宸ヨ壓璺嚎鑺傜偣鍚嶇О
 		/// </summary>
-		[DisplayName("工艺路线节点名称")]
+		[DisplayName("宸ヨ壓璺嚎鑺傜偣鍚嶇О")]
 		public string NODE_NAME { get; set; }
 		/// <summary>
-		/// 工厂编码
+		/// 宸ュ巶缂栫爜
 		/// </summary>
-		[DisplayName("工厂编码")]
+		[DisplayName("宸ュ巶缂栫爜")]
 		public string FTY_CODE { get; set; }
 		/// <summary>
-		/// 车间编码
+		/// 杞﹂棿缂栫爜
 		/// </summary>
-		[DisplayName("车间编码")]
+		[DisplayName("杞﹂棿缂栫爜")]
 		public string WS_CODE { get; set; }
 		/// <summary>
-		/// 产线编码
+		/// 浜х嚎缂栫爜
 		/// </summary>
-		[DisplayName("产线编码")]
+		[DisplayName("浜х嚎缂栫爜")]
 		public string LINE_CODE { get; set; }
 		/// <summary>
-		/// 岗位编码
+		/// 宀椾綅缂栫爜
 		/// </summary>
-		[DisplayName("岗位编码")]
+		[DisplayName("宀椾綅缂栫爜")]
 		public string POST_CODE { get; set; }
 		/// <summary>
-		/// 工序编码
+		/// 宸ュ簭缂栫爜
 		/// </summary>
-		[DisplayName("工序编码")]
+		[DisplayName("宸ュ簭缂栫爜")]
 		public string OPER_CODE { get; set; }
 		/// <summary>
-		/// 加工段
+		/// 鍔犲伐娈�
 		/// </summary>
-		[DisplayName("加工段")]
+		[DisplayName("鍔犲伐娈�")]
 		public string SEGMENT { get; set; }
 		/// <summary>
-		/// 备注
+		/// 澶囨敞
 		/// </summary>
-		[DisplayName("备注")]
+		[DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		/// <summary>
-		/// 追溯信息
+		/// 杩芥函淇℃伅
 		/// </summary>
-		[DisplayName("追溯信息")]
+		[DisplayName("杩芥函淇℃伅")]
 		public string TRACE_INFO { get; set; }
 		#endregion
 
-		#region 虚拟属性
-		/*例子
+		#region 铏氭嫙灞炴��
+		/*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
 		#endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是MES_WIP_PKG类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.MES_WIP_PKGId))]//ClassA表中的MES_WIP_PKGId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.MES_WIP_PKGId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+		#region 澶栭敭灞炴��
+		/*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疢ES_WIP_PKG绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.MES_WIP_PKGId))]//ClassA琛ㄤ腑鐨凪ES_WIP_PKGId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.MES_WIP_PKGId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
 		#endregion
 
-		#region 枚举变量
-		/*例子
+		#region 鏋氫妇鍙橀噺
+		/*渚嬪瓙
 		public enum FieldNames
 		{
-			[Description("枚举描述0")]
+			[Description("鏋氫妇鎻忚堪0")]
 			Enum0,
-			[Description("枚举描述1")]
+			[Description("鏋氫妇鎻忚堪1")]
 			Enum1,
 		}
 		*/
 
-		/// <summary>
-		/// 枚举:包装类型(0OnePiece单件|1Container载具|2Carton箱|3Pallet栈板)
-		/// </summary>
-		public enum PKG_TYPEs
-		{
-			[Description("单件")]
-			OnePiece = 0,
-			[Description("载具")]
-			Container = 1,
-			[Description("箱")]
-			Carton = 2,
-			[Description("栈板")]
-			Pallet = 3,
-		}
 		#endregion
 
-		#region 公共方法
+		#region 鍏叡鏂规硶
 
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WO_ACTION.cs b/Tiger.Model.Net/Entitys/MES/MES_WO_ACTION.cs
index 2395741..099dded 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WO_ACTION.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WO_ACTION.cs
@@ -7,189 +7,209 @@
 namespace Tiger.Model
 {
 	/// <summary>
-	/// 实体:工单工序行为
+	/// 瀹炰綋锛氬伐鍗曞伐搴忚涓�
 	/// </summary>
 	[Description("Primary:ID")]
-	[DisplayName("工单工序行为")]
+	[DisplayName("宸ュ崟宸ュ簭琛屼负")]
 	[Serializable]
 	[SugarTable("MES_WO_ACTION")]
 	public class MES_WO_ACTION : DbEntityWithAuth
 	{
-		#region 构造函数
+		#region 鏋勯�犲嚱鏁�
 		/// <summary>
-		/// 实体:工单工序行为
+		/// 瀹炰綋锛氬伐鍗曞伐搴忚涓�
 		/// </summary>
 		public MES_WO_ACTION() {}
 		#endregion
 
-		#region 公共属性
+		#region 鍏叡灞炴��
 		/// <summary>
-		/// 关联工单号
+		/// 鍏宠仈宸ュ崟鍙�
 		/// </summary>
-		[DisplayName("关联工单号")]
+		[DisplayName("鍏宠仈宸ュ崟鍙�")]
 		public string WORK_ORDER { get; set; }
 		/// <summary>
-		/// 产品编码
+		/// 浜у搧缂栫爜
 		/// </summary>
-		[DisplayName("产品编码")]
+		[DisplayName("浜у搧缂栫爜")]
 		public string PROD_CODE { get; set; }
 		/// <summary>
-		/// 客户编码(留空则不区分客户)
+		/// 瀹㈡埛缂栫爜(鐣欑┖鍒欎笉鍖哄垎瀹㈡埛)
 		/// </summary>
-		[DisplayName("客户编码(留空则不区分客户)")]
+		[DisplayName("瀹㈡埛缂栫爜(鐣欑┖鍒欎笉鍖哄垎瀹㈡埛)")]
 		public string CUST_CODE { get; set; }
 		/// <summary>
-		/// 工艺路线ID
+		/// 宸ヨ壓璺嚎ID
 		/// </summary>
-		[DisplayName("工艺路线ID")]
+		[DisplayName("宸ヨ壓璺嚎ID")]
 		public string ROT_ID { get; set; }
 		/// <summary>
-		/// 工单路线节点ID
+		/// 宸ュ崟璺嚎鑺傜偣ID
 		/// </summary>
-		[DisplayName("工单路线节点ID")]
+		[DisplayName("宸ュ崟璺嚎鑺傜偣ID")]
 		public string NODE_ID { get; set; }
 		/// <summary>
-		/// 工单行为节点ID
+		/// 宸ュ崟琛屼负鑺傜偣ID
 		/// </summary>
-		[DisplayName("工单行为节点ID")]
+		[DisplayName("宸ュ崟琛屼负鑺傜偣ID")]
 		public string ACT_ID { get; set; }
 		/// <summary>
-		/// 行为类型(0Normal默认行为|1Scan扫码验证|2Assy组装上料|3Test产品测试|4Audit产品抽检|5Print标签打印|6Package包装规则)
+		/// 琛屼负绫诲瀷(0Normal榛樿琛屼负|1Scan鎵爜楠岃瘉|2Assy缁勮涓婃枡|3Test浜у搧娴嬭瘯|4Audit浜у搧鎶芥|5Print鏍囩鎵撳嵃|6Package鍖呰瑙勫垯)
 		/// </summary>
-		[DisplayName("行为类型(0Normal默认行为|1Scan扫码验证|2Assy组装上料|3Test产品测试|4Audit产品抽检|5Print标签打印|6Package包装规则)")]
+		[DisplayName("琛屼负绫诲瀷(0Normal榛樿琛屼负|1Scan鎵爜楠岃瘉|2Assy缁勮涓婃枡|3Test浜у搧娴嬭瘯|4Audit浜у搧鎶芥|5Print鏍囩鎵撳嵃|6Package鍖呰瑙勫垯)")]
 		public int ACT_TYPE { get; set; }
 		/// <summary>
-		/// 行为定义编码
+		/// 琛屼负瀹氫箟缂栫爜
 		/// </summary>
-		[DisplayName("行为定义编码")]
+		[DisplayName("琛屼负瀹氫箟缂栫爜")]
 		public string ACT_CODE { get; set; }
 		/// <summary>
-		/// 扫码验证:条码规则
+		/// 鎵爜楠岃瘉锛氭潯鐮佽鍒�
 		/// </summary>
-		[DisplayName("扫码验证:条码规则")]
+		[DisplayName("鎵爜楠岃瘉锛氭潯鐮佽鍒�")]
 		public string RULE_CODE { get; set; }
 		/// <summary>
-		/// 组装上料:物料料号
+		/// 缁勮涓婃枡锛氱墿鏂欐枡鍙�
 		/// </summary>
-		[DisplayName("组装上料:物料料号")]
+		[DisplayName("缁勮涓婃枡锛氱墿鏂欐枡鍙�")]
 		public string ITEM_CODE { get; set; }
 		/// <summary>
-		/// 产品测试:检验项目编码
+		/// 浜у搧娴嬭瘯锛氭楠岄」鐩紪鐮�
 		/// </summary>
-		[DisplayName("产品测试:检验项目编码")]
+		[DisplayName("浜у搧娴嬭瘯锛氭楠岄」鐩紪鐮�")]
 		public string TEST_CODE { get; set; }
 		/// <summary>
-		/// 产品抽检:抽样规则编码
+		/// 浜у搧鎶芥锛氭娊鏍疯鍒欑紪鐮�
 		/// </summary>
-		[DisplayName("产品抽检:抽样规则编码")]
+		[DisplayName("浜у搧鎶芥锛氭娊鏍疯鍒欑紪鐮�")]
 		public string SAPL_CODE { get; set; }
 		/// <summary>
-		/// 标签打印:标签模板编码
+		/// 鏍囩鎵撳嵃锛氭爣绛炬ā鏉跨紪鐮�
 		/// </summary>
-		[DisplayName("标签打印:标签模板编码")]
+		[DisplayName("鏍囩鎵撳嵃锛氭爣绛炬ā鏉跨紪鐮�")]
 		public string LABEL_CODE { get; set; }
 		/// <summary>
-		/// 包装规则:包装规则编码
+		/// 鍖呰瑙勫垯锛氬寘瑁呰鍒欑紪鐮�
 		/// </summary>
-		[DisplayName("包装规则:包装规则编码")]
+		[DisplayName("鍖呰瑙勫垯锛氬寘瑁呰鍒欑紪鐮�")]
 		public string PKG_CODE { get; set; }
 		/// <summary>
-		/// 是否启用(Y/N)
+		/// 鏄惁鍚敤(Y/N)
 		/// </summary>
-		[DisplayName("是否启用(Y/N)")]
+		[DisplayName("鏄惁鍚敤(Y/N)")]
 		public string IS_ACTIVE { get; set; }
-		/// <summary>
-		/// 设置值1
-		/// </summary>
-		[DisplayName("设置值1")]
+        /// <summary>
+        /// 鏄惁璁剧疆瀹屾垚(Y/N)
+        /// </summary>
+        [DisplayName("鏄惁璁剧疆瀹屾垚(Y/N)")]
+        public string SETUP_FINISH { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�1
+        /// </summary>
+        [DisplayName("璁剧疆鍊�1")]
 		public string OPTION_1 { get; set; }
 		/// <summary>
-		/// 设置值2
+		/// 璁剧疆鍊�2
 		/// </summary>
-		[DisplayName("设置值2")]
+		[DisplayName("璁剧疆鍊�2")]
 		public string OPTION_2 { get; set; }
 		/// <summary>
-		/// 设置值3
+		/// 璁剧疆鍊�3
 		/// </summary>
-		[DisplayName("设置值3")]
+		[DisplayName("璁剧疆鍊�3")]
 		public string OPTION_3 { get; set; }
 		/// <summary>
-		/// 设置值4
+		/// 璁剧疆鍊�4
 		/// </summary>
-		[DisplayName("设置值4")]
+		[DisplayName("璁剧疆鍊�4")]
 		public string OPTION_4 { get; set; }
 		/// <summary>
-		/// 设置值5
+		/// 璁剧疆鍊�5
 		/// </summary>
-		[DisplayName("设置值5")]
+		[DisplayName("璁剧疆鍊�5")]
 		public string OPTION_5 { get; set; }
-		/// <summary>
-		/// 是否设置完成(Y/N)
-		/// </summary>
-		[DisplayName("是否设置完成(Y/N)")]
-		public string SETUP_FINISH { get; set; }
-		/// <summary>
-		/// 备注
-		/// </summary>
-		[DisplayName("备注")]
+        /// <summary>
+        /// 璁剧疆鍊�6
+        /// </summary>
+        [DisplayName("璁剧疆鍊�6")]
+        public string OPTION_6 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�7
+        /// </summary>
+        [DisplayName("璁剧疆鍊�7")]
+        public string OPTION_7 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�8
+        /// </summary>
+        [DisplayName("璁剧疆鍊�8")]
+        public string OPTION_8 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�9
+        /// </summary>
+        [DisplayName("璁剧疆鍊�9")]
+        public string OPTION_9 { get; set; }
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        [DisplayName("澶囨敞")]
 		public string REMARK { get; set; }
 		#endregion
 
-		#region 虚拟属性
-		/*例子
+		#region 铏氭嫙灞炴��
+		/*渚嬪瓙
 		[SugarColumn(IsIgnore = true)]
 		public string FieldName { get; set; }
 		*/
 		#endregion
 
-		#region 外键属性
-		/*例子
-		//一对一外键导航
-		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是MES_WO_ACTION类里面的外键ID字段
-		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
-		//一对多外键导航
-		[Navigate(NavigateType.OneToMany, nameof(ClassA.MES_WO_ACTIONId))]//ClassA表中的MES_WO_ACTIONId
-		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
-		//多对多外键导航
-		[Navigate(typeof(MappingClass), nameof(MappingClass.MES_WO_ACTIONId), nameof(MappingClass.ClassAId))]//注意顺序
-		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+		#region 澶栭敭灞炴��
+		/*渚嬪瓙
+		//涓�瀵逛竴澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//涓�瀵逛竴 ClassAId鏄疢ES_WO_ACTION绫婚噷闈㈢殑澶栭敭ID瀛楁
+		public ClassA ClassA { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//涓�瀵瑰澶栭敭瀵艰埅
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.MES_WO_ACTIONId))]//ClassA琛ㄤ腑鐨凪ES_WO_ACTIONId
+		public List<ClassA> ClassAList { get; set; }//娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
+		//澶氬澶氬閿鑸�
+		[Navigate(typeof(MappingClass), nameof(MappingClass.MES_WO_ACTIONId), nameof(MappingClass.ClassAId))]//娉ㄦ剰椤哄簭
+		public List<ClassA> ClassAList { get; set; } //娉ㄦ剰绂佹鎵嬪姩璧嬪�硷紝鍙兘鏄痭ull
 		*/
 		#endregion
 
-		#region 枚举变量
-		/*例子
+		#region 鏋氫妇鍙橀噺
+		/*渚嬪瓙
 		public enum FieldNames
 		{
-			[Description("枚举描述0")]
+			[Description("鏋氫妇鎻忚堪0")]
 			Enum0,
-			[Description("枚举描述1")]
+			[Description("鏋氫妇鎻忚堪1")]
 			Enum1,
 		}
 		*/
 
 		/// <summary>
-		/// 枚举:行为类型(0Normal默认行为|1Scan扫码验证|2Assy组装上料|3Test产品测试|4Audit产品抽检|5Print标签打印|6Package包装规则)
+		/// 鏋氫妇锛氳涓虹被鍨�(0Normal榛樿琛屼负|1Scan鎵爜楠岃瘉|2Assy缁勮涓婃枡|3Test浜у搧娴嬭瘯|4Audit浜у搧鎶芥|5Print鏍囩鎵撳嵃|6Package鍖呰瑙勫垯)
 		/// </summary>
 		public enum ACT_TYPEs
 		{
-			[Description("默认行为")]
+			[Description("榛樿琛屼负")]
 			Normal = 0,
-			[Description("扫码验证")]
+			[Description("鎵爜楠岃瘉")]
 			Scan = 1,
-			[Description("组装上料")]
+			[Description("缁勮涓婃枡")]
 			Assy = 2,
-			[Description("产品测试")]
+			[Description("浜у搧娴嬭瘯")]
 			Test = 3,
-			[Description("产品抽检")]
+			[Description("浜у搧鎶芥")]
 			Audit = 4,
-			[Description("标签打印")]
+			[Description("鏍囩鎵撳嵃")]
 			Print = 5,
-			[Description("包装规则")]
+			[Description("鍖呰瑙勫垯")]
 			Package = 6,
 		}
 		#endregion
 
-		#region 公共方法
+		#region 鍏叡鏂规硶
 
 		#endregion
 
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WO_OPER.cs b/Tiger.Model.Net/Entitys/MES/MES_WO_OPER.cs
index fc395d5..e4aa40c 100644
--- a/Tiger.Model.Net/Entitys/MES/MES_WO_OPER.cs
+++ b/Tiger.Model.Net/Entitys/MES/MES_WO_OPER.cs
@@ -114,6 +114,26 @@
         [DisplayName("璁剧疆鍊�5")]
         public string OPTION_5 { get; set; }
         /// <summary>
+		/// 璁剧疆鍊�6
+		/// </summary>
+		[DisplayName("璁剧疆鍊�6")]
+        public string OPTION_6 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�7
+        /// </summary>
+        [DisplayName("璁剧疆鍊�7")]
+        public string OPTION_7 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�8
+        /// </summary>
+        [DisplayName("璁剧疆鍊�8")]
+        public string OPTION_8 { get; set; }
+        /// <summary>
+        /// 璁剧疆鍊�9
+        /// </summary>
+        [DisplayName("璁剧疆鍊�9")]
+        public string OPTION_9 { get; set; }
+        /// <summary>
         /// 澶囨敞
         /// </summary>
         [DisplayName("澶囨敞")]
diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
index e778eeb..ecd55cd 100644
--- a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
+++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
@@ -87,4 +87,75 @@
         public string DFT_NAME { get; set; }
         public int DFT_LEVEL { get; set; }
     }
+
+    public class PackingActionInput
+    {
+        /// <summary>
+        /// 鍖呰琛屼负褰撳墠鎵ц鐨勬搷浣滀唬鐮侊紝鍖呮嫭锛�<br/>
+        /// Scan锛氭壂鐮侊紝鎵弿褰撳墠鍖呰灞傜骇鐨勬潯鐮�<br/>
+        /// Print锛氭墦鍗帮紝鎵撳嵃褰撳墠鍖呰灞傜骇鐨勬爣绛�<br/>
+        /// Complete锛氬畬鎴愶紝瀹屾垚鍏ㄩ儴鍖呰鍚庣粨鏉熻涓�<br/>
+        /// </summary>
+        public string ExecCode { get; set; }
+        /// <summary>
+        /// 瀹㈡埛绔槸鍚﹀畬鎴愬綋鍓嶆搷浣�
+        /// </summary>
+        public bool IsFinish { get; set; }
+        /// <summary>
+        /// 褰撳墠鎿嶄綔鐨勫寘瑁呭眰绾�
+        /// </summary>
+        public int PkgLevel { get; set; }
+        /// <summary>
+        /// 褰撳墠鎿嶄綔鐨勫寘瑁呭眰绾х殑鏍囩鏉$爜
+        /// </summary>
+        public string PkgSN { get; set; }
+    }
+
+    public class PackingActionOutput
+    {
+        public WipPkg PkgInfo { get; set; }
+        /// <summary>
+        /// 鍖呰琛屼负褰撳墠鎵ц鐨勬搷浣滀唬鐮侊紝鍖呮嫭锛�<br/>
+        /// Scan锛氭壂鐮侊紝鎵弿褰撳墠鍖呰灞傜骇鐨勬潯鐮�<br/>
+        /// Print锛氭墦鍗帮紝鎵撳嵃褰撳墠鍖呰灞傜骇鐨勬爣绛�<br/>
+        /// Complete锛氬畬鎴愶紝宸蹭繚瀛樺寘瑁呮暟鎹�<br/>
+        /// </summary>
+        public string ExecCode { get; set; }
+        /// <summary>
+        /// 褰撳墠鎿嶄綔鐨勫寘瑁呭眰绾�
+        /// </summary>
+        public int PkgLevel { get; set; }
+        /// <summary>
+        /// 褰撳墠闇�瑕佹墦鍗扮殑鍖呰灞傜骇鐨勬爣绛句俊鎭�
+        /// </summary>
+        public BAS_LABEL_TEMP PrintLable { get; set; }
+    }
+
+    /// <summary>
+    /// 鍦ㄧ嚎鍖呰
+    /// </summary>
+    public class WipPkg
+    {
+        public string RULE_CODE { get; set; }
+        public string RULE_NAME { get; set; }
+        public WipPkgItem Item { get; set; }
+        public bool IsFinished { get; set; } = false;
+    }
+
+    /// <summary>
+    /// 鍦ㄧ嚎鍖呰鏄庣粏
+    /// </summary>
+    public class WipPkgItem
+    {
+        public string PKG_CODE { get; set; }
+        public string PKG_NAME { get; set; }
+        public string IS_MIN_PKG { get; set; }
+        public int PKG_LEVEL { get; set; }
+        public int PKG_QTY { get; set; }
+        public string LABEL_CODE { get; set; }
+        public MES_WIP_PKG Package { get; set; }
+        public bool IsFinished { get; set; } = false;
+        public List<WipPkgItem> Items { get; set; } = new List<WipPkgItem>();
+        
+    }
 }

--
Gitblit v1.9.3