From fb6d929a21ea364313dc5ca5c99ed743cf7df9cc Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期五, 25 十月 2024 16:23:06 +0800
Subject: [PATCH] 优化包装行为支持不打印客户标签

---
 Tiger.Business.MES/WorkAction/PackingAction.cs |  692 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 530 insertions(+), 162 deletions(-)

diff --git a/Tiger.Business.MES/WorkAction/PackingAction.cs b/Tiger.Business.MES/WorkAction/PackingAction.cs
index 421672b..d0cf4fb 100644
--- a/Tiger.Business.MES/WorkAction/PackingAction.cs
+++ b/Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -1,10 +1,12 @@
-锘縰sing Rhea.Common;
+锘縰sing Microsoft.CodeAnalysis.Differencing;
+using Rhea.Common;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Tiger.Business.MES.Transaction;
 using Tiger.IBusiness;
 using Tiger.IBusiness.MES.WorkAction;
 using Tiger.Model;
@@ -23,18 +25,20 @@
         public MES_WO_ACTION Setting { get; set; }
         #endregion
         public BAS_PKG_RULE PkgRule { get; set; }
+        public BAS_PKG_PROD PkgProd { get; set; }
         public WipPkg CurPkg { get; set; }
         public WipPkgItem CurPkgItem { get; set; }
         public PackingActionOutput CurCmd { get; set; }
         public int PrintTimes = 0;
-        public Dictionary<int, BAS_LABEL_TEMP> LabelDic { get; set; }    = new();
+        public Dictionary<int, BAS_LABEL_TEMP> LabelDic { get; set; } = new();
         public List<BAS_LABEL_PV> LabelPV { get; set; } = new();
         public int FinishLevel = 0;
+        private bool IsManually => CurStep.IsNullOrEmpty();
         #endregion Propertys & Variables
 
         #region Functions
         /// <summary>
-        /// 鍒濆鍖栧伐搴忚涓�
+        /// 鍒濆鍖栧伐搴忚涓�(姝e父鏉$爜杩囩珯)
         /// </summary>
         /// <returns></returns>
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
@@ -45,36 +49,34 @@
             NodeAct = nodeAct;
             Setting = setting;
             #endregion
-            //鎵嬪姩缁撴潫鍖呰涓撶敤锛屼复鏃舵墽琛岃涓�
-            if (setting.IsNullOrEmpty())
-            {
-                PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
-            } 
+
             //姝e父鏉$爜杩囩珯鎵ц鍖呰琛屼负
-            else
-            {
-            	PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
-            }
+            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
+
             //鏍规嵁琛屼负璁剧疆鑾峰彇澶氬眰鍖呰鐨勬爣绛炬墦鍗版ā鏉垮瓧鍏�
-            var codes = (Setting.OPTION_1?? "").JsonToObject<List<WipPkgItem>>();
+            var codes = (Setting.OPTION_1 ?? "").JsonToObject<List<WipPkgItem>>() ?? new List<WipPkgItem>();
             foreach (var code in codes)
             {
                 var label = code.LABEL_CODE.IsNullOrEmpty() ? null : Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == code.LABEL_CODE).IncludesAllFirstLayer().First();
                 LabelDic.Add(code.PKG_LEVEL, label);
             }
             LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
-            //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓紝鏈夊垯鑾峰彇褰撳墠鐨勫寘瑁呰褰�
-            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty())
+
+            //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓紝鏈変笖鏈寘瑁呭畬鎴愬垯鑾峰彇褰撳墠鐨勫寘瑁呰褰�
+            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty() && !(CurPosition.Context["CurPackage"] as WipPkg).IsFinished)
             {
                 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, 
+                CurPkg = new WipPkg()
+                {
+                    WorkBatch = CurPosition.WorkBatch.Batch.BATCH_NO,
+                    RULE_CODE = PkgRule.RULE_CODE,
                     RULE_NAME = PkgRule.RULE_NAME,
+                    PROD_CODE = CurPosition.WorkBatch.WO.ITEM_CODE,
+                    CustSN = Biz.Db.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == CurPosition.CurWipSNs.First().FLOW_SN).First(),
                     Item = new WipPkgItem()
                     {
                         PKG_CODE = max.PKG_CODE,
@@ -82,7 +84,8 @@
                         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,
+                        LABEL_CODE = LabelDic.Count > max.PKG_LEVEL ? LabelDic[max.PKG_LEVEL]?.LABEL_CODE : null,
+                        SN = CurPosition.GenerateSN(max.SN_RULE, this),
                     }
                 };
                 WipPkgItem child = null;
@@ -97,7 +100,8 @@
                             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,
+                            LABEL_CODE = LabelDic.Count > dtl.PKG_LEVEL ? LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE : null,
+                            SN = CurPosition.GenerateSN(dtl.SN_RULE, this),
                         };
                         if (!child.IsNullOrEmpty())
                         {
@@ -110,8 +114,54 @@
                 {
                     CurPkg.Item.Items.Add(child);
                 }
-                
+
+                //鍒犻櫎宸ュ簭涓婁笅鏂囦腑鐨勫寘瑁呰褰�
+                if (CurPosition.Context.ContainsKey("CurPackage"))
+                {
+                    CurPosition.Context.Remove("CurPackage");
+                    CurPosition.Context.Remove("CurLabelDic");
+                }
             }
