From fdd3e9c598b0a53a6eb84321f5c95a0862b1a673 Mon Sep 17 00:00:00 2001
From: Rodney Chen <rodney.chen@hotmail.com>
Date: 星期六, 03 八月 2024 22:22:34 +0800
Subject: [PATCH] 增加上料行为

---
 Tiger.IBusiness/MES/WorkAction/IIPQC.cs                          |    2 
 Tiger.Api/Language.db                                            |    0 
 Tiger.Business.MES/WorkAction/Assembly.cs                        |  293 ++++++++++++++++++++
 Tiger.Model.Net/Entitys/MES/MES_WIP_ASSY.cs                      |  156 +++++++++++
 Tiger.Model.Net/Tiger.Model.Net.csproj                           |    1 
 Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs                    |    2 
 Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs |   33 ++
 Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs                    |   12 
 Tiger.Business.MES/WorkAction/IPQC.cs                            |    1 
 Tiger.IBusiness/MES/WorkAction/IPackingAction.cs                 |    2 
 Tiger.Business.MES/WorkAction/PackingAction.cs                   |    1 
 Tiger.Business.MES/WorkAction/PrintLabel.cs                      |    4 
 Tiger.Business.MES/WorkAction/WipExtInfo.cs                      |  293 ++++++++++++++++++++
 Tiger.IBusiness/MES/WorkAction/IAssembly.cs                      |   12 
 14 files changed, 807 insertions(+), 5 deletions(-)

