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."); }
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 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); }
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; } }
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); }
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; } }