+            //鑾峰彇鏄惁鍖呰瀹屽悗闇�瑕佺О閲�
+            CurPkg.NeedWeighing = Setting.OPTION_2 == "Y";
+            //鑾峰彇鍖呰瑙勫垯鐨勭О閲嶈寖鍥�
+            PkgProd = Biz.Db.Queryable<BAS_PKG_PROD>().Where(q => q.PKG_RULE_ID == PkgRule.ID && q.ITEM_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).First();
+
+            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("璁板綍鍖呰鏁版嵁"));
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧伐搴忚涓�(鎵嬪姩缁撴潫鍖呰涓撶敤)
+        /// </summary>
+        /// <returns></returns>
+        public void Init(IPosition position)
+        {
+            #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            CurStep = null;
+            CurPosition = position;
+            NodeAct = null;
+            Setting = null;
+            #endregion
+            //鑾峰彇褰撳墠鐨勫寘瑁呰褰�
+            if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty())
+            {
+                CurPkg = (CurPosition.Context["CurPackage"] as WipPkg).Clone();
+            }
+            else
+            {
+                throw new Exception("鎵句笉鍒板寘瑁呮暟鎹紝璇烽噸鏂版壂鎻忛渶瑕佸寘瑁呯殑浜у搧");
+            }
+            //鎵嬪姩缁撴潫鍖呰涓撶敤锛屼复鏃舵墽琛岃涓�
+            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == CurPkg.RULE_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
+
+            //鏍规嵁琛屼负璁剧疆鑾峰彇澶氬眰鍖呰鐨勬爣绛炬墦鍗版ā鏉垮瓧鍏�
+            LabelDic = CurPosition.Context["CurLabelDic"] as Dictionary<int, BAS_LABEL_TEMP>;
+            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
+            //鑾峰彇鍖呰瑙勫垯鐨勭О閲嶈寖鍥�
+            PkgProd = Biz.Db.Queryable<BAS_PKG_PROD>().Where(q => q.PKG_RULE_ID == PkgRule.ID && q.ITEM_CODE == CurPkg.PROD_CODE).First();
+            //鎶�
+
+            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("璁板綍鍖呰鏁版嵁"));
         }
 
         /// <summary>
@@ -146,8 +196,20 @@
             action.LocaleMsg = GetBeginMsg();
 
             var min = PkgRule.Details.OrderBy(q => q.PKG_LEVEL).First();
+            if (min.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
+            {
+                var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                data.ExecCode = "Weighing";
+                data.PkgLevel = min.PKG_LEVEL;
+                CurCmd = data;
+                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("涓婄О绉伴噸"));
+                action.Data.Data = data;
+                action.Data.ShortMsg = new("涓婄О绉伴噸", ShortMessage.Types.Success);
+                //action.LocaleMsg = new($"璇锋妸澶栧寘瑁呬笂绉扮О閲�");
+                action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing");
+            }
             //鏍规嵁鍖呰涓嶅悓灞傜骇鐨勬爣绛炬ā鏉夸唬鐮侊紝濡傛灉涓虹┖鍒欎笉闇�瑕佹墦鍗�
-            if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
+            else if (LabelDic[min.PKG_LEVEL].IsNullOrEmpty())
             {
                 input.Data = new PackingActionInput()
                 {
@@ -161,21 +223,25 @@
             else
             {
                 //璁剧疆鎵撳嵃鍙橀噺鍊�
-                LabelDic[min.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[min.PKG_LEVEL]);
+                LabelDic[min.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[min.PKG_LEVEL], this);
 
                 var data = new PackingActionOutput() { PkgInfo = CurPkg };
                 data.ExecCode = "Print";
                 data.PkgLevel = min.PKG_LEVEL;
                 data.PrintLable = LabelDic[min.PKG_LEVEL];
+                data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                 CurCmd = data;
                 PrintTimes++;
+                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵撳嵃鏍囩"));
+                action.IsSuccessed = true;
                 action.Data.Data = data;
+                action.Data.ShortMsg = new("鎵撳嵃鏍囩", ShortMessage.Types.Normal);
                 //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;
+            //action.IsSuccessed = true;
             return action;
         }
 
@@ -194,22 +260,39 @@
                 case "Scan":
                     if (CurCmd.IsNullOrEmpty() || CurCmd.ExecCode == "Scan" || (CurCmd.ExecCode == "Print" && CurCmd.PkgLevel == pInput.PkgLevel))
                     {
-                        //瀹㈡埛绔壂鎻忔垚鍔�
-                        if (pInput.IsFinish)
-                        {
-                            CurCmd = null;
-                            PrintTimes = 0;
-                            action = SavePkgData(input, action);
-                        }
                         //瀹㈡埛绔壂鎻忓け璐�
-                        else
+                        if (!pInput.IsFinish || pInput.PkgSN.IsNullOrEmpty())
                         {
                             var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                            CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("鎵弿閿欒"));
+                            action.Data.ShortMsg = new("鎵弿閿欒", ShortMessage.Types.Error);
                             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);
+                            CurPosition.ResetNode();
                             return action;
                         }
+                        //楠岃瘉褰撳墠鍖呰鏉$爜鏄惁宸茬粡琚壂鎻忚繃
+                        if (CurPosition.GetPackageList(CurPkg.Item).Any(q => q.SN == pInput.PkgSN))
+                        {
+                            var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == pInput.PkgLevel);
+                            CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("鎵弿閿欒"));
+                            action.Data.ShortMsg = new("鎵弿閿欒", ShortMessage.Types.Error);
+                            action.IsSuccessed = false;
+                            //action.LocaleMsg = new($"鏉$爜[{pInput.PkgSN}]鏃犻渶閲嶅鎵弿锛岃鎵弿绗瑊dtl.PKG_LEVEL}灞傚寘瑁匸{dtl.PkgType.PKG_NAME}]鐨勬爣绛炬潯鐮�");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.ScanRepeat", pInput.PkgSN, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME);
+                            CurPosition.ResetNode();
+                            return action;
+                        }
+                        //瀹㈡埛绔壂鎻忔垚鍔�
+                        CurCmd = null;
+                        PrintTimes = 0;
+                        action = SavePkgData(input, action);
+                        //if (action.IsSuccessed)
+                        //{
+                        //    CurStep?.SetStatusMessage(StepStatus.Success, Biz.L("鎵弿鎴愬姛"));
+                        //    action.Data.ShortMsg = new("鎵弿鎴愬姛", ShortMessage.Types.Success);
+                        //}
                     }
                     break;
                 //Print锛氭墦鍗帮紝鎵撳嵃褰撳墠鍖呰灞傜骇鐨勬爣绛�
@@ -226,10 +309,12 @@
                             data.ExecCode = "Scan";
                             data.PkgLevel = dtl.PKG_LEVEL;
                             CurCmd = data;
+                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵弿鏍囩"));
                             action.Data.Data = data;
+                            action.Data.ShortMsg = new("鎵弿鏍囩", ShortMessage.Types.Normal);
                             //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
                         {
@@ -237,7 +322,9 @@
                             if (PrintTimes < 3 && !CurCmd.IsNullOrEmpty())
                             {
                                 PrintTimes++;
+                                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("閲嶆柊鎵撳嵃"));
                                 action.Data.Data = CurCmd;
+                                action.Data.ShortMsg = new("閲嶆柊鎵撳嵃", ShortMessage.Types.Normal);
                                 //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);
                             }
