From 9fe67118a220448d5d9647733d6c8308f069e4da Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期日, 13 十月 2024 16:05:23 +0800 Subject: [PATCH] 增加工艺路线必须要有结束节点,及其流程相应优化 增加工单批次自动关单 增加判断条码是未投入生产还是已经完工产出 --- Tiger.Business.MES/Common/WorkBatch.cs | 103 ++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 85 insertions(+), 18 deletions(-) diff --git a/Tiger.Business.MES/Common/WorkBatch.cs b/Tiger.Business.MES/Common/WorkBatch.cs index a18e11a..214a269 100644 --- a/Tiger.Business.MES/Common/WorkBatch.cs +++ b/Tiger.Business.MES/Common/WorkBatch.cs @@ -53,25 +53,40 @@ public WorkBatch Init(string lineCode) { LineCode = lineCode; + 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 && + (q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())).First(); GetBatchInfo(); return this; } public void Update() { - if (!WoContext.WoBatchDic.ContainsKey(Batch.BATCH_NO)) + 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)) + { + if (wo.STATUS > BIZ_MES_WO.STATUSs.Working.GetValue() || batch.STATUS > BIZ_MES_WO_BATCH.STATUSs.Working.GetValue()) + { + WoContext.WoBatchDic.Remove(Batch.BATCH_NO); + } + else if(wo.UPDATE_TIME > WO.UPDATE_TIME || batch.UPDATE_TIME > Batch.UPDATE_TIME) + { + GetBatchInfo(); + } + } + else { GetBatchInfo(); - WoContext.WoBatchDic.Add(Batch.BATCH_NO, this); + WoContext.WoBatchDic.Add(batch.BATCH_NO, this); } + WO = wo; + Batch = batch; } 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(); @@ -90,7 +105,7 @@ } /// <summary> - /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃 + /// 閫掑綊閬嶅巻宸ュ簭鑺傜偣锛岀粰涓嬬骇宸ュ簭鑺傜偣鎺掑簭鍜屾暣鐞嗗墠缃伐搴� /// </summary> /// <param name="parent"></param> private void NodeSorting(MES_WO_NODE parent) @@ -122,12 +137,12 @@ /// </summary> /// <param name="curNode"></param> /// <returns></returns> - public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode) + public ApiAction<SubmitOutput> CheckCanProduce(MES_WO_NODE curNode, MES_WO_OPER curNodeSetting) { 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(); + Update(); + //宸ュ崟鎵规鐘舵�佷笉鏄凡涓嬪彂鎴栬�呯敓浜т腑锛屽垯涓嶅厑璁哥敓浜� if (Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() && Batch.STATUS != BIZ_MES_WO_BATCH.STATUSs.Working.GetValue()) { @@ -146,7 +161,7 @@ } //宸ュ崟鎵规鎶曞叆鏁伴噺鍑忓幓鎶ュ簾鏁伴噺濡傛灉澶т簬绛変簬璁″垝鏁伴噺锛屽垯涓嶅厑璁哥敓浜� //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) + if (curNodeSetting.IS_INPUT == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.BATCH_NO == Batch.BATCH_NO) - Batch.SCRAP_QTY >= Batch.PLAN_QTY) { action.IsSuccessed = false; action.Data.SetValue(this, null); @@ -154,7 +169,7 @@ 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) + if (curNodeSetting.IS_INPUT == "Y" && WoSNs.Count(q => q.STATUS > BIZ_MES_WO_SN.STATUSs.NotInput.GetValue() && q.WORK_ORDER == WO.ORDER_NO) - WO.SCRAP_QTY >= WO.PLAN_QTY) { action.IsSuccessed = false; action.Data.SetValue(this, null); @@ -222,6 +237,48 @@ } /// <summary> + /// 妫�鏌ュ伐鍗曟槸鍚﹀畬宸ワ紝宸插畬宸ュ垯淇敼鐩稿簲鐘舵�佸苟璁板綍鍒版暟鎹簱 + /// </summary> + /// <param name="user"></param> + /// <returns></returns> + public async Task<bool> CheckIsComplete(string user) + { + var woSNs = Biz.Db.Queryable<BIZ_MES_WO_SN>().Where(q => q.WORK_ORDER == OrderNo).ToList(); + + //鍒ゆ柇褰撳墠宸ュ崟鎵规鏄惁宸插畬宸� + if (!woSNs.Any(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) && + woSNs.Count(q => q.BATCH_NO == Batch.BATCH_NO && q.STATUS == BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) == Batch.PLAN_QTY) + { + Batch.STATUS = BIZ_MES_WO_BATCH.STATUSs.Closed.GetValue(); + Batch.ACT_END_TIME = DateTime.Now; + } + + //鍒ゆ柇褰撳墠宸ュ崟鏄惁宸插畬宸� + if (!woSNs.Any(q => q.STATUS < BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) && + woSNs.Count(q => q.STATUS == BIZ_MES_WO_SN.STATUSs.Finished.GetValue()) == WO.PLAN_QTY) + { + WO.STATUS = BIZ_MES_WO.STATUSs.Closed.GetValue(); + WO.ACT_END_TIME = DateTime.Now; + } + + //淇濆瓨鏁版嵁搴� + 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_END_TIME }).ExecuteCommand(); + db.Updateable(Batch, user).UpdateColumns(q => new { q.UPDATE_TIME, q.UPDATE_USER, q.STATUS, q.ACT_END_TIME }).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + //throw dbTran.ErrorException; + Logger.Default.Fatal(dbTran.ErrorException, $"妫�鏌ュ伐鍗曟壒娆{Batch.BATCH_NO}]鏄惁瀹屽伐寮傚父"); + return false; + } + + return true; + } + + /// <summary> /// 鏍规嵁宀椾綅缂栫爜鍒ゆ柇鏄笉鏄绔� /// </summary> /// <param name="postCode"></param> @@ -239,6 +296,16 @@ 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="postCode"></param> + /// <returns></returns> + public MES_WO_OPER GetNodeSetting(MES_WO_NODE node) + { + return NodeSets.FirstOrDefault(q => q.NODE_ID == node?.ID); } /// <summary> @@ -265,7 +332,7 @@ 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)})" : "")))); + 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; } } @@ -301,7 +368,7 @@ 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)})" : "")))); + 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; } } @@ -327,12 +394,12 @@ } //濡傛灉褰撳墠宸ュ簭鏈夊繀椤绘墽琛岀殑鍚庣画宸ュ簭锛屽垯鎶ラ敊 - if (nextNodes.Any(q => NodeSets.Any(s => s.NODE_ID == q.ID && s.IS_ACTIVE == "Y" && s.CAN_SKIP != "Y"))) + if (nextNodes.Any(q => q.OPER_CODE != "EndNode" && 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)})" : "")))); + 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; } //濡傛灉褰撳墠宸ュ簭娌℃湁蹇呴』鎵ц鐨勫悗缁伐搴忥紝鍒欏湪鍓嶇疆宸ュ簭鏌ユ壘杩樻湁娌℃湁鍚庣画宸ュ簭娌″畬鎴愮殑宸ュ簭锛屾湁鍒欏皾璇曟墽琛� @@ -361,7 +428,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("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)})" : "")))); + 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; } } @@ -372,7 +439,7 @@ } /// <summary> - /// 娣诲姞鑺傜偣鐨勪笅涓�涓彲鎵ц鑺傜偣 + /// 鑾峰彇鑺傜偣鐨勪笅涓�涓彲鎵ц鑺傜偣锛堟帓闄ゆ湁鍓嶇疆宸ュ簭鏈畬鎴愮殑鑺傜偣锛� /// </summary> /// <param name="parent"></param> /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曚俊鎭�</param> @@ -407,7 +474,7 @@ } /// <summary> - /// 鏍规嵁浼犲叆鐨勬潯鐮佽繑鍥炰笅涓�绔欏彲杩涘叆杩涘叆鐨勭洰鏍囧伐搴� + /// 鏍规嵁浼犲叆鐨勬潯鐮佽繑鍥炰笅涓�绔欏彲杩涘叆鐨勭洰鏍囧伐搴� /// </summary> /// <param name="wipSN">褰撳墠鐨勬潯鐮佽繃绔欒褰曪紝闇�瑕佸鑸煡璇㈢敓浜ц繃绋嬭褰曞拰鐢熶骇涓嶈壇璁板綍淇℃伅</param> /// <returns></returns> -- Gitblit v1.9.3