From 201b456883c4d4799561fd17acec3f8c2111445f Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期一, 29 七月 2024 18:09:22 +0800 Subject: [PATCH] 获取过程变量优化 --- Tiger.Business.MES/Transaction/Position.cs | 243 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 233 insertions(+), 10 deletions(-) diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs index 498f67b..99879d9 100644 --- a/Tiger.Business.MES/Transaction/Position.cs +++ b/Tiger.Business.MES/Transaction/Position.cs @@ -10,9 +10,7 @@ using System.Threading.Tasks; using Tiger.Model; using static Tiger.Business.Biz; -using Org.BouncyCastle.Ocsp; using Tiger.Model.Entitys.MES.Position; -using MailKit.Search; namespace Tiger.Business.MES.Transaction { @@ -41,6 +39,9 @@ //if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"MES.Transaction.Position.FactoryNotExistsException", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}")); if (CurFactory.IsNullOrEmpty()) throw new InvalidDataException($"宀椾綅[{postCode}]鎵�灞炵殑宸ュ巶[{CurWorkshop.FTY_CODE}]涓嶅瓨鍦紝璇峰厛璁剧疆鎵�灞炲伐鍘�", new Exception($"{postCode}|{CurWorkshop.FTY_CODE}")); + //鍔犺浇褰撳墠浜х嚎鐨勭彮鍒� + CurShiftSys = Biz.Db.Queryable<MES_SHIFT_SYS>().Where(q => q.SFTS_CODE == CurLine.SFTS_CODE).IncludesAllFirstLayer().IncludesAllSecondLayer(q => q.Shifts).First(); + return this; } @@ -51,12 +52,18 @@ public MES_WORKSHOP CurWorkshop { get; set; } public MES_LINE CurLine { get; set; } public MES_POSITION CurPosition { get; set; } + public MES_SHIFT_SYS CurShiftSys { get; set; } public WorkBatch CurBatch { get; set; } public IWorkBatch WorkBatch => CurBatch; public MES_WIP_DATA CurWipSN { get; set; } + public MES_WIP_HIS CurWipSNHis { get; set; } + public Dictionary<string, object> Context { get; set; } = new(); public List<WorkStep> Steps { get; set; } = new(); - public bool IsFinishAllSteps => Steps.Any() && !Steps.Any(q => !q.IsFinished); - public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0; + public WorkStep CurStep { get; set; } + public List<WorkStep> NextSteps { get; set; } = new(); + public bool IsFinishNodeSteps => !Steps.Any(q => q.Type == IWorkStep.Types.Node && !q.IsFinished); + public bool IsFinishAllSteps => !Steps.Any() || !Steps.Any(q => !q.IsFinished); + //public int CurStep => Steps.Where(q => !q.IsFinished).OrderBy(q => q.Sequence).FirstOrDefault()?.Sequence ?? 0; private DbClient CommitDB; #endregion Propertys & Variables @@ -86,23 +93,23 @@ if (wo.IsNullOrEmpty()) { action.IsSuccessed = false; - action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]涓嶅瓨鍦�", input.OrderNo); - //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.EmptyException", input.OrderNO); + //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]涓嶅瓨鍦�", input.OrderNo); + action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.EmptyException", input.OrderNo); return action; } if (wo.STATUS != BIZ_MES_WO.STATUSs.Release.GetValue() && wo.STATUS != BIZ_MES_WO.STATUSs.Working.GetValue()) { action.IsSuccessed = false; - action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]鐘舵�乕{wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶈兘鐢熶骇"); - //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNO, query.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()); + //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]鐘舵�乕{wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()}]涓嶈兘鐢熶骇"); + action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.StatusException", input.OrderNo, wo.STATUS.GetEnum<BIZ_MES_WO.STATUSs>().GetName()); return action; } var batch = await Biz.Db.Queryable<BIZ_MES_WO_BATCH>().ByAuth(input.AuthOption).Where(q => q.ORDER_NO == input.OrderNo && q.ACT_LINE == CurLine.LINE_CODE).FirstAsync(); if (batch.IsNullOrEmpty()) { action.IsSuccessed = false; - action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]娌℃湁涓嬪彂鍒颁骇绾跨姸鎬乕{CurLine.LINE_CODE}]"); - //action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.LineException", input.OrderNO, CurLine.LINE_CODE); + //action.LocaleMsg = new($"宸ュ崟[{input.OrderNo}]娌℃湁涓嬪彂鍒颁骇绾跨姸鎬乕{CurLine.LINE_CODE}]"); + action.LocaleMsg = new("MES.Transaction.Position.SelectOrder.LineException", input.OrderNo, CurLine.LINE_CODE); return action; } var wb = new WorkBatch(input.OrderNo).Init(CurLine.LINE_CODE); @@ -119,6 +126,27 @@ } /// <summary> + /// 鑾峰彇褰撳墠鏃堕棿鎵�灞炵殑鐝埗鐝鏃舵 + /// </summary> + public ShiftPeriod GetShiftPeriodForNow() + { + var time = DateTime.Now.ToString("HHmm").ToInt32(); + foreach (var shift in CurShiftSys.Shifts) + { + var period = shift.Periods.Where(q => q.PRD_BEGIN <= time && time <= q.PRD_END).FirstOrDefault(); + if (!period.IsNullOrEmpty()) + { + var result = new ShiftPeriod(); + result.ShiftSys = CurShiftSys; + result.Shift = shift; + result.Period = period; + return result; + } + } + return null; + } + + /// <summary> /// 閲嶇疆褰撳墠宸ユ /// </summary> public void ResetSteps() @@ -127,6 +155,201 @@ CurWipSN = null; } + /// <summary> + /// 鐢熸垚浼犲叆宸ユ鍚庣画鐨勮涓哄埌宸ユ鍒楄〃 + /// </summary> + /// <param name="parent"></param> + public void GenerateSteps(WorkStep parent) + { + //閫掑綊娣诲姞鎵�鏈夊伐姝� + AddNextActToSteps(parent); + //璋冩暣宸ユ鐨勫簭鍙� + //while (CurBatch.Edges.Any(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence <= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence)) + //{ + // var edges = CurBatch.Edges.Where(q => Steps.First(s => s.NodeID == q.SRC_NODE).Sequence >= Steps.First(s => s.NodeID == q.TGT_NODE).Sequence).ToList(); + // foreach (var edge in edges) + // { + // var source = Steps.First(s => s.NodeID == edge.SRC_NODE); + // var target = Steps.First(s => s.NodeID == edge.TGT_NODE); + // target.Sequence = source.Sequence + 1; + // } + //} + } + + /// <summary> + /// 娣诲姞鑺傜偣鐨勪笅涓�涓涓哄埌宸ユ鍒楄〃 + /// </summary> + /// <param name="parent"></param> + private void AddNextActToSteps(WorkStep parent) + { + var edges = CurBatch.Edges.Where(q => q.SRC_NODE == parent.NodeID && CurBatch.NodeActs.Any(a => a.NODE_ID == parent.Node.ID && a.ID == q.TGT_NODE)).ToList(); + foreach (var edge in edges) + { + var act = CurBatch.NodeActs.First(q => q.ID == edge.TGT_NODE); + if (Steps.Any(q => q.NodeID == act.ID)) + { + var next = Steps.First(q => q.NodeID == act.ID); + next.Sequence = next.Sequence > parent.Sequence ? next.Sequence : (parent.Sequence + 1); + next.PrepNodeIDs.Add(parent.NodeID); + next.PrepNodeIDs.AddRange(parent.PrepNodeIDs); + next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList(); + AddNextActToSteps(next); + } + else + { + var next = new WorkStep(IWorkStep.Types.Action, this) + { + NodeID = act.ID, + Sequence = parent.Sequence + 1, + Node = parent.Node, + NodeAct = act, + Setting = CurBatch.ActionSets.FirstOrDefault(q => q.ACT_ID == act.ID), + }; + next.PrepNodeIDs.Add(parent.NodeID); + next.PrepNodeIDs.AddRange(parent.PrepNodeIDs); + next.PrepNodeIDs = next.PrepNodeIDs.Distinct().ToList(); + Steps.Add(next); + AddNextActToSteps(next); + } + } + } + + /// <summary> + /// 鏍规嵁浼犲叆鐨勫伐姝ワ紝杩斿洖涓嬩竴姝ュ彲鎵ц鐨勫伐姝ュ垪琛� + /// </summary> + /// <param name="curStep"></param> + public List<WorkStep> GetNextSteps(WorkStep curStep) + { + var result = new List<WorkStep>(); + var nextSteps = Steps.Where(q => !q.IsFinished + && CurBatch.Edges.Any(e => e.SRC_NODE == curStep.NodeID && e.TGT_NODE == q.NodeID) + ).ToList(); + //灏濊瘯灏嗗綋鍓嶅伐姝ョ殑鍚庣画宸ユ娣诲姞鍒板彲浠ユ墽琛岀殑宸ユ鍒楄〃 + foreach (var step in nextSteps) + { + //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯涓嶅厑璁哥户缁墽琛� + if (!Steps.Any(q => step.PrepNodeIDs.Any(id => id == q.NodeID && !q.IsFinished))) + { + result.Add(step); + } + } + //濡傛灉褰撳墠宸ユ娌℃湁鍙墽琛岀殑鍚庣画宸ユ锛屽垯鍦ㄥ墠缃伐姝ユ煡鎵捐繕鏈夋病鏈夊悗缁伐姝ユ病瀹屾垚鐨勫伐姝ワ紝鏈夊垯鎵ц + if (!result.Any()) + { + //鏌ユ壘鏈夋病鏈夊墠缃伐姝ユ湭瀹屾垚锛岃嫢鏈夊垯鍏堝畬鎴愭湭瀹屾垚鐨勫墠缃伐姝� + var prepIDs = curStep.PrepNodeIDs.Where(id => CurBatch.Edges.Any(e => e.SRC_NODE == id && Steps.Any(q => !q.IsFinished && e.TGT_NODE == q.NodeID))).ToList(); + var prepSteps = Steps.Where(q => prepIDs.Contains(q.NodeID)).OrderByDescending(q => q.Sequence).ToList(); + while (prepSteps.Any() && !result.Any()) + { + var prep = prepSteps.First(); + var prepNext = GetNextSteps(prep); + if (prepNext.Any()) + { + result = prepNext; + } + else + { + prepSteps.Remove(prep); + } + } + + } + return result.OrderBy(q => q.NodeAct.ACT_NAME).ToList(); + } + + /// <summary> + /// 寮�濮嬫墽琛屼笅涓�琛屼负宸ユ + /// </summary> + /// <param name="input"></param> + public ApiAction<SubmitOutput> BeginNextActionStep(SubmitInput input) + { + var result = new ApiAction<SubmitOutput>(); + //璁剧疆鍚庣画鍙墽琛岀殑宸ユ鍒楄〃 + NextSteps = GetNextSteps(CurStep); + //灏濊瘯鏈夋病鏈夊彲浠ョ洿鎺ュ紑濮嬬殑鍚庣画宸ユ + foreach (var step in NextSteps) + { + //灏濊瘯鎵ц鍚庣画宸ユ + var canBegin = step.TryBegin(input); + //濡傛灉鍚庣画宸ユ鍙互鐩存帴寮�濮嬪垯鐩存帴鎵ц + if (canBegin.IsSuccessed) + { + //鏇存柊褰撳墠鎵ц宸ユ涓哄凡寮�濮嬪伐姝� + CurStep = step; + //鏇存柊鍚庣画鍙墽琛岀殑宸ユ鍒楄〃 + NextSteps = GetNextSteps(CurStep); + //杩斿洖缁撴灉鍒板鎴风 + result = canBegin; + result.Data.IsFinished = IsFinishAllSteps; + result.Data.CurWO = CurBatch.WO.ORDER_NO; + result.Data.CurBatch = CurBatch.Batch.BATCH_NO; + result.Data.CurNode = CurStep.NodeAct.ACT_NAME; + result.Data.StepActCode = CurStep.NodeAct.ACT_CODE; + result.Data.NextStepID = CurStep.ID; + + return result; + } + } + + //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁伐姝ヨ繑鍥濧piAction + result.Data.IsFinished = IsFinishAllSteps; + result.Data.CurWO = CurBatch.WO.ORDER_NO; + result.Data.CurBatch = CurBatch.Batch.BATCH_NO; + result.Data.CurNode = CurStep.Node.NODE_NAME; + result.Data.StepActCode = CurStep.NodeAct.ACT_CODE; + result.Data.NextStepID = ""; + + //娌℃湁鍙互鐩存帴寮�濮嬬殑鍚庣画宸ユ锛屾牴鎹悗缁彲鎵ц宸ユ鍒楄〃杩斿洖鐩稿簲鐨勬搷浣滄彁绀� + if (NextSteps.Count == 1) + { + result.LocaleMsg = NextSteps.First().GetBeginMsg(); + } + else + { + result.LocaleMsg = new(T(L("MES.Transaction.Position.PleaseSelectNextStep"), input.Locale) + "\r\n" + + string.Join("\r\n", NextSteps.Select(q => " >> " + T(q.GetBeginMsg(), input.Locale)))); + } + return result; + } + + /// <summary> + /// 鑾峰彇鎵撳嵃鏍囩妯℃澘杩囩▼鍙橀噺鍊� + /// </summary> + /// <param name="labelPVs">杩囩▼鍙橀噺鍒楄〃</param> + /// <param name="lv">鏍囩妯℃澘鍙橀噺</param> + /// <returns></returns> + public string GetPrintProcessValue(List<BAS_LABEL_PV> labelPVs, BAS_LABEL_VAR lv) + { + var pv = labelPVs.FirstOrDefault(q => q.VAR_CODE == lv.VAR_VALUE); + if (!pv.IsNullOrEmpty()) + { + switch (pv.VAR_TYPE.GetEnum<BAS_LABEL_PV.VAR_TYPEs>()) + { + case BAS_LABEL_PV.VAR_TYPEs.ServerMethod: + { + switch (pv.VAR_METHOD) + { + case "GetSN": + return CurWipSN.SN; + case "GetBAS_ITEM": + return WorkBatch.Product.ToJson(); + case "GetCustomer": + return WorkBatch.Batch.ToJson(); + default: + return ""; + } + } + case BAS_LABEL_PV.VAR_TYPEs.WebApiWebApi: + break; + case BAS_LABEL_PV.VAR_TYPEs.StoredProcedure: + break; + default: + break; + } + } + return ""; + } + #endregion Functions public override bool Close(bool needSaveHistoryLog = false) -- Gitblit v1.9.3