@@ -245,11 +332,92 @@
                             {
                                 CurCmd = null;
                                 PrintTimes = 0;
+                                CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("鎵撳嵃澶辫触"));
+                                action.Data.ShortMsg = new("鎵撳嵃澶辫触", ShortMessage.Types.Failed);
                                 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.ResetNode();
                             }
+                        }
+                    }
+                    break;
+                // Weighing锛氱О閲嶏紝瀹屾垚鍖呰鍚庡鏁翠釜鍖呰鎴愮О閲�
+                case "Weighing":
+                    if (CurCmd.ExecCode == "Weighing")
+                    {
+                        if (!pInput.WeightInfo.IsNullOrEmpty() && pInput.WeightInfo.Weight > 0)
+                        {
+                            //楠岃瘉閲嶉噺鏁版嵁鏄惁绗﹀悎璁剧疆濂界殑閲嶉噺鑼冨洿
+                            if (!PkgProd.IsNullOrEmpty() && ((pInput.WeightInfo.Weight < PkgProd.MIN_WEIGHT && !IsManually) || PkgProd.MAX_WEIGHT < pInput.WeightInfo.Weight))
+                            {
+                                action.IsSuccessed = false;
+                                CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("閲嶉噺瓒呴檺"));
+                                action.Data.Data = CurCmd;
+                                action.Data.ShortMsg = new("閲嶉噺瓒呴檺", ShortMessage.Types.Failed);
+                                //action.LocaleMsg = new($"澶栧寘瑁呴噸閲廩{0}]瓒呭嚭浜у搧[{1}]鍦ㄥ寘瑁呰鍒橻{2}]涓殑棰勮鑼冨洿[{3} - {4}]锛岃澶勭悊鍚庨噸鏂颁笂绉扮О閲�");
+                                action.LocaleMsg = new("MES.WorkAction.PackingAction.PackageOverWeight", pInput.WeightInfo.Weight + pInput.WeightInfo.Unit.IsNullOrEmpty("", " " + pInput.WeightInfo.Unit), CurPosition.WorkBatch.WO.ITEM_CODE, PkgRule.RULE_NAME, PkgProd.MIN_WEIGHT + PkgProd.MIN_UNIT.IsNullOrEmpty("", " " + PkgProd.MIN_UNIT), PkgProd.MAX_WEIGHT + PkgProd.MAX_UNIT.IsNullOrEmpty("", " " + PkgProd.MAX_UNIT));
+                                return action;
+                            }
+
+                            CurCmd = null;
+                            PrintTimes = 0;
+                            CurPkg.WeightInfo.Weight = pInput.WeightInfo.Weight;
+                            CurPkg.WeightInfo.Unit = pInput.WeightInfo.Unit;
+                            CurPkg.NeedWeighing = false;
+
+                            //绉伴噸鎴愬姛锛岀户缁涓�
+                            var dtl = PkgRule.Details.FirstOrDefault(q => q.PKG_LEVEL == FinishLevel + 1);
+                            //鏈�澶栧眰鍖呰宸插鐞嗗畬鎴愬垯鐩存帴缁撴潫琛屼负
+                            if (CurPkg.Item.PKG_LEVEL == FinishLevel)
+                            {
+                                action = End(input);
+                            }
+                            //鏈�澶栧眰鍖呰鏈墦鍗版壂鎻忓垯缁х画
+                            else
+                            {
+                                //濡傛灉涓虹┖鍒欎笉闇�瑕佹墦鍗�
+                                if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
+                                {
+                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                    data.ExecCode = "Scan";
+                                    data.PkgLevel = dtl.PKG_LEVEL;
+                                    CurCmd = data;
+                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵弿鏍囩"));
+                                    action.Data.Data = data;
+                                    action.Data.ShortMsg = new("鎵弿鏍囩", ShortMessage.Types.Normal);
+                                    //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], this);
+
+                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                    data.ExecCode = "Print";
+                                    data.PkgLevel = dtl.PKG_LEVEL;
+                                    data.PrintLable = LabelDic[dtl.PKG_LEVEL];
+                                    data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
+                                    CurCmd = data;
+                                    PrintTimes++;
+                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵撳嵃鏍囩"));
+                                    action.Data.Data = data;
+                                    action.Data.ShortMsg = new("鎵撳嵃鏍囩", ShortMessage.Types.Normal);
+                                    //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.IsSuccessed = false;
+                            CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("绉伴噸澶辫触"));
+                            action.Data.Data = CurCmd;
+                            action.Data.ShortMsg = new("绉伴噸澶辫触", ShortMessage.Types.Failed);
+                            //action.LocaleMsg = new($"澶栧寘瑁呯О閲嶆暟鎹紓甯革紝璇烽噸鏂颁笂绉扮О閲�");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighingAgain");
+                            return action;
                         }
                     }
                     break;
@@ -259,7 +427,23 @@
                     {
                         CurCmd = null;
                         PrintTimes = 0;
-                        action = End();
+                        //鎵撳嵃鍚庣О閲�
+                        if (CurPkg.NeedWeighing)
+                        {
+                            var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                            data.ExecCode = "Weighing";
+                            data.PkgLevel = CurPkgItem.PKG_LEVEL;
+                            CurCmd = data;
+                            CurStep?.SetStatusMessage(StepStatus.Success, Biz.L("鍖呰鎴愬姛"));
+                            action.Data.Data = data;
+                            action.Data.ShortMsg = new("鍖呰鎴愬姛", ShortMessage.Types.Success);
+                            //action.LocaleMsg = new($"璇锋妸鍖呰[{CurPkgItem.Package.SN}]涓婄О绉伴噸");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing", CurPkgItem.Package.SN);
+                        }
+                        else
+                        {
+                            action = End(input);
+                        }
                     }
                     break;
                 // 鎵嬪姩缁撴潫鍖呰锛屼繚瀛樻殏瀛樼殑鍖呰鏁版嵁
@@ -278,29 +462,46 @@
 
                         //鎵嬪姩缁撴潫鍖呰榛樿浠庣浜屽眰鍖呰寮�濮嬮獙璇�
                         var dtl = PkgRule.Details.First(q => q.PKG_LEVEL == 2);
