public void LCAInvalidParamtersShouldThrow()
        {
            LCASettings settings = GetBasicSettings();

            settings.MaxLDWgt = -1;
            LCAWrapper lca = new LCAWrapper(settings);

            lca.AddArea("TEST_AREA", 1, 1);

            lca.AddAisle("TEST_AREA", "TEST_AISLE", 1, 1, 1, 1, "+");

            lca.AddPickBatchLine("TEST_PBROW", 0, "TEST_PRODUCT", "TEST_COMPANY", 10, 1, 1, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "", 1, 1, "TEST_WPADR");

            try
            {
                LCAWrapperResult result = lca.Process();
            }
            catch (LCAWrapperException ex)
            {
                if (ex.ErrorCode == 1401) //Parameter out of bounds
                {
                    return;
                }
            }

            Assert.Fail("Parameter out of bounds error expected.");
        }
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        private LCASettings GetBasicSettings()
        {
            LCASettings settings = new LCASettings();

            settings.AllowPBRowSplit            = false;
            settings.DistanceFactor             = 1.5;
            settings.DoBeautyPhase              = true;
            settings.DoDistPhase                = true;
            settings.DoLCPhase                  = true;
            settings.GroupId                    = "TEST";
            settings.MaxLDWgt                   = 10;
            settings.MaxLDVol                   = 10;
            settings.MaxmSecBeauty              = 60 * 1000;
            settings.MaxmSecDistance            = 60 * 1000;
            settings.MaxmSecLC                  = 60 * 1000;
            settings.MaxPBRowCar                = 1000;
            settings.NumberOfIterationsBeauty   = 100000;
            settings.NumberOfIterationsDistance = 100000;
            settings.NumberOfIterationsLC       = 100000;
            settings.OnlyAptean                 = false;
            settings.WHId        = "TEST_WH";
            settings.PZId        = "TEST_PZ";
            settings.StrekArea   = "TEST_AREA";
            settings.StrekXCoord = 1;
            settings.StrekYCoord = 1;

            return(settings);
        }
        public void LCATheoreticalMinimumWeightTest()
        {
            LCASettings settings = GetBasicSettings();

            settings.DoDistPhase   = false;
            settings.DoBeautyPhase = false;

            LCAWrapper lca = new LCAWrapper(settings);

            lca.AddArea("TEST_AREA", 1, 1);

            lca.AddAisle("TEST_AREA", "TEST_AISLE", 1, 1, 1, 1, "+");

            lca.AddPickBatchLine("TEST_PBROW_1", 1, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_2", 2, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_3", 3, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_4", 4, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_5", 5, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_6", 6, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_7", 7, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_8", 8, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_9", 9, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");
            lca.AddPickBatchLine("TEST_PBROW_10", 10, "TEST_PRODUCT", "TEST_COMPANY", 1, 1, 5, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");

            LCAWrapperResult result = lca.Process();

            Assert.AreEqual(0, result.Errors.Count);
            Assert.AreEqual(10, result.Lines.Count);
            var loadCarrierCount = (from x in result.Lines
                                    select x.PBCarIdVirtual).Distinct().Count();

            Assert.AreEqual(5, loadCarrierCount);
        }
        public void LCABasicTest()
        {
            LCASettings settings = GetBasicSettings();

            LCAWrapper lca = new LCAWrapper(settings);

            lca.AddArea("TEST_AREA", 1, 1);

            lca.AddAisle("TEST_AREA", "TEST_AISLE", 1, 1, 1, 1, "+");

            lca.AddPickBatchLine("TEST_PBROW", 0, "TEST_PRODUCT", "TEST_COMPANY", 10, 1, 1, "TEST_AREA", "TEST_AISLE", "TEST_PRODUCT_GROUP", "TEST_CAT_GROUP", 1, 1, "TEST_WPADR");

            LCAWrapperResult result = lca.Process();

            Assert.AreEqual(0, result.Errors.Count);
            Assert.AreEqual(1, result.Lines.Count);
            Assert.AreEqual("TEST_PBROW", result.Lines[0].PBRowId);
            Assert.IsNotNull(result.Lines[0].PBCarIdVirtual);
        }
        /// <summary>
        /// ExecuteProcedure is the main activity method, this is the code that is run
        /// when the Job is activated/signalled.
        /// </summary>
        protected override void ExecuteProcedure(Imi.Framework.Job.JobArgumentCollection args)
        {
            if (args.ContainsKey("recycleThresholdWP"))
            {
                _recycleThresholdWP = Convert.ToInt32(args["recycleThresholdWP"]);
            }

            if (args.ContainsKey("processingTimeoutInMinutesWP"))
            {
                _processingTimeoutInMinutesWP = Convert.ToInt32(args["processingTimeoutInMinutesWP"]);
            }

            string PBROWGRP_ID_O         = "";
            string PZID_O                = "";
            string WHID_O                = "";
            string ALLOW_PBROWSPLIT_O    = "0";
            string CARTYPID_O            = "";
            string SHIPWSID_O            = "";
            double?SHIPXCORD_O           = 0;
            double?SHIPYCORD_O           = 0;
            double?MAXLDVOL_O            = 0;
            double?MAXLDWGT_O            = 0;
            double?OFR_DISTANCE_FACTOR_O = 0;
            int?   MAXPBROWCAR_O         = 0;
            int?   OFR_MAX_ITER_FILL_O   = 0;
            int?   OFR_MAX_TME_FILL_O    = 0;
            int?   OFR_MAX_ITER_STORE_O  = 0;
            int?   OFR_MAX_TME_STORE_O   = 0;
            int?   OFR_MAX_ITER_DIST_O   = 0;
            int?   OFR_MAX_TME_DIST_O    = 0;

            IList <PBROW>          rows      = null;
            IList <AISLE_WAYPOINT> waypoints = null;

            try
            {
                StartTransaction();

                IDataReader rowReader;
                IDataReader waypointReader;

                _pickOrderCarrierBuild.GetGroup(10,
                                                ref PBROWGRP_ID_O,
                                                ref OFR_DISTANCE_FACTOR_O,
                                                ref OFR_MAX_ITER_FILL_O,
                                                ref OFR_MAX_TME_FILL_O,
                                                ref OFR_MAX_ITER_STORE_O,
                                                ref OFR_MAX_TME_STORE_O,
                                                ref OFR_MAX_ITER_DIST_O,
                                                ref OFR_MAX_TME_DIST_O,
                                                ref PZID_O,
                                                ref WHID_O,
                                                ref ALLOW_PBROWSPLIT_O,
                                                ref MAXPBROWCAR_O,
                                                ref CARTYPID_O,
                                                ref MAXLDVOL_O,
                                                ref MAXLDWGT_O,
                                                ref SHIPWSID_O,
                                                ref SHIPXCORD_O,
                                                ref SHIPYCORD_O,
                                                out waypointReader,
                                                out rowReader);

                if (string.IsNullOrEmpty(PBROWGRP_ID_O))
                {
                    Commit();
                    return;
                }

                Tracing.TraceEvent(TraceEventType.Information, 0,
                                   string.Format("Found group {0}", PBROWGRP_ID_O));

                rows      = ReadPickOrderLines(rowReader);
                waypoints = ReadWaypoints(waypointReader);

                Commit();

                if (rows.Count < 1)
                {
                    Tracing.TraceEvent(TraceEventType.Warning, 0, "No rows to process, aborting.");

                    return;
                }

                LCASettings lcaSettings = new LCASettings();

                lcaSettings.DistanceFactor             = OFR_DISTANCE_FACTOR_O.Value;
                lcaSettings.DoBeautyPhase              = OFR_MAX_ITER_STORE_O > 0 && OFR_MAX_TME_STORE_O > 0;
                lcaSettings.DoDistPhase                = OFR_MAX_ITER_DIST_O > 0 && OFR_MAX_TME_DIST_O > 0;
                lcaSettings.DoLCPhase                  = OFR_MAX_ITER_FILL_O > 0 && OFR_MAX_TME_FILL_O > 0;
                lcaSettings.GroupId                    = PBROWGRP_ID_O;
                lcaSettings.MaxmSecBeauty              = OFR_MAX_TME_STORE_O.Value * 1000;
                lcaSettings.MaxmSecDistance            = OFR_MAX_TME_DIST_O.Value * 1000;
                lcaSettings.MaxmSecLC                  = OFR_MAX_TME_FILL_O.Value * 1000;
                lcaSettings.NumberOfIterationsBeauty   = OFR_MAX_ITER_STORE_O.Value;
                lcaSettings.NumberOfIterationsDistance = OFR_MAX_ITER_DIST_O.Value;
                lcaSettings.NumberOfIterationsLC       = OFR_MAX_ITER_FILL_O.Value;
                lcaSettings.PZId            = PZID_O;
                lcaSettings.WHId            = WHID_O;
                lcaSettings.StrekArea       = SHIPWSID_O;
                lcaSettings.StrekXCoord     = SHIPXCORD_O.GetValueOrDefault();
                lcaSettings.StrekYCoord     = SHIPYCORD_O.GetValueOrDefault();
                lcaSettings.AllowPBRowSplit = ALLOW_PBROWSPLIT_O == "1";
                lcaSettings.MaxLDWgt        = MAXLDWGT_O.GetValueOrDefault(double.MaxValue);
                lcaSettings.MaxLDVol        = MAXLDVOL_O.GetValueOrDefault(double.MaxValue);

                lcaSettings.MaxPBRowCar = MAXPBROWCAR_O.GetValueOrDefault(int.MaxValue);
                lcaSettings.OnlyAptean  = false;

                Tracing.TraceEvent(TraceEventType.Information, 0,
                                   string.Format("Parameters:{0}{1}", Environment.NewLine, lcaSettings.ToString()));

                Tracing.TraceEvent(TraceEventType.Information, 0,
                                   string.Format("Processing group {0} ({1} lines, {2} waypoints)...", PBROWGRP_ID_O, rows.Count, waypoints.Count));


                LCAWrapperResult result = null;
                int retry = 1;

                while (retry < 3)
                {
                    // Process Group in Worker Process.
                    try
                    {
                        result = SendGroupToWorkerProcess(rows, waypoints, lcaSettings);  //ProcessGroup(rows, waypoints, lcaSettings);
                        retry  = 3;
                    }
                    catch (TimeoutException)
                    {
                        throw;
                    }
                    catch (Exception)
                    {
                        //Make three tries at processing data in the algorithm if any anknown exception occurs.
                        lock (_syncLock)
                        {
                            AbortClients();
                            retry++;
                        }

                        Thread.Sleep(3000);
                    }
                }

                StringBuilder sb = new StringBuilder();

                foreach (var entry in MapErrors(PBROWGRP_ID_O, result.Errors)) //These are actually warnings
                {
                    foreach (string errorMessage in entry.Value)
                    {
                        string formattedMessage = string.Format("{0} [{1}]", errorMessage, entry.Key);
                        Tracing.TraceEvent(TraceEventType.Warning, 0, formattedMessage);
                        sb.AppendLine(string.Format("{0} Warning: {1}", this.Name, formattedMessage));
                    }
                }

                if (sb.Length > 0)
                {
                    LogGroupError(PBROWGRP_ID_O, sb.ToString());
                }

                Tracing.TraceEvent(TraceEventType.Information, 0,
                                   string.Format("Connecting {0} result lines...", result.Lines.Count));

                StartTransaction();

                ConnectPickOrderLines(PBROWGRP_ID_O, CARTYPID_O, result.Lines);

                _pickOrderCarrierBuild.FinishGroup(PBROWGRP_ID_O);

                Tracing.TraceEvent(TraceEventType.Information, 0,
                                   string.Format("Done processing.", PBROWGRP_ID_O));
                Commit();
            }
            catch (Exception ex)
            {
                try
                {
                    Rollback();
                }
                finally
                {
                    try
                    {
                        LogGroupError(PBROWGRP_ID_O, string.Format("Error - {0}", ex.ToString()));
                    }
                    finally
                    {
                        _pickOrderCarrierBuild.CancelGroup(PBROWGRP_ID_O);
                    }
                }

                throw;
            }
        }
            public LCAWrapperResult ProcessGroup(IList <PBROW> rows, IList <AISLE_WAYPOINT> waypoints, LCASettings lcaSettings)
            {
                List <string> parameters = new List <string>();

                XmlSerializer pbrowsSeri      = new XmlSerializer(typeof(List <PBROW>));
                XmlSerializer waypointsSeri   = new XmlSerializer(typeof(List <AISLE_WAYPOINT>));
                XmlSerializer lcaSettingsSeri = new XmlSerializer(typeof(LCASettings));
                XmlSerializer resultSeri      = new XmlSerializer(typeof(LCAWrapperResultWrapper));

                XmlWriterSettings xmlsettings = new XmlWriterSettings();

                xmlsettings.Indent = true;
                xmlsettings.NewLineOnAttributes = true;

                StringBuilder builder = new StringBuilder();
                XmlWriter     writer  = XmlWriter.Create(builder, xmlsettings);

                pbrowsSeri.Serialize(writer, rows);
                parameters.Add(builder.ToString());

                builder.Clear();
                writer.Close();
                writer = XmlWriter.Create(builder, xmlsettings);

                waypointsSeri.Serialize(writer, waypoints);
                parameters.Add(builder.ToString());

                builder.Clear();
                writer.Close();
                writer = XmlWriter.Create(builder, xmlsettings);

                lcaSettingsSeri.Serialize(writer, lcaSettings);
                parameters.Add(builder.ToString());

                string result = Channel.Process(parameters);

                if (string.IsNullOrEmpty(result))
                {
                    throw new Exception("Error Processing Group, Internal Server Error, SupplyChain.Server.WorkerProcess.OptimizeFillRateWorkerProcessService.Process");
                }

                LCAWrapperResultWrapper resultWrapper = resultSeri.Deserialize(new StringReader(result)) as LCAWrapperResultWrapper;


                LCAWrapperResult realResult = new LCAWrapperResult(resultWrapper.Lines, resultWrapper.GetErrorDictionary());

                return(realResult);
            }
        private LCAWrapperResult SendGroupToWorkerProcess(IList <PBROW> rows, IList <AISLE_WAYPOINT> waypoints, LCASettings lcaSettings)
        {
            LCAWrapperResult lcaResult = new LCAWrapperResult(new List <LCAWrapperResultLine>(), new Dictionary <int, List <string> >());

            _processingLock.AcquireReaderLock(-1);

            bool recycle = false;

            lock (_syncLock)
            {
                if (!_isRecycling)
                {
                    if (!IsWokerProccesAlive())
                    {
                        AbortClients();
                        recycle = true;
                    }
                    else if (_processCount == _recycleThresholdWP + 1)
                    {
                        recycle = true;
                    }
                    else
                    {
                        _processCount++;
                    }

                    _isRecycling = recycle;
                }
            }

            if (recycle)
            {
                LockCookie cookie = _processingLock.UpgradeToWriterLock(-1);

                _isRecycling = false;

                try
                {
                    Tracing.TraceEvent(TraceEventType.Verbose, 0, "Recycling worker process...");

                    CreateWorkerProcess();

                    Tracing.TraceEvent(TraceEventType.Verbose, 0, "Done recycling worker process.");
                }
                finally
                {
                    _processingLock.DowngradeFromWriterLock(ref cookie);
                }
            }


            WorkerProcessClient client = CreateWorkerProcessClient();

            try
            {
                lock (_clientList)
                {
                    _clientList.Add(client);
                }

                client.Open();

                try
                {
                    lcaResult = client.ProcessGroup(rows, waypoints, lcaSettings);
                }
                catch (TimeoutException)
                {
                    Tracing.TraceEvent(TraceEventType.Warning, 0, "Timed out while processing group");
                    throw;
                }
            }
            finally
            {
                lock (_clientList)
                {
                    _clientList.Remove(client);
                }

                try
                {
                    client.Close();
                }
                catch (TimeoutException)
                {
                    client.Abort();
                }
                catch (CommunicationException)
                {
                    client.Abort();
                }
            }

            return(lcaResult);
        }
Example #8
0
        public string Process(List <string> parameters)
        {
            try
            {
                IList <PBROW>          rows        = null;
                IList <AISLE_WAYPOINT> waypoints   = null;
                LCASettings            lcaSettings = null;

                XmlSerializer pbrowsSeri      = new XmlSerializer(typeof(List <PBROW>));
                XmlSerializer waypointsSeri   = new XmlSerializer(typeof(List <AISLE_WAYPOINT>));
                XmlSerializer lcaSettingsSeri = new XmlSerializer(typeof(LCASettings));

                if (parameters.Count != 3)
                {
                    return(null);
                }

                try
                {
                    rows        = pbrowsSeri.Deserialize(new StringReader(parameters[0])) as IList <PBROW>;
                    waypoints   = waypointsSeri.Deserialize(new StringReader(parameters[1])) as IList <AISLE_WAYPOINT>;
                    lcaSettings = lcaSettingsSeri.Deserialize(new StringReader(parameters[2])) as LCASettings;
                }
                catch
                {
                    return(null);
                }

                if (rows == null || waypoints == null || lcaSettings == null)
                {
                    return(null);
                }


                LCAWrapperResult result = null;

                using (LCAWrapper lca = new LCAWrapper(lcaSettings))
                {
                    if (!string.IsNullOrEmpty(lcaSettings.StrekArea))
                    {
                        lca.AddArea(lcaSettings.StrekArea, lcaSettings.StrekXCoord, lcaSettings.StrekYCoord);
                    }

                    string prevWSID  = "";
                    string prevAISLE = "";

                    foreach (AISLE_WAYPOINT waypoint in waypoints)
                    {
                        if (waypoint.WSID != prevWSID)
                        {
                            lca.AddArea(waypoint.WSID, waypoint.WS_XCORD, waypoint.WS_YCORD);
                        }

                        prevWSID = waypoint.WSID;

                        if (waypoint.AISLE != prevAISLE)
                        {
                            lca.AddAisle(waypoint.WSID, waypoint.AISLE, waypoint.AISLE_FROM_XCORD, waypoint.AISLE_FROM_YCORD, waypoint.AISLE_TO_XCORD, waypoint.AISLE_TO_YCORD, waypoint.DIRECTION_PICK);
                        }

                        prevAISLE = waypoint.AISLE;

                        lca.AddAisleWayPoint(waypoint.WSID, waypoint.AISLE, waypoint.WAYPOINT_ID, waypoint.WAYPOINT_XCORD, waypoint.WAYPOINT_YCORD);
                    }

                    foreach (PBROW row in rows)
                    {
                        lca.AddPickBatchLine(row.PBROWID, row.PICKSEQ, row.ARTID, row.COMPANY_ID, row.ORDQTY, row.VOLUME, row.WEIGHT, row.WSID, row.AISLE, row.ARTGROUP, row.CATGROUP, row.XCORD, row.YCORD, row.WPADR);
                    }

                    result = lca.Process();
                }



                if (result != null)
                {
                    XmlSerializer resultSeri = new XmlSerializer(typeof(LCAWrapperResultWrapper));

                    XmlWriterSettings xmlsettings = new XmlWriterSettings();
                    xmlsettings.Indent = true;
                    xmlsettings.NewLineOnAttributes = true;

                    StringBuilder builder = new StringBuilder();
                    XmlWriter     writer  = XmlWriter.Create(builder, xmlsettings);

                    LCAWrapperResultWrapper wrapper = new LCAWrapperResultWrapper(result);

                    resultSeri.Serialize(writer, wrapper);

                    return(builder.ToString());
                }
                else
                {
                    return(null);
                }
            }
            finally
            {
                WorkerProcessHost.processing = false;
            }
        }