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