BomItemPreparer.cs
*BomItemPreparer.cs*
using Bartech.SGCore.Base;
using Bartech.SGCore.Base.Web;
using Bartech.SGCore.Helpers;
using Bartech.SGCore.Local.DataObjects;
using Bartech.SGCore.Local.Services;
using Bartech.SGCore.Model;
using Bartech.SGCore.Model.API.Request;
using Bartech.SGCore.Model.API.Request.Common;
using Bartech.SGCore.Model.API.Response;
using Bartech.SGCore.Model.Messages;
using DevExpress.Xpo;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using xTrace03_SG_Data;
namespace Bartech.SGCore.Local
{
[XModule("BOM_ITEM_Preparer", "Modul pro přípravu materiálu do vozíků", ModuleGroupType.Part, applicationType: xTraceApplicationType.BomItem)]
public class SGBomItemPreparer : SGBomItem
{
#region Konstruktor
public SGBomItemPreparer(SGSession session)
: base(session)
{
m_dxSession = Session.Resolve<SGDxSessionLocker>();
m_inputBatchSvc = Session.Resolve<InputBatchService>();
m_inputBatches = new List<BusInputBatch>();
m_dockingCart = new DODockingCart(this);
AllowedInDevs = new SGDeviceType[] { SGDeviceType.Scanner, SGDeviceType.API };
}
#endregion
#region enum modulu
private enum PreparerState
{
WaitingForDockingCart,
WaitingForOperatorDecision,
WaitingForMaterial,
}
#endregion
#region privatni promenne
SGDxSessionLocker m_dxSession;
List<BusInputBatch> m_inputBatches;
PreparerState State;
BusItem componentToBeLoaded;
DODockingCart m_dockingCart;
int m_finishCommand;
InputBatchService m_inputBatchSvc;
#endregion
#region public property
public DODockingCart DoDockingCart { get => m_dockingCart; }
#endregion
#region overridy modulu
public override void StartLevel(SGTreeModuleData mdata)
{
base.StartLevel(mdata);
}
public override void Clear()
{
State = PreparerState.WaitingForDockingCart;
Session.BomItemPreparer.DoDockingCart.Clear();
Session.CycleContext.Components.Clear();
Session.GlobalContext.BOMComponents.Clear();
base.Clear();
}
public override SGLMState ModuleChecker(SGTreeModuleData mdata)
{
SGLMState s = base.ModuleChecker(mdata);
if ((s & SGLMState.UpLevel) == SGLMState.UpLevel)
{
Message = Log(LogMsg.DockingCart_MaterialPreparationFinished, Session.Job.DoJob.JobID);
//DoDockingCart.SaveItemsToDockingCart(collToBeSaved: m_inputBatchSvc.GetInputBatchIDsFromBusItems(m_dxSession, Session.CycleContext.Components.ToList()));
DoDockingCart.SaveItemsToDockingCart(collToBeSaved: Session.CycleContext.Components.ToList());
this.Clear();
Session.Job.Clear();
Session.CycleContext.OperationOverride.Clear();
}
return s;
}
protected override bool OnSetParameters()
{
var cmd = Session.SysParams.GetParamValue<string>(this, "FinishDockingCartSetupCommand", "C0312", "Příkaz pro dokončení přípravy materiálu na vozíku");
if (!Session.Data.CheckData(DataType.Command, cmd)) throw new SGSysParamException("FinishSetupCommand", LogMsg.SYSPARAM_NotInRequestedFormat);
m_finishCommand = int.Parse(Regex.Replace(cmd, @"[^\d]", ""));
Session.SysCommands.CheckCommandParameter("FinishSetupCommand", cmd);
return base.OnSetParameters();
}
public override LogMessage HandleSysCommand(SGSysCommandType type, ref bool handled, object[] param)
{
if ((int)type == m_finishCommand)
{
handled = true;
//
DoDockingCart.SaveItemsToDockingCart(collToBeSaved: Session.CycleContext.Components.ToList());
State = PreparerState.WaitingForDockingCart;
Session.CycleContext.Components.Clear();
Session.BomItemPreparer.DoDockingCart.Clear();
}
return base.HandleSysCommand(type, ref handled, param);
}
public override SGLMState HandlePortData(SGTreeModuleData mdata, SGReceivedData data)
{
SGLMState s = SGLMState.NotHandled;
if (mdata.LevelState == SGLevelState.Echo)
{
s = SGLMState.Handled;
switch (State)
{
case PreparerState.WaitingForDockingCart:
Message = Log(LogMsg.DockingCart_WaitingForSN);
break;
case PreparerState.WaitingForOperatorDecision:
Message = Log(LogMsg.DockingCart_NotEmpty);
break;
case PreparerState.WaitingForMaterial:
//vrati prvni nematchnutou komponentu z global contextu pro zobrazeni do Echo msg
componentToBeLoaded = Session.GlobalContext.BOMComponents.Where(x => x.Matched == false && x.IsSlotNeeded == true).FirstOrDefault();
if (componentToBeLoaded != null)
Message = Log(LogMsg.DockingCart_WaitingForMaterialOnSlot, componentToBeLoaded.ComponentCD, componentToBeLoaded.MachineID, componentToBeLoaded.MachineSideCD, componentToBeLoaded.RequestedSlot);
break;
}
}
else
{
//nacten vozik, do ktereho se bude ukladat material
switch (State)
{
case PreparerState.WaitingForDockingCart:
if (data.DataType == DataType.Carrier)
s = HandleDockingCartData(data.Text);
break;
case PreparerState.WaitingForOperatorDecision:
if (data.DataType == DataType.Command)
s = HandleOperatorDecision(data.Text);
break;
case PreparerState.WaitingForMaterial:
if (data.DataType == DataType.InputBatch)
s = base.HandlePortData(mdata, data);
break;
}
}
return s;
}
private SGLMState HandleDockingCartData(string dockingCartCD)
{
SGLMState s = SGLMState.Handled;
s = SGLMState.Handled;
if (DoDockingCart.CheckDockingCartExist(dockingCartCD))
{
if (DoDockingCart.GetInputBatchesFromDockingCart())
{
//jiz obsahuje material
State = PreparerState.WaitingForOperatorDecision;
}
else
{
//je prazdny
State = PreparerState.WaitingForMaterial;
}
s |= SGLMState.OK;
}
else
{
Message = Log(LogMsg.DockingCart_NotFound, dockingCartCD);
s |= SGLMState.Fail;
}
return s;
}
private SGLMState HandleOperatorDecision(string decision)
{
SGLMState s = SGLMState.NotHandled;
if (Session.SysCommands.IsSysCommand(this, decision, SGSysCommandType.Yes))
{
if (DoDockingCart.IsForActualJobAndPosIndex)
{
//Session.GlobalContext.BOMComponents.Matched = false pro vsechny SX, ktera sou ve voziku na dany slot
foreach (var ib in DoDockingCart.SlotsByInputBatches)
{
//pro veschny zaznamy v GlobalContextu, kde se je stejny ProductID a pozadovany slot jako je ulozen ve voziku, tak jej nastaV na Matched = false
var testuju = Session.GlobalContext.BOMComponents.Where(x => x.ComponentID == ib.Key.ProductID && x.FullRequestedSlot == ib.Value).FirstOrDefault();
var test = Session.GlobalContext.BOMComponents.Where(x => x.ComponentID == ib.Key.ProductID && x.FullRequestedSlot == ib.Value).Select(x => { x.Matched = false; return x; }).ToList();
}
}
//Session.CycleContext.Components.Clear(); //nemusi se clearovat CycleContext, protoze v tuto chvili nemoze byt cimkoli naplnen
Session.BomItemPreparer.DoDockingCart.ClearItemsFromDockingCart();
State = PreparerState.WaitingForMaterial;
s = SGLMState.Handled | SGLMState.OK;
}
else if (Session.SysCommands.IsSysCommand(this, decision, SGSysCommandType.No))
{
foreach (var ib in DoDockingCart.SlotsByInputBatches)
{
string ibToBeSend = ib.Key.ComponentCD + " " + ib.Key.BatchCD;
Session.SetNextData(Session.Data.CreateReceivedData(SGDeviceType.Scanner, ibToBeSend, false));
}
State = PreparerState.WaitingForMaterial;
s = SGLMState.Handled | SGLMState.OK;
}
return s;
}
#endregion
}
}