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
    }
}