ProductionTracing for Nanjing, OrderInfo updated after assignment of serial numbers, ver. 3.1.1831

This commit is contained in:
Milan Hanajik 2021-12-10 07:59:29 +01:00
parent dfddc8a980
commit 0d0355c65a
7 changed files with 138 additions and 109 deletions

View File

@ -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")]

View File

@ -227,6 +227,10 @@ namespace TBF.Rig.DataEntry.iPerl
}
ProcessData.OrderInfo = (listOfOrders == null) ? null : listOfOrders.FirstOrDefault<IOrderInfo>(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);

View File

@ -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<OrderInfo>()
.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<Process>()
.Where(x => x.Name == (order as OrderInfo).Workflow)
.List();
if (wflows.Count == 1)
{
var wsteps = session.QueryOver<Workstep>()
.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<OrderInfo> ReadOrders(ISession session)
{
try
@ -207,45 +257,70 @@ namespace TBF.Rig.Output.DB.ProductionTracing
/// <summary>
/// Read reference records belonging to specified order
/// Read reference records belonging to a specified order
/// </summary>
/// <param name="session">DB sesson</param>
/// <param name="order">Order</param>
/// <returns>List of reference records-s</returns>
public IList<ReferenceRecord> ReadRefRecords(ISession session, OrderInfo order)
public IList<ReferenceRecord> ReadRefRecords(ISession session, OrderInfo order, OrderInfo dfltOrder = null, Process dfltWFlow = null)
{
try
{
return session.QueryOver<ReferenceRecord>()
.Where(x => (x.POrder == order))
.List();
var refRecords = session.QueryOver<ReferenceRecord>()
.Where(x => (x.POrder == order))
.List();
refRecords.Reverse();
if (dfltOrder != null && dfltWFlow != null)
{
var moreRecords = session.QueryOver<ReferenceRecord>()
.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<ReferenceRecord>();
}
}
/// <summary>
/// Read records belonging to specified order
/// Read records belonging to a specified order
/// </summary>
/// <param name="session">DB sesson</param>
/// <param name="order">Order</param>
/// <returns>List of records</returns>
public IList<Record> ReadRecords(ISession session, OrderInfo order)
public IList<Record> ReadRecords(ISession session, OrderInfo order, OrderInfo dfltOrder = null, Process dfltWFlow = null)
{
try
{
return session.QueryOver<Record>()
.JoinQueryOver<ReferenceRecord>(rec => rec.ReferenceRecord)
.Where(rr => rr.POrder.Id == order.Id)
.List<Record>();
var records = session.QueryOver<Record>()
.JoinQueryOver<ReferenceRecord>(rec => rec.ReferenceRecord)
.Where(rr => rr.POrder.Id == order.Id)
.List();
records.Reverse();
if (dfltOrder != null && dfltWFlow != null)
{
var moreRecords = session.QueryOver<Record>()
.JoinQueryOver<ReferenceRecord>(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<Record>();
}
}
@ -574,8 +649,8 @@ namespace TBF.Rig.Output.DB.ProductionTracing
ITransaction transaction = null;
ISession session = null;
var sampleWM = batch.WaterMeters.FirstOrDefault<Results.Entities.WaterMeter>(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<OrderInfo>()
.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<OrderInfo>()
.Where(x => x.Id == order.Id)
.List();
if (reloadedOrder.Count == 1)
{
cOrders = session.QueryOver<OrderInfo>()
.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
/// <param name="session">DB session</param>
/// <param name="wm">Watermeter entity</param>
/// <returns>Number of written reference record</returns>
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<Process> processes = session.QueryOver<Process>()
.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<ReferenceRecord> refRecords;
int trialsCount = 0;
do
{
if (trialsCount > 0) ReadProcessesFromDB(session);
refRecords = session.QueryOver<ReferenceRecord>()
.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<Workstep> 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;
}
/// <summary>

View File

@ -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"

View File

@ -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.

View File

@ -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 &&

View File

@ -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;