Discover Erik's code

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}
Packaging machine
This is actual code from the Packaging Machine. Feel free to scroll through it.
Packaging

Sometimes, the product fits in one of our standard boxes of bags and other times, the product is delivered in the sturdy box the manufacturer already used. This has consequences for the path that the order takes in our warehouse.

The weight of the product is unknown

Sometimes, we don't know the weight of the product. For example, because there's wrong product data in our system. These products are marked, so we can measure and weigh them again later.

Vorige
Volgende