From 090e455687745bc64c8e32baf480d9310f8e2a57 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期二, 24 九月 2024 23:21:18 +0800
Subject: [PATCH] MES 一处Tiger.IBusiness

---
 Tiger.IBusiness.MES/WorkAction/IPackageInputCheck.cs |    0 
 Tiger.IBusiness.MES/WorkAction/IPackingAction.cs     |    0 
 Tiger.IBusiness.MES/WorkAction/IIPQC.cs              |    0 
 Tiger.Business.MES/Transaction/CollectNode.cs        |    2 
 Tiger.IBusiness.MES/Transaction/ILoadingMaterial.cs  |    0 
 Tiger.Business.MES/Transaction/PackingNode.cs        |    2 
 Tiger.Api.sln                                        |   11 
 Tiger.IBusiness.MES/LabelTemplate/ILabelTemplate.cs  |    0 
 Tiger.IBusiness.MES/BIZ/IBasRule.cs                  |    0 
 Tiger.IBusiness.MES/Transaction/IPackingNode.cs      |    0 
 Tiger.IBusiness.MES/BIZ/IMES_WORKSHOP.cs             |    0 
 Tiger.IBusiness.MES/WorkAction/IAssembly.cs          |    0 
 Tiger.IBusiness.MES/WorkAction/IWeighing.cs          |    0 
 Tiger.IBusiness.MES/Common/IDoUnPack.cs              |    0 
 Tiger.IBusiness.MES/Transaction/ICollectNode.cs      |    0 
 Tiger.IBusiness.MES/BIZ/IMES_WO.cs                   |    0 
 Tiger.IBusiness.MES/IMESContext.cs                   |    0 
 Tiger.Api/Tiger.Api.csproj                           |    1 
 Tiger.Business.MES/Common/WorkBatch.cs               |  508 ++++++++++++++++++++++++++++++++++++
 Tiger.IBusiness.MES/Transaction/ITestNode.cs         |    0 
 Tiger.Business.MES/Common/WorkStep.cs                |  143 ++++++++++
 Tiger.IBusiness.MES/Common/ICodeVerification.cs      |    0 
 Tiger.IBusiness.MES/WorkAction/IWipExtInfo.cs        |    0 
 Tiger.IBusiness.MES/IWorkStep.cs                     |    0 
 Tiger.Business.MES/Tiger.Business.MES.csproj         |    1 
 Tiger.IBusiness.MES/Extensions/ModelExtension.cs     |    0 
 Tiger.IBusiness.MES/Transaction/IPosition.cs         |    0 
 Tiger.Business.MES/Common/WoContext.cs               |    2 
 Tiger.Business.MES/Transaction/TestNode.cs           |    2 
 Tiger.IBusiness.MES/iERP/IU9C_MES.cs                 |    0 
 Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj       |   13 
 /dev/null                                            |  146 ----------
 Tiger.IBusiness.MES/Transaction/IMESTransaction.cs   |    0 
 Tiger.IBusiness.MES/WorkAction/IPrintLabel.cs        |    0 
 Tiger.IBusiness.MES/WorkAction/IThreeInOne.cs        |    0 
 Tiger.IBusiness.MES/WorkAction/IWorkAction.cs        |    0 
 Tiger.IBusiness.MES/WorkAction/IVerifyCustomSN.cs    |    0 
 Tiger.IBusiness.MES/WorkAction/IYadaAssembly.cs      |    0 
 Tiger.IBusiness.MES/SMT/ISmtTool.cs                  |    0 
 39 files changed, 681 insertions(+), 150 deletions(-)

diff --git a/Tiger.Api.sln b/Tiger.Api.sln
index 2a21ce2..c7b3b6f 100644
--- a/Tiger.Api.sln
+++ b/Tiger.Api.sln
@@ -40,6 +40,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.Controllers.MES", "Tiger.Controllers.MES\Tiger.Controllers.MES.csproj", "{016ABAEC-75DE-4553-B828-AA45C237B485}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tiger.IBusiness.MES", "Tiger.IBusiness.MES\Tiger.IBusiness.MES.csproj", "{07B13ED4-77D9-4B9C-9375-91B7ED371422}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -136,6 +138,14 @@
 		{016ABAEC-75DE-4553-B828-AA45C237B485}.Release|Any CPU.Build.0 = Release|Any CPU
 		{016ABAEC-75DE-4553-B828-AA45C237B485}.Release|x86.ActiveCfg = Release|Any CPU
 		{016ABAEC-75DE-4553-B828-AA45C237B485}.Release|x86.Build.0 = Release|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Debug|x86.Build.0 = Debug|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Release|Any CPU.Build.0 = Release|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Release|x86.ActiveCfg = Release|Any CPU
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -153,6 +163,7 @@
 		{457563B5-E42C-448A-A924-FBEE9B585A81} = {FF44BF62-08C5-4B52-B24F-54CD79E96848}
 		{0B65AB5A-2D97-4292-8210-8E0D0BD227BB} = {457563B5-E42C-448A-A924-FBEE9B585A81}
 		{016ABAEC-75DE-4553-B828-AA45C237B485} = {457563B5-E42C-448A-A924-FBEE9B585A81}
+		{07B13ED4-77D9-4B9C-9375-91B7ED371422} = {A994D516-643A-4543-B781-540E81F1DE55}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {797A1D83-9F3C-4AEC-8A83-E3468102DBD1}
diff --git a/Tiger.Api/Tiger.Api.csproj b/Tiger.Api/Tiger.Api.csproj
index 4688c44..2b363fc 100644
--- a/Tiger.Api/Tiger.Api.csproj
+++ b/Tiger.Api/Tiger.Api.csproj
@@ -90,6 +90,7 @@
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\Tiger.IBusiness.MES\Tiger.IBusiness.MES.csproj" />
     <ProjectReference Include="..\Tiger.IBusiness.WMS\Tiger.IBusiness.WMS.csproj" />
     <ProjectReference Include="..\Tiger.IBusiness\Tiger.IBusiness.csproj" />
   </ItemGroup>
diff --git a/Tiger.Business/MES/WoContext.cs b/Tiger.Business.MES/Common/WoContext.cs
similarity index 99%
rename from Tiger.Business/MES/WoContext.cs
rename to Tiger.Business.MES/Common/WoContext.cs
index 6829945..c8868dc 100644
--- a/Tiger.Business/MES/WoContext.cs
+++ b/Tiger.Business.MES/Common/WoContext.cs
@@ -12,7 +12,7 @@
 using Tiger.Model.Entitys.MES.Position;
 using static Tiger.Business.Biz;
 