diff --git a/Tiger.Api/Language.db b/Tiger.Api/Language.db
index 2f60691..ced73f7 100644
--- a/Tiger.Api/Language.db
+++ b/Tiger.Api/Language.db
Binary files differ
diff --git a/Tiger.Business.MES/WorkAction/Assembly.cs b/Tiger.Business.MES/WorkAction/Assembly.cs
new file mode 100644
index 0000000..f2fa2bc
--- /dev/null
+++ b/Tiger.Business.MES/WorkAction/Assembly.cs
@@ -0,0 +1,293 @@
+锘縰sing Rhea.Common;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Tiger.IBusiness;
+using Tiger.IBusiness.MES.WorkAction;
+using Tiger.Model;
+using Tiger.Model.Entitys.MES.Position;
+
+namespace Tiger.Business.MES.WorkAction
+{
+    public class Assembly : IAssembly
+    {
+        #region Propertys & Variables
+        #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public bool IsFinished { get; set; } = false;
+        public IWorkStep CurStep { get; set; }
+        public IPosition CurPosition { get; set; }
+        public MES_WO_NODE_ACT NodeAct { get; set; }
+        public MES_WO_ACTION Setting { get; set; }
+        #endregion
+        public List<BAS_PROD_BOM> Boms { get; set; } = new();
+        public Dictionary<string, List<BAS_ITEM>> SubItemDic { get; set; } = new();
+        public AssemblyInfo CurAssembly { get; set; } = new();
+        #endregion Propertys & Variables
+
+        #region Functions
+        /// <summary>
+        /// 鍒濆鍖栧伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
+        {
+            #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            CurStep = curStep;
+            CurPosition = position;
+            NodeAct = nodeAct;
+            Setting = setting;
+            #endregion
+
+            //鑾峰彇浜у搧BOM
+            Boms = Biz.Db.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
+            //鑾峰彇涓婃枡鐗╂枡
+            var assyList = new List<AssemblySetting>();
+            try
+            {
+                assyList = setting.ITEM_CODE.JsonToObject<List<AssemblySetting>>();
+            }
+            catch (System.Exception ex)
+            {
+                var codeList = setting.ITEM_CODE.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                foreach (var code in codeList)
+                {
+                    assyList.Add(new(){ ItemCode = code });
+                }
+            }
+            var codes = assyList.Select(q => q.ItemCode).ToList();
+            var items = Biz.Db.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)
+            {
+                var info = items.FirstOrDefault(q => q.ITEM_CODE == assy.ItemCode);
+                if (!info.IsNullOrEmpty())
+                {
+	                var item = new AssemblyItem { 
+	                    ItemInfo = info,  
+	                    RuleCode = assy.RuleCode,
+	                    LoadQty = assy.Qty,
+	                };
+	                var bom = Boms.FirstOrDefault(q => q.ITEM_CODE == assy.ItemCode);
+	                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();
+	                    if (!SubItemDic.ContainsKey(assy.ItemCode))
+	                    {
+	                        SubItemDic.Add(assy.ItemCode, surItems);
+	                    }
+	                }
+	                CurAssembly.Items.Add(item);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇琛屼负寮�濮嬬殑鎻愮ず淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Locale GetBeginMsg()
+        {
+            var msg = new Locale("MES.WorkAction.Assembly.BeginMsg", string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            //var msg = new Locale($"璇锋壂鎻忎互涓嬮渶瑕佷笂鏂欑殑鐗╂枡鏉$爜锛歿string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+            return msg;
+        }
+
+        /// <summary>
+        /// 灏濊瘯寮�濮嬫墽琛屽伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> TryBegin(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            if (input.SN != CurPosition.CurWipSN.SN)
+            {
+                action = SaveAssembly(input, action);
+                return action;
+            }
+
+            //濡傛灉杩斿洖鎴愬姛鍒欒涓哄綋鍓嶈涓哄彲浠ュ紑濮嬫墽琛岋紝鍚﹀垯杩斿洖澶辫触
+            action.IsSuccessed = false;
+            return action;
+        }
+
+        /// <summary>
+        /// 宸ュ簭琛屼负鎻愪氦鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> Submit(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            action = SaveAssembly(input, action);
+            //涓婃枡鏁版嵁淇濆瓨澶辫触
+            if (!action.IsSuccessed)
+            {
+                //濡傛灉琛屼负璁剧疆涓哄嚭閿欓渶瑕侀噸缃伐搴忔搷浣�
+                if (NodeAct.NEED_RESET == "Y")
+                {
+                    CurPosition.ResetNode();
+                }
+            }
+            return action;
+        }
+
+        public ApiAction<SubmitOutput> SaveAssembly(SubmitInput input, ApiAction<SubmitOutput> action)
+        {
+            try
+            {
+                foreach (var item in CurAssembly.Items.Where(q => !q.IsFinished))
+                {
+                    var isOK = true;
+                    //鏍规嵁鏉$爜瑙勫垯楠岃瘉涓婃枡鏄惁姝g‘
+                    if (!item.RuleCode.IsNullOrEmpty())
+                    {
+                        if (!Biz.CodeRule[item.RuleCode].IsNullOrEmpty())
+                        {
+                            var result = Biz.CodeRule[item.RuleCode].Verify(input.SN);
+                            if (!result.IsSuccessed)
+                            {
+                                isOK = false;
+                            }
+                        }
+                        //涓嶅瓨鍦ㄦ潯鐮佽鍒欙紝鍒欏垽鏂槸鍚︽湁鑷畾涔夎鍒欙紝娌℃湁鍒欒繑鍥炲け璐�
+                        else
+                        {
+                            switch (item.RuleCode)
+                            {
+                                case "鑷楠岃瘉":
+                                    break;
+                                default:
+                                    isOK = false;
+                                    break;
+                            }
+                        }
+                    }
+                    //楠岃瘉閫氳繃鍒欎繚瀛樹笂鏂欎俊鎭�
+                    if (isOK)
+                    {
+                        var record = new MES_WIP_ASSY()
+                        {
+                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                            SN = input.SN,
+                            PROD_SN = CurPosition.CurWipSN.SN,
+                            ITEM_CODE = item.ItemInfo.ITEM_CODE,
+                            QTY = 1,
+                            UNIT = item.ItemInfo.UNIT,
+                            WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                            BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                            ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                            NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                            NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                            FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                            WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                            LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                            POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                            OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                            SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                        };
+                        item.Records.Add(record);
+                        if (item.Records.Sum(q => q.QTY) >= item.LoadQty)
+                        {
+                        	item.IsFinished = true;
+                        }
+
+                        action.IsSuccessed = true;
+	                    action.Data.Data = CurAssembly;
+	                    action.LocaleMsg = new Locale($"鎵弿鐗╂枡[{item.ItemInfo.ITEM_NAME}({item.ItemInfo.ITEM_CODE})鐨勬潯鐮乕{input.SN}]鎴愬姛锛岃缁х画涓婃枡");
+	                    action.LocaleMsg = new Locale("MES.WorkAction.Assembly.LoadSuccess", item.ItemInfo.ITEM_NAME, item.ItemInfo.ITEM_CODE);
+
+                        //涓婃枡瀹屾垚
+                        if (CurAssembly.IsFinished)
+                        {
+                            action = End();
+                        }
+                        return action;
+                    }
+                }
+                //閮芥病鏈夌墿鏂欓獙璇侀�氳繃锛屽垯杩斿洖閿欒淇℃伅
+                action.IsSuccessed = false;
+                //action.LocaleMsg = new($"鏉$爜[{input.SN}]楠岃瘉澶辫触锛屼笉鏄互涓嬬墿鏂欑殑鏉$爜锛歿string.Join("锛�", CurAssembly.Items.Where(q => !q.IsFinished).Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+                action.LocaleMsg = new("MES.WorkAction.Assembly.LoadFail", input.SN, string.Join("锛�", CurAssembly.Items.Where(q => !q.IsFinished).Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            }
+            catch (System.Exception ex)
+            {
+                action.CatchExceptionWithLog(ex, $"涓婃枡琛屼负锛氶獙璇佹潯鐮乕{input.SN}]骞朵繚瀛樻暟鎹け璐�");
+                action.IsSuccessed = false;
+                action.LocaleMsg = new($"楠岃瘉鏉$爜[{input.SN}]骞朵繚瀛樻暟鎹け璐ワ紝宸ュ簭宸查噸缃紝璇烽噸鏂版壂鎻忚繘绔欎骇鍝佹潯鐮�");
+                action.LocaleMsg = new("MES.WorkAction.Assembly.SaveAssemblyException", input.SN);
+                CurPosition.ResetNode();
+            }
+            return action;
+        }
+
+        /// <summary>
+        /// 缁撴潫鎵ц宸ュ簭琛屼负
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> End()
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            //璁板綍琛屼负鎿嶄綔璁板綍
+            var wipAct = new MES_WIP_ACT()
+            {
+                AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                HIS_ID = CurPosition.CurWipSNHis.ID,
+                SN = CurPosition.CurWipSN.SN,
+                STATUS = CurPosition.CurWipSN.STATUS,
+                ITEM_CODE = CurPosition.CurWipSN.ITEM_CODE,
+                WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                ACT_ID = NodeAct.ID,
+                ACT_NAME = NodeAct.ACT_NAME,
+                FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                TRAY_SN = CurPosition.CurWipSN.TRAY_SN,
+                OPERATION_TIME = DateTime.Now,
+                SFTS_CODE = CurPosition.CurWipSN.SFTS_CODE,
+                SFT_CODE = CurPosition.CurWipSN.SFT_CODE,
+                PRD_CODE = CurPosition.CurWipSN.PRD_CODE,
+                ACT_TYPE = NodeAct.ACT_TYPE,
+                ACT_SN = CurPosition.CurWipSN.SN,
+                ACT_VALUE_1 = CurAssembly.ToJson(),
+                ACT_RESULT = "Y",
+                TRACE_INFO = $"浠ヤ笅鐗╂枡涓婃枡瀹屾垚锛歿string.Join(",", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}",
+            };
+            var records = new List<MES_WIP_ASSY>();
+            foreach (var item in CurAssembly.Items)
+            {
+                records.AddRange(item.Records);
+            }
+
+            //淇濆瓨鏁版嵁
+            CurStep.DBSubmitAction = () =>
+            {
+                var db = CurPosition.GetCommitDB();
+                db.Storageable(wipAct, CurPosition.UserCode).ExecuteCommand();
+                db.Insertable(records, CurPosition.UserCode).ExecuteCommand();
+            };
+
+            IsFinished = true;
+            //action.LocaleMsg = new($"浠ヤ笅鐗╂枡涓婃枡瀹屾垚锛歿string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+            action.LocaleMsg = new("MES.WorkAction.Assembly.LoadFinish", string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            return action;
+        }
+
+        #endregion Functions
+    }
+}
diff --git a/Tiger.Business.MES/WorkAction/IPQC.cs b/Tiger.Business.MES/WorkAction/IPQC.cs
index c9cfde9..3bede32 100644
--- a/Tiger.Business.MES/WorkAction/IPQC.cs
+++ b/Tiger.Business.MES/WorkAction/IPQC.cs
@@ -6,6 +6,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using Tiger.IBusiness;
+using Tiger.IBusiness.MES.WorkAction;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
 