-                        //琛屼负璁惧畾鐨凮PTION_1-9鏄寘瑁呬笉鍚屽眰绾х殑鏍囩妯℃澘浠g爜锛屽鏋滀负绌哄垯涓嶉渶瑕佹墦鍗�
-                        if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
+                        if (dtl.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
+                        {
+                            var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                            data.ExecCode = "Weighing";
+                            data.PkgLevel = dtl.PKG_LEVEL;
+                            CurCmd = data;
+                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("涓婄О绉伴噸"));
+                            action.Data.Data = data;
+                            action.Data.ShortMsg = new("涓婄О绉伴噸", ShortMessage.Types.Success);
+                            //action.LocaleMsg = new($"璇锋妸澶栧寘瑁呬笂绉扮О閲�");
+                            action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing");
+                        }
+                        //鏍规嵁鍖呰涓嶅悓灞傜骇鐨勬爣绛炬ā鏉夸唬鐮侊紝濡傛灉涓虹┖鍒欎笉闇�瑕佹墦鍗�
+                        else if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
                         {
                             var data = new PackingActionOutput() { PkgInfo = CurPkg };
                             data.ExecCode = "Scan";
                             data.PkgLevel = dtl.PKG_LEVEL;
                             CurCmd = data;
+                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵弿鏍囩"));
                             action.Data.Data = data;
+                            action.Data.ShortMsg = new("鎵弿鏍囩", ShortMessage.Types.Normal);
                             //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]);
+                            LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL], this);
 
                             var data = new PackingActionOutput() { PkgInfo = CurPkg };
                             data.ExecCode = "Print";
                             data.PkgLevel = dtl.PKG_LEVEL;
                             data.PrintLable = LabelDic[dtl.PKG_LEVEL];
+                            data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
                             CurCmd = data;
                             PrintTimes++;
+                            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵撳嵃鏍囩"));
                             action.Data.Data = data;
+                            action.Data.ShortMsg = new("鎵撳嵃鏍囩", ShortMessage.Types.Normal);
                             //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, dtl.PKG_LEVEL, dtl.PkgType.PKG_NAME, LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE, LabelDic[dtl.PKG_LEVEL].LABEL_NAME);
                         }
@@ -311,7 +512,7 @@
             }
 
             //濡傛灉琛屼负璁剧疆涓哄嚭閿欓渶瑕侀噸缃伐搴忔搷浣�
-            if (!action.IsSuccessed && NodeAct.NEED_RESET == "Y")
+            if (!action.IsSuccessed && NodeAct?.NEED_RESET == "Y")
             {
                 CurPosition.ResetNode();
             }
@@ -338,44 +539,80 @@
                         PKG_LEVEL = dtl.PKG_LEVEL,
                         PKG_QTY = dtl.PKG_QTY,
                         LABEL_CODE = LabelDic[dtl.PKG_LEVEL]?.LABEL_CODE,
+                        SN = CurPosition.GenerateSN(dtl.SN_RULE, this).IsNullOrEmpty(pInput.PkgSN),
                         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.CurWipSNs.First().ITEM_CODE,
-                            QTY = CurPosition.CurWipSNs.First().QTY,
-                            UNIT = dtl.PkgType.PKG_NAME,
-                            WORK_ORDER = CurPosition.CurWipSNs.First().WORK_ORDER,
-                            BATCH_NO = CurPosition.CurWipSNs.First().BATCH_NO,
-                            ROT_CODE = CurPosition.CurWipSNs.First().ROT_CODE,
-                            NODE_ID = CurPosition.CurWipSNs.First().NODE_ID,
-                            NODE_NAME = CurPosition.CurWipSNs.First().NODE_NAME,
-                            FTY_CODE = CurPosition.CurWipSNs.First().FTY_CODE,
-                            WS_CODE = CurPosition.CurWipSNs.First().WS_CODE,
-                            LINE_CODE = CurPosition.CurWipSNs.First().LINE_CODE,
-                            POST_CODE = CurPosition.CurWipSNs.First().POST_CODE,
-                            OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE,
-                            SEGMENT = CurPosition.CurWipSNs.First().SEGMENT,
-                        }
                     };
+
+                    CurPkgItem.Package = Biz.Db.Queryable<MES_WIP_PKG>().Where(q => q.SN == CurPkgItem.SN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
+                    {
+                        AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                        AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                        SN = CurPkgItem.SN,
+                    };
+                    CurPkgItem.Package.WIP_ID = CurPosition.CurWipSNs.Count == 1 ? CurPosition.CurWipSNs.First().ID : null;
+                    CurPkgItem.Package.PKG_TYPE = dtl.PkgType.PKG_NAME;
+                    CurPkgItem.Package.ITEM_CODE = CurPosition.CurWipSNs.First().ITEM_CODE;
+                    CurPkgItem.Package.QTY = CurPosition.CurWipSNs.First().QTY;
+                    CurPkgItem.Package.UNIT = dtl.PkgType.PKG_NAME;
+                    CurPkgItem.Package.WORK_ORDER = CurPosition.CurWipSNs.First().WORK_ORDER;
+                    CurPkgItem.Package.BATCH_NO = CurPosition.CurWipSNs.First().BATCH_NO;
+                    CurPkgItem.Package.ROT_CODE = CurPosition.CurWipSNs.First().ROT_CODE;
+                    CurPkgItem.Package.NODE_ID = CurPosition.CurWipSNs.First().NODE_ID;
+                    CurPkgItem.Package.NODE_NAME = CurPosition.CurWipSNs.First().NODE_NAME;
+                    CurPkgItem.Package.FTY_CODE = CurPosition.CurWipSNs.First().FTY_CODE;
+                    CurPkgItem.Package.WS_CODE = CurPosition.CurWipSNs.First().WS_CODE;
+                    CurPkgItem.Package.LINE_CODE = CurPosition.CurWipSNs.First().LINE_CODE;
+                    CurPkgItem.Package.POST_CODE = CurPosition.CurWipSNs.First().POST_CODE;
+                    CurPkgItem.Package.OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE;
+                    CurPkgItem.Package.SEGMENT = CurPosition.CurWipSNs.First().SEGMENT;
+                    CurPkgItem.Package.ACT_ID = NodeAct.ID;
+                    CurPkgItem.Package.FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN;
                     FinishLevel++;
-                    action = SavePkgData(input, action);
+                    //瀹屾垚鍖呰鐨勫眰绾у皬浜庢渶澶栧眰鍖呰灞傜骇
+                    if (FinishLevel < PkgRule.Details.Max(q => q.PKG_LEVEL))
+                    {
+                        //褰撳墠澶勭悊鐨勫寘瑁呭眰绾у凡缁忓鐞嗗畬锛岀户缁線涓婁繚瀛�
+                        action = SavePkgData(input, action);
+                    }
+                    //鏈�澶栧眰鍖呰宸茬粡瀹屾垚鍖呰锛屼繚瀛樺寘瑁呮暟鎹埌鏁版嵁搴�
+                    else
+                    {
+                        CurPkg.Item = CurPkgItem;
+                        action = CompletePkg();
+                    }
                 }
                 //澶勭悊鍏朵粬鍖呰灞傜骇鏁版嵁
