From 3678120ac63c176b5f261ef12e67c4ce7f1b320f Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期四, 25 七月 2024 21:44:25 +0800 Subject: [PATCH] 增加维修入站跟维修回流的判断 --- Tiger.Business.MES/Transaction/Position.cs | 187 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 183 insertions(+), 4 deletions(-) diff --git a/Tiger.Business.MES/Transaction/Position.cs b/Tiger.Business.MES/Transaction/Position.cs index 4d046eb..435eb9f 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,13 +52,17 @@ 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 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 @@ -120,6 +125,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() @@ -128,6 +154,159 @@ 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; + } + } + + //鏍规嵁鍚庣画宸ユ杩斿洖ApiAction + 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; + } + #endregion Functions public override bool Close(bool needSaveHistoryLog = false) -- Gitblit v1.9.3