diff --git a/Tiger.Business.MES/WorkAction/PackingAction.cs b/Tiger.Business.MES/WorkAction/PackingAction.cs
index 0ce6715..da3cebe 100644
--- a/Tiger.Business.MES/WorkAction/PackingAction.cs
+++ b/Tiger.Business.MES/WorkAction/PackingAction.cs
@@ -6,6 +6,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using Tiger.IBusiness;
+using Tiger.IBusiness.MES.WorkAction;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
 
diff --git a/Tiger.Business.MES/WorkAction/PrintLabel.cs b/Tiger.Business.MES/WorkAction/PrintLabel.cs
index d13023e..8f33876 100644
--- a/Tiger.Business.MES/WorkAction/PrintLabel.cs
+++ b/Tiger.Business.MES/WorkAction/PrintLabel.cs
@@ -1,5 +1,4 @@
-锘縰sing MailKit.Search;
-using Rhea.Common;
+锘縰sing Rhea.Common;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -7,6 +6,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using Tiger.IBusiness;
+using Tiger.IBusiness.MES.WorkAction;
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
 
diff --git a/Tiger.Business.MES/WorkAction/WipExtInfo.cs b/Tiger.Business.MES/WorkAction/WipExtInfo.cs
new file mode 100644
index 0000000..9026560
--- /dev/null
+++ b/Tiger.Business.MES/WorkAction/WipExtInfo.cs
@@ -0,0 +1,293 @@
+锘縰sing Rhea.Common;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tiger.IBusiness;
+using Tiger.IBusiness.MES.WorkAction;
+using Tiger.Model;
+using Tiger.Model.Entitys.MES.Position;
+
+namespace Tiger.Business.MES.WorkAction
+{
+    public class WipExtInfo : IWipExtInfo
+    {
+        #region Propertys & Variables
+        #region 鍥哄畾鍐欐硶锛屽伐搴忎腑鐨勫繀瑕佷俊鎭�
+        public bool IsFinished { get; set; } = false;
+        public IWorkStep CurStep { get; set; }
+        public IPosition CurPosition { get; set; }
+        public MES_WO_NODE_ACT NodeAct { get; set; }
+        public MES_WO_ACTION Setting { get; set; }
+        #endregion
+        public List<BAS_PROD_BOM> Boms { get; set; } = new();
+        public Dictionary<string, List<BAS_ITEM>> SubItemDic { get; set; } = new();
+        public AssemblyInfo CurAssembly { get; set; } = new();
+        #endregion Propertys & Variables
+
+        #region Functions
+        /// <summary>
+        /// 鍒濆鍖栧伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public void Init(IWorkStep curStep, IPosition position, MES_WO_NODE_ACT nodeAct, MES_WO_ACTION setting)
+        {
+            #region 鍥哄畾鍐欐硶锛岀粰榛樿鍙橀噺璧嬪��
+            CurStep = curStep;
+            CurPosition = position;
+            NodeAct = nodeAct;
+            Setting = setting;
+            #endregion
+
+            //鑾峰彇浜у搧BOM
+            Boms = Biz.Db.Queryable<BAS_PROD_BOM>().Where(q => q.PROD_CODE == CurPosition.WorkBatch.WO.ITEM_CODE).ToList();
+            //鑾峰彇涓婃枡鐗╂枡
+            var assyList = new List<AssemblySetting>();
+            try
+            {
+                assyList = setting.ITEM_CODE.JsonToObject<List<AssemblySetting>>();
+            }
+            catch (System.Exception ex)
+            {
+                var codeList = setting.ITEM_CODE.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                foreach (var code in codeList)
+                {
+                    assyList.Add(new() { ItemCode = code });
+                }
+            }
+            var codes = assyList.Select(q => q.ItemCode).ToList();
+            var items = Biz.Db.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)
+            {
+                var info = items.FirstOrDefault(q => q.ITEM_CODE == assy.ItemCode);
+                if (!info.IsNullOrEmpty())
+                {
+                    var item = new AssemblyItem
+                    {
+                        ItemInfo = info,
+                        RuleCode = assy.RuleCode,
+                        LoadQty = assy.Qty,
+                    };
+                    var bom = Boms.FirstOrDefault(q => q.ITEM_CODE == assy.ItemCode);
+                    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();
+                        if (!SubItemDic.ContainsKey(assy.ItemCode))
+                        {
+                            SubItemDic.Add(assy.ItemCode, surItems);
+                        }
+                    }
+                    CurAssembly.Items.Add(item);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇琛屼负寮�濮嬬殑鎻愮ず淇℃伅
+        /// </summary>
+        /// <returns></returns>
+        public Locale GetBeginMsg()
+        {
+            var msg = new Locale("MES.WorkAction.WipExtInfo.BeginMsg", string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            //var msg = new Locale($"璇锋壂鎻忎互涓嬮渶瑕佷笂鏂欑殑鐗╂枡鏉$爜锛歿string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+            return msg;
+        }
+
+        /// <summary>
+        /// 灏濊瘯寮�濮嬫墽琛屽伐搴忚涓�
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> TryBegin(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            if (input.SN != CurPosition.CurWipSN.SN)
+            {
+                action = SaveAssembly(input, action);
+                return action;
+            }
+
+            //濡傛灉杩斿洖鎴愬姛鍒欒涓哄綋鍓嶈涓哄彲浠ュ紑濮嬫墽琛岋紝鍚﹀垯杩斿洖澶辫触
+            action.IsSuccessed = false;
+            return action;
+        }
+
+        /// <summary>
+        /// 宸ュ簭琛屼负鎻愪氦鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> Submit(SubmitInput input)
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            action = SaveAssembly(input, action);
+            //涓婃枡鏁版嵁淇濆瓨澶辫触
+            if (!action.IsSuccessed)
+            {
+                //濡傛灉琛屼负璁剧疆涓哄嚭閿欓渶瑕侀噸缃伐搴忔搷浣�
+                if (NodeAct.NEED_RESET == "Y")
+                {
+                    CurPosition.ResetNode();
+                }
+            }
+            return action;
+        }
+
+        public ApiAction<SubmitOutput> SaveAssembly(SubmitInput input, ApiAction<SubmitOutput> action)
+        {
+            try
+            {
+                foreach (var item in CurAssembly.Items.Where(q => !q.IsFinished))
+                {
+                    var isOK = true;
+                    //鏍规嵁鏉$爜瑙勫垯楠岃瘉涓婃枡鏄惁姝g‘
+                    if (!item.RuleCode.IsNullOrEmpty())
+                    {
+                        if (!Biz.CodeRule[item.RuleCode].IsNullOrEmpty())
+                        {
+                            var result = Biz.CodeRule[item.RuleCode].Verify(input.SN);
+                            if (!result.IsSuccessed)
+                            {
+                                isOK = false;
+                            }
+                        }
+                        //涓嶅瓨鍦ㄦ潯鐮佽鍒欙紝鍒欏垽鏂槸鍚︽湁鑷畾涔夎鍒欙紝娌℃湁鍒欒繑鍥炲け璐�
+                        else
+                        {
+                            switch (item.RuleCode)
+                            {
+                                case "鑷楠岃瘉":
+                                    break;
+                                default:
+                                    isOK = false;
+                                    break;
+                            }
+                        }
+                    }
+                    //楠岃瘉閫氳繃鍒欎繚瀛樹笂鏂欎俊鎭�
+                    if (isOK)
+                    {
+                        var record = new MES_WIP_ASSY()
+                        {
+                            AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                            AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                            SN = input.SN,
+                            PROD_SN = CurPosition.CurWipSN.SN,
+                            ITEM_CODE = item.ItemInfo.ITEM_CODE,
+                            QTY = 1,
+                            UNIT = item.ItemInfo.UNIT,
+                            WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                            BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                            ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                            NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                            NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                            FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                            WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                            LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                            POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                            OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                            SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                        };
+                        item.Records.Add(record);
+                        if (item.Records.Sum(q => q.QTY) >= item.LoadQty)
+                        {
+                            item.IsFinished = true;
+                        }
+
+                        action.IsSuccessed = true;
+                        action.Data.Data = CurAssembly;
+                        action.LocaleMsg = new Locale($"鎵弿鐗╂枡[{item.ItemInfo.ITEM_NAME}({item.ItemInfo.ITEM_CODE})鐨勬潯鐮乕{input.SN}]鎴愬姛锛岃缁х画涓婃枡");
+                        action.LocaleMsg = new Locale("MES.WorkAction.WipExtInfo.LoadSuccess", item.ItemInfo.ITEM_NAME, item.ItemInfo.ITEM_CODE);
+
+                        //涓婃枡瀹屾垚
+                        if (CurAssembly.IsFinished)
+                        {
+                            action = End();
+                        }
+                        return action;
+                    }
+                }
+                //閮芥病鏈夌墿鏂欓獙璇侀�氳繃锛屽垯杩斿洖閿欒淇℃伅
+                action.IsSuccessed = false;
+                //action.LocaleMsg = new($"鏉$爜[{input.SN}]楠岃瘉澶辫触锛屼笉鏄互涓嬬墿鏂欑殑鏉$爜锛歿string.Join("锛�", CurAssembly.Items.Where(q => !q.IsFinished).Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+                action.LocaleMsg = new("MES.WorkAction.WipExtInfo.LoadFail", input.SN, string.Join("锛�", CurAssembly.Items.Where(q => !q.IsFinished).Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            }
+            catch (System.Exception ex)
+            {
+                action.CatchExceptionWithLog(ex, $"涓婃枡琛屼负锛氶獙璇佹潯鐮乕{input.SN}]骞朵繚瀛樻暟鎹け璐�");
+                action.IsSuccessed = false;
+                action.LocaleMsg = new($"楠岃瘉鏉$爜[{input.SN}]骞朵繚瀛樻暟鎹け璐ワ紝宸ュ簭宸查噸缃紝璇烽噸鏂版壂鎻忚繘绔欎骇鍝佹潯鐮�");
+                action.LocaleMsg = new("MES.WorkAction.WipExtInfo.SaveAssemblyException", input.SN);
+                CurPosition.ResetNode();
+            }
+            return action;
+        }
+
+        /// <summary>
+        /// 缁撴潫鎵ц宸ュ簭琛屼负
+        /// </summary>
+        /// <returns></returns>
+        public ApiAction<SubmitOutput> End()
+        {
+            var action = new ApiAction<SubmitOutput>(new SubmitOutput());
+
+            //璁板綍琛屼负鎿嶄綔璁板綍
+            var wipAct = new MES_WIP_ACT()
+            {
+                AUTH_ORG = CurPosition.WorkBatch.WO.AUTH_ORG,
+                AUTH_PROD = CurPosition.CurLine.LINE_CODE,
+                HIS_ID = CurPosition.CurWipSNHis.ID,
+                SN = CurPosition.CurWipSN.SN,
+                STATUS = CurPosition.CurWipSN.STATUS,
+                ITEM_CODE = CurPosition.CurWipSN.ITEM_CODE,
+                WORK_ORDER = CurPosition.CurWipSN.WORK_ORDER,
+                BATCH_NO = CurPosition.CurWipSN.BATCH_NO,
+                ROT_CODE = CurPosition.CurWipSN.ROT_CODE,
+                NODE_ID = CurPosition.CurWipSN.NODE_ID,
+                NODE_NAME = CurPosition.CurWipSN.NODE_NAME,
+                ACT_ID = NodeAct.ID,
+                ACT_NAME = NodeAct.ACT_NAME,
+                FTY_CODE = CurPosition.CurWipSN.FTY_CODE,
+                WS_CODE = CurPosition.CurWipSN.WS_CODE,
+                LINE_CODE = CurPosition.CurWipSN.LINE_CODE,
+                POST_CODE = CurPosition.CurWipSN.POST_CODE,
+                OPER_CODE = CurPosition.CurWipSN.OPER_CODE,
+                SEGMENT = CurPosition.CurWipSN.SEGMENT,
+                TRAY_SN = CurPosition.CurWipSN.TRAY_SN,
+                OPERATION_TIME = DateTime.Now,
+                SFTS_CODE = CurPosition.CurWipSN.SFTS_CODE,
+                SFT_CODE = CurPosition.CurWipSN.SFT_CODE,
+                PRD_CODE = CurPosition.CurWipSN.PRD_CODE,
+                ACT_TYPE = NodeAct.ACT_TYPE,
+                ACT_SN = CurPosition.CurWipSN.SN,
+                ACT_VALUE_1 = CurAssembly.ToJson(),
+                ACT_RESULT = "Y",
+                TRACE_INFO = $"浠ヤ笅鐗╂枡涓婃枡瀹屾垚锛歿string.Join(",", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}",
+            };
+            var records = new List<MES_WIP_ASSY>();
+            foreach (var item in CurAssembly.Items)
+            {
+                records.AddRange(item.Records);
+            }
+
+            //淇濆瓨鏁版嵁
+            CurStep.DBSubmitAction = () =>
+            {
+                var db = CurPosition.GetCommitDB();
+                db.Storageable(wipAct, CurPosition.UserCode).ExecuteCommand();
+                db.Insertable(records, CurPosition.UserCode).ExecuteCommand();
+            };
+
+            IsFinished = true;
+            //action.LocaleMsg = new($"浠ヤ笅鐗╂枡涓婃枡瀹屾垚锛歿string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})"))}");
+            action.LocaleMsg = new("MES.WorkAction.WipExtInfo.LoadFinish", string.Join("锛�", CurAssembly.Items.Select(q => $"{q.ItemInfo.ITEM_NAME}({q.ItemInfo.ITEM_CODE})")));
+            return action;
+        }
+
+        #endregion Functions
+    }
+}
diff --git a/Tiger.IBusiness/MES/WorkAction/IAssembly.cs b/Tiger.IBusiness/MES/WorkAction/IAssembly.cs
new file mode 100644
index 0000000..5f682f6
--- /dev/null
+++ b/Tiger.IBusiness/MES/WorkAction/IAssembly.cs
@@ -0,0 +1,12 @@
+锘縰sing Newtonsoft.Json;
+using Rhea.Common;
+using System;
+using Tiger.Model;
+
+namespace Tiger.IBusiness.MES.WorkAction
+{
+    public interface IAssembly : IWorkAction
+    {
+
+    }
+}
diff --git a/Tiger.IBusiness/MES/WorkAction/IIPQC.cs b/Tiger.IBusiness/MES/WorkAction/IIPQC.cs
index c268f75..45e67cb 100644
--- a/Tiger.IBusiness/MES/WorkAction/IIPQC.cs
+++ b/Tiger.IBusiness/MES/WorkAction/IIPQC.cs
@@ -3,7 +3,7 @@
 using System;
 using Tiger.Model;
 
-namespace Tiger.IBusiness
+namespace Tiger.IBusiness.MES.WorkAction
 {
     public interface IIPQC : IWorkAction
     {
diff --git a/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs b/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
index bdd1a26..daf8e85 100644
--- a/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
+++ b/Tiger.IBusiness/MES/WorkAction/IPackingAction.cs
@@ -4,7 +4,7 @@
 using Tiger.Model;
 using Tiger.Model.Entitys.MES.Position;
 
-namespace Tiger.IBusiness
+namespace Tiger.IBusiness.MES.WorkAction
 {
     public interface IPackingAction : IWorkAction
     {
diff --git a/Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs b/Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs
index 0d5e392..32b552e 100644
--- a/Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs
+++ b/Tiger.IBusiness/MES/WorkAction/IPrintLabel.cs
@@ -3,7 +3,7 @@
 using System;
 using Tiger.Model;
 
-namespace Tiger.IBusiness
+namespace Tiger.IBusiness.MES.WorkAction
 {
     public interface IPrintLabel : IWorkAction
     {
diff --git a/Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs b/Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs
new file mode 100644
index 0000000..d63f01e
--- /dev/null
+++ b/Tiger.IBusiness/MES/WorkAction/IWipExtInfo.cs
@@ -0,0 +1,12 @@
+锘縰sing Newtonsoft.Json;
+using Rhea.Common;
+using System;
+using Tiger.Model;
+
+namespace Tiger.IBusiness.MES.WorkAction
+{
+    public interface IWipExtInfo : IWorkAction
+    {
+
+    }
+}
diff --git a/Tiger.Model.Net/Entitys/MES/MES_WIP_ASSY.cs b/Tiger.Model.Net/Entitys/MES/MES_WIP_ASSY.cs
new file mode 100644
index 0000000..46be0c6
--- /dev/null
+++ b/Tiger.Model.Net/Entitys/MES/MES_WIP_ASSY.cs
@@ -0,0 +1,156 @@
+using System;
+using SqlSugar;
+using System.Linq;
+using System.ComponentModel;
+using System.Collections.Generic;
+
+namespace Tiger.Model
+{
+	/// <summary>
+	/// 实体:生产上料记录
+	/// </summary>
+	[Description("Primary:ID")]
+	[DisplayName("生产上料记录")]
+	[Serializable]
+	[SugarTable("MES_WIP_ASSY")]
+	public class MES_WIP_ASSY : DbEntityWithAuth
+	{
+		#region 构造函数
+		/// <summary>
+		/// 实体:生产上料记录
+		/// </summary>
+		public MES_WIP_ASSY() {}
+		#endregion
+
+		#region 公共属性
+		/// <summary>
+		/// 物料条码
+		/// </summary>
+		[DisplayName("物料条码")]
+		public string SN { get; set; }
+		/// <summary>
+		/// 产品条码
+		/// </summary>
+		[DisplayName("产品条码")]
+		public string PROD_SN { get; set; }
+		/// <summary>
+		/// 物料编码
+		/// </summary>
+		[DisplayName("物料编码")]
+		public string ITEM_CODE { get; set; }
+		/// <summary>
+		/// 数量
+		/// </summary>
+		[DisplayName("数量")]
+		public double QTY { get; set; }
+		/// <summary>
+		/// 单位
+		/// </summary>
+		[DisplayName("单位")]
+		public string UNIT { get; set; }
+		/// <summary>
+		/// 工单号
+		/// </summary>
+		[DisplayName("工单号")]
+		public string WORK_ORDER { get; set; }
+		/// <summary>
+		/// 工单批次号
+		/// </summary>
+		[DisplayName("工单批次号")]
+		public string BATCH_NO { get; set; }
+		/// <summary>
+		/// 工艺路线编码
+		/// </summary>
+		[DisplayName("工艺路线编码")]
+		public string ROT_CODE { get; set; }
+		/// <summary>
+		/// 工艺路线节点ID
+		/// </summary>
+		[DisplayName("工艺路线节点ID")]
+		public string NODE_ID { get; set; }
+		/// <summary>
+		/// 工艺路线节点名称
+		/// </summary>
+		[DisplayName("工艺路线节点名称")]
+		public string NODE_NAME { get; set; }
+		/// <summary>
+		/// 工厂编码
+		/// </summary>
+		[DisplayName("工厂编码")]
+		public string FTY_CODE { get; set; }
+		/// <summary>
+		/// 车间编码
+		/// </summary>
+		[DisplayName("车间编码")]
+		public string WS_CODE { get; set; }
+		/// <summary>
+		/// 产线编码
+		/// </summary>
+		[DisplayName("产线编码")]
+		public string LINE_CODE { get; set; }
+		/// <summary>
+		/// 岗位编码
+		/// </summary>
+		[DisplayName("岗位编码")]
+		public string POST_CODE { get; set; }
+		/// <summary>
+		/// 工序编码
+		/// </summary>
+		[DisplayName("工序编码")]
+		public string OPER_CODE { get; set; }
+		/// <summary>
+		/// 加工段
+		/// </summary>
+		[DisplayName("加工段")]
+		public string SEGMENT { get; set; }
+		/// <summary>
+		/// 备注
+		/// </summary>
+		[DisplayName("备注")]
+		public string REMARK { get; set; }
+		/// <summary>
+		/// 追溯信息
+		/// </summary>
+		[DisplayName("追溯信息")]
+		public string TRACE_INFO { get; set; }
+		#endregion
+
+		#region 虚拟属性
+		/*例子
+		[SugarColumn(IsIgnore = true)]
+		public string FieldName { get; set; }
+		*/
+		#endregion
+
+		#region 外键属性
+		/*例子
+		//一对一外键导航
+		[Navigate(NavigateType.OneToOne, nameof(ClassAId))]//一对一 ClassAId是MES_WIP_ASSY类里面的外键ID字段
+		public ClassA ClassA { get; set; } //注意禁止手动赋值,只能是null
+		//一对多外键导航
+		[Navigate(NavigateType.OneToMany, nameof(ClassA.MES_WIP_ASSYId))]//ClassA表中的MES_WIP_ASSYId
+		public List<ClassA> ClassAList { get; set; }//注意禁止手动赋值,只能是null
+		//多对多外键导航
+		[Navigate(typeof(MappingClass), nameof(MappingClass.MES_WIP_ASSYId), nameof(MappingClass.ClassAId))]//注意顺序
+		public List<ClassA> ClassAList { get; set; } //注意禁止手动赋值,只能是null
+		*/
+		#endregion
+
+		#region 枚举变量
+		/*例子
+		public enum FieldNames
+		{
+			[Description("枚举描述0")]
+			Enum0,
+			[Description("枚举描述1")]
+			Enum1,
+		}
+		*/
+		#endregion
+
+		#region 公共方法
+
+		#endregion
+
+	}//endClass
+}
\ No newline at end of file
diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
index c333f07..f5a525f 100644
--- a/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
+++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/PositionParameter.cs
@@ -163,4 +163,37 @@
         public List<WipPkgItem> Items { get; set; } = new List<WipPkgItem>();
         
     }
+
+    /// <summary>
+    /// 涓婃枡璁剧疆
+    /// </summary>
+    public class AssemblySetting
+    {
+        public string ItemCode { get; set; }
+        public string RuleCode { get; set; } 
+        public int Qty { get; set; } 
+    }
+
+    /// <summary>
+    /// 涓婃枡淇℃伅
+    /// </summary>
+    public class AssemblyInfo
+    {
+        public MES_WIP_DATA Product { get; set; }
+        public bool IsFinished => !Items.Any(q => !q.IsFinished);
+        public List<AssemblyItem> Items { get; set; } = new List<AssemblyItem>();
+    }
+
+    /// <summary>
+    /// 涓婃枡淇℃伅鏄庣粏
+    /// </summary>
+    public class AssemblyItem
+    {
+        public BAS_ITEM ItemInfo { get; set; }
+        public string RuleCode { get; set; }
+        public int LoadQty { get; set; }
+        public List<MES_WIP_ASSY> Records { get; set; } = new List<MES_WIP_ASSY>();
+        public bool IsFinished { get; set; } = false;
+
+    }
 }
diff --git a/Tiger.Model.Net/Tiger.Model.Net.csproj b/Tiger.Model.Net/Tiger.Model.Net.csproj
index 9b87fb0..ec6ce45 100644
--- a/Tiger.Model.Net/Tiger.Model.Net.csproj
+++ b/Tiger.Model.Net/Tiger.Model.Net.csproj
@@ -139,6 +139,7 @@
     <Compile Include="Entitys\MES\MES_SHIFT_PRD.cs" />
     <Compile Include="Entitys\MES\MES_SHIFT_SYS.cs" />
     <Compile Include="Entitys\MES\MES_WIP_ACT.cs" />
+    <Compile Include="Entitys\MES\MES_WIP_ASSY.cs" />
     <Compile Include="Entitys\MES\MES_WIP_DATA.cs" />
     <Compile Include="Entitys\MES\MES_WIP_DFT.cs" />
     <Compile Include="Entitys\MES\MES_WIP_EXT.cs" />

--
Gitblit v1.9.3