-                else 
+                else
                 {
                     //瀹㈡埛绔彁浜ょ殑鍖呰灞傜骇绛変簬褰撳墠澶勭悊鐨勫寘瑁呭眰绾�
                     if (pInput.PkgLevel == dtl.PKG_LEVEL)
                     {
                         CurPkgItem.IsFinished = true;
-                        CurPkgItem.Package = new()
+                        CurPkgItem.Package = IsManually ? new()
                         {
                             AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                             AUTH_PROD = CurPosition.CurLine.LINE_CODE,
-                            SN = pInput.PkgSN,
+                            SN = CurPkgItem.SN.IsNullOrEmpty(pInput.PkgSN),
+                            PKG_TYPE = dtl.PkgType.PKG_NAME,
+                            ITEM_CODE = CurPkgItem.Items.First().Package.ITEM_CODE,
+                            QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
+                            UNIT = dtl.PkgType.PKG_NAME,
+                            WORK_ORDER = CurPkgItem.Items.First().Package.WORK_ORDER,
+                            BATCH_NO = CurPkgItem.Items.First().Package.BATCH_NO,
+                            ROT_CODE = CurPkgItem.Items.First().Package.ROT_CODE,
+                            NODE_ID = CurPkgItem.Items.First().Package.NODE_ID,
+                            NODE_NAME = CurPkgItem.Items.First().Package.NODE_NAME,
+                            FTY_CODE = CurPkgItem.Items.First().Package.FTY_CODE,
+                            WS_CODE = CurPkgItem.Items.First().Package.WS_CODE,
+                            LINE_CODE = CurPkgItem.Items.First().Package.LINE_CODE,
+                            POST_CODE = CurPkgItem.Items.First().Package.POST_CODE,
+                            OPER_CODE = CurPkgItem.Items.First().Package.OPER_CODE,
+                            SEGMENT = CurPkgItem.Items.First().Package.SEGMENT,
+                        } : new()
+                        {
+                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                            SN = CurPkgItem.SN.IsNullOrEmpty(pInput.PkgSN),
                             PKG_TYPE = dtl.PkgType.PKG_NAME,
                             ITEM_CODE = CurPosition.CurWipSNs.First().ITEM_CODE,
                             QTY = CurPkgItem.Items.Sum(q => q.Package.QTY),
@@ -391,6 +628,8 @@
                             POST_CODE = CurPosition.CurWipSNs.First().POST_CODE,
                             OPER_CODE = CurPosition.CurWipSNs.First().OPER_CODE,
                             SEGMENT = CurPosition.CurWipSNs.First().SEGMENT,
+                            ACT_ID = NodeAct.ID,
+                            FLOW_SN = CurPosition.CurWipSNs.First().FLOW_SN,
                         };
                         FinishLevel++;
                         //瀹屾垚鍖呰鐨勫眰绾у皬浜庢渶澶栧眰鍖呰灞傜骇
@@ -424,6 +663,7 @@
                                     PKG_LEVEL = nextDtl.PKG_LEVEL,
                                     PKG_QTY = nextDtl.PKG_QTY,
                                     LABEL_CODE = LabelDic[nextDtl.PKG_LEVEL]?.LABEL_CODE,
+                                    SN = CurPosition.GenerateSN(nextDtl.SN_RULE, this),
                                 };
                                 curItem.Items.Add(next);
                             }
@@ -432,49 +672,72 @@
                         //娣诲姞褰撳墠鐨勫寘瑁呮槑缁嗗埌涓婁竴灞傚寘瑁呯殑鏄庣粏鍒楄〃
                         if (!curItem.Items.Contains(CurPkgItem))
                         {
-                        	curItem.Items.Add(CurPkgItem);
+                            curItem.Items.Add(CurPkgItem);
                         }
                         CurPkgItem = curItem;
 
                         //娣诲姞鏄庣粏鍚庡垽鏂綋鍓嶅寘瑁呭眰绾х殑鏄庣粏鏁伴噺鏄惁绛変簬鍖呰鏁伴噺锛岃嫢鐩哥瓑鍒欐爣璁板綋鍓嶅寘瑁呭眰绾т负瀹屾垚骞跺皾璇曟墦鍗版爣绛�
-                        if (CurPkgItem.Items.Count(q => q.IsFinished) == CurPkgItem.PKG_QTY || CurStep.IsNullOrEmpty())
+                        if (CurPkgItem.Items.Count(q => q.IsFinished) == CurPkgItem.PKG_QTY || IsManually)
                         {
-                            //琛屼负璁惧畾鐨凮PTION_1-9鏄寘瑁呬笉鍚屽眰绾х殑鏍囩妯℃澘浠g爜锛屽鏋滀负绌哄垯涓嶉渶瑕佹墦鍗�
-                            if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
+                            //鎵撳嵃鍓嶇О閲嶏細濡傛灉褰撳墠鐨勫寘瑁呮槑缁嗙殑涓婁竴灞傚寘瑁呭璞℃槸鏈�澶栧眰鍖呰涓旈渶瑕佺О閲嶆椂锛屽厛绉伴噸锛屽悎鏍煎悗鍦ㄥ彂鍗版垨鑰呮壂鎻忔渶澶栧眰鍖呰鏍囩
+                            if (CurPkgItem.PKG_LEVEL == CurPkg.Item.PKG_LEVEL && CurPkg.NeedWeighing)
                             {
                                 var data = new PackingActionOutput() { PkgInfo = CurPkg };
-                                data.ExecCode = "Scan";
-                                data.PkgLevel = dtl.PKG_LEVEL;
+                                data.ExecCode = "Weighing";
+                                data.PkgLevel = CurPkgItem.PKG_LEVEL;
                                 CurCmd = data;
+                                CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("涓婄О绉伴噸"));
                                 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);
