From 0d0355c65ac5a5d2df34983d0f07bcb05c069e91 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 10 Dec 2021 07:59:29 +0100 Subject: [PATCH] ProductionTracing for Nanjing, OrderInfo updated after assignment of serial numbers, ver. 3.1.1831 --- TBF/Properties/AssemblyInfo.cs | 4 +- TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs | 4 + .../Output/DB/ProductionTracing/Tracing.cs | 222 ++++++++++-------- TBF/Rig/Sequences/MainSeq.cs | 4 + TBF/Rig/Sequences/ProcessData.cs | 2 + .../S640Communication/S640CommForm.cs | 6 +- TBF/UI/MainWnd.cs | 5 +- 7 files changed, 138 insertions(+), 109 deletions(-) diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 1c0ad038c..4aa124305 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("3.1.1827.0")] -[assembly: AssemblyFileVersion("3.1.1827.0")] +[assembly: AssemblyVersion("3.1.1831.0")] +[assembly: AssemblyFileVersion("3.1.1831.0")] diff --git a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs index 7efcaf841..09161494d 100644 --- a/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs +++ b/TBF/Rig/DataEntry/iPerl/CycleBeginningForm.cs @@ -227,6 +227,10 @@ namespace TBF.Rig.DataEntry.iPerl } ProcessData.OrderInfo = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault(x => x.POName == orderComboBox.Text); + if (ProcessData.TracingDB != null) + { + ProcessData.Workflow = ProcessData.TracingDB.GetWorkflowAndWorkstep(ProcessData.OrderInfo, out ProcessData.Workstep); + } PurchaseOrder = orderComboBox.Text; Program.LocalSettings.UpdateHistory(orderComboBox.Text, ref Program.LocalSettings.PurchaseOrderHistory); diff --git a/TBF/Rig/Output/DB/ProductionTracing/Tracing.cs b/TBF/Rig/Output/DB/ProductionTracing/Tracing.cs index bd83e4f13..73bd0de7d 100644 --- a/TBF/Rig/Output/DB/ProductionTracing/Tracing.cs +++ b/TBF/Rig/Output/DB/ProductionTracing/Tracing.cs @@ -11,6 +11,7 @@ using NHibernate.Criterion; using Common; using Config.Entities; using SharedDatabase.Entities; +using TBF.Rig.Sequences; namespace TBF.Rig.Output.DB.ProductionTracing { @@ -35,6 +36,8 @@ namespace TBF.Rig.Output.DB.ProductionTracing public const string WorkstepName = "Test_bench"; + public OrderInfo DefaultOrder; + MonitoringCfg tracingCfg; string workplace { @@ -112,6 +115,8 @@ namespace TBF.Rig.Output.DB.ProductionTracing netMask = netadapter.NetMask; currentOpState = OpState.None; log.Warn(this.ToString()); + + DefaultOrder = null; } /// @@ -144,13 +149,21 @@ namespace TBF.Rig.Output.DB.ProductionTracing .BuildSessionFactory(); } - /// - /// Register this test bench in the tracing DB for approx. 2 weeks - /// ISession session = SessionFactory.OpenSession(); + /// + /// Initialize DefaultOrder + /// + var dfltOrders = session.QueryOver() + .Where(x => x.POName == "0000001") + .And(x => (x.POState == (sbyte)OrderState.New || x.POState == (sbyte)OrderState.Active)) + .List(); + if (dfltOrders.Count > 0) DefaultOrder = dfltOrders[0]; + #if !DEBUG - /// Only a release version registers a workplace + /// + /// Register this test bench in the tracing DB for approx. 2 weeks (RELEASE version only) + /// SharedDatabase.TracingDB.RegisterWorkplaceObsolete(session, workplace, GlobalData.GetCurrentUserName(), @@ -188,6 +201,43 @@ namespace TBF.Rig.Output.DB.ProductionTracing public void StopDevice2() {} + public Process GetWorkflowAndWorkstep(IOrderInfo order, out Workstep workstep) + { + workstep = null; + + if (order is OrderInfo) + { + try + { + var session = SessionFactory.OpenSession(); + var wflows = session.QueryOver() + .Where(x => x.Name == (order as OrderInfo).Workflow) + .List(); + if (wflows.Count == 1) + { + var wsteps = session.QueryOver() + .Where(x => x.Workflow == wflows[0]) + .And(x => x.Name.ToLower().Contains("test")) + .List(); + if (wsteps.Count == 1) workstep = wsteps[0]; + } + + session.Close(); + + if (wflows.Count == 1) + { + return wflows[0]; /// Successful + } + } + catch (Exception exc) + { + log.ErrorFormat("GetWorkflow({0}) failed: {1}", order, exc.Message); + } + } + + return null; + } + public IList ReadOrders(ISession session) { try @@ -207,45 +257,70 @@ namespace TBF.Rig.Output.DB.ProductionTracing /// - /// Read reference records belonging to specified order + /// Read reference records belonging to a specified order /// /// DB sesson /// Order /// List of reference records-s - public IList ReadRefRecords(ISession session, OrderInfo order) + public IList ReadRefRecords(ISession session, OrderInfo order, OrderInfo dfltOrder = null, Process dfltWFlow = null) { try { - return session.QueryOver() - .Where(x => (x.POrder == order)) - .List(); + var refRecords = session.QueryOver() + .Where(x => (x.POrder == order)) + .List(); + refRecords.Reverse(); + + if (dfltOrder != null && dfltWFlow != null) + { + var moreRecords = session.QueryOver() + .Where(x => (x.POrder == dfltOrder)) + .And(x => (x.Workflow == dfltWFlow)) + .List(); + for (int i = moreRecords.Count - 1; i >= 0; i--) refRecords.Add(moreRecords[i]); + } + + return refRecords; } catch (Exception exc) { - log.ErrorFormat("Cannot read orders from the tracing DB: {0}", exc.Message); + log.ErrorFormat("Cannot read ref.records from the tracing DB: {0}", exc.Message); return new List(); } } /// - /// Read records belonging to specified order + /// Read records belonging to a specified order /// /// DB sesson /// Order /// List of records - public IList ReadRecords(ISession session, OrderInfo order) + public IList ReadRecords(ISession session, OrderInfo order, OrderInfo dfltOrder = null, Process dfltWFlow = null) { try { - return session.QueryOver() - .JoinQueryOver(rec => rec.ReferenceRecord) - .Where(rr => rr.POrder.Id == order.Id) - .List(); + var records = session.QueryOver() + .JoinQueryOver(rec => rec.ReferenceRecord) + .Where(rr => rr.POrder.Id == order.Id) + .List(); + records.Reverse(); + + if (dfltOrder != null && dfltWFlow != null) + { + var moreRecords = session.QueryOver() + .JoinQueryOver(rec => rec.ReferenceRecord) + .Where(rr => (rr.POrder.Id == dfltOrder.Id)) + .And(rr => (rr.Workflow.Id == dfltWFlow.Id)) + .List(); + for (int i = moreRecords.Count - 1; i >= 0; i--) records.Add(moreRecords[i]); + } + + return records; } catch (Exception exc) { - log.ErrorFormat("Cannot read orders from the tracing DB: {0}", exc.Message); + log.ErrorFormat("Cannot read records from the tracing DB: {0}", exc.Message); return new List(); } } @@ -574,8 +649,8 @@ namespace TBF.Rig.Output.DB.ProductionTracing ITransaction transaction = null; ISession session = null; - var sampleWM = batch.WaterMeters.FirstOrDefault(x => x != null && x.Disabled == false); - if (sampleWM != null) + var order = ProcessData.OrderInfo as SharedDatabase.Entities.OrderInfo; + if (order != null && ProcessData.Workflow != null && ProcessData.Workstep != null) { /// /// Save to regular tracing DB @@ -585,40 +660,31 @@ namespace TBF.Rig.Output.DB.ProductionTracing session = SessionFactory.OpenSession(); transaction = session.BeginTransaction(); - var cOrders = session.QueryOver() - .Where(x => x.POName == sampleWM.PurchaseOrder) - .And(x => (x.POState == (sbyte)OrderState.New || x.POState == (sbyte)OrderState.Active)) - .List(); - - if (cOrders.Count < 1) + var reloadedOrder = session.QueryOver() + .Where(x => x.Id == order.Id) + .List(); + if (reloadedOrder.Count == 1) { - cOrders = session.QueryOver() - .Where(x => x.POName == "0000001") - .List(); + reloadedOrder[0].POState = (sbyte)OrderState.Active; + reloadedOrder[0].CurrentPcsCount = order.CurrentPcsCount; + reloadedOrder[0].CurrentSN = order.CurrentSN; + reloadedOrder[0].CurrentRA = order.CurrentRA; + session.SaveOrUpdate(reloadedOrder[0]); } - if (cOrders.Count == 1) + int writtenRecordsCount = 0; + foreach (var wMtr in batch.WaterMeters) { - currentOrder = cOrders[0]; - - int writtenRecordsCount = 0; - foreach (var wMtr in batch.WaterMeters) + if (wMtr.SessionId == 1) { - if (wMtr.SessionId == 1) - { - writtenRecordsCount += SaveSingleWM2DB(session, currentOrder, wMtr); - } + writtenRecordsCount += SaveSingleWM2DB(session, order, wMtr); } - transaction.Commit(); - session.Flush(); + } + transaction.Commit(); + session.Flush(); - log.ErrorFormat("Batch {0}: {1} of {2} watermeters written to the regular production tracing DB", - batch.BatchNr, writtenRecordsCount, batch.WaterMeters.Count); - } - else - { - log.ErrorFormat("POrder not found: {0}", sampleWM); - } + log.ErrorFormat("Batch {0}: {1} of {2} watermeters written to the regular production tracing DB", + batch.BatchNr, writtenRecordsCount, batch.WaterMeters.Count); } catch (Exception exc) { @@ -649,70 +715,18 @@ namespace TBF.Rig.Output.DB.ProductionTracing /// DB session /// Watermeter entity /// Number of written reference record - int SaveSingleWM2DB(ISession session, OrderInfo pOrder, Results.Entities.WaterMeter wm) + int SaveSingleWM2DB(ISession session, OrderInfo order, Results.Entities.WaterMeter wm) { - if (string.IsNullOrEmpty(wm.SerialNr) || (wm.ProcessId == 0)) - { - /// Without PCB number there is no DB activity - return 0; - } - else if ((currentWorkflow != null) && (wm.ProcessId == currentWorkflow.Id)) + if (!string.IsNullOrEmpty(wm.SerialNr) && ProcessData.Workflow != null && ProcessData.Workstep != null) { /// Process is already loaded => save a reference record for this WM - session.SaveOrUpdate(new ReferenceRecord(pOrder, currentWorkflow, currentWorkstep, wm.SerialNr, GlobalData.CurrentUser.UserName, workplace, wm.Passed ? 0 : 1)); + session.SaveOrUpdate(new ReferenceRecord(order, ProcessData.Workflow, ProcessData.Workstep, + wm.SerialNr, GlobalData.CurrentUser.UserName, workplace, wm.Passed ? 0 : 1)); return 1; } - else if (wm.ProcessId != 0) - { - /// Process ID is already known, however process and workstep have to be loaded - IList processes = session.QueryOver() - .Where(x => (x.Id == wm.ProcessId)) - .List(); - if (processes.Count != 1) return 0; - foreach (var ws in processes[0].Worksteps) - { - if (ws.Name == WorkstepName) - { - session.SaveOrUpdate(new ReferenceRecord(pOrder, processes[0], ws, wm.SerialNr, GlobalData.CurrentUser.UserName, workplace, wm.Passed ? 0 : 1)); - return 1; - } - } - - return 0; /// No workste with 'WorkstepName' found - } - else - { - /// - /// Process ID is unknown => do everything from scratch - /// - - /// Get all already existing reference records with Code == wm.SerialNr, refRecords[0] will be the most recent one - IList refRecords; - int trialsCount = 0; - do - { - if (trialsCount > 0) ReadProcessesFromDB(session); - - refRecords = session.QueryOver() - .Where(rr => (rr.Code == wm.SerialNr)) - .OrderBy(rr => rr.TimeStamp).Desc - .List(); - trialsCount++; - } - while (refRecords.Count == 0 && trialsCount <= 2); - - /// Save a new reference record from this test bench if workstep "Test_bench" is defined in the obtained WM process - IList worksteps; - if ((refRecords.Count > 0) && workstepsDictionary.TryGetValue(refRecords[0].Workflow.Id, out worksteps) && (worksteps.Count == 1)) - { - session.SaveOrUpdate(new ReferenceRecord(pOrder, refRecords[0].Workflow, worksteps[0], wm.SerialNr, GlobalData.GetCurrentUserName(), workplace, wm.Passed ? 0 : 1)); - return 1; - } - - return 0; - } - } + return 0; + } /// diff --git a/TBF/Rig/Sequences/MainSeq.cs b/TBF/Rig/Sequences/MainSeq.cs index 6f8309122..30562c781 100644 --- a/TBF/Rig/Sequences/MainSeq.cs +++ b/TBF/Rig/Sequences/MainSeq.cs @@ -215,6 +215,10 @@ namespace TBF.Rig.Sequences ProcessData.SelectedProcedure = Program.MainWnd.SelectedProcedure; ProcessData.OrderInfo = Program.MainWnd.SelectedProcedure.OrderInfo; + if (ProcessData.TracingDB != null) + { + ProcessData.Workflow = ProcessData.TracingDB.GetWorkflowAndWorkstep(ProcessData.OrderInfo, out ProcessData.Workstep); + } selectedTestName = (selection == Selection.Q1) ? "Q1" : ((selection == Selection.Q2) ? "Q2" diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs index 701ceec59..c287befc8 100644 --- a/TBF/Rig/Sequences/ProcessData.cs +++ b/TBF/Rig/Sequences/ProcessData.cs @@ -37,6 +37,8 @@ namespace TBF.Rig.Sequences /// public static ProcedureInfo SelectedProcedure; public static Common.IOrderInfo OrderInfo; + public static SharedDatabase.Entities.Process Workflow; + public static SharedDatabase.Entities.Workstep Workstep; /// /// Test related (instance) variables. diff --git a/TBF/Rig/TestMethods/S640Communication/S640CommForm.cs b/TBF/Rig/TestMethods/S640Communication/S640CommForm.cs index b4a54cddf..e6598540f 100644 --- a/TBF/Rig/TestMethods/S640Communication/S640CommForm.cs +++ b/TBF/Rig/TestMethods/S640Communication/S640CommForm.cs @@ -466,9 +466,10 @@ namespace TBF.Rig.TestMethods.S640Communication { if (ProcessData.TracingDB != null && ProcessData.OrderInfo is OrderInfo) { + var order = ProcessData.OrderInfo as OrderInfo; ISession session = ProcessData.TracingDB.SessionFactory.OpenSession(); - refRecords = ProcessData.TracingDB.ReadRefRecords(session, ProcessData.OrderInfo as OrderInfo); - records = ProcessData.TracingDB.ReadRecords(session, ProcessData.OrderInfo as OrderInfo); + refRecords = ProcessData.TracingDB.ReadRefRecords(session, order, ProcessData.TracingDB.DefaultOrder, ProcessData.Workflow); + records = ProcessData.TracingDB.ReadRecords(session, order, ProcessData.TracingDB.DefaultOrder, ProcessData.Workflow); session.Close(); } @@ -513,6 +514,7 @@ namespace TBF.Rig.TestMethods.S640Communication eRegisterNumbers[i].Text = pcbNumber; radioAddresses[i].Text = optoHeads[i].RadioAddress.ToString(); + /// Find the housing number in the tracing DDB Record rec; ReferenceRecord refRec; if ((rec = records.FirstOrDefault(x => x.Code == pcbNumber)) != null && diff --git a/TBF/UI/MainWnd.cs b/TBF/UI/MainWnd.cs index 42ac9fe3a..7d2842d78 100644 --- a/TBF/UI/MainWnd.cs +++ b/TBF/UI/MainWnd.cs @@ -404,7 +404,10 @@ namespace TBF.UI string[] edgesLcfg = null; string[] edgesXLcfg = null; /// - var schDrawingCmpnts = TBF.DB.CurrentBench.IsRealBench ? Rig.StateMachine.Components : TBF.Rig.TbfComponents.LoadComponentsFromDB(cmpntEntities); + var schDrawingCmpnts = (TBF.DB.CurrentBench.IsRealBench && Rig.StateMachine.Components != null) + ? Rig.StateMachine.Components + : TBF.Rig.TbfComponents.LoadComponentsFromDB(cmpntEntities); + foreach (var component in schDrawingCmpnts) { TBF.Rig.Generic.IComponentCfg cmpCfg = component.Cfg;