From eb0ad83719de660e5c4f7676aea4710625b6bd51 Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期四, 19 十二月 2024 21:55:43 +0800 Subject: [PATCH] WMS增加标准上下架功能事务 --- Tiger.Business.MES/Common/WorkBatch.cs | 108 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 72 insertions(+), 36 deletions(-) diff --git a/Tiger.Business.MES/Common/WorkBatch.cs b/Tiger.Business.MES/Common/WorkBatch.cs index 50e3fe1..1fa994a 100644 --- a/Tiger.Business.MES/Common/WorkBatch.cs +++ b/Tiger.Business.MES/Common/WorkBatch.cs @@ -10,8 +10,8 @@ using Tiger.IBusiness; using Tiger.Model.Entitys.MES.Position; using Tiger.Business.MES; -using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; using Org.BouncyCastle.Ocsp; +using System.IO; namespace Tiger.Business { @@ -49,7 +49,7 @@ #region Functions /// <summary> - /// 鍒濆鍖栧伐鍗曡祫鏂� + /// 鍒濆鍖栧伐鍗曟壒娆¤祫鏂� /// </summary> /// <returns></returns> public WorkBatch Init(string lineCode) @@ -62,8 +62,13 @@ return this; } + /// <summary> + /// 鏇存柊宸ュ崟鎵规璧勬枡 + /// </summary> + /// <param name="updateAll"></param> public void Update(bool updateAll = false) { + var strat = DateTime.Now; var wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(q => q.ORDER_NO == OrderNo).IncludesAllFirstLayer().First(); var batch = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => q.BATCH_NO == Batch.BATCH_NO).First(); if (WoContext.WoBatchDic.ContainsKey(batch.BATCH_NO)) @@ -72,7 +77,7 @@ { WoContext.WoBatchDic.Remove(Batch.BATCH_NO); } - else if(updateAll || wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME) + else if(updateAll || wo.CHANGE_TIME > WO.CHANGE_TIME || batch.CHANGE_TIME > Batch.CHANGE_TIME) { GetBatchInfo(); } @@ -84,10 +89,12 @@ } WO = wo; Batch = batch; + ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss} ##### : {(DateTime.Now - strat).TotalSeconds}s", ConsoleColor.Yellow); } private void GetBatchInfo() { + ConsoleExt.WriteLine($"{DateTime.Now:HH:mm:ss} !!!!! ", ConsoleColor.Cyan); Product = Biz.Db.Queryable<BAS_ITEM>().Where(q => q.ITEM_CODE == WO.ITEM_CODE && q.AUTH_ORG == WO.AUTH_ORG).IncludesAllFirstLayer().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(); @@ -162,20 +169,22 @@ action.LocaleMsg = new("MES.WorkBatch.WoStatusCanNotWork", WO.ORDER_NO, Batch.STATUS.GetEnumDesc<BIZ_MES_WO.STATUSs>()); } //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜� - if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= Batch.PLAN_QTY) + var batchInput = WoSNs.Where(q => q.BATCH_NO == Batch.BATCH_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()).DistinctBy(q => q.WIP_ID).Sum(q => q.QTY); + if (curNode.IS_FIRST_NODE == "Y" && batchInput >= 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), WoSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), Batch.PLAN_QTY); + action.LocaleMsg = new("MES.WorkBatch.BatchInputEnough", Batch.BATCH_NO, batchInput, WoSNs.Where(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()).DistinctBy(q => q.WIP_ID).Sum(q => q.QTY), Batch.PLAN_QTY); } //宸ュ崟鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜� - if (curNode.IS_FIRST_NODE == "Y" && WoSNs.Count(q =>q.WORK_ORDER == WO.ORDER_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) >= WO.PLAN_QTY) + var woInput = WoSNs.Where(q => q.WORK_ORDER == WO.ORDER_NO && BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() < q.STATUS && q.STATUS <= BIZ_MES_WO_SN.STATUSs.Finished.GetValue()).DistinctBy(q => q.WIP_ID).Sum(q => q.QTY); + if (curNode.IS_FIRST_NODE == "Y" && woInput >= 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), WoSNs.Count(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()), WO.PLAN_QTY); + action.LocaleMsg = new("MES.WorkBatch.WoInputEnough", WO.ORDER_NO, woInput, WoSNs.Where(q => q.WORK_ORDER == WO.ORDER_NO && q.STATUS > BIZ_MES_WO_SN.STATUSs.Finished.GetValue()).DistinctBy(q => q.WIP_ID).Sum(q => q.QTY), WO.PLAN_QTY); } return action; @@ -198,8 +207,8 @@ 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(); + db.Updateable(WO, user).UpdateColumns(q => new { q.STATUS, q.ACT_START_TIME }).ExecuteCommand(); + db.Updateable(Batch, user).UpdateColumns(q => new { q.STATUS, q.ACT_START_TIME }).ExecuteCommand(); }); if (!dbTran.IsSuccess) { @@ -346,6 +355,7 @@ action.IsSuccessed = false; action.Data.SetValue(this, null); var nextList = Nodes.Where(q => q.IS_FIRST_NODE == "Y"); + //action.LocaleMsg = new($"鏉$爜[{0}]鍦ㄥ伐搴廩{1}]杩囩珯鎵弿閿欒锛岃鍏堥�氳繃浠ヤ笅宸ュ簭锛歿2}"); action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (GetNodeSetting(q)?.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); return action; } @@ -382,22 +392,25 @@ 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($"宸ュ簭[{0}]涓嶆槸鏉$爜[{1}]鍦ㄥ伐搴廩{2}]缁翠慨鍚庡彲鍥炴祦鐨勫伐搴忥紝璇烽�夋嫨鍥炴祦鍒颁互涓嬪伐搴忥細{3}"); action.LocaleMsg = new("MES.WorkBatch.ReflowToNodeException", nextNode.NODE_NAME, input.SN, curNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (GetNodeSetting(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 { + //涓嶈壇鍝佸叆绔欙細濡傛灉浜у搧鏈変笉鑹褰曚笖鐩爣宸ュ簭涓嶆槸缁翠慨宸ュ簭涓斾笉鍏佽涓嶈壇鍝佸叆绔欙紝鍒欐姤閿� + if (wipSN.Defects.Any(q => 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($"宸ュ簭[{0}]涓嶅厑璁镐笉鑹搧鍏ョ珯锛屾潯鐮乕{1}]瀛樺湪涓嶈壇璁板綍锛岃鍏堟寜娴佺▼鎸囧紩鎿嶄綔鎴栬�呰繘鍏ョ淮淇�"); + action.LocaleMsg = new("MES.WorkBatch.PleaseGotoRepair", curNode.NODE_NAME, input.SN); + return action; + } + //娣诲姞鏉$爜褰撳墠宸ュ簭鐨勪笅涓�涓彲鎵ц宸ュ簭 var nextNodes = GetNextNodes(curNode, wipSN); //濡傛灉涓嬩竴涓彲鎵ц宸ュ簭鍖呭惈鐩爣宸ュ簭鍒欏厑璁歌繘绔� @@ -412,7 +425,8 @@ { 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")); + var nextList = nextNodes.Where(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y")); + //action.LocaleMsg = new($"鏉$爜[{0}]鍦ㄥ伐搴廩{1}]杩囩珯鎵弿閿欒锛岃鍏堥�氳繃浠ヤ笅宸ュ簭锛歿2}"); action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (GetNodeSetting(q)?.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); return action; } @@ -442,6 +456,7 @@ 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($"鏉$爜[{0}]鍦ㄥ伐搴廩{1}]杩囩珯鎵弿閿欒锛岃鍏堥�氳繃浠ヤ笅宸ュ簭锛歿2}"); action.LocaleMsg = new("MES.WorkBatch.GotoNextNodeException", input.SN, nextNode.NODE_NAME, string.Join(", ", nextList.Select(q => q.NODE_NAME + (GetNodeSetting(q)?.CAN_SKIP == "Y" ? $"({Biz.T(Biz.L("MES.WorkBatch.Optional"), input.Locale)})" : "")))); return action; } @@ -460,7 +475,7 @@ 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() + 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.UNBIND_FLAG != "Y" && h.NODE_ID == q.ID && h.IsFinished) ).ToList(); @@ -601,36 +616,40 @@ var batchs = wipList.Where(q => !q.BATCH_NO.IsNullOrEmpty()).GroupBy(q => new { q.BATCH_NO }).Select(g => new { g.Key.BATCH_NO, Qty = g.Count(), - FinishQty = g.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue()), + OutQty = g.Count(q => MES_WIP_DATA.STATUSs.Output.GetValue() <= q.STATUS && q.STATUS < MES_WIP_DATA.STATUSs.InStorage.GetValue()), }); var db = Biz.Db; var dbTran = db.UseTran(() => { //BIZ_MES_WO wo.INPUT_QTY -= wipList.Count; - wo.OUTPUT_QTY -= wipList.Count(q => q.STATUS == MES_WIP_DATA.STATUSs.Finished.GetValue()); + wo.OUTPUT_QTY -= wipList.Count(q => MES_WIP_DATA.STATUSs.Output.GetValue() <= q.STATUS && q.STATUS < MES_WIP_DATA.STATUSs.InStorage.GetValue()); wo.SCRAP_QTY += wipList.Count; - db.Updateable(wo, user).UpdateColumns(q => new { q.INPUT_QTY, q.OUTPUT_QTY, q.SCRAP_QTY, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand(); + wo.STATUS = wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>() == BIZ_MES_WO.STATUSs.Closed ? BIZ_MES_WO.STATUSs.Working.GetValue() : wo.STATUS; + db.Updateable(wo, user).UpdateColumns(q => new { q.INPUT_QTY, q.OUTPUT_QTY, q.SCRAP_QTY, q.UPDATE_USER, q.UPDATE_TIME, q.STATUS }).ExecuteCommand(); //BIZ_MES_WO_BATCH - foreach (var batch in batchs) + var wobatchs = Biz.Db.Queryable<BIZ_MES_WO_BATCH>().Where(q => batchs.Select(x => x.BATCH_NO).Contains(q.BATCH_NO)).ToList(); + foreach (var batch in wobatchs) { - db.Updateable<BIZ_MES_WO_BATCH>(user) - .SetColumns(q => q.INPUT_QTY == q.INPUT_QTY - batch.Qty) - .SetColumns(q => q.OUTPUT_QTY == q.OUTPUT_QTY - batch.FinishQty) - .SetColumns(q => q.SCRAP_QTY == q.SCRAP_QTY + batch.Qty) - .Where(q => q.BATCH_NO == q.BATCH_NO) - .ExecuteCommand(); + batch.INPUT_QTY -= batchs.Where(q=>q.BATCH_NO == batch.BATCH_NO).First().Qty; + batch.OUTPUT_QTY -= batchs.Where(q => q.BATCH_NO == batch.BATCH_NO).First().OutQty; + batch.SCRAP_QTY += batchs.Where(q => q.BATCH_NO == batch.BATCH_NO).First().Qty; + batch.STATUS = batch.STATUS.GetEnum<BIZ_MES_WO_BATCH.STATUSs>() == BIZ_MES_WO_BATCH.STATUSs.Closed ? BIZ_MES_WO_BATCH.STATUSs.Working.GetValue() : batch.STATUS; } + db.Updateable(wobatchs, user).UpdateColumns(q => new { q.INPUT_QTY, q.OUTPUT_QTY, q.SCRAP_QTY, q.UPDATE_USER, q.UPDATE_TIME, q.STATUS }).ExecuteCommand(); //BIZ_MES_WO_SN db.Updateable<BIZ_MES_WO_SN>(user) .SetColumns(q => q.STATUS == BIZ_MES_WO_SN.STATUSs.Offline.GetValue()) + .SetColumns(q => q.TRAY_SN == null).SetColumns(q => q.OUTER_SN == null) .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID)) .ExecuteCommand(); //MES_WIP_DATA & MES_WIP_HIS var wipHiss = new List<MES_WIP_HIS>(); - foreach (var wipSN in wipList.Where(q => q.STATUS != MES_WIP_DATA.STATUSs.Offline.GetValue())) + foreach (var wipSN in wipList) //.Where(q => q.STATUS != MES_WIP_DATA.STATUSs.Offline.GetValue()) { wipSN.STATUS = MES_WIP_DATA.STATUSs.Offline.GetValue(); + wipSN.TRAY_SN = wipSN.INNER_SN = wipSN.CARTON_SN = wipSN.PALLET_SN = wipSN.SHIPPING_ORDER = null; + wipSN.FINISHED_FLAG = wipSN.HOLD_FLAG = "N"; wipSN.UNBIND_FLAG = "Y"; wipSN.NODE_ID = ""; wipSN.NODE_NAME = "涓嬬嚎閫�搴�"; @@ -659,19 +678,36 @@ } } while (curpkg.Any()); - db.Updateable(curpkg, user).ExecuteCommand(); + db.Updateable(pkgs, user).ExecuteCommand(); //MES_WIP_DFT锛屽湪涓婁粨搴撹閰嶅拰缁翠慨涔嬪墠锛屽厛鎶婁笉鑹褰曟爣璁颁负宸插鐞� - db.Updateable<MES_WIP_DFT>(user) - .SetColumns(q => q.STATUS == MES_WIP_DFT.STATUSs.Resolved.GetValue()) - .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID)) + db.Updateable<MES_WIP_DATA>(user) + .SetColumns(q => q.DFT_FLAG == "N") + .SetColumns(q => q.DFT_COUNT == 0) + .SetColumns(q => q.DFT_CODE == null) + .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.ID)) .ExecuteCommand(); + db.Updateable<MES_WIP_DFT>(user) + .SetColumns(q => q.STATUS == MES_WIP_DFT.STATUSs.Resolved.GetValue()) + .Where(q => q.WORK_ORDER == wo.ORDER_NO && wipIDs.Contains(q.WIP_ID)) + .ExecuteCommand(); }); if (!dbTran.IsSuccess) { //鎶涘嚭寮傚父 throw dbTran.ErrorException; } - + //鏇存柊宸ュ崟姹犱腑鐨勫伐鍗曟潯鐮佽〃鏁版嵁鐨勭姸鎬� + foreach (var item in WoContext.WoBatchDic) + { + if (item.Value.WO.ORDER_NO == wo.ORDER_NO) + { + foreach (var woSn in item.Value.WoSNs.Where(q => wipIDs.Contains(q.WIP_ID))) + { + woSn.STATUS = BIZ_MES_WO_SN.STATUSs.Offline.GetValue(); + } + item.Value.Update(); + } + } return action; } #endregion -- Gitblit v1.9.3