+                                action.Data.ShortMsg = new("涓婄О绉伴噸", ShortMessage.Types.Success);
+                                //action.LocaleMsg = new($"璇锋妸澶栧寘瑁呬笂绉扮О閲�");
+                                action.LocaleMsg = new("MES.WorkAction.PackingAction.PleaseWeighing");
                             }
                             else
                             {
-                                //璁剧疆鎵撳嵃鍙橀噺鍊�
-                                LabelDic[dtl.PKG_LEVEL] = CurPosition.SetLabelVariables(LabelPV, LabelDic[dtl.PKG_LEVEL]);
+                                //濡傛灉涓虹┖鍒欎笉闇�瑕佹墦鍗�
+                                if (LabelDic[dtl.PKG_LEVEL].IsNullOrEmpty())
+                                {
+                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                    data.ExecCode = "Scan";
+                                    data.PkgLevel = dtl.PKG_LEVEL;
+                                    CurCmd = data;
+                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵弿鏍囩"));
+                                    action.Data.Data = data;
+                                    action.Data.ShortMsg = new("鎵弿鏍囩", ShortMessage.Types.Normal);
+                                    //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], this);
 
-                                var data = new PackingActionOutput() { PkgInfo = CurPkg };
-                                data.ExecCode = "Print";
-                                data.PkgLevel = dtl.PKG_LEVEL;
-                                data.PrintLable = LabelDic[dtl.PKG_LEVEL];
-                                CurCmd = 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);                
+                                    var data = new PackingActionOutput() { PkgInfo = CurPkg };
+                                    data.ExecCode = "Print";
+                                    data.PkgLevel = dtl.PKG_LEVEL;
+                                    data.PrintLable = LabelDic[dtl.PKG_LEVEL];
+                                    data.RealPrint = data.PkgLevel != CurPkg.Item.PKG_LEVEL || CurPosition is not YadaPacking || (CurPosition as YadaPacking).IsPrintCustomerLabel;
+                                    CurCmd = data;
+                                    PrintTimes++;
+                                    CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("鎵撳嵃鏍囩"));
+                                    action.Data.Data = data;
+                                    action.Data.ShortMsg = new("鎵撳嵃鏍囩", ShortMessage.Types.Normal);
+                                    //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();
+                            action = End(input);
                         }
                     }
                     //鏁版嵁寮傚父
                     else
                     {
+                        CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("鍖呰閿欒"));
+                        action.Data.ShortMsg = new("鍖呰閿欒", ShortMessage.Types.Error);
                         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})锛屽伐搴忓凡閲嶇疆锛岃閲嶆柊鎵弿杩涚珯浜у搧鏉$爜");
@@ -485,6 +748,8 @@
             }
             catch (System.Exception ex)
             {
+                CurStep?.SetStatusMessage(StepStatus.Error, Biz.L("鍖呰寮傚父"));
+                action.Data.ShortMsg = new("鍖呰寮傚父", ShortMessage.Types.Exception);
                 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;
@@ -495,13 +760,23 @@
             return action;
         }
 
-        private List<MES_WIP_PKG> GetPackageList(WipPkgItem parent)
+        public List<MES_WIP_PKG> GetMinPackageList(WipPkgItem parent)
         {
-            List<MES_WIP_PKG> list = new() { parent.Package };
-            foreach (var item in parent.Items)
+            List<MES_WIP_PKG> list = new();
+            if (parent.Items.Any())
             {
-                item.Package.PARENT_SN = parent.Package.SN;
-                list.AddRange(GetPackageList(item));
+                foreach (var item in parent.Items)
+                {
+                    item.Package.PARENT_SN = parent.Package?.SN;
+                    list.AddRange(GetMinPackageList(item));
+                }
+            }
+            else
+            {
+                if (!parent.Package.IsNullOrEmpty())
+                {
+                    list.Add(parent.Package);
+                }
             }
             return list;
         }
@@ -514,15 +789,17 @@
             data.ExecCode = "Complete";
             data.PkgLevel = CurPkg.Item.PKG_LEVEL;
             CurCmd = data;
+            CurStep?.SetStatusMessage(StepStatus.Normal, Biz.L("淇濆瓨鍖呰鏁版嵁"));
             action.Data.Data = data;
+            action.Data.ShortMsg = new("淇濆瓨鍖呰鏁版嵁", ShortMessage.Types.Normal);
             //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);
 
             //鎵嬪姩缁撴潫鍖呰鍒欐爣璁拌涓哄畬鎴�
-            if (CurStep.IsNullOrEmpty())
-            {
-                IsFinished = true;
-            }
+            //if (IsManually)
+            //{
+            //    IsFinished = true;
+            //}
 
             return action;
         }
@@ -531,103 +808,194 @@
         /// 缁撴潫鎵ц宸ュ簭琛屼负
         /// </summary>
         /// <returns></returns>
-        public ApiAction<SubmitOutput> End()
+        public ApiAction<SubmitOutput> End(SubmitInput input)
         {
             var action = new ApiAction<SubmitOutput>(new SubmitOutput());
 
-            //璁板綍琛屼负鎿嶄綔璁板綍
-            var wipActs = new List<MES_WIP_ACT>();
-            foreach (var wipSn in CurPosition.CurWipSNs)
+            //璁板綍澶栧寘瑁呯殑绉伴噸鏁版嵁
+            if (CurPkg.IsFinished)
             {
-                var wipAct = new MES_WIP_ACT()
-                {
-                    AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
-                    AUTH_PROD = CurPosition.CurLine.LINE_CODE,
-                    HIS_ID = CurPosition.CurWipSNHiss.First(q => q.SN == wipSn.SN).ID,
-                    SN = wipSn.SN,
-                    STATUS = wipSn.STATUS,
-                    ITEM_CODE = wipSn.ITEM_CODE,
-                    WORK_ORDER = wipSn.WORK_ORDER,
-                    BATCH_NO = wipSn.BATCH_NO,
-                    ROT_CODE = wipSn.ROT_CODE,
-                    NODE_ID = wipSn.NODE_ID,
-                    NODE_NAME = wipSn.NODE_NAME,
-                    ACT_ID = NodeAct.ID,
-                    ACT_NAME = NodeAct.ACT_NAME,
-                    FTY_CODE = wipSn.FTY_CODE,
-                    WS_CODE = wipSn.WS_CODE,
-                    LINE_CODE = wipSn.LINE_CODE,
-                    POST_CODE = wipSn.POST_CODE,
-                    OPER_CODE = wipSn.OPER_CODE,
-                    SEGMENT = wipSn.SEGMENT,
-                    TRAY_SN = wipSn.TRAY_SN,
-                    OPERATION_TIME = DateTime.Now,
-                    SFTS_CODE = wipSn.SFTS_CODE,
-                    SFT_CODE = wipSn.SFT_CODE,
-                    PRD_CODE = wipSn.PRD_CODE,
-                    ACT_TYPE = NodeAct.ACT_TYPE,
-                    ACT_SN = wipSn.SN,
-                    ACT_RESULT = "Y",
-                    TRACE_INFO = $"浜у搧鏉$爜[{string.Join("锛�", CurPosition.CurSN)}]鍖呰瀹屾垚",
-                };
-                wipActs.Add(wipAct);
+                CurPkg.Item.Package.WEIGHT = CurPkg.WeightInfo.Weight;
+                CurPkg.Item.Package.WEIGHT_UNIT = CurPkg.WeightInfo.Unit;
             }
 
-            //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
-            var _wipActs = wipActs.Clone();
-            var _pkgList = CurPkg.IsFinished ? GetPackageList(CurPkg.Item) : new();
-            //淇濆瓨鏁版嵁
-            CurStep.DBSubmitAction = () =>
+            //涓嶆槸鎵嬪姩缁撴潫鍖呰鍒欎繚瀛樿涓烘搷浣滆褰�
+            if (!IsManually)
             {
-                var db = CurPosition.GetCommitDB();
-                db.Storageable(_wipActs, CurPosition.UserCode).ExecuteCommand();
-                if (_pkgList.Any())
+                //璁板綍琛屼负鎿嶄綔璁板綍
+                var wipActs = new List<MES_WIP_ACT>();
+                foreach (var wipSn in CurPosition.CurWipSNs)
                 {
-                    db.Insertable(_pkgList, CurPosition.UserCode).ExecuteCommand();
-                    foreach (var pkg in _pkgList)
+
+                    var wipAct = new MES_WIP_ACT()
                     {
+                        AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                        AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                        WIP_ID = wipSn.ID,
+                        HIS_ID = CurPosition.CurWipSNHiss.First(q => q.SN == wipSn.SN).ID,
+                        SN = wipSn.SN,
+                        STATUS = wipSn.STATUS,
+                        ITEM_CODE = wipSn.ITEM_CODE,
+                        WORK_ORDER = wipSn.WORK_ORDER,
+                        BATCH_NO = wipSn.BATCH_NO,
+                        ROT_CODE = wipSn.ROT_CODE,
+                        NODE_ID = wipSn.NODE_ID,
+                        NODE_NAME = wipSn.NODE_NAME,
+                        ACT_ID = NodeAct.ID,
+                        ACT_NAME = NodeAct.ACT_NAME,
+                        FTY_CODE = wipSn.FTY_CODE,
+                        WS_CODE = wipSn.WS_CODE,
+                        LINE_CODE = wipSn.LINE_CODE,
+                        POST_CODE = wipSn.POST_CODE,
+                        OPER_CODE = wipSn.OPER_CODE,
+                        SEGMENT = wipSn.SEGMENT,
+                        FLOW_SN = wipSn.FLOW_SN,
+                        TRAY_SN = wipSn.TRAY_SN,
+                        INNER_SN = wipSn.INNER_SN,
+                        CARTON_SN = wipSn.CARTON_SN,
+                        PALLET_SN = wipSn.PALLET_SN,
+                        OPERATION_TIME = DateTime.Now,
+                        SFTS_CODE = wipSn.SFTS_CODE,
+                        SFT_CODE = wipSn.SFT_CODE,
+                        PRD_CODE = wipSn.PRD_CODE,
+                        ACT_TYPE = NodeAct.ACT_TYPE,
+                        ACT_SN = wipSn.SN,
+                        ACT_RESULT = "Y",
+                        ACT_VALUE_1 = CurPkg.IsFinished ? "Y" : "N",
+                        ACT_VALUE_2 = CurPkg.ToJson(),
+                        ACT_VALUE_3 = CurPkg.IsFinished ? LabelDic[CurPkg.Item.PKG_LEVEL].ToJson() : "",
+                        ELAPSED_TIME = CurStep.GetElapsedTime().TotalMilliseconds.ToInt64(),
+                        TRACE_INFO = $"浜у搧鏉$爜[{string.Join("锛�", CurPosition.CurSN)}]鍖呰瀹屾垚",
+                    };
+                    wipActs.Add(wipAct);
+                }
+
+                //鍒涘缓鍙橀噺鍏嬮殕瀵硅薄鐢ㄤ簬浼犲叆DBSubmitAction涓繚瀛樺綋鍓嶉渶瑕佹殏瀛樼殑鏁版嵁鍊�
+                var _wipActs = wipActs.Clone();
+                var _pkgList = CurPkg.IsFinished ? CurPosition.GetPackageList(CurPkg.Item) : new();
+                //淇濆瓨鏁版嵁
+                CurStep.DBSubmitAction = () =>
+                {
+                    var db = CurPosition.GetCommitDB();
+                    if (_wipActs.Any())
+                    {
+                        db.Storageable(_wipActs, CurPosition.UserCode).ExecuteCommand();
+                    }
+                    if (_pkgList.Any())
+                    {
+                        db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
+                        var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
+                        var nodeID = _pkgList.First().NODE_ID;
+                        var actID = _pkgList.First().ACT_ID;
+                        var wo = _pkgList.First().WORK_ORDER;
                         //鍖呰淇℃伅淇濆瓨鍒板湪鍒跺搧淇℃伅琛�
                         db.Updateable<MES_WIP_DATA>()
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
-                            .SetColumns(q => q.CONTAINER_SN == q.CARTON_SN)
+                            .SetColumns(q => q.INNER_SN == q.CARTON_SN)
                             .SetColumns(q => q.CARTON_SN == CurPkg.Item.Package.SN)
-                            .Where(q => q.WORK_ORDER == pkg.WORK_ORDER && q.SN == pkg.SN)
+                            .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.ID))
+                            .ExecuteCommand();
+                        //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
+                        db.Updateable<MES_WIP_HIS>()
+                            .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>()
+                            .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>()
                             .SetColumns(q => q.TRAY_SN == CurPkg.Item.Package.SN)
                             .SetColumns(q => q.OUTER_SN == CurPkg.Item.Package.SN)
-                            .Where(q => q.WORK_ORDER == pkg.WORK_ORDER && q.SN == pkg.SN)
+                            .Where(q => q.WORK_ORDER == wo && wipIDs.Contains(q.WIP_ID))
                             .ExecuteCommand();
                     }
-                }
-            };
-
-            if (CurPkg.IsFinished)
-            {
-                //鏈�澶栧眰鍖呰宸茬粡瀹屾垚鍖呰锛屽垯鎶婂伐搴忎腑鏆傚瓨鏍囪璁句负false锛岀粺涓�鎻愪氦鍖呰鍐呬骇鍝佺殑杩囩珯璁板綍
-                CurPosition.NeedTemporaryStoreDBCommitAction = false;
-                //鍒犻櫎宸ュ簭涓婁笅鏂囦腑鐨勫寘瑁呰褰�
-                CurPosition.Context.Remove("CurPackage");
+                };
             }
             else
             {
-                //鏈�澶栧眰鍖呰鏈畬鎴愬寘瑁咃紝鍒欐妸宸ュ簭涓殏瀛樻爣璁拌涓簍rue锛屽緟鍏ㄩ儴鍖呰瀹屾垚鍐嶇粺涓�鎻愪氦鍖呰鍐呬骇鍝佺殑杩囩珯璁板綍
-                CurPosition.NeedTemporaryStoreDBCommitAction = true;
-                //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓�
-                if (CurPosition.Context.ContainsKey("CurPackage"))
+                if (CurPkg.IsFinished)
                 {
-                    CurPosition.Context["CurPackage"] = CurPkg;
-                }
-                else
-                {
-                    CurPosition.Context.Add("CurPackage", CurPkg);
+                    var _pkgList = CurPosition.GetPackageList(CurPkg.Item).Clone();
+
+                    //鏈�澶栧眰鍖呰宸茬粡瀹屾垚鍖呰锛屽垯鎶婂伐搴忎腑鏆傚瓨鏍囪璁句负false锛岀粺涓�鎻愪氦鍖呰鍐呬骇鍝佺殑杩囩珯璁板綍
+                    CurPosition.NeedTemporaryStoreDBCommitAction = false;
+                    //淇濆瓨鏁版嵁
+                    CurPosition.SaveStepsCommitActionToDB(() =>
+                    {
+                        var db = CurPosition.GetCommitDB();
+                        if (_pkgList.Any())
+                        {
+                            db.Storageable(_pkgList, CurPosition.UserCode).ExecuteCommand();
+                            var wipIDs = _pkgList.Where(q => !q.WIP_ID.IsNullOrEmpty()).Select(q => q.WIP_ID).ToList();
+                            var nodeID = _pkgList.First(q => !q.WIP_ID.IsNullOrEmpty()).NODE_ID;
+                            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>()
+                                .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();
+                            //鍖呰淇℃伅淇濆瓨鍒扮敓浜ц繃绋嬭褰�
+                            var endOperCode = CurPkg.IsReachedEndNode ? "EndNode" : "NotReachedEndNode";
+                            db.Updateable<MES_WIP_HIS>()
+                                .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>()
+                                .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>()
+                                .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))
+                                .ExecuteCommand();
+                        }
+                    });
+                    //濡傛灉褰撳墠鏉$爜宸茬粡瀹屽伐锛屾鏌ュ綋鍓嶅伐鍗曟壒娆″拰宸ュ崟鏄惁瀹屽伐
+                    if (CurPkg.IsReachedEndNode)
+                    {
+                        CurPosition.WorkBatch.CheckIsComplete(CurPosition.UserCode);
+                    }
                 }
             }
 
-            IsFinished = true;
-            action.LocaleMsg = new($"浜у搧鏉$爜[{CurPosition.CurSN}]鍖呰瀹屾垚");
+            //鏈�澶栧眰鍖呰宸茬粡瀹屾垚鍖呰锛屽垯鎶婂伐搴忎腑鏆傚瓨鏍囪璁句负false锛岀粺涓�鎻愪氦鍖呰鍐呬骇鍝佺殑杩囩珯璁板綍
+            //鏈�澶栧眰鍖呰鏈畬鎴愬寘瑁咃紝鍒欐妸宸ュ簭涓殏瀛樻爣璁拌涓簍rue锛屽緟鍏ㄩ儴鍖呰瀹屾垚鍐嶇粺涓�鎻愪氦鍖呰鍐呬骇鍝佺殑杩囩珯璁板綍
+            CurPosition.NeedTemporaryStoreDBCommitAction = !CurPkg.IsFinished;
+            //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓�
+            if (CurPosition.Context.ContainsKey("CurPackage"))
+            {
+                CurPosition.Context["CurPackage"] = CurPkg;
+                CurPosition.Context["CurLabelDic"] = LabelDic;
+            }
+            else
+            {
+                CurPosition.Context.Add("CurPackage", CurPkg);
+                CurPosition.Context.Add("CurLabelDic", LabelDic);
+            }
+            //action.LocaleMsg = new($"鏉$爜[{CurPosition.CurSN}]鍖呰瀹屾垚");
             action.LocaleMsg = new("MES.WorkAction.PackingAction.PackingSuccess", CurPosition.CurSN);
+
+            IsFinished = true;
+            CurStep?.SetStatusMessage(StepStatus.Finished, Biz.L("鍖呰瀹屾垚"));
+            action.Data.ShortMsg = new("鍖呰瀹屾垚", ShortMessage.Types.Success);
+
             return action;
         }
 

--
Gitblit v1.9.3