-namespace Tiger.Business.MES
+namespace Tiger.Business
 {
     /// <summary>
     /// 宸ュ崟 涓婁笅鏂�
diff --git a/Tiger.Business.MES/Common/WorkBatch.cs b/Tiger.Business.MES/Common/WorkBatch.cs
new file mode 100644
index 0000000..a18e11a
--- /dev/null
+++ b/Tiger.Business.MES/Common/WorkBatch.cs
@@ -0,0 +1,508 @@
+锘縰sing Tiger.Model;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+using Rhea.Common;
+using System.Linq;
+using Tiger.IBusiness;
+using Tiger.Model.Entitys.MES.Position;
+using Tiger.Business.MES;
+
+namespace Tiger.Business
+{
+    /// <summary>
+    /// 鐢熶骇涓殑宸ュ崟鎵规
+    /// </summary>
+    public partial class WorkBatch : IWorkBatch, IDisposable
+    {
+        public WorkBatch(string order)
+        {
+            OrderNo = order;
+        }
+        #region Propertys & Variables
+        public string OrderNo { get; set; }
+        public string LineCode { get; set; }
+        public BIZ_MES_WO WO { get; set; }
+        public BAS_ITEM Product { get; set; }
+        public BIZ_MES_WO_BATCH Batch { get; set; }
+        public BAS_CUSTOMER Customer { get; set; }
+        public List<BIZ_MES_WO_SN> WoSNs { get; set; }
+        public List<MES_WO_EDGE> Edges { get; set; }
+        public List<MES_WO_NODE> Nodes { get; set; }
+        public List<MES_WO_OPER> NodeSets { get; set; }
+        public List<MES_WO_NODE_ACT> NodeActs { get; set; }
+        public List<MES_WO_ACTION> ActionSets { get; set; }
+        public List<MES_WO_NODE_POST> NodePosts { get; set; }
+        public List<MES_WO_NODE_DFTG> NodeDftgs { get; set; }
+        public List<BAS_DEFECT_GRP> DefectGroups { get; set; }
+        public List<BAS_DEFECT> Defects => DefectGroups.SelectMany(q => q.Defects).ToList();
+        /// <summary>
+        /// 浜嬪姟閿�
+        /// </summary>
+        public object TransLock { get; }
+        #endregion
+
+        #region Functions
+        /// <summary>
+        /// 鍒濆鍖栧伐鍗曡祫鏂�
+        /// </summary>
+        /// <returns></returns>
+        public WorkBatch Init(string lineCode)
+        {
+            LineCode = lineCode;
+            GetBatchInfo();
+            return this;
+        }
+
+        public void Update()
+        {
+            if (!WoContext.WoBatchDic.ContainsKey(Batch.BATCH_NO))
+            {
+                GetBatchInfo();
+                WoContext.WoBatchDic.Add(Batch.BATCH_NO, this);
+            }
+        }
+
+        private void GetBatchInfo()
+        {
+            WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
+            Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).IncludesAllFirstLayer().First();
+            Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode &&
+                                (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
+            Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();
+            WoSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            Edges = Biz.Db.Queryable<MES_WO_EDGE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
+            NodeSets = Biz.Db.Queryable<MES_WO_OPER>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            NodeActs = Biz.Db.Queryable<MES_WO_NODE_ACT>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
+            ActionSets = Biz.Db.Queryable<MES_WO_ACTION>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            NodePosts = Biz.Db.Queryable<MES_WO_NODE_POST>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            NodeDftgs = Biz.Db.Queryable<MES_WO_NODE_DFTG>().Where(q => q.WORK_ORDER == OrderNo).ToList();
+            DefectGroups = Biz.Db.Queryable<BAS_DEFECT_GRP>().IncludesAllFirstLayer().ToList();
+
+            //宸ュ簭鑺傜偣鎺掑簭
+            var first = Nodes.First(q => q.IS_FIRST_NODE == "Y");
+            first.Sequence = 1;
+            NodeSorting(first);
+        }
+
+        /// <summary>
+        /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃
+        /// </summary>
+        /// <param name="parent"></param>
+        private void NodeSorting(MES_WO_NODE parent)
+        {
+            var edges = Edges.Where(q => q.SRC_NODE == parent.ID && Nodes.Any(a => a.ID == q.TGT_NODE)).ToList();
+            foreach (var edge in edges)
+            {
+                var next = Nodes.First(q => q.ID == edge.TGT_NODE);
+                //鎺掗櫎缁翠慨宸ュ簭
+                if (next.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                {
+                    next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1);
+                    //濡傛灉鐖惰妭鐐瑰惎鐢ㄤ笖涓嶅彲璺崇珯锛屽垯娣诲姞涓轰笅涓�涓伐搴忕殑鍓嶇疆宸ュ簭
+                    var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == parent.ID);
+                    if (!setting.IsNullOrEmpty() && setting.IS_ACTIVE == "Y" && setting.CAN_SKIP != "Y")
+                    {
+                        next.PrepNodeIDs.Add(parent.ID);
+                    }
+                    //缁ф壙鐖剁粨鐐圭殑鍓嶇疆宸ュ簭
+                    next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
+                    next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
+                    NodeSorting(next);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 妫�鏌ュ伐鍗曞湪褰撳墠宸ュ簭鑺傜偣鏄惁鍙互鐢熶骇
+        /// </summary>
+        /// <param name="curNode"></param>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput(), true);
+
+            WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
+            Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode).First();
+            //宸ュ崟鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
+            if (Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
+            {
+                action.IsSuccessed = false;
+                action.Data.SetValue(this, null);
+                //action.LocaleMsg = new($"宸ュ崟鎵规[{Batch.BATCH_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
+                action.LocaleMsg = new("MES.WorkBatch.WoBatchStatusCanNotWork", Batch.BATCH_NO, Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName());
+            }
+            //宸ュ崟鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
+            if (WO.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && WO.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue())
+            {
+                action.IsSuccessed = false;
+                action.Data.SetValue(this, null);
+                //action.LocaleMsg = new($"宸ュ崟[{WO.ORDER_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
+                action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
+            }
+            //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
+            //if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+            if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
+            {
+                action.IsSuccessed = false;
+                action.Data.SetValue(this, null);
+                //action.LocaleMsg = new($"宸ュ崟鎵规[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
+                action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), Batch.SCRAP_QTY, Batch.PLAN_QTY);
+            }
+            //宸ュ崟鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
+            if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY)
+            {
+                action.IsSuccessed = false;
+                action.Data.SetValue(this, null);
+                //action.LocaleMsg = new($"宸ュ崟[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
+                action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WO.SCRAP_QTY, WO.PLAN_QTY);
+            }
+
+            return action;
+        }
+
+        /// <summary>
+        /// 宸ュ崟寮�宸�
+        /// </summary>
+        /// <param name="user"></param>
+        /// <returns></returns>
+        public bool StartWorking(string user)
+        {
+            if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue())
+            {
+                WO.STATUS = BIZ_MES_WO.STATUSs.Working.GetValue();
+                WO.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
+                Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Working.GetValue();
+                Batch.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
+                //淇濆瓨鏁版嵁搴�
+                var db = Biz.Db;
+                var dbTran = db.UseTran(() =>
+                {
+                    db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
+                    db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
+                });
+                if (!dbTran.IsSuccess)
+                {
+                    //throw dbTran.ErrorException;
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 宸ュ崟鏆傚仠
+        /// </summary>
+        /// <param name="user"></param>
+        /// <returns></returns>
+        public bool PausedWorking(string user)
+        {
+            if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
+            {
+                WO.STATUS = BIZ_MES_WO.STATUSs.Paused.GetValue();
+                Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue();
+                //淇濆瓨鏁版嵁搴�
+                var db = Biz.Db;
+                var dbTran = db.UseTran(() =>
+                {
+                    db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                    db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
+                });
+                if (!dbTran.IsSuccess)
+                {
+                    //throw dbTran.ErrorException;
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 鏍规嵁宀椾綅缂栫爜鍒ゆ柇鏄笉鏄绔�
+        /// </summary>
+        /// <param name="postCode"></param>
+        /// <returns></returns>
+        public bool IsFirstNode(string postCode)
+        {
+            return Nodes.Any(q => q.IS_FIRST_NODE == "Y" && NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
+        }
+
+        /// <summary>
+        /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭鑺傜偣
+        /// </summary>
+        /// <param name="postCode"></param>
+        /// <returns></returns>
+        public MES_WO_NODE GetNode(string postCode)
+        {
+            return Nodes.FirstOrDefault(q => NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
+        }
+
+        /// <summary>
+        /// 鏍规嵁浼犲叆鐨勬潯鐮佽繃绔欎俊鎭拰涓嬩竴绔欑殑鐩爣宸ュ簭锛屽垽鏂潯鐮佹槸鍚﹁兘杩涘叆涓嬩竴绔�
+        /// </summary>
+        /// <param name="input">鏈鎻愪氦鐨勬暟鎹�</param>
+        /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param>
+        /// <param name="nextNode">瑕佽繘鍏ョ殑鐩爣宸ュ簭</param>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> CanGotoNext(SubmitInput input, MES_WIP_DATA wipSN, MES_WO_NODE nextNode)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
+            if (wipSN.NODE_ID.IsNullOrEmpty())
+            {
+                if (nextNode.IS_FIRST_NODE == "Y")
+                {
+                    action.IsSuccessed = true;
+                    return action;
+                }
+                else
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
+                    action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                    return action;
+                }
+            }
+            //鏉$爜宸叉湁杩囩珯璁板綍
+            else
+            {
+                var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
+                var curSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID);
+                var nextSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == nextNode.ID);
+                //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁杩炵嚎鍒扮淮淇伐搴忥紝鍒欏厑璁歌繘鍏ョ淮淇伐搴�
+                if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue()
+                    && wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue())
+                    && Edges.Any(q => q.SRC_NODE == curNode.ID && q.TGT_NODE == nextNode.ID))
+                {
+                    action.IsSuccessed = true;
+                    return action;
+                }
+                //缁翠慨鍥炴祦锛氬鏋滄潯鐮佺殑褰撳墠宸ュ簭鏄淮淇伐搴忥紝鍒欒涓烘槸缁翠慨鍥炴祦
+                else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                {
+                    //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
+                    var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID)
+                                                                && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList();
+
+                    //鍙洖娴佺殑宸ュ簭鍖呭惈鐩爣宸ュ簭涓旀潯鐮佸湪缁翠慨绔欓�夋嫨鐨勫洖娴佸伐搴忎负绌烘垨鑰呯瓑浜庣洰鏍囧伐搴忥紝鍒欏厑璁歌繘绔�
+                    if (reflowNodes.Any(q => q.ID == nextNode.ID) && (wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == nextNode.NODE_NAME))
+                    {
+                        action.IsSuccessed = true;
+                        return action;
+                    }
+                    else
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.SetValue(this, null);
+                        var nextList = reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME);
+                        action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, input.SN, curNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                        return action;
+                    }
+                }
+                //涓嶈壇鍝佸叆绔欙細濡傛灉浜у搧鏈変笉鑹褰曚笖鐩爣宸ュ簭涓嶆槸缁翠慨宸ュ簭涓斾笉鍏佽涓嶈壇鍝佸叆绔欙紝鍒欐姤閿�
+                else if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue())
+                     && nextSetting.ALLOW_DFT_IN != "Y" && nextNode.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                {
+                    action.IsSuccessed = false;
+                    action.Data.SetValue(this, null);
+                    action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, input.SN);
+                    return action;
+                }
+                //姝e父宸ュ簭杩囩珯
+                else
+                {
+                    //娣诲姞鏉$爜褰撳墠宸ュ簭鐨勪笅涓�涓彲鎵ц宸ュ簭
+                    var nextNodes = GetNextNodes(curNode, wipSN);
+                    //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
+                    if (nextNodes.Any(q => q.ID == nextNode.ID))
+                    {
+                        action.IsSuccessed = true;
+                        return action;
+                    }
+
+                    //濡傛灉褰撳墠宸ュ簭鏈夊繀椤绘墽琛岀殑鍚庣画宸ュ簭锛屽垯鎶ラ敊
+                    if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
+                    {
+                        action.IsSuccessed = false;
+                        action.Data.SetValue(this, null);
+                        var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y"));
+                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                        return action;
+                    }
+                    //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏皾璇曟墽琛�
+                    else
+                    {
+                        //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
+                        var prepIDs = curNode.PrepNodeIDs.Where(id =>
+                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
+                                                             ).ToList();
+                        foreach (var prepID in prepIDs)
+                        {
+                            //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
+                            var prep = Nodes.First(q => q.ID == prepID);
+                            var next = GetNextNodes(prep, wipSN);
+                            nextNodes.AddRange(next);
+                        }
+
+                        //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
+                        if (nextNodes.Any(q => q.ID == nextNode.ID))
+                        {
+                            action.IsSuccessed = true;
+                            return action;
+                        }
+                        else
+                        {
+                            action.IsSuccessed = false;
+                            action.Data.SetValue(this, null);
+                            var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y"));
+                            action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
+                            return action;
+                        }
+                    }
+                }
+            }
+
+            return action;
+        }
+
+        /// <summary>
+        /// 娣诲姞鑺傜偣鐨勪笅涓�涓彲鎵ц鑺傜偣
+        /// </summary>
+        /// <param name="parent"></param>
+        /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param>
+        private List<MES_WO_NODE> GetNextNodes(MES_WO_NODE parent, MES_WIP_DATA wipSN)
+        {
+            var result = new List<MES_WO_NODE>();
+            var nextNodes = Nodes.Where(q => q.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue()
+                                                                && Edges.Any(e => e.SRC_NODE == parent.ID && e.TGT_NODE == q.ID)
+                                                                && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == q.ID && h.IsFinished)
+                                                             ).ToList();
+            //灏濊瘯灏嗗綋鍓嶅伐搴忕殑鍚庣画宸ュ簭娣诲姞鍒板彲浠ユ墽琛岀殑宸ュ簭鍒楄〃
+            foreach (var next in nextNodes)
+            {
+                //鏌ユ壘鏈夋病鏈夊墠缃伐搴忔壘涓嶅埌宸茶壇鍝佽繃绔欑殑鍘嗗彶璁板綍锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛�
+                if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
+                {
+                    var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == next.ID);
+                    //鍚庣画宸ュ簭鏄惎鐢ㄧ殑锛屽垯娣诲姞
+                    if (!result.Any(q => q.ID == next.ID) && setting.IS_ACTIVE == "Y")
+                    {
+                        result.Add(next);
+                    }
+                    //鍚庣画宸ュ簭鏄笉鍚敤鎴栬�呭彲璺崇珯锛屽垯缁х画娣诲姞鍏跺悗缁伐搴�
+                    if (!setting.IsNullOrEmpty() && (setting.IS_ACTIVE != "Y" || setting.CAN_SKIP == "Y"))
+                    {
+                        result.AddRange(GetNextNodes(next, wipSN));
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鏍规嵁浼犲叆鐨勬潯鐮佽繑鍥炰笅涓�绔欏彲杩涘叆杩涘叆鐨勭洰鏍囧伐搴�
+        /// </summary>
+        /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曞拰鐢熶骇涓嶈壇璁板綍淇℃伅</param>
+        /// <returns></returns>
+        public List<MES_WO_NODE> GetNextNodes(MES_WIP_DATA wipSN)
+        {
+            var result = new List<MES_WO_NODE>();
+
+            //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
+            if (wipSN.NODE_ID.IsNullOrEmpty())
+            {
+                result.AddRange(Nodes.Where(q => q.IS_FIRST_NODE == "Y"));
+            }
+            //鏉$爜宸叉湁杩囩珯璁板綍
+            else
+            {
+                var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
+                //鏉$爜鍦ㄧ淮淇伐搴忥紝杩斿洖鍙洖娴佸伐搴�
+                if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
+                {
+                    //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
+                    var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID)
+                                                                && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList();
+                    result.AddRange(reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME));
+                }
+                else
+                {
+                    //寰�涓嬫煡鎵炬潯鐮佸綋鍓嶅伐搴忕殑涓嬩竴涓彲鎵ц宸ュ簭
+                    var nextNodes = GetNextNodes(curNode, wipSN);
+                    //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏皾璇曞湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏姞鍏�
+                    if (!nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
+                    {
+                        //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
+                        var prepIDs = curNode.PrepNodeIDs.Where(id =>
+                                                             Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
+                                                             ).ToList();
+                        foreach (var prepID in prepIDs)
+                        {
+                            //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
+                            var prep = Nodes.First(q => q.ID == prepID);
+                            var next = GetNextNodes(prep, wipSN);
+                            nextNodes.AddRange(next);
+                        }
+                    }
+                    result.AddRange(nextNodes);
+                    //濡傛灉褰撳墠鏉$爜鏄笉鑹垯鍙繑鍥炲厑璁镐笉鑹繘绔欑殑宸ュ簭鍜屽伐搴忚繛鎺ョ殑缁翠慨宸ュ簭
+                    if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()))
+                    {
+                        result.RemoveAll(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.ALLOW_DFT_IN != "Y"));
+                        //鍔犲叆宸ュ簭杩炴帴鐨勭淮淇伐搴�
+                        var repairNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID) && q.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue());
+                        result.AddRange(repairNodes);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭涓嶈壇浠g爜
+        /// </summary>
+        /// <param name="postCode"></param>
+        /// <returns></returns>
+        public List<DefectOutput> GetNodeDefects(string postCode)
+        {
+            var result = new List<DefectOutput>();
+            var groups = DefectGroups.Where((b, s) => NodeDftgs.Any(d => d.NODE_ID == GetNode(postCode).ID && d.DFTG_CODE == b.DFTG_CODE)).ToList();
+            foreach (var group in groups)
+            {
+                result.AddRange(group.Defects.Select(q => new DefectOutput
+                {
+                    DFTG_CODE = q.DFTG_CODE,
+                    DFTG_NAME = group.DFTG_NAME,
+                    DFT_CODE = q.DFT_CODE,
+                    DFT_NAME = q.DFT_NAME,
+                    DFT_LEVEL = q.DFT_LEVEL,
+                }));
+            }
+            return result;
+        }
+
+        #endregion
+
+        /// <summary>
+        /// 鍏抽棴宸ュ崟
+        /// </summary>
+        /// <returns></returns>
+        public bool Close()
+        {
+            Dispose();
+            return true;
+        }
+        public virtual void Dispose()
+        {
+            WoContext.WoBatchDic.Remove(OrderNo);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Tiger.Business.MES/Common/WorkStep.cs b/Tiger.Business.MES/Common/WorkStep.cs
new file mode 100644
index 0000000..581fbd3
--- /dev/null
+++ b/Tiger.Business.MES/Common/WorkStep.cs
@@ -0,0 +1,143 @@
+锘縰sing Tiger.Model;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+using Rhea.Common;
+using System.Net;
+using System.Linq;
+using Newtonsoft.Json;
+using Tiger.IBusiness;
+using Tiger.Model.Entitys.MES.Position;
+
+namespace Tiger.Business
+{
+    /// <summary>
+    /// 宸ユ
+    /// </summary>
+    public partial class WorkStep : IWorkStep
+    {
+        public WorkStep(IWorkStep.NodeTypes type, IPosition position)
+        {
+            NodeType = type;
+            CurPosition = position;
+        }
+
+        #region Propertys & Variables
+        public string ID { get; set; } = Guid.NewGuid().ToString("N");
+        public string Name { get; set; }
+        public IWorkStep.NodeTypes NodeType { get; set; }
+        public MES_WO_NODE Node { get; set; }
+        public MES_WO_OPER OperSetting { get; set; }
+        public MES_WO_NODE_ACT NodeAct { get; set; }
+        public MES_WO_ACTION ActSetting { get; set; }
+        public IPosition CurPosition { get; set; }
+        public IWorkAction CurAction { get; set; }
+        public int Sequence { get; set; }
+        public List<string> PrepNodeIDs { get; set; } = new();
+        public string NodeID => NodeType == IWorkStep.NodeTypes.Action ? NodeAct.ID : Node.ID;
+        private bool _IsFinished = false;
+        public bool IsFinished
+        {
+            get => NodeType == IWorkStep.NodeTypes.Action ? CurAction.IsFinished : _IsFinished;
+            set { _IsFinished = value; }
+        }
+        public StepStatus Status { get; set; } = StepStatus.Normal;
+        //public bool IsFinished => Status == StepStatus.Finished;
+        private Locale _Message;
+        public Locale Message
+        {
+            get => _Message;
+            set { _MsgHistory.Add(_Message = value); }
+        }
+        private List<Locale> _MsgHistory = new();
+        public List<Locale> MsgHistory => _MsgHistory;
+        public Action DBSubmitAction { get; set; } = () => { };
+        #endregion
+
+        #region Functions
+        /// <summary>
+        /// 鍒濆鍖栧伐姝�
+        /// </summary>
+        /// <returns></returns>
+        public void Init()
+        {
+            CurAction = DI.Resolve(NodeAct.Definition.SERVICE_TYPE) as IWorkAction;
+            //CurAction = DI.Resolve("Tiger.IBusiness.IPrintLabel,Tiger.IBusiness") as IWorkAction;
+            CurAction.Init(this, CurPosition, NodeAct, ActSetting);
+        }
+
+        /// <summary>
+        /// 灏濊瘯寮�濮嬫墽琛屽伐姝�
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> TryBegin(SubmitInput input)
+        {
+            return CurAction.TryBegin(input);
+        }
+
+        /// <summary>
+        /// 鑾峰彇琛屼负寮�濮嬬殑鎻愮ず淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Locale GetBeginMsg()
+        {
+            return CurAction.GetBeginMsg();
+        }
+
+        /// <summary>
+        /// 宸ユ鎻愪氦鏁版嵁
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> Submit(SubmitInput input)
+        {
+            return CurAction.Submit(input);
+        }
+
+        /// <summary>
+        /// 缁撴潫宸ユ鎵ц
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> End(SubmitInput input)
+        {
+            return CurAction.End(input);
+        }
+
+        /// <summary>
+        /// 璁剧疆宸ユ鐘舵�佸拰娑堟伅
+        /// </summary>
+        /// <returns></returns>
+        public void SetStatusMessage(StepStatus status, Locale msg)
+        {
+            Message = msg;
+            Status = status;
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠宸ユ鐨勪俊鎭�
+        /// </summary>
+        /// <returns></returns>
+        public WorkStepInfo GetInfo(string locale)
+        {
+            return new WorkStepInfo()
+            {
+                ID = ID,
+                Name = Name,
+                Sequence = Sequence,
+                NodeID = NodeID,
+                NodeType = NodeType.ToString(),
+                Node = Node,
+                OperSetting = OperSetting,
+                NodeAct = NodeAct,
+                ActSetting = ActSetting,
+                Status = Status.ToString(),
+                Message = Message.IsNullOrEmpty() ? "" : Biz.T(Message, locale),
+            };
+        }
+        #endregion
+
+    }
+}
\ No newline at end of file
diff --git a/Tiger.Business.MES/Tiger.Business.MES.csproj b/Tiger.Business.MES/Tiger.Business.MES.csproj
index 8a80107..54434c7 100644
--- a/Tiger.Business.MES/Tiger.Business.MES.csproj
+++ b/Tiger.Business.MES/Tiger.Business.MES.csproj
@@ -8,6 +8,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Tiger.Business\Tiger.Business.csproj" />
+    <ProjectReference Include="..\Tiger.IBusiness.MES\Tiger.IBusiness.MES.csproj" />
     <ProjectReference Include="..\Tiger.IBusiness\Tiger.IBusiness.csproj" />
   </ItemGroup>
 
diff --git a/Tiger.Business.MES/Transaction/CollectNode.cs b/Tiger.Business.MES/Transaction/CollectNode.cs
index 0044c67..027165c 100644
--- a/Tiger.Business.MES/Transaction/CollectNode.cs
+++ b/Tiger.Business.MES/Transaction/CollectNode.cs
@@ -412,7 +412,7 @@
 
                     //鍒濆鍖栧伐姝ュ垪琛�
                     Steps.Clear();
-                    var curStep = new Biz.WorkStep(IWorkStep.NodeTypes.Node, this)
+                    var curStep = new WorkStep(IWorkStep.NodeTypes.Node, this)
                     {
                         Name = "鎵弿浜у搧",
                         Sequence = Steps.Count + 1,
diff --git a/Tiger.Business.MES/Transaction/PackingNode.cs b/Tiger.Business.MES/Transaction/PackingNode.cs
index dbca424..3228fdd 100644
--- a/Tiger.Business.MES/Transaction/PackingNode.cs
+++ b/Tiger.Business.MES/Transaction/PackingNode.cs
@@ -453,7 +453,7 @@
 
                     //鍒濆鍖栧伐姝ュ垪琛�
                     Steps.Clear();
-	                var curStep = new Biz.WorkStep(IWorkStep.NodeTypes.Node, this) 
+	                var curStep = new WorkStep(IWorkStep.NodeTypes.Node, this) 
                     {
                         Name = "鎵弿浜у搧",
                         Sequence = Steps.Count + 1,
diff --git a/Tiger.Business.MES/Transaction/TestNode.cs b/Tiger.Business.MES/Transaction/TestNode.cs
index e316fef..9934de1 100644
--- a/Tiger.Business.MES/Transaction/TestNode.cs
+++ b/Tiger.Business.MES/Transaction/TestNode.cs
@@ -412,7 +412,7 @@
 
                     //鍒濆鍖栧伐姝ュ垪琛�
                     Steps.Clear();
-                    var curStep = new Biz.WorkStep(IWorkStep.NodeTypes.Node, this)
+                    var curStep = new WorkStep(IWorkStep.NodeTypes.Node, this)
                     {
                         Name = "鎵弿浜у搧",
                         Sequence = Steps.Count + 1,
diff --git a/Tiger.Business/MES/Biz.WorkBatch.cs b/Tiger.Business/MES/Biz.WorkBatch.cs
deleted file mode 100644
index e56ae10..0000000
--- a/Tiger.Business/MES/Biz.WorkBatch.cs
+++ /dev/null
@@ -1,510 +0,0 @@
-锘縰sing Tiger.Model;
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-using Rhea.Common;
-using System.Linq;
-using Tiger.IBusiness;
-using Tiger.Business.MES;
-using Tiger.Model.Entitys.MES.Position;
-
-namespace Tiger.Business
-{
-    public partial class Biz
-    {
-        /// <summary>
-        /// 鐢熶骇涓殑宸ュ崟鎵规
-        /// </summary>
-        public partial class WorkBatch : IWorkBatch, IDisposable
-        {
-            public WorkBatch(string order)
-            {
-                OrderNo = order;
-            }
-            #region Propertys & Variables
-            public string OrderNo { get; set; }
-            public string LineCode { get; set; }
-            public BIZ_MES_WO WO { get; set; }
-            public BAS_ITEM Product { get; set; }
-            public BIZ_MES_WO_BATCH Batch { get; set; }
-            public BAS_CUSTOMER Customer { get; set; }
-            public List<BIZ_MES_WO_SN> WoSNs { get; set; }
-            public List<MES_WO_EDGE> Edges { get; set; }
-            public List<MES_WO_NODE> Nodes { get; set; }
-            public List<MES_WO_OPER> NodeSets { get; set; }
-            public List<MES_WO_NODE_ACT> NodeActs { get; set; }
-            public List<MES_WO_ACTION> ActionSets { get; set; }
-            public List<MES_WO_NODE_POST> NodePosts { get; set; }
-            public List<MES_WO_NODE_DFTG> NodeDftgs { get; set; }
-            public List<BAS_DEFECT_GRP> DefectGroups { get; set; }
-            public List<BAS_DEFECT> Defects => DefectGroups.SelectMany(q => q.Defects).ToList();
-            /// <summary>
-            /// 浜嬪姟閿�
-            /// </summary>
-            public object TransLock { get; }
-            #endregion
-
-            #region Functions
-            /// <summary>
-            /// 鍒濆鍖栧伐鍗曡祫鏂�
-            /// </summary>
-            /// <returns></returns>
-            public WorkBatch Init(string lineCode)
-            {
-                LineCode = lineCode;
-                GetBatchInfo();
-                return this;
-            }
-
-            public void Update()
-            {
-                if (!WoContext.WoBatchDic.ContainsKey(Batch.BATCH_NO))
-                {
-                    GetBatchInfo();
-                    WoContext.WoBatchDic.Add(Batch.BATCH_NO, this);
-                }
-            }
-
-            private void GetBatchInfo()
-            {
-                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
-                Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).IncludesAllFirstLayer().First();
-                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode &&
-                                    (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First();
-                Customer = Biz.Db.Queryable<BAS_CUSTOMER>().Where(q => q.CUST_CODE == WO.CUST_CODE).First();
-                WoSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                Edges = Biz.Db.Queryable<MES_WO_EDGE>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                Nodes = Biz.Db.Queryable<MES_WO_NODE>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
-                NodeSets = Biz.Db.Queryable<MES_WO_OPER>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                NodeActs = Biz.Db.Queryable<MES_WO_NODE_ACT>().Where(q => q.WORK_ORDER == OrderNo).IncludesAllFirstLayer().ToList();
-                ActionSets = Biz.Db.Queryable<MES_WO_ACTION>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                NodePosts = Biz.Db.Queryable<MES_WO_NODE_POST>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                NodeDftgs = Biz.Db.Queryable<MES_WO_NODE_DFTG>().Where(q => q.WORK_ORDER == OrderNo).ToList();
-                DefectGroups = Biz.Db.Queryable<BAS_DEFECT_GRP>().IncludesAllFirstLayer().ToList();
-
-                //宸ュ簭鑺傜偣鎺掑簭
-                var first = Nodes.First(q => q.IS_FIRST_NODE == "Y");
-                first.Sequence = 1;
-                NodeSorting(first);
-            }
-
-            /// <summary>
-            /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃
-            /// </summary>
-            /// <param name="parent"></param>
-            private void NodeSorting(MES_WO_NODE parent)
-            {
-                var edges = Edges.Where(q => q.SRC_NODE == parent.ID && Nodes.Any(a => a.ID == q.TGT_NODE)).ToList();
-                foreach (var edge in edges)
-                {
-                    var next = Nodes.First(q => q.ID == edge.TGT_NODE);
-                    //鎺掗櫎缁翠慨宸ュ簭
-                    if (next.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
-                    {
-                        next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1);
-                        //濡傛灉鐖惰妭鐐瑰惎鐢ㄤ笖涓嶅彲璺崇珯锛屽垯娣诲姞涓轰笅涓�涓伐搴忕殑鍓嶇疆宸ュ簭
-                        var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == parent.ID);
-                        if (!setting.IsNullOrEmpty() && setting.IS_ACTIVE == "Y" && setting.CAN_SKIP != "Y")
-	                    {
-                            next.PrepNodeIDs.Add(parent.ID);
-	                    }
-                        //缁ф壙鐖剁粨鐐圭殑鍓嶇疆宸ュ簭
-                        next.PrepNodeIDs.AddRange(parent.PrepNodeIDs);
-                        next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList();
-                        NodeSorting(next);
-                    }
-                }
-            }
-
-            /// <summary>
-            /// 妫�鏌ュ伐鍗曞湪褰撳墠宸ュ簭鑺傜偣鏄惁鍙互鐢熶骇
-            /// </summary>
-            /// <param name="curNode"></param>
-            /// <returns></returns>
-            public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode)
-            {
-                var action = new ApiAction<SubmitOutput>(new SubmitOutput(), true);
-
-                WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First();
-                Batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.ORDER_NO == OrderNo && q.ACT_LINE == LineCode).First();
-                //宸ュ崟鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
-                if (Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
-                {
-                    action.IsSuccessed = false;
-                    action.Data.SetValue(this, null);
-                    //action.LocaleMsg = new($"宸ュ崟鎵规[{Batch.BATCH_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
-                    action.LocaleMsg = new("MES.WorkBatch.WoBatchStatusCanNotWork", Batch.BATCH_NO, Batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>().GetName());
-                }
-                //宸ュ崟鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜�
-                if (WO.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && WO.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue())
-                {
-                    action.IsSuccessed = false;
-                    action.Data.SetValue(this, null);
-                    //action.LocaleMsg = new($"宸ュ崟[{WO.ORDER_NO}]鐘舵�乕{Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶆槸鍏佽鐢熶骇鐨勭姸鎬侊紝璇锋壂鎻忓厑璁哥敓浜х殑浜у搧鏉$爜");
-                    action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName());
-                }
-                //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
-                //if (curNode.IS_INPUT == "Y" && Batch.INPUT_QTY - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
-                if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY)
-                {
-                    action.IsSuccessed = false;
-                    action.Data.SetValue(this, null);
-                    //action.LocaleMsg = new($"宸ュ崟鎵规[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
-                    action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO), Batch.SCRAP_QTY, Batch.PLAN_QTY);
-                }
-                //宸ュ崟鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜�
-                if (curNode.IS_INPUT == "Y" && WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY)
-                {
-                    action.IsSuccessed = false;
-                    action.Data.SetValue(this, null);
-                    //action.LocaleMsg = new($"宸ュ崟[{0}]宸叉姇鍏� {1}锛屽叾涓姤搴� {2}锛屼互婊¤冻璁″垝鏁伴噺[{3}]锛屾棤闇�缁х画鎶曞叆");
-                    action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO), WO.SCRAP_QTY, WO.PLAN_QTY);
-                }
-
-                return action;
-            }
-
-            /// <summary>
-            /// 宸ュ崟寮�宸�
-            /// </summary>
-            /// <param name="user"></param>
-            /// <returns></returns>
-            public bool StartWorking(string user)
-            {
-                if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue())
-                {
-	                WO.STATUS = BIZ_MES_WO.STATUSs.Working.GetValue();
-	                WO.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
-	                Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Working.GetValue();
-	                Batch.ACT_START_TIME = WO.ACT_START_TIME < new DateTime(2000, 1, 1) ? DateTime.Now : WO.ACT_START_TIME;
-	                //淇濆瓨鏁版嵁搴�
-	                var db = Biz.Db;
-	                var dbTran = db.UseTran(() =>
-	                {
-	                    db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
-	                    db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_START_TIME }).ExecuteCommand();
-	                });
-	                if (!dbTran.IsSuccess)
-	                {
-	                    //throw dbTran.ErrorException;
-	                    return false;
-	                }
-                }
-                return true;
-            }
-
-            /// <summary>
-            /// 宸ュ崟鏆傚仠
-            /// </summary>
-            /// <param name="user"></param>
-            /// <returns></returns>
-            public bool PausedWorking(string user)
-            {
-                if (Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())
-                {
-                    WO.STATUS = BIZ_MES_WO.STATUSs.Paused.GetValue();
-                    Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Paused.GetValue();
-                    //淇濆瓨鏁版嵁搴�
-                    var db = Biz.Db;
-                    var dbTran = db.UseTran(() =>
-                    {
-                        db.Updateable(WO, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
-                        db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS }).ExecuteCommand();
-                    });
-                    if (!dbTran.IsSuccess)
-                    {
-                        //throw dbTran.ErrorException;
-                        return false;
-                    }
-                }
-                return true;
-            }
-
-            /// <summary>
-            /// 鏍规嵁宀椾綅缂栫爜鍒ゆ柇鏄笉鏄绔�
-            /// </summary>
-            /// <param name="postCode"></param>
-            /// <returns></returns>
-            public bool IsFirstNode(string postCode)
-            {
-                return Nodes.Any(q => q.IS_FIRST_NODE == "Y" && NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
-            }
-
-            /// <summary>
-            /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭鑺傜偣
-            /// </summary>
-            /// <param name="postCode"></param>
-            /// <returns></returns>
-            public MES_WO_NODE GetNode(string postCode)
-            {
-                return Nodes.FirstOrDefault(q => NodePosts.Any(p => p.NODE_ID == q.ID && p.POST_CODE == postCode));
-            }
-
-            /// <summary>
-            /// 鏍规嵁浼犲叆鐨勬潯鐮佽繃绔欎俊鎭拰涓嬩竴绔欑殑鐩爣宸ュ簭锛屽垽鏂潯鐮佹槸鍚﹁兘杩涘叆涓嬩竴绔�
-            /// </summary>
-            /// <param name="input">鏈鎻愪氦鐨勬暟鎹�</param>
-            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param>
-            /// <param name="nextNode">瑕佽繘鍏ョ殑鐩爣宸ュ簭</param>
-            /// <returns></returns>
-            public ApiAction<SubmitOutput> CanGotoNext(SubmitInput input, MES_WIP_DATA wipSN, MES_WO_NODE nextNode)
-            {
-                var action = new ApiAction<SubmitOutput>(new SubmitOutput());
-
-                //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
-                if (wipSN.NODE_ID.IsNullOrEmpty())
-                {
-                    if (nextNode.IS_FIRST_NODE == "Y")
-                    {
-                        action.IsSuccessed = true;
-                        return action;
-                    }
-                    else
-                    {
-                        action.IsSuccessed = false;
-                        action.Data.SetValue(this, null);
-                        var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y");
-                        action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                        return action;
-                    }
-                }
-                //鏉$爜宸叉湁杩囩珯璁板綍
-                else
-                {
-                    var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
-                    var curSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == curNode.ID);
-                    var nextSetting = NodeSets.FirstOrDefault(q => q.NODE_ID == nextNode.ID);
-                    //杩涘叆缁翠慨锛氬鏋滅洰鏍囧伐搴忔槸缁翠慨宸ュ簭鍒欏垽鏂綋鍓嶆潯鐮佸湪鏈伐鍗曟湁鏈淮淇殑涓嶈壇璁板綍涓斿綋鍓嶅伐搴忚妭鐐规湁杩炵嚎鍒扮淮淇伐搴忥紝鍒欏厑璁歌繘鍏ョ淮淇伐搴�
-                    if (nextNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue()
-                        && wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue())
-                        && Edges.Any(q => q.SRC_NODE == curNode.ID && q.TGT_NODE == nextNode.ID))
-                    {
-                        action.IsSuccessed = true;
-                        return action;
-                    }
-                    //缁翠慨鍥炴祦锛氬鏋滄潯鐮佺殑褰撳墠宸ュ簭鏄淮淇伐搴忥紝鍒欒涓烘槸缁翠慨鍥炴祦
-                    else if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
-                    {
-                        //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
-                        var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID)
-                                                                    && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList();
-
-                        //鍙洖娴佺殑宸ュ簭鍖呭惈鐩爣宸ュ簭涓旀潯鐮佸湪缁翠慨绔欓�夋嫨鐨勫洖娴佸伐搴忎负绌烘垨鑰呯瓑浜庣洰鏍囧伐搴忥紝鍒欏厑璁歌繘绔�
-                        if (reflowNodes.Any(q => q.ID == nextNode.ID) && (wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == nextNode.NODE_NAME))
-                        {
-                            action.IsSuccessed = true;
-                            return action;
-                        }
-                        else
-                        {
-                            action.IsSuccessed = false;
-                            action.Data.SetValue(this, null);
-                            var nextList = reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME);
-                            action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, input.SN, curNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                            return action;
-                        }
-                    }
-                    //涓嶈壇鍝佸叆绔欙細濡傛灉浜у搧鏈変笉鑹褰曚笖鐩爣宸ュ簭涓嶆槸缁翠慨宸ュ簭涓斾笉鍏佽涓嶈壇鍝佸叆绔欙紝鍒欐姤閿�
-                    else if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()) 
-                         && nextSetting.ALLOW_DFT_IN != "Y" && nextNode.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue())
-                    {
-                        action.IsSuccessed = false;
-                        action.Data.SetValue(this, null);
-                        action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, input.SN);
-                        return action;
-                    }
-                    //姝e父宸ュ簭杩囩珯
-                    else
-                    {
-                        //娣诲姞鏉$爜褰撳墠宸ュ簭鐨勪笅涓�涓彲鎵ц宸ュ簭
-                        var nextNodes = GetNextNodes(curNode, wipSN);
-                        //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
-                        if (nextNodes.Any(q => q.ID == nextNode.ID))
-                        {
-                            action.IsSuccessed = true;
-                            return action;
-                        }
-
-                        //濡傛灉褰撳墠宸ュ簭鏈夊繀椤绘墽琛岀殑鍚庣画宸ュ簭锛屽垯鎶ラ敊
-                        if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
-                        {
-                            action.IsSuccessed = false;
-                            action.Data.SetValue(this, null);
-                            var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y"));
-                            action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                            return action;
-                        }
-                        //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏皾璇曟墽琛�
-                        else
-	                    {
-                            //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
-                            var prepIDs = curNode.PrepNodeIDs.Where(id =>
-                                                                 Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
-                                                                 ).ToList();
-                            foreach (var prepID in prepIDs)
-                            {
-                                //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
-                                var prep = Nodes.First(q => q.ID == prepID);
-                                var next = GetNextNodes(prep, wipSN);
-                                nextNodes.AddRange(next);
-                            }
-
-                            //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔�
-                            if (nextNodes.Any(q => q.ID == nextNode.ID))
-                            {
-                                action.IsSuccessed = true;
-                                return action;
-                            }
-                            else
-                            {
-                                action.IsSuccessed = false;
-                                action.Data.SetValue(this, null);
-                                var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y"));
-                                action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (q.CAN_SKIP == "Y" ? $"({T(L("MES.WorkBatch.Optional"), input.Locale)})" : ""))));
-                                return action;
-                            }
-                        }
-                    }
-                }
-
-                return action;
-            }
-
-            /// <summary>
-            /// 娣诲姞鑺傜偣鐨勪笅涓�涓彲鎵ц鑺傜偣
-            /// </summary>
-            /// <param name="parent"></param>
-            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param>
-            private List<MES_WO_NODE> GetNextNodes(MES_WO_NODE parent, MES_WIP_DATA wipSN)
-            {
-                var result = new List<MES_WO_NODE>();
-                var nextNodes = Nodes.Where(q => q.Operation.OPER_TYPE != MES_OPERATION.OPER_TYPEs.Repair.GetValue()
-                                                                    && Edges.Any(e => e.SRC_NODE == parent.ID && e.TGT_NODE == q.ID)
-                                                                    && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == q.ID && h.IsFinished)
-                                                                 ).ToList();
-                //灏濊瘯灏嗗綋鍓嶅伐搴忕殑鍚庣画宸ュ簭娣诲姞鍒板彲浠ユ墽琛岀殑宸ュ簭鍒楄〃
-                foreach (var next in nextNodes)
-                {
-                    //鏌ユ壘鏈夋病鏈夊墠缃伐搴忔壘涓嶅埌宸茶壇鍝佽繃绔欑殑鍘嗗彶璁板綍锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛�
-                    if (!next.PrepNodeIDs.Any(id => !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == id && h.IsFinished)) || parent.IS_FIRST_NODE == "Y")
-                    {
-                        var setting = NodeSets.FirstOrDefault(q => q.NODE_ID == next.ID);
-                        //鍚庣画宸ュ簭鏄惎鐢ㄧ殑锛屽垯娣诲姞
-                        if (!result.Any(q => q.ID == next.ID) && setting.IS_ACTIVE == "Y")
-                        {
-                        	result.Add(next);
-                        }
-                        //鍚庣画宸ュ簭鏄笉鍚敤鎴栬�呭彲璺崇珯锛屽垯缁х画娣诲姞鍏跺悗缁伐搴�
-                        if (!setting.IsNullOrEmpty() && (setting.IS_ACTIVE != "Y" || setting.CAN_SKIP == "Y"))
-                        {
-                            result.AddRange(GetNextNodes(next, wipSN));
-                        }
-                    }
-                }
-
-                return result;
-            }
-
-            /// <summary>
-            /// 鏍规嵁浼犲叆鐨勬潯鐮佽繑鍥炰笅涓�绔欏彲杩涘叆杩涘叆鐨勭洰鏍囧伐搴�
-            /// </summary>
-            /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曞拰鐢熶骇涓嶈壇璁板綍淇℃伅</param>
-            /// <returns></returns>
-            public List<MES_WO_NODE> GetNextNodes(MES_WIP_DATA wipSN)
-            {
-                var result = new List<MES_WO_NODE>();
-
-                //鏉$爜鍦ㄦ湰宸ュ崟绗竴娆¤繃绔�
-                if (wipSN.NODE_ID.IsNullOrEmpty())
-                {
-                    result.AddRange(Nodes.Where(q => q.IS_FIRST_NODE == "Y"));
-                }
-                //鏉$爜宸叉湁杩囩珯璁板綍
-                else
-                {
-                    var curNode = Nodes.First(q => q.ID == wipSN.NODE_ID);
-                    //鏉$爜鍦ㄧ淮淇伐搴忥紝杩斿洖鍙洖娴佸伐搴�
-                    if (curNode.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue())
-                    {
-                        //鏌ユ壘鎵�鏈夊彲浠ュ洖娴佺殑宸ュ簭
-                        var reflowNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID)
-                                                                    && NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")).ToList();
-                        result.AddRange(reflowNodes.Where(q => wipSN.REFLOW_NODE.IsNullOrEmpty() || wipSN.REFLOW_NODE == q.NODE_NAME));
-                    }
-                    else
-                    {
-                        //寰�涓嬫煡鎵炬潯鐮佸綋鍓嶅伐搴忕殑涓嬩竴涓彲鎵ц宸ュ簭
-                        var nextNodes = GetNextNodes(curNode, wipSN);
-                        //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏皾璇曞湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏姞鍏�
-                        if (!nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y")))
-                        {
-                            //鍦ㄥ墠缃伐搴忔煡鎵捐繕鏈夋病鏈夊悗缁伐搴忔病瀹屾垚鐨勫墠缃伐搴�
-                            var prepIDs = curNode.PrepNodeIDs.Where(id =>
-                                                                 Edges.Any(e => e.SRC_NODE == id && !wipSN.History.Any(h => h.WORK_ORDER == WO.ORDER_NO && h.NODE_ID == e.TGT_NODE && h.IsFinished))
-                                                                 ).ToList();
-                            foreach (var prepID in prepIDs)
-                            {
-                                //濡傛灉杩炵嚎鐨勭洰鏍囧伐搴忕殑鍓嶇疆宸ュ簭閮藉凡瀹屾垚锛屽垯鎶婅繛绾跨殑鐩爣宸ュ簭娣诲姞鍒板彲鎵ц宸ュ簭鍒楄〃
-                                var prep = Nodes.First(q => q.ID == prepID);
-                                var next = GetNextNodes(prep, wipSN);
-                                nextNodes.AddRange(next);
-                            }
-                        }
-                        result.AddRange(nextNodes);
-                        //濡傛灉褰撳墠鏉$爜鏄笉鑹垯鍙繑鍥炲厑璁镐笉鑹繘绔欑殑宸ュ簭鍜屽伐搴忚繛鎺ョ殑缁翠慨宸ュ簭
-                        if (wipSN.Defects.Any(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS < MES_WIP_DFT.STATUSs.Resolved.GetValue()))
-                        {
-                            result.RemoveAll(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.ALLOW_DFT_IN != "Y"));
-                            //鍔犲叆宸ュ簭杩炴帴鐨勭淮淇伐搴�
-                            var repairNodes = Nodes.Where(q => Edges.Any(e => e.SRC_NODE == curNode.ID && e.TGT_NODE == q.ID) && q.Operation.OPER_TYPE == MES_OPERATION.OPER_TYPEs.Repair.GetValue());
-                            result.AddRange(repairNodes);
-                        }
-                    }
-                }
-
-                return result;
-            }
-
-            /// <summary>
-            /// 鏍规嵁宀椾綅缂栫爜杩斿洖宸ュ簭涓嶈壇浠g爜
-            /// </summary>
-            /// <param name="postCode"></param>
-            /// <returns></returns>
-            public List<DefectOutput> GetNodeDefects(string postCode)
-            {
-                var result = new List<DefectOutput>();
-                var groups = DefectGroups.Where((b, s) => NodeDftgs.Any(d => d.NODE_ID == GetNode(postCode).ID && d.DFTG_CODE == b.DFTG_CODE)).ToList();
-                foreach (var group in groups)
-                {
-                    result.AddRange(group.Defects.Select(q => new DefectOutput { 
-                        DFTG_CODE = q.DFTG_CODE,
-                        DFTG_NAME = group.DFTG_NAME,
-                        DFT_CODE = q.DFT_CODE,
-                        DFT_NAME = q.DFT_NAME,
-                        DFT_LEVEL = q.DFT_LEVEL,
-                    }));
-                }
-                return result;
-            }
-
-            #endregion
-
-            /// <summary>
-            /// 鍏抽棴宸ュ崟
-            /// </summary>
-            /// <returns></returns>
-            public bool Close()
-            {
-                Dispose();
-                return true;
-            }
-            public virtual void Dispose()
-            {
-                WoContext.WoBatchDic.Remove(OrderNo);
-            }
-        }
-    }
-}
diff --git a/Tiger.Business/MES/Biz.WorkStep.cs b/Tiger.Business/MES/Biz.WorkStep.cs
deleted file mode 100644
index 769d1a7..0000000
--- a/Tiger.Business/MES/Biz.WorkStep.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-锘縰sing Tiger.Model;
-using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
-using Rhea.Common;
-using System.Net;
-using System.Linq;
-using Newtonsoft.Json;
-using Tiger.IBusiness;
-using Tiger.Business.MES;
-using Tiger.Model.Entitys.MES.Position;
-
-namespace Tiger.Business
-{
-    public partial class Biz
-    {
-        /// <summary>
-        /// 宸ユ
-        /// </summary>
-        public partial class WorkStep : IWorkStep
-        {
-            public WorkStep(IWorkStep.NodeTypes type, IPosition position)
-            {
-                NodeType = type;
-                CurPosition = position;
-            }
-
-            #region Propertys & Variables
-            public string ID { get; set; } = Guid.NewGuid().ToString("N");
-            public string Name { get; set; }
-            public IWorkStep.NodeTypes NodeType { get; set; }
-            public MES_WO_NODE Node { get; set; }
-            public MES_WO_OPER OperSetting { get; set; }
-            public MES_WO_NODE_ACT NodeAct { get; set; }
-            public MES_WO_ACTION ActSetting { get; set; }
-            public IPosition CurPosition { get; set; }
-            public IWorkAction CurAction { get; set; }
-            public int Sequence { get; set; }
-            public List<string> PrepNodeIDs { get; set; } = new();
-            public string NodeID => NodeType == IWorkStep.NodeTypes.Action ? NodeAct.ID : Node.ID;
-            private bool _IsFinished = false;
-            public bool IsFinished
-            {
-                get => NodeType == IWorkStep.NodeTypes.Action ? CurAction.IsFinished : _IsFinished;
-                set { _IsFinished = value; }
-            }
-            public StepStatus Status { get; set; } = StepStatus.Normal;
-            //public bool IsFinished => Status == StepStatus.Finished;
-            private Locale _Message;
-            public Locale Message
-            {
-                get => _Message;
-                set { _MsgHistory.Add(_Message = value); }
-            }
-            private List<Locale> _MsgHistory = new();
-            public List<Locale> MsgHistory => _MsgHistory;
-            public Action DBSubmitAction { get; set; } = () => { };
-            #endregion
-
-            #region Functions
-            /// <summary>
-            /// 鍒濆鍖栧伐姝�
-            /// </summary>
-            /// <returns></returns>
-            public void Init()
-            {
-                CurAction = DI.Resolve(NodeAct.Definition.SERVICE_TYPE) as IWorkAction;
-                //CurAction = DI.Resolve("Tiger.IBusiness.IPrintLabel,Tiger.IBusiness") as IWorkAction;
-                CurAction.Init(this, CurPosition, NodeAct, ActSetting);
-            }
-
-            /// <summary>
-            /// 灏濊瘯寮�濮嬫墽琛屽伐姝�
-            /// </summary>
-            /// <returns></returns>
-            public ApiAction<SubmitOutput> TryBegin(SubmitInput input)
-            {
-                return CurAction.TryBegin(input);
-            }
-
-            /// <summary>
-            /// 鑾峰彇琛屼负寮�濮嬬殑鎻愮ず淇℃伅
-            /// </summary>
-            /// <returns></returns>
-            public Locale GetBeginMsg()
-            {
-                return CurAction.GetBeginMsg();
-            }
-
-            /// <summary>
-            /// 宸ユ鎻愪氦鏁版嵁
-            /// </summary>
-            /// <param name="input"></param>
-            /// <returns></returns>
-            public ApiAction<SubmitOutput> Submit(SubmitInput input)
-            {
-                return CurAction.Submit(input);
-            }
-
-            /// <summary>
-            /// 缁撴潫宸ユ鎵ц
-            /// </summary>
-            /// <returns></returns>
-            public ApiAction<SubmitOutput> End(SubmitInput input)
-            {
-                return CurAction.End(input);
-            }
-
-            /// <summary>
-            /// 璁剧疆宸ユ鐘舵�佸拰娑堟伅
-            /// </summary>
-            /// <returns></returns>
-            public void SetStatusMessage(StepStatus status, Locale msg)
-            {
-                Message = msg;
-                Status = status;
-            }
-
-            /// <summary>
-            /// 鑾峰彇褰撳墠宸ユ鐨勪俊鎭�
-            /// </summary>
-            /// <returns></returns>
-            public WorkStepInfo GetInfo(string locale)
-            {
-                return new WorkStepInfo() { 
-                    ID = ID,
-                    Name = Name,
-                    Sequence = Sequence,
-                    NodeID = NodeID,
-                    NodeType = NodeType.ToString(),
-                    Node = Node,
-                    OperSetting = OperSetting,
-                    NodeAct = NodeAct,
-                    ActSetting = ActSetting,
-                    Status = Status.ToString(),
-                    Message = Message.IsNullOrEmpty() ? "" : Biz.T(Message, locale),
-                };
-            }
-            #endregion
-
-        }
-    }
-}
diff --git a/Tiger.IBusiness/MES/BIZ/IBasRule.cs b/Tiger.IBusiness.MES/BIZ/IBasRule.cs
similarity index 100%
rename from Tiger.IBusiness/MES/BIZ/IBasRule.cs
rename to Tiger.IBusiness.MES/BIZ/IBasRule.cs
diff --git a/Tiger.IBusiness/MES/BIZ/IMES_WO.cs b/Tiger.IBusiness.MES/BIZ/IMES_WO.cs
similarity index 100%
rename from Tiger.IBusiness/MES/BIZ/IMES_WO.cs
rename to Tiger.IBusiness.MES/BIZ/IMES_WO.cs
diff --git a/Tiger.IBusiness/MES/BIZ/IMES_WORKSHOP.cs b/Tiger.IBusiness.MES/BIZ/IMES_WORKSHOP.cs
similarity index 100%
rename from Tiger.IBusiness/MES/BIZ/IMES_WORKSHOP.cs
rename to Tiger.IBusiness.MES/BIZ/IMES_WORKSHOP.cs
diff --git a/Tiger.IBusiness/MES/Common/ICodeVerification.cs b/Tiger.IBusiness.MES/Common/ICodeVerification.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Common/ICodeVerification.cs
rename to Tiger.IBusiness.MES/Common/ICodeVerification.cs
diff --git a/Tiger.IBusiness/MES/Common/IDoUnPack.cs b/Tiger.IBusiness.MES/Common/IDoUnPack.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Common/IDoUnPack.cs
rename to Tiger.IBusiness.MES/Common/IDoUnPack.cs
diff --git a/Tiger.IBusiness/Extensions/ModelExtension.cs b/Tiger.IBusiness.MES/Extensions/ModelExtension.cs
similarity index 100%
rename from Tiger.IBusiness/Extensions/ModelExtension.cs
rename to Tiger.IBusiness.MES/Extensions/ModelExtension.cs
diff --git a/Tiger.IBusiness/MES/IWMSContext.cs b/Tiger.IBusiness.MES/IMESContext.cs
similarity index 100%
rename from Tiger.IBusiness/MES/IWMSContext.cs
rename to Tiger.IBusiness.MES/IMESContext.cs
diff --git a/Tiger.IBusiness/MES/IWorkStep.cs b/Tiger.IBusiness.MES/IWorkStep.cs
similarity index 100%
rename from Tiger.IBusiness/MES/IWorkStep.cs
rename to Tiger.IBusiness.MES/IWorkStep.cs
diff --git a/Tiger.IBusiness/MES/LabelTemplate/ILabelTemplate.cs b/Tiger.IBusiness.MES/LabelTemplate/ILabelTemplate.cs
similarity index 100%
rename from Tiger.IBusiness/MES/LabelTemplate/ILabelTemplate.cs
rename to Tiger.IBusiness.MES/LabelTemplate/ILabelTemplate.cs
diff --git a/Tiger.IBusiness/MES/SMT/ISmtTool.cs b/Tiger.IBusiness.MES/SMT/ISmtTool.cs
similarity index 100%
rename from Tiger.IBusiness/MES/SMT/ISmtTool.cs
rename to Tiger.IBusiness.MES/SMT/ISmtTool.cs
diff --git a/Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj b/Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj
new file mode 100644
index 0000000..cd09432
--- /dev/null
+++ b/Tiger.IBusiness.MES/Tiger.IBusiness.MES.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\Tiger.IBusiness\Tiger.IBusiness.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Tiger.IBusiness/MES/Transaction/ICollectNode.cs b/Tiger.IBusiness.MES/Transaction/ICollectNode.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/ICollectNode.cs
rename to Tiger.IBusiness.MES/Transaction/ICollectNode.cs
diff --git a/Tiger.IBusiness/MES/Transaction/ILoadingMaterial.cs b/Tiger.IBusiness.MES/Transaction/ILoadingMaterial.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/ILoadingMaterial.cs
rename to Tiger.IBusiness.MES/Transaction/ILoadingMaterial.cs
diff --git a/Tiger.IBusiness/MES/Transaction/IMESTransaction.cs b/Tiger.IBusiness.MES/Transaction/IMESTransaction.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/IMESTransaction.cs
rename to Tiger.IBusiness.MES/Transaction/IMESTransaction.cs
diff --git a/Tiger.IBusiness/MES/Transaction/IPackingNode.cs b/Tiger.IBusiness.MES/Transaction/IPackingNode.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/IPackingNode.cs
rename to Tiger.IBusiness.MES/Transaction/IPackingNode.cs
diff --git a/Tiger.IBusiness/MES/Transaction/IPosition.cs b/Tiger.IBusiness.MES/Transaction/IPosition.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/IPosition.cs
rename to Tiger.IBusiness.MES/Transaction/IPosition.cs
diff --git a/Tiger.IBusiness/MES/Transaction/ITestNode.cs b/Tiger.IBusiness.MES/Transaction/ITestNode.cs
similarity index 100%
rename from Tiger.IBusiness/MES/Transaction/ITestNode.cs
rename to Tiger.IBusiness.MES/Transaction/ITestNode.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IAssembly.cs b/Tiger.IBusiness.MES/WorkAction/IAssembly.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IAssembly.cs
rename to Tiger.IBusiness.MES/WorkAction/IAssembly.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IIPQC.cs b/Tiger.IBusiness.MES/WorkAction/IIPQC.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IIPQC.cs
rename to Tiger.IBusiness.MES/WorkAction/IIPQC.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IPackageInputCheck.cs b/Tiger.IBusiness.MES/WorkAction/IPackageInputCheck.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IPackageInputCheck.cs
rename to Tiger.IBusiness.MES/WorkAction/IPackageInputCheck.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs b/Tiger.IBusiness.MES/WorkAction/IPackingAction.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
rename to Tiger.IBusiness.MES/WorkAction/IPackingAction.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs b/Tiger.IBusiness.MES/WorkAction/IPrintLabel.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs
rename to Tiger.IBusiness.MES/WorkAction/IPrintLabel.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IThreeInOne.cs b/Tiger.IBusiness.MES/WorkAction/IThreeInOne.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IThreeInOne.cs
rename to Tiger.IBusiness.MES/WorkAction/IThreeInOne.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IVerifyCustomSN.cs b/Tiger.IBusiness.MES/WorkAction/IVerifyCustomSN.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IVerifyCustomSN.cs
rename to Tiger.IBusiness.MES/WorkAction/IVerifyCustomSN.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IWeighing.cs b/Tiger.IBusiness.MES/WorkAction/IWeighing.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IWeighing.cs
rename to Tiger.IBusiness.MES/WorkAction/IWeighing.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs b/Tiger.IBusiness.MES/WorkAction/IWipExtInfo.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs
rename to Tiger.IBusiness.MES/WorkAction/IWipExtInfo.cs
diff --git a/Tiger.IBusiness/MES/IWorkAction.cs b/Tiger.IBusiness.MES/WorkAction/IWorkAction.cs
similarity index 100%
rename from Tiger.IBusiness/MES/IWorkAction.cs
rename to Tiger.IBusiness.MES/WorkAction/IWorkAction.cs
diff --git a/Tiger.IBusiness/MES/WorkAction/IYadaAssembly.cs b/Tiger.IBusiness.MES/WorkAction/IYadaAssembly.cs
similarity index 100%
rename from Tiger.IBusiness/MES/WorkAction/IYadaAssembly.cs
rename to Tiger.IBusiness.MES/WorkAction/IYadaAssembly.cs
diff --git a/Tiger.IBusiness/MES/iERP/IU9C_MES.cs b/Tiger.IBusiness.MES/iERP/IU9C_MES.cs
similarity index 100%
rename from Tiger.IBusiness/MES/iERP/IU9C_MES.cs
rename to Tiger.IBusiness.MES/iERP/IU9C_MES.cs

--
Gitblit v1.9.3