From 3f364634b79a0f97a550c54f67313dfc0cfd4cb5 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期三, 27 十一月 2024 22:16:01 +0800
Subject: [PATCH] 一大波签入来了

---
 Tiger.Business.MES/WorkAction/ThreeInOne.cs                      |   12 +
 Tiger.Business.MES/Transaction/YadaPacking.cs                    |   26 ++--
 Tiger.Model.Net/Entitys/MQTTEntity.cs                            |   60 ++++++++++
 Tiger.Business.MES/Transaction/CollectNode.cs                    |    8 
 Tiger.Business.MES/WorkAction/Assembly.cs                        |    8 
 Tiger.Business.MES/WorkAction/Weighing.cs                        |    4 
 Tiger.Business.MESTests/Tiger.Business.MESTests.csproj           |    6 
 Tiger.Business.MES/Transaction/PackingNode.cs                    |   12 +-
 Tiger.Dependencies/Tiger.Dependencies.csproj                     |    2 
 Tiger.Model.Net/Tiger.Model.Net.csproj                           |    5 
 Tiger.Business.MES/Transaction/Position.cs                       |   72 ++++++++++-
 Tiger.Business.MES/WorkAction/PrintInStoreLabel.cs               |    6 
 Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs |   12 +
 Tiger.IBusiness.MES/Transaction/IPosition.cs                     |    1 
 Tiger.Business.MES/Transaction/TestNode.cs                       |    8 
 Tiger.Business.MES/WorkAction/PackageInputCheck.cs               |    6 
 Tiger.Business.MES/WorkAction/IPQC.cs                            |    2 
 Tiger.Business.MES/WorkAction/YadaWoReport.cs                    |    2 
 Tiger.Model.Net/packages.config                                  |    2 
 Tiger.Business.MES/WorkAction/YadaAssembly.cs                    |   10 +
 Tiger.Business.MES/WorkAction/PackingAction.cs                   |   21 ++-
 Tiger.Business.MES/WorkAction/PrintLabel.cs                      |    6 
 Tiger.Business.MES/WorkAction/VerifyCustomSN.cs                  |    4 
 Tiger.Business.MES/WorkAction/WipExtInfo.cs                      |    6 
 24 files changed, 222 insertions(+), 79 deletions(-)

diff --git a/Tiger.Business.MES/Transaction/CollectNode.cs b/Tiger.Business.MES/Transaction/CollectNode.cs
index ed53ddd..880b248 100644
--- a/Tiger.Business.MES/Transaction/CollectNode.cs
+++ b/Tiger.Business.MES/Transaction/CollectNode.cs
@@ -43,7 +43,7 @@
                 //宸ユ鍒楄〃涓虹┖鎴栬�呭伐搴忚妭鐐瑰伐姝ユ湁鏈畬鎴愭椂锛屼紭鍏堝畬鎴愬伐搴忚妭鐐瑰伐姝�
                 if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                 {
-                    var wosns = Biz.Db.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
+                    var wosns = MainDB.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
                                 .ByAuth(input.AuthOption)//.Where((q, s) => s.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue())
                                 .Where((q, s) => s.SN == input.SN || s.FLOW_SN == input.SN || s.TRAY_SN == input.SN).Select((q, s) => new { Batch = q, SN = s }).ToList();
                     //鍏堝垽鏂綋鍓嶅伐鍗曚笉涓虹┖涓斿綋鍓嶅矖浣嶅湪褰撳墠宸ュ崟鏄笉鏄绔欙紝濡傛灉鏄垯涓嶅厑璁稿彉鏇村綋鍓嶅伐鍗曪紝灏濊瘯鎶婃潯鐮佺粦瀹氬埌褰撳墠宸ュ崟
@@ -105,7 +105,7 @@
                                         action.Data.OperInfo = new();
                                         action.IsSuccessed = result.IsSuccessed;
                                         action.LocaleMsg = result.LocaleMsg;
-                                        return action;
+                                        return SetOutPutMqttMsg(action, input.Locale);
                                     }
                                 }
                                 //鏇存柊CurBatch
@@ -224,7 +224,7 @@
                 //action.CatchExceptionWithLog(ex, $"閲囬泦宸ュ簭锛氭彁浜ゆ搷浣滄暟鎹紓甯�");
                 action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.CollectNode.SubmitException"));
             }
-            return action;
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
@@ -262,7 +262,7 @@
                         return woStatus;
                     }
 
-                    var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
+                    var wipSNs = MainDB.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
                     if (wipSNs.IsNullOrEmpty())
                     {
                         var wipSN = new MES_WIP_DATA()
diff --git a/Tiger.Business.MES/Transaction/PackingNode.cs b/Tiger.Business.MES/Transaction/PackingNode.cs
index ddf7f7a..47d5edc 100644
--- a/Tiger.Business.MES/Transaction/PackingNode.cs
+++ b/Tiger.Business.MES/Transaction/PackingNode.cs
@@ -66,7 +66,7 @@
                     if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                     {
 
-                        var wosns = Biz.Db.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
+                        var wosns = MainDB.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
                                             .ByAuth(input.AuthOption)//.Where((q, s) => s.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue())
                                             .Where((q, s) => s.SN == input.SN || s.FLOW_SN == input.SN || s.TRAY_SN == input.SN).Select((q, s) => new { Batch = q, SN = s }).ToList();
 
@@ -116,7 +116,7 @@
                                     action.IsSuccessed = false;
                                     //action.LocaleMsg = new($"鏉$爜[{0}]鏄浇鍏锋潯鐮侊紝璇锋壂鎻忚浇鍏蜂腑鐨勪骇鍝佹潯鐮佺户缁寘瑁呮搷浣�");
                                     action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.OnlyMinPackage", input.SN);
-                                    return action;
+                                    return SetOutPutMqttMsg(action, input.Locale);
                                 }
                                 var curPkg = Context.ContainsKey("CurPackage") ? Context["CurPackage"] as WipPkg : null;
                                 if (!curPkg.IsNullOrEmpty() && !curPkg.IsFinished && curPkg.WorkBatch != curSNs.First().Batch.BATCH_NO)
@@ -126,7 +126,7 @@
                                     action.IsSuccessed = false;
                                     //action.LocaleMsg = new($"姝e湪鍖呰宸ュ崟鎵规[{0}]鐨勪骇鍝侊紝璇峰厛瀹屾垚褰撳墠鍖呰鍚庡啀鎵弿鍏朵粬鎵规[{1}]鐨勪骇鍝乕{2}]");
                                     action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.BatchError", curPkg.WorkBatch, curSNs.First().Batch.BATCH_NO, input.SN);
-                                    return action;
+                                    return SetOutPutMqttMsg(action, input.Locale);
                                 }
                                 if (curSNs.First().Batch.ACT_LINE != CurLine.LINE_CODE)
                                 {
@@ -148,7 +148,7 @@
                                             action.Data.OperInfo = new();
                                             action.IsSuccessed = result.IsSuccessed;
                                             action.LocaleMsg = result.LocaleMsg;
-                                            return action;
+                                            return SetOutPutMqttMsg(action, input.Locale);
                                         }
                                     }
                                     //鏇存柊CurBatch
@@ -267,7 +267,7 @@
                 //action.CatchExceptionWithLog(ex, $"鍖呰宸ュ簭锛氭彁浜ゆ搷浣滄暟鎹紓甯�");
                 action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.PackingNode.SubmitException"));
             }
-            return action;
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
@@ -304,7 +304,7 @@
                         return woStatus;
                     }
 
-                    var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
+                    var wipSNs = MainDB.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
                     if (wipSNs.IsNullOrEmpty())
                     {
                         var wipSN = new MES_WIP_DATA()
diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs
index 707f714..5696ae8 100644
--- a/Tiger.Business.MES/Transaction/Position.cs
+++ b/Tiger.Business.MES/Transaction/Position.cs
@@ -30,22 +30,23 @@
             UserCode = userCode;
             ApiHost = apiHost;
             PostCode = postCode;
+            _MainDB = Biz.Db;
 
-            CurPosition = Biz.Db.Queryable<MES_POSITION>().Where(q => q.POST_CODE == postCode).First();
+            CurPosition = MainDB.Queryable<MES_POSITION>().Where(q => q.POST_CODE == postCode).First();
             //if (CurPosition.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.PositionNotExistsException", new Exception($"{postCode}|"));
             if (CurPosition.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]涓嶅瓨鍦紝璇锋彁浜ゆ纭殑宀椾綅浠g爜", new Exception($"{postCode}|"));
-            CurLine = Biz.Db.Queryable<MES_LINE>().Where(q => q.LINE_CODE == CurPosition.LINE_CODE).First();
+            CurLine = MainDB.Queryable<MES_LINE>().Where(q => q.LINE_CODE == CurPosition.LINE_CODE).First();
             //if (CurLine.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.LineNotExistsException", new Exception($"{postCode}|{CurPosition.LINE_CODE}"));
             if (CurLine.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑浜х嚎[{CurPosition.LINE_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炰骇绾�", new Exception($"{postCode}|{CurPosition.LINE_CODE}"));
-            CurWorkshop = Biz.Db.Queryable<MES_WORKSHOP>().Where(q => q.WS_CODE == CurLine.WS_CODE).First();
+            CurWorkshop = MainDB.Queryable<MES_WORKSHOP>().Where(q => q.WS_CODE == CurLine.WS_CODE).First();
             //if (CurWorkshop.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.WorkshopNotExistsException", new Exception($"{postCode}|{CurLine.WS_CODE}"));
             if (CurWorkshop.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑杞﹂棿[{CurLine.WS_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炶溅闂�", new Exception($"{postCode}|{CurLine.WS_CODE}"));
-            CurFactory = Biz.Db.Queryable<MES_FACTORY>().Where(q => q.FTY_CODE == CurWorkshop.FTY_CODE).First();
+            CurFactory = MainDB.Queryable<MES_FACTORY>().Where(q => q.FTY_CODE == CurWorkshop.FTY_CODE).First();
             //if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.FactoryNotExistsException", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
             if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑宸ュ巶[{CurWorkshop.FTY_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炲伐鍘�", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}"));
 
             //鍔犺浇褰撳墠浜х嚎鐨勭彮鍒�
-            CurShiftSys = Biz.Db.Queryable<MES_SHIFT_SYS>().Where(q => q.SFTS_CODE == CurLine.SFTS_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Shifts).First();
+            CurShiftSys = MainDB.Queryable<MES_SHIFT_SYS>().Where(q => q.SFTS_CODE == CurLine.SFTS_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Shifts).First();
 
             return this;
         }
@@ -75,6 +76,8 @@
         public bool IsFinishNodeSteps => !Steps.Any(q => q.NodeType == IWorkStep.NodeTypes.Node && !q.IsFinished);
         public bool IsFinishAllSteps => Steps.Any() && !Steps.Any(q => !q.IsFinished);
         //public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0;
+        private DbClient _MainDB;
+        public DbClient MainDB => _MainDB;
         private DbClient CommitDB;
         /// <summary>
         /// 鏄惁闇�瑕佷复鏃跺瓨鍌ㄦ暟鎹簱鎻愪氦鎿嶄綔锛屽緟闇�瑕佺殑鏃跺�欏啀鎻愪氦
@@ -107,7 +110,7 @@
             {
                 if (!WoContext.ExistsBatch(input.OrderNo, CurLine.LINE_CODE, batchNo, true))
                 {
-                    var wo = await Biz.Db.Queryable<BIZ_MES_WO>().ByAuth(input.AuthOption).Where(q => q.ORDER_NO == input.OrderNo).FirstAsync();
+                    var wo = await MainDB.Queryable<BIZ_MES_WO>().ByAuth(input.AuthOption).Where(q => q.ORDER_NO == input.OrderNo).FirstAsync();
                     //楠岃瘉鏄庣粏鏄惁姝g‘
                     if (wo.IsNullOrEmpty())
                     {
@@ -123,7 +126,7 @@
                         action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNo, wo.STATUS.GetEnumDesc<BIZ_MES_WO.STATUSs>());
                         return action;
                     }
-                    var batch = await Biz.Db.Queryable<BIZ_MES_WO_BATCH>().ByAuth(input.AuthOption)
+                    var batch = await MainDB.Queryable<BIZ_MES_WO_BATCH>().ByAuth(input.AuthOption)
                         .Where(q => q.ORDER_NO == input.OrderNo && q.ACT_LINE == CurLine.LINE_CODE)
                         .WhereIF(!batchNo.IsNullOrEmpty(), q => q.BATCH_NO == batchNo)
                         .OrderBy(q => q.STATUS).FirstAsync();
@@ -242,6 +245,55 @@
                 info.NextNode = "   鈥�   ";
             }
             return info;
+        }
+
+        /// <summary>
+        /// 璁剧疆褰撳墠鏉$爜鐨勫伐搴忎俊鎭�
+        /// </summary>
+        public ApiAction<SubmitOutput> SetOutPutMqttMsg(ApiAction<SubmitOutput> action, string locale = null)
+        {
+            MQTT.Message msg = new()
+            {
+                IsSuccessed = action.IsSuccessed,
+                Content = Biz.T(action.LocaleMsg, locale),
+            };
+            switch (action.Status)
+            {
+                case ApiAction.StatusCodes.Success:
+                    if (action.Data.IsFinished)
+                    {
+                        msg.Voice = MQTT.Voice.Pass;
+                        msg.Color = "#FF228B22";
+                    }
+                    else
+                    {
+                        msg.Voice = MQTT.Voice.Success;
+                        msg.Color = "#FF1E90FF";
+                    }
+                    break;
+                case ApiAction.StatusCodes.Warning:
+                    msg.Voice = MQTT.Voice.Warning;
+                    msg.Color = "#FFB8860B";
+                    break;
+                case ApiAction.StatusCodes.Error:
+                case ApiAction.StatusCodes.Failed:
+                    msg.Voice = MQTT.Voice.Fail;
+                    msg.Color = "#FFFF0000";
+                    break;
+                case ApiAction.StatusCodes.Exception:
+                    msg.Voice = MQTT.Voice.Fail;
+                    msg.Color = "#FF8B0000";
+                    break;
+                case ApiAction.StatusCodes.Normal:
+                case ApiAction.StatusCodes.NeedConfrim:
+                case ApiAction.StatusCodes.Confrimed:
+                default:
+                    msg.Voice = MQTT.Voice.Silent;
+                    msg.Color = "#FF000000";
+                    break;
+            }
+            action.Data.MqttMsg = msg;
+            return action;
         }
 
         /// <summary>
@@ -663,7 +715,7 @@
                                             {
                                                 snList.Add(_orderAction.CurPkg.CustSN?.FLOW_SN);
                                             }
-                                            _lotnos = string.Join(",", Biz.Db.Queryable<MES_CUST_SN>()
+                                            _lotnos = string.Join(",", MainDB.Queryable<MES_CUST_SN>()
                                                 .Where((q) => snList.Contains(q.FLOW_SN))
                                                 .Select((q) => q.WORK_ORDER).Distinct().ToList());
                                             return _lotnos;
@@ -742,7 +794,7 @@
         private string GetLabelVarWo(BAS_LABEL_VAR lv, string value)
         {
             string result = "";
-            var labelVarwos = Biz.Db.Queryable<BAS_LABEL_VAR_WO>().Where(x => x.LABEL_ID == lv.LABEL_ID && x.VAR_NAME == lv.VAR_NAME).ToList();
+            var labelVarwos = MainDB.Queryable<BAS_LABEL_VAR_WO>().Where(x => x.LABEL_ID == lv.LABEL_ID && x.VAR_NAME == lv.VAR_NAME).ToList();
             if (labelVarwos.Any(q => q.WORK_ORDER == WorkBatch.Batch.ORDER_NO))
             {
                 result = labelVarwos.First(q => q.WORK_ORDER == WorkBatch.Batch.ORDER_NO).VAR_VALUE;
@@ -854,7 +906,7 @@
         private string GetHuaWeiWeek(string pkgOrder, List<string> snList)
         {
             Dictionary<string, string> dic = new();
-            var snOrder = Biz.Db.Queryable<MES_CUST_SN, BIZ_MES_WO>((q, w) => new JoinQueryInfos(JoinType.Left, q.WORK_ORDER == w.ORDER_NO))
+            var snOrder = MainDB.Queryable<MES_CUST_SN, BIZ_MES_WO>((q, w) => new JoinQueryInfos(JoinType.Left, q.WORK_ORDER == w.ORDER_NO))
                                             .Where((q, w) => q.PKG_ORDER == pkgOrder && (snList.Contains(q.FLOW_SN) || snList.Contains(q.CUST_SN)))
                                            .Select((q, w) => new { q.PKG_ORDER, q.WORK_ORDER, w.ACT_START_TIME, w.PLAN_START_TIME, q.FLOW_SN, q.CUST_SN }).ToList();
             foreach (var sn in snList)
diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index acea8bc..62455eb 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -37,7 +37,7 @@
                 //宸ユ鍒楄〃涓虹┖鎴栬�呭伐搴忚妭鐐瑰伐姝ユ湁鏈畬鎴愭椂锛屼紭鍏堝畬鎴愬伐搴忚妭鐐瑰伐姝�
                 if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                 {
-                    var wosns = Biz.Db.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
+                    var wosns = MainDB.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
                                                     .ByAuth(input.AuthOption)//.Where((q, s) => s.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue())
                                                     .Where((q, s) => s.SN == input.SN || s.FLOW_SN == input.SN || s.TRAY_SN == input.SN).Select((q, s) => new { Batch = q, SN = s }).ToList();
 
@@ -100,7 +100,7 @@
                                         action.Data.OperInfo = new();
                                         action.IsSuccessed = result.IsSuccessed;
                                         action.LocaleMsg = result.LocaleMsg;
-                                        return action;
+                                        return SetOutPutMqttMsg(action, input.Locale);
                                     }
                                 }
                                 //鏇存柊CurBatch
@@ -219,7 +219,7 @@
                 //action.CatchExceptionWithLog(ex, $"娴嬭瘯宸ュ簭锛氭彁浜ゆ搷浣滄暟鎹紓甯�");
                 action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.TestNode.SubmitException"));
             }
-            return action;
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
@@ -257,7 +257,7 @@
                         return woStatus;
                     }
 
-                    var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
+                    var wipSNs = MainDB.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
                     if (wipSNs.IsNullOrEmpty())
                     {
                         var wipSN = new MES_WIP_DATA()
diff --git a/Tiger.Business.MES/Transaction/YadaPacking.cs b/Tiger.Business.MES/Transaction/YadaPacking.cs
index 7ea9974..ee9a561 100644
--- a/Tiger.Business.MES/Transaction/YadaPacking.cs
+++ b/Tiger.Business.MES/Transaction/YadaPacking.cs
@@ -63,7 +63,7 @@
                 //    action.IsSuccessed = false;
                 //    action.LocaleMsg = new($"鍖呰鏁伴噺[{input.Qty}]涓嶆纭紝璇烽噸鏂拌緭鍏ユ暟閲忓悗缁х画鍖呰鎿嶄綔");
                 //    //action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.QtyError", input.Qty);
-                //    return action;
+                //    return SetOutPutMqttMsg(action, input.Locale);
                 //}
                 if (input.Options.ContainsKey("IsPrintCustomerLabel"))
                 {
@@ -91,7 +91,7 @@
                     //宸ユ鍒楄〃涓虹┖鎴栬�呭伐搴忚妭鐐瑰伐姝ユ湁鏈畬鎴愭椂锛屼紭鍏堝畬鎴愬伐搴忚妭鐐瑰伐姝�
                     if (Steps.IsNullOrEmpty() || !IsFinishNodeSteps)
                     {   
-                        var wosns = Biz.Db.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
+                        var wosns = MainDB.Queryable<BIZ_MES_WO_BATCH, BIZ_MES_WO_SN>((q, s) => new JoinQueryInfos(JoinType.Inner, q.ORDER_NO == s.WORK_ORDER && q.BATCH_NO == s.BATCH_NO))
                                                 .ByAuth(input.AuthOption)//.Where((q, s) => s.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue())
                                                 .Where((q, s) => s.SN == input.SN || s.FLOW_SN == input.SN || s.TRAY_SN == input.SN).Select((q, s) => new { Batch = q, SN = s }).ToList();
                         curtime = DateTime.Now;  Logger.Console.Info($"{CurSN} : ***** 2 : {(curtime - prevtime).TotalSeconds}s", ConsoleColor.Green); prevtime = curtime;
@@ -142,7 +142,7 @@
                                     action.IsSuccessed = false;
                                     //action.LocaleMsg = new($"鏉$爜[{0}]鏄浇鍏锋潯鐮侊紝璇锋壂鎻忚浇鍏蜂腑鐨勪骇鍝佹潯鐮佺户缁寘瑁呮搷浣�");
                                     action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.OnlyMinPackage", input.SN);
-                                    return action;
+                                    return SetOutPutMqttMsg(action, input.Locale);
                                 }
                                 var curPkg = Context.ContainsKey("CurPackage") ? Context["CurPackage"] as WipPkg : null;
                                 if (!curPkg.IsNullOrEmpty() && !curPkg.IsFinished && curPkg.WorkBatch != curSNs.First().Batch.BATCH_NO)
@@ -152,7 +152,7 @@
                                     action.IsSuccessed = false;
                                     //action.LocaleMsg = new($"姝e湪鍖呰宸ュ崟鎵规[{0}]鐨勪骇鍝侊紝璇峰厛瀹屾垚褰撳墠鍖呰鍚庡啀鎵弿鍏朵粬鎵规[{1}]鐨勪骇鍝乕{2}]");
                                     action.LocaleMsg = new("MES.Transaction.PackingNode.Submit.BatchError", curPkg.WorkBatch, curSNs.First().Batch.BATCH_NO, input.SN);
-                                    return action;
+                                    return SetOutPutMqttMsg(action, input.Locale);
                                 }
                                 if (curSNs.First().Batch.ACT_LINE != CurLine.LINE_CODE)
                                 {
@@ -174,7 +174,7 @@
                                             action.Data.OperInfo = new();
                                             action.IsSuccessed = result.IsSuccessed;
                                             action.LocaleMsg = result.LocaleMsg;
-                                            return action;
+                                            return SetOutPutMqttMsg(action, input.Locale);
                                         }
                                     }
                                     //鏇存柊CurBatch
@@ -297,7 +297,7 @@
                 action.CatchExceptionWithLog(ex, Biz.L("MES.Transaction.PackingNode.SubmitException"));
             }
             curtime = DateTime.Now;  Logger.Console.Info($"{CurSN} : ***** 9 : {(curtime - prevtime).TotalSeconds}s", ConsoleColor.Green); prevtime = curtime;
-            return action;
+            return SetOutPutMqttMsg(action, input.Locale);
         }
 
         /// <summary>
@@ -335,7 +335,7 @@
                         return woStatus;
                     }
 
-                    var wipSNs = Biz.Db.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
+                    var wipSNs = MainDB.Queryable<MES_WIP_DATA>().IncludesAllFirstLayer().Where(q => q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN).Where(q => q.FINISHED_FLAG != "Y").ToList();
                     if (wipSNs.IsNullOrEmpty())
                     {
                         var wipSN = new MES_WIP_DATA()
@@ -404,8 +404,8 @@
                     {
                         CurShipQty = ship.ShipQty;
                         IsPrintCustomerLabel = true;
-                        SugarParameter[] pars = Biz.Db.Ado.GetParameters(new { BATCH = CurBatch.Batch.BATCH_NO, NodeIdOrName = curNode.NODE_NAME });
-                        var list = Biz.Db.Ado.UseStoredProcedure().GetDataTable("SP_MES_GET_NODE_BATCH_COUNT", pars).AsEnumerable().ToList();
+                        SugarParameter[] pars = MainDB.Ado.GetParameters(new { BATCH = CurBatch.Batch.BATCH_NO, NodeIdOrName = curNode.NODE_NAME });
+                        var list = MainDB.Ado.UseStoredProcedure().GetDataTable("SP_MES_GET_NODE_BATCH_COUNT", pars).AsEnumerable().ToList();
                         if (!list.IsNullOrEmpty())
                         {
                             var batchCount = list.Where(q => q["ProdDate"].ToString() == "Whole").FirstOrDefault();
@@ -904,7 +904,7 @@
                             action.IsSuccessed = false;
                             //action.LocaleMsg = new($"鍑鸿揣鏁伴噺璁惧畾涓篬{0}]锛岀洰鍓嶅寘瑁呬簡[{1}]锛屽寘瑁呭熬鏁扮殑鏁伴噺蹇呴渶鏄痆{2}]锛岃瑁呭鏁伴噺鍚庡啀缁撴潫鍖呰");
                             action.LocaleMsg = new("MES.Transaction.PackingNode.NotMatchShipQty", shipQty, curQty, shipQty % ruleQty);
-                            return action;
+                            return SetOutPutMqttMsg(action);
                         }
 
                         NodeCmd = "PkgSubmit";
@@ -937,7 +937,7 @@
                 action.CatchExceptionWithLog(ex, $"鍖呰宸ュ簭锛氭墜鍔ㄧ粨鏉熷寘瑁呭紓甯�");
                 NodeCmd = null;
             }
-            return action;
+            return SetOutPutMqttMsg(action);
         }
 
         /// <summary>
@@ -951,8 +951,8 @@
             try
             {
                 var CurPkg = Context.ContainsKey("CurPackage") ? Context["CurPackage"] as WipPkg : null;
-                var LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
-                var label = CurPkg.Item.LABEL_CODE.IsNullOrEmpty() ? null : Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == CurPkg.Item.LABEL_CODE).IncludesAllFirstLayer().First();
+                var LabelPV = MainDB.Queryable<BAS_LABEL_PV>().ToList();
+                var label = CurPkg.Item.LABEL_CODE.IsNullOrEmpty() ? null : MainDB.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == CurPkg.Item.LABEL_CODE).IncludesAllFirstLayer().First();
                 var printLb =  SetLabelVariables(LabelPV, label, new PackingAction(), CurPkg);
                 action.Data = new PackingActionOutput()
                 {
diff --git a/Tiger.Business.MES/WorkAction/Assembly.cs b/Tiger.Business.MES/WorkAction/Assembly.cs
index e5b0ed7..7173fd3 100644
--- a/Tiger.Business.MES/WorkAction/Assembly.cs
+++ b/Tiger.Business.MES/WorkAction/Assembly.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -34,6 +35,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -41,7 +43,7 @@
             #endregion
 
             //鑾峰彇浜у搧BOM
-            Boms = Biz.Db.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
+            Boms = MainDB.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
             //鑾峰彇涓婃枡鐗╂枡
             var assyList = new List<AssemblySetting>();
             try
@@ -57,7 +59,7 @@
                 }
             }
             var codes = assyList.Select(q => q.ITEM_CODE).ToList();
-            var items = Biz.Db.Queryable<BAS_ITEM>().Where(q => codes.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
+            var items = MainDB.Queryable<BAS_ITEM>().Where(q => codes.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
             //鑾峰彇涓婃枡鐗╂枡鐨勬浛浠f枡
             foreach (var assy in assyList)
             {
@@ -74,7 +76,7 @@
 	                if (!bom.IsNullOrEmpty())
 	                {
 		                var subs = bom.SUB_CODE.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
-		                var surItems = Biz.Db.Queryable<BAS_ITEM>().Where(q => subs.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
+		                var surItems = MainDB.Queryable<BAS_ITEM>().Where(q => subs.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
                         foreach (var sub in surItems)
                         {
                             if (!item.SubItems.Any(q => q.ITEM_CODE == sub.ITEM_CODE))
diff --git a/Tiger.Business.MES/WorkAction/IPQC.cs b/Tiger.Business.MES/WorkAction/IPQC.cs
index 8e423ab..6034819 100644
--- a/Tiger.Business.MES/WorkAction/IPQC.cs
+++ b/Tiger.Business.MES/WorkAction/IPQC.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -32,6 +33,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
diff --git a/Tiger.Business.MES/WorkAction/PackageInputCheck.cs b/Tiger.Business.MES/WorkAction/PackageInputCheck.cs
index bb135d0..1d2cb52 100644
--- a/Tiger.Business.MES/WorkAction/PackageInputCheck.cs
+++ b/Tiger.Business.MES/WorkAction/PackageInputCheck.cs
@@ -17,6 +17,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -37,6 +38,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -44,7 +46,7 @@
             #endregion
 
             //鑾峰彇褰撳墠浜у搧鍦ㄥ綋鍓嶅鎴风殑鍏崇郴
-            CustInfo = Biz.Db.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
+            CustInfo = MainDB.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
 
             CurStep.Message = Biz.L("鎵弿鍘傚唴鏉$爜鎴栧鎴锋潯鐮�");
             CurStep.Status = StepStatus.Normal;
@@ -118,7 +120,7 @@
             }
             U9Cost = (DateTime.Now - begin).TotalSeconds;
 
-            FlowCSN = Biz.Db.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == wipSn.SN || q.CUST_SN == wipSn.SN).First();
+            FlowCSN = MainDB.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == wipSn.SN || q.CUST_SN == wipSn.SN).First();
             //鎵句笉鍒扮敓浜ц褰曪紝璁や负鎵弿閿欒
             if (FlowCSN.IsNullOrEmpty())
             {
diff --git a/Tiger.Business.MES/WorkAction/PackingAction.cs b/Tiger.Business.MES/WorkAction/PackingAction.cs
index 15fbec4..528c272 100644
--- a/Tiger.Business.MES/WorkAction/PackingAction.cs
+++ b/Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -18,6 +18,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -48,19 +49,20 @@
             CurPosition = position;
             NodeAct = nodeAct;
             Setting = setting;
+            MainDB = position.MainDB;
             #endregion
 
             //姝e父鏉$爜杩囩珯鎵ц鍖呰琛屼负
-            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == setting.PKG_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
+            PkgRule = MainDB.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>>() ?? 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();
+                var label = code.LABEL_CODE.IsNullOrEmpty() ? null : MainDB.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();
+            LabelPV = MainDB.Queryable<BAS_LABEL_PV>().ToList();
 
             //濡傛灉宸ュ簭涓婁笅鏂囦腑娌℃湁鍖呰璁板綍鍒欐柊寤轰竴涓紝鏈変笖鏈寘瑁呭畬鎴愬垯鑾峰彇褰撳墠鐨勫寘瑁呰褰�
             if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty() && !(CurPosition.Context["CurPackage"] as WipPkg).IsFinished)
@@ -76,7 +78,7 @@
                     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(),
+                    CustSN = MainDB.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == CurPosition.CurWipSNs.First().FLOW_SN).First(),
                     Item = new WipPkgItem()
                     {
                         PKG_CODE = max.PKG_CODE,
@@ -125,7 +127,7 @@
             //鑾峰彇鏄惁鍖呰瀹屽悗闇�瑕佺О閲�
             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();
+            PkgProd = MainDB.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("璁板綍鍖呰鏁版嵁"));
         }
@@ -141,6 +143,7 @@
             CurPosition = position;
             NodeAct = null;
             Setting = null;
+            MainDB = position.MainDB;
             #endregion
             //鑾峰彇褰撳墠鐨勫寘瑁呰褰�
             if (CurPosition.Context.ContainsKey("CurPackage") && !CurPosition.Context["CurPackage"].IsNullOrEmpty())
@@ -152,13 +155,13 @@
                 throw new Exception("鎵句笉鍒板寘瑁呮暟鎹紝璇烽噸鏂版壂鎻忛渶瑕佸寘瑁呯殑浜у搧");
             }
             //鎵嬪姩缁撴潫鍖呰涓撶敤锛屼复鏃舵墽琛岃涓�
-            PkgRule = Biz.Db.Queryable<BAS_PKG_RULE>().Where(q => q.RULE_CODE == CurPkg.RULE_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Details).First();
+            PkgRule = MainDB.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();
+            LabelPV = MainDB.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();
+            PkgProd = MainDB.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("璁板綍鍖呰鏁版嵁"));
@@ -566,7 +569,7 @@
                         IsFinished = true,
                     };
 
-                    CurPkgItem.Package = Biz.Db.Queryable<MES_WIP_PKG>().Where(q => q.SN == CurPkgItem.SN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
+                    CurPkgItem.Package = MainDB.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,
diff --git a/Tiger.Business.MES/WorkAction/PrintInStoreLabel.cs b/Tiger.Business.MES/WorkAction/PrintInStoreLabel.cs
index 2eb4b6d..2a79431 100644
--- a/Tiger.Business.MES/WorkAction/PrintInStoreLabel.cs
+++ b/Tiger.Business.MES/WorkAction/PrintInStoreLabel.cs
@@ -17,6 +17,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -37,14 +38,15 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
             Setting = setting;
             #endregion
 
-            Label = Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
-            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
+            Label = MainDB.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
+            LabelPV = MainDB.Queryable<BAS_LABEL_PV>().ToList();
 
             CurStep.Message = Biz.L("绛夊緟鏍囩鎵撳嵃");
             CurStep.Status = StepStatus.Normal;
diff --git a/Tiger.Business.MES/WorkAction/PrintLabel.cs b/Tiger.Business.MES/WorkAction/PrintLabel.cs
index ca49e4b..29a1b6b 100644
--- a/Tiger.Business.MES/WorkAction/PrintLabel.cs
+++ b/Tiger.Business.MES/WorkAction/PrintLabel.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -34,14 +35,15 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
             Setting = setting;
             #endregion
 
-            Label = Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
-            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
+            Label = MainDB.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
+            LabelPV = MainDB.Queryable<BAS_LABEL_PV>().ToList();
 
             CurStep.Message = Biz.L("绛夊緟鏍囩鎵撳嵃");
             CurStep.Status = StepStatus.Normal;
diff --git a/Tiger.Business.MES/WorkAction/ThreeInOne.cs b/Tiger.Business.MES/WorkAction/ThreeInOne.cs
index 1a77309..abcb818 100644
--- a/Tiger.Business.MES/WorkAction/ThreeInOne.cs
+++ b/Tiger.Business.MES/WorkAction/ThreeInOne.cs
@@ -17,6 +17,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -39,6 +40,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -46,11 +48,11 @@
             #endregion
 
             //鑾峰彇鎵撳嵃妯℃澘
-            Label = Biz.Db.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
-            LabelPV = Biz.Db.Queryable<BAS_LABEL_PV>().ToList();
+            Label = MainDB.Queryable<BAS_LABEL_TEMP>().Where(q => q.LABEL_CODE == setting.LABEL_CODE).IncludesAllFirstLayer().First();
+            LabelPV = MainDB.Queryable<BAS_LABEL_PV>().ToList();
 
             //鑾峰彇褰撳墠浜у搧鍦ㄥ綋鍓嶅鎴风殑鍏崇郴
-            CustInfo = Biz.Db.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
+            CustInfo = MainDB.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
 
             CurStep.Message = Biz.L("鎵弿鍘傚唴鏉$爜鎴栧鎴锋潯鐮�");
             CurStep.Status = StepStatus.Normal;
@@ -100,7 +102,7 @@
             }
 
             var wipSn = CurPosition.CurWipSNs.First();
-            FlowCSN = Biz.Db.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == wipSn.SN || q.CUST_SN == wipSn.SN).First();
+            FlowCSN = MainDB.Queryable<MES_CUST_SN>().Where(q => q.FLOW_SN == wipSn.SN || q.CUST_SN == wipSn.SN).First();
             //鎵句笉鍒扮敓浜ц褰曪紝璁や负鎵弿閿欒
             if (FlowCSN.IsNullOrEmpty())
             {
@@ -264,7 +266,7 @@
             var action = new ApiAction<SubmitOutput>(new SubmitOutput());
 
             //鏌ヨ鏄惁瀛樺湪宸插鍏ョ殑瀹㈡埛鏉$爜
-            CustCSN = Biz.Db.Queryable<MES_CUST_SN>().Where(q => q.CUST_SN == input.Data).First();
+            CustCSN = MainDB.Queryable<MES_CUST_SN>().Where(q => q.CUST_SN == input.Data).First();
 
             var isOK = true;
             //瀹㈡埛鏉$爜鎵埌鍘傚唴鏉$爜
diff --git a/Tiger.Business.MES/WorkAction/VerifyCustomSN.cs b/Tiger.Business.MES/WorkAction/VerifyCustomSN.cs
index 9c18553..cac915d 100644
--- a/Tiger.Business.MES/WorkAction/VerifyCustomSN.cs
+++ b/Tiger.Business.MES/WorkAction/VerifyCustomSN.cs
@@ -17,6 +17,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -34,6 +35,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -41,7 +43,7 @@
             #endregion
 
             //鑾峰彇褰撳墠浜у搧鍦ㄥ綋鍓嶅鎴风殑鍏崇郴
-            CustInfo = Biz.Db.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
+            CustInfo = MainDB.Queryable<BAS_ITEM_CUST>().Where(q => q.ITEM_ID == CurPosition.WorkBatch.WO.ItemInfo.ID && q.CUST_CODE == CurPosition.WorkBatch.WO.CUST_CODE).First();
 
             CurStep.SetStatusMessage(StepStatus.Normal, Biz.L("楠岃瘉鏄惁瀹㈡埛鏍囩"));
         }
diff --git a/Tiger.Business.MES/WorkAction/Weighing.cs b/Tiger.Business.MES/WorkAction/Weighing.cs
index 091f1a0..354b4bb 100644
--- a/Tiger.Business.MES/WorkAction/Weighing.cs
+++ b/Tiger.Business.MES/WorkAction/Weighing.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -33,13 +34,14 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
             Setting = setting;
             #endregion
 
-            CurPkg = Biz.Db.Queryable<MES_WIP_PKG>().Where(q => q.SN == CurPosition.CurSN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
+            CurPkg = MainDB.Queryable<MES_WIP_PKG>().Where(q => q.SN == CurPosition.CurSN && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).First() ?? new()
             {
                 AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
                 AUTH_PROD = CurPosition.CurLine.LINE_CODE,
diff --git a/Tiger.Business.MES/WorkAction/WipExtInfo.cs b/Tiger.Business.MES/WorkAction/WipExtInfo.cs
index 6f3aa22..238d3fe 100644
--- a/Tiger.Business.MES/WorkAction/WipExtInfo.cs
+++ b/Tiger.Business.MES/WorkAction/WipExtInfo.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -34,6 +35,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -42,9 +44,9 @@
 
             //鑾峰彇鎵╁睍瀛楁瀹氫箟
             var seq = Setting.ITEM_CODE.ToInt32();
-            ExtInfo = Biz.Db.Queryable<BAS_WIP_EXT>().Where(q => q.SEQ == seq).First();
+            ExtInfo = MainDB.Queryable<BAS_WIP_EXT>().Where(q => q.SEQ == seq).First();
             //鑾峰彇褰撳墠SN鐨勬墿灞曚俊鎭�
-            CurWipExt = Biz.Db.Queryable<MES_WIP_EXT>().Where(q => CurPosition.CurWipSNs.Any(w => w.SN == q.SN)).ToList();
+            CurWipExt = MainDB.Queryable<MES_WIP_EXT>().Where(q => CurPosition.CurWipSNs.Any(w => w.SN == q.SN)).ToList();
             foreach (var wipSN in CurPosition.CurWipSNs)
             {
                 if (!CurWipExt.Any(q => q.SN == wipSN.SN))
diff --git a/Tiger.Business.MES/WorkAction/YadaAssembly.cs b/Tiger.Business.MES/WorkAction/YadaAssembly.cs
index 3168265..e199743 100644
--- a/Tiger.Business.MES/WorkAction/YadaAssembly.cs
+++ b/Tiger.Business.MES/WorkAction/YadaAssembly.cs
@@ -17,6 +17,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -36,6 +37,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
@@ -43,7 +45,7 @@
             #endregion
 
             //鑾峰彇浜у搧BOM
-            Boms = Biz.Db.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
+            Boms = MainDB.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
             //鑾峰彇涓婃枡鐗╂枡
             var assyList = new List<AssemblySetting>();
             try
@@ -59,7 +61,7 @@
                 }
             }
             var codes = assyList.Select(q => q.ITEM_CODE).ToList();
-            var items = Biz.Db.Queryable<BAS_ITEM>().Where(q => codes.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
+            var items = MainDB.Queryable<BAS_ITEM>().Where(q => codes.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
             //鑾峰彇涓婃枡鐗╂枡鐨勬浛浠f枡
             foreach (var assy in assyList)
             {
@@ -76,7 +78,7 @@
 	                if (!bom.IsNullOrEmpty())
 	                {
 		                var subs = bom.SUB_CODE.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
-		                var surItems = Biz.Db.Queryable<BAS_ITEM>().Where(q => subs.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
+		                var surItems = MainDB.Queryable<BAS_ITEM>().Where(q => subs.Contains(q.ITEM_CODE) && q.AUTH_ORG == CurPosition.WorkBatch.WO.AUTH_ORG).ToList();
                         foreach (var sub in surItems)
                         {
                             if (!item.SubItems.Any(q => q.ITEM_CODE == sub.ITEM_CODE))
@@ -208,7 +210,7 @@
                     {
                         isOK = false;
                         //鍦ㄦ帹鑽愭壒娆℃墍灞炲伐鍗曠殑鏉$爜涓瓨鍦�
-                        if (Biz.Db.Queryable<BIZ_MES_WO_SN>().Any(q => suggest.Contains(q.WORK_ORDER) && (q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN)))
+                        if (MainDB.Queryable<BIZ_MES_WO_SN>().Any(q => suggest.Contains(q.WORK_ORDER) && (q.SN == input.SN || q.FLOW_SN == input.SN || q.TRAY_SN == input.SN)))
                         {
                             isOK = true;
                         }
diff --git a/Tiger.Business.MES/WorkAction/YadaWoReport.cs b/Tiger.Business.MES/WorkAction/YadaWoReport.cs
index 4e6da83..3dfb053 100644
--- a/Tiger.Business.MES/WorkAction/YadaWoReport.cs
+++ b/Tiger.Business.MES/WorkAction/YadaWoReport.cs
@@ -16,6 +16,7 @@
     {
         #region Propertys & Variables
         #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public DbClient MainDB { get; set; }
         public bool IsFinished { get; set; } = false;
         public IWorkStep CurStep { get; set; }
         public IPosition CurPosition { get; set; }
@@ -33,6 +34,7 @@
         public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
         {
             #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            MainDB = position.MainDB;
             CurStep = curStep;
             CurPosition = position;
             NodeAct = nodeAct;
diff --git a/Tiger.Business.MESTests/Tiger.Business.MESTests.csproj b/Tiger.Business.MESTests/Tiger.Business.MESTests.csproj
index 2d677c9..b2cf7a6 100644
--- a/Tiger.Business.MESTests/Tiger.Business.MESTests.csproj
+++ b/Tiger.Business.MESTests/Tiger.Business.MESTests.csproj
@@ -17,9 +17,9 @@
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-    <PackageReference Include="MSTest.TestAdapter" Version="3.6.0" />
-    <PackageReference Include="MSTest.TestFramework" Version="3.6.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="3.6.3" />
+    <PackageReference Include="MSTest.TestFramework" Version="3.6.3" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/Tiger.Dependencies/Tiger.Dependencies.csproj b/Tiger.Dependencies/Tiger.Dependencies.csproj
index 737c2f7..869b90a 100644
--- a/Tiger.Dependencies/Tiger.Dependencies.csproj
+++ b/Tiger.Dependencies/Tiger.Dependencies.csproj
@@ -17,7 +17,7 @@
     <PackageReference Include="MailKit" Version="4.8.0" />
     <PackageReference Include="NLog" Version="5.3.4" />
     <PackageReference Include="NLog.Database" Version="5.3.4" />
-    <PackageReference Include="Rhea.Common" Version="6.1.7.1360" />
+    <PackageReference Include="Rhea.Common" Version="6.1.7.1361" />
     <PackageReference Include="SharpZipLib" Version="1.4.2" />
     <PackageReference Include="Sundial" Version="2.64.0" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="7.1.0" />
diff --git a/Tiger.IBusiness.MES/Transaction/IPosition.cs b/Tiger.IBusiness.MES/Transaction/IPosition.cs
index c90e1d9..75bc542 100644
--- a/Tiger.IBusiness.MES/Transaction/IPosition.cs
+++ b/Tiger.IBusiness.MES/Transaction/IPosition.cs
@@ -12,6 +12,7 @@
     public interface IPosition : IMESTransaction
     {
         #region Propertys & Variables
+        public DbClient MainDB { get; }
         public string UserCode { get; set; }
         public string PostCode { get; set; }
         public MES_FACTORY CurFactory { get; set; }
diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
index 0ec700f..d74c353 100644
--- a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
+++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
@@ -62,10 +62,6 @@
         /// </summary>
         public bool IsFinished { get; set; } = false;
         /// <summary>
-        /// 鐭秷鎭�
-        /// </summary>
-        public ShortMessage ShortMsg { get; set; }
-        /// <summary>
         /// 褰撳墠鎿嶄綔鐨勮妭鐐瑰悕绉�
         /// </summary>
         public string NodeName { get; set; }
@@ -82,6 +78,14 @@
         /// </summary>
         public string NextStepID { get; set; }
         /// <summary>
+        /// 鐭秷鎭�
+        /// </summary>
+        public ShortMessage ShortMsg { get; set; }
+        /// <summary>
+        /// Mqtt娑堟伅
+        /// </summary>
+        public MQTT.Message MqttMsg { get; set; }
+        /// <summary>
         /// 褰撳墠鎿嶄綔杩斿洖鐨勬暟鎹�
         /// </summary>
         public object Data { get; set; }
diff --git a/Tiger.Model.Net/Entitys/MQTTEntity.cs b/Tiger.Model.Net/Entitys/MQTTEntity.cs
new file mode 100644
index 0000000..41b82cf
--- /dev/null
+++ b/Tiger.Model.Net/Entitys/MQTTEntity.cs
@@ -0,0 +1,60 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Text;
+
+namespace Tiger.Model
+{
+    public class MQTT
+    {
+        public class Message
+        {
+            public Message()
+            {
+
+            }
+
+            public Message(bool isSuccessed, Voice voice, string content, string color)
+            {
+                IsSuccessed = isSuccessed;
+                Voice = voice;
+                Content = content;
+                Color = color;
+            }
+
+            /// <summary>
+            /// 鏄惁鎴愬姛
+            /// </summary>
+            public bool IsSuccessed { get; set; }
+
+            /// <summary>
+            /// 鏄惁鍙戝0
+            /// </summary>
+            public Voice Voice { get; set; }
+
+            /// <summary>
+            /// 娑堟伅
+            /// </summary>
+            public string Content { get; set; }
+
+            /// <summary>
+            /// 棰滆壊
+            /// </summary>
+            public string Color { get; set; }
+        }
+
+        public enum Voice
+        {
+            [Description("涓嶅彂闊�")]
+            Silent,
+            [Description("鎴愬姛")]
+            Success,
+            [Description("閫氳繃")]
+            Pass,
+            [Description("澶辫触")]
+            Fail,
+            [Description("璀﹀憡")]
+            Warning,
+        }
+    }
+}
diff --git a/Tiger.Model.Net/Tiger.Model.Net.csproj b/Tiger.Model.Net/Tiger.Model.Net.csproj
index 306d65b..39d5e4e 100644
--- a/Tiger.Model.Net/Tiger.Model.Net.csproj
+++ b/Tiger.Model.Net/Tiger.Model.Net.csproj
@@ -61,8 +61,8 @@
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="SqlSugar, Version=5.1.4.168, Culture=neutral, processorArchitecture=MSIL">
-      <HintPath>..\packages\SqlSugar.5.1.4.169\lib\SqlSugar.dll</HintPath>
+    <Reference Include="SqlSugar, Version=5.1.4.170, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\SqlSugar.5.1.4.171-preview11\lib\SqlSugar.dll</HintPath>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
@@ -77,6 +77,7 @@
   <ItemGroup>
     <Compile Include="Base\DbEntityBase.cs" />
     <Compile Include="DTO\MESDTO.cs" />
+    <Compile Include="Entitys\MQTTEntity.cs" />
     <Compile Include="Entitys\Api\Base.cs" />
     <Compile Include="Entitys\Automate\SNInfo.cs" />
     <Compile Include="Entitys\Automate\Vechicle.cs" />
diff --git a/Tiger.Model.Net/packages.config b/Tiger.Model.Net/packages.config
index 4b69700..37ba543 100644
--- a/Tiger.Model.Net/packages.config
+++ b/Tiger.Model.Net/packages.config
@@ -1,5 +1,5 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="Newtonsoft.Json" version="13.0.3" targetFramework="net452" />
-  <package id="SqlSugar" version="5.1.4.169" targetFramework="net48" />
+  <package id="SqlSugar" version="5.1.4.171-preview11" targetFramework="net48" />
 </packages>
\ No newline at end of file

--
Gitblit v1.9.3