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:58 +01:00
parent dfddc8a980
commit 0d0355c65a
7 changed files with 138 additions and 109 deletions
+118 -104
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>