Job alert
Sluiten

Waar wil je van op de hoogte gehouden worden?

  • Bezorger
  • Magazijn (Tilburg)
  • Kantoor

Ontdek de code van Erik

001using System;002using System.Collections.Generic;003using System.Linq;004using VanRiet.Shipment.Sorter.Weighing.Strategies;005using static VanRiet.Shipment.Sorter.Weighing.Constants;006007namespace VanRiet.Shipment.Sorter.Weighing008{009    public class WeightAllowanceCalculator010    {011        public virtual WeightAllowanceCalculationResult Calculate(uint weightInGrams)012        {013            var strategy = new PreCalculatedWeightStrategy(weightInGrams);014015            return CalculateWeightAllowance(strategy);016        }017018        public virtual WeightAllowanceCalculationResult Calculate(019            WeightAllowanceCalculationInformation info)020        {021            var strategy = ChooseStrategy();022023            return CalculateWeightAllowance(strategy);024025            IShipmentWeightAllowanceStrategy ChooseStrategy()026            {027                if (!info.Products.Any())028                    return new UnknownShipmentStrategy();029030                var anyProductsWithUnknownWeight =031                    info.Products.Any(p => !p.WeightGrams.HasValue);032033                if (anyProductsWithUnknownWeight && info.IsMultiColli)034                    return new UnknownShipmentStrategy();035036                if (info.IsMultiColli)037                    return new MultiColliShipmentStrategy(info);038039                if (anyProductsWithUnknownWeight)040                    return new UnknownProductWeightStrategy(info);041042                if (info.PreCalculatedWeight.HasValue)043                    return new PreCalculatedWeightStrategy(info.PreCalculatedWeight.Value);044045                return new SingleShipmentStrategy(info);046            }047        }048049        private WeightAllowanceCalculationResult CalculateWeightAllowance(050            IShipmentWeightAllowanceStrategy input051        )052        {053            checked054            {055                var intermediateResults = new List<WeightAllowanceCorrection>();056057                var result = ApplyToleranceCoefficientsToProductsWeight();058                result = ApplyMaximumAllowedProductsWeightCorrection(result);059                result = AddPackaging(result);060                result = ApplySupportedGrossWeightCorrection(result);061                result = ApplySensorsAccuracyCorrection(result);062063                return new WeightAllowanceCalculationResult(064                    new WeightRangeGrams(065                        min: (uint) result.min,066                        max: (uint) result.max067                    ),068                    input.PackagingType,069                    input.GetType(),070                    intermediateResults071                );072073                (decimal min, decimal max) ApplyToleranceCoefficientsToProductsWeight()074                {075                    decimal calculatedMin = Math.Floor(076                        input.Products.Min * _settings.MinimumProductWeightToleranceCoefficient077                    );078079                    decimal calculatedMax = Math.Ceiling(080                        input.Products.Max * _settings.MaximumProductWeightToleranceCoefficient081                    );082083                    var correctedRange = (calculatedMin, calculatedMax);084085                    AddIntermediateResult(086                        WeightAllowanceCorrectionType.AppliedProductWeightToleranceCoefficients,087                        original: (input.Products.Min, input.Products.Max),088                        corrected: correctedRange089                    );090091                    return correctedRange;092                }093094                void AddIntermediateResult(WeightAllowanceCorrectionType type, (decimal, decimal) original, (decimal, decimal) corrected) =>095                    intermediateResults.Add(new WeightAllowanceCorrection(type, original: original, corrected: corrected));096097                (decimal min, decimal max) AddPackaging((decimal min, decimal max) range)098                {099                    var correctedRange = (range.min + input.Packaging.Min, range.max + input.Packaging.Max);100101                    AddIntermediateResult(102                        WeightAllowanceCorrectionType.AddedPackagingWeight,103                        original: range,104                        corrected: correctedRange105                    );106107                    return correctedRange;108                }109110                (decimal min, decimal max) ApplySensorsAccuracyCorrection(111                    (decimal min, decimal max) range112                )113                {114                    decimal calculatedMin = Math.Max(range.min - SensorsAccuracyGrams, 0);115                    decimal calculatedMax = range.max + SensorsAccuracyGrams;116117                    var correctedRange = (calculatedMin, calculatedMax);118119                    AddIntermediateResult(120                        WeightAllowanceCorrectionType.IncludedSensorsAccuracy,121                        original: range,122                        corrected: correctedRange123                    );124125                    return correctedRange;126                }127128                (decimal min, decimal max) ApplyMaximumAllowedProductsWeightCorrection(129                    (decimal min, decimal max) range130                )131                {132                    decimal calculatedMin = range.min;133                    decimal calculatedMax = range.max;134                    calculatedMin = Math.Min(calculatedMin, input.MaxSupportedWeightGrams);135                    calculatedMax = Math.Min(calculatedMax, input.MaxSupportedWeightGrams);136137                    var corrected = (calculatedMin, calculatedMax);138139                    if (range != corrected)140                    {141                        intermediateResults.Add(142                            new WeightAllowanceCorrection(143                                WeightAllowanceCorrectionType.ExceededMaximumAllowedProductsWeight,144                                original: range,145                                corrected: (calculatedMin, calculatedMax)146                            )147                        );148                    }149150                    return corrected;151                }152153                (decimal min, decimal max) ApplySupportedGrossWeightCorrection(154                    (decimal min, decimal max) range155                )156                {157                    decimal calculatedMin = range.min;158                    decimal calculatedMax = range.max;159                    calculatedMin = Math.Max(calculatedMin, 0);160                    calculatedMin = Math.Min(calculatedMin, MaxSupportedWeightGrams);161                    calculatedMax = Math.Max(calculatedMax, 0);162                    calculatedMax = Math.Min(calculatedMax, MaxSupportedWeightGrams);163164                    var corrected = (calculatedMin, calculatedMax);165166                    if (range != corrected)167                    {168                        intermediateResults.Add(169                            new WeightAllowanceCorrection(170                                WeightAllowanceCorrectionType.ExceededSupportedGrossWeight,171                                original: range,172                                corrected: (calculatedMin, calculatedMax)173                            )174                        );175                    }176177                    return corrected;178                }179            }180        }181182        private readonly IWeighingSettings _settings;183184        public WeightAllowanceCalculator(IWeighingSettings settings)185        {186            _settings = settings ?? throw new ArgumentNullException(nameof(settings));187        }188    }189}
Pakketjesmachine NL
Dit is echte code uit de Pakketjesmachine. Scroll er gerust doorheen.
Verpakkingen

Soms past het product in één van onze standaard dozen of zakken en soms wordt het product al in een stevige doos aangeleverd door de fabrikant. Dit heeft gevolgen voor de de weg die de bestelling aflegt in ons magazijn.

Gewicht niet geweten

Soms weten we het gewicht van het product niet, bijvoorbeeld doordat er verkeerde productgegevens in ons systeem staan. Dan worden deze producten aangemerkt, zodat we ze later nog eens kunnen meten en wegen.

Vorige
Volgende