Implement sleeves calculator

This commit is contained in:
Sergey Chebotar 2023-06-21 06:33:12 +03:00
parent 5153e951e4
commit 0da818da3e

View File

@ -1,13 +1,64 @@
namespace RhSolutions.Services; using System.Text.RegularExpressions;
namespace RhSolutions.Services;
public class SleevesCalculator : ISleevesCaluculator public class SleevesCalculator : ISleevesCaluculator
{ {
private const string doublePattern =
@"((?i)равнопроходная|угольник 90|угольник 45|Т-образная|Комплект трубок(?i))(.+?(?<Sleeve>\b16\b|\b20\b|\b25\b|\b32\b|\b40\b|\b50\b|\b63\b))+";
private const string singlePattern =
@"((?i)муфта|тройник|переходник|угольник|штуцер|Г-образная|заглушка(?i))(.+?(?<Sleeve>\b16\b|\b20\b|\b25\b|\b32\b|\b40\b|\b50\b|\b63\b))+";
public Dictionary<Product, double> CalculateSleeves(Dictionary<Product, double> products) public Dictionary<Product, double> CalculateSleeves(Dictionary<Product, double> products)
{ {
int counter = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN")).Count(); Dictionary<string, double> result = new()
return new Dictionary<Product, double>()
{ {
[new Product("11600011001")] = counter ["16"] = 0,
["20"] = 0,
["25"] = 0,
["32"] = 0,
["40"] = 0,
["50"] = 0,
["63"] = 0,
}; };
var rautitanProducts = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN"));
foreach (var kvp in rautitanProducts)
{
var doubleCollection = Regex.Matches(kvp.Key.Name, doublePattern);
if (doubleCollection.Count != 0)
{
CaptureCollection collection = doubleCollection[0].Groups["Sleeve"].Captures;
foreach (Capture sleeve in collection)
{
result[sleeve.Value] += kvp.Value * 2;
}
continue;
}
var singleCollection = Regex.Matches(kvp.Key.Name, singlePattern);
if (singleCollection.Count != 0)
{
CaptureCollection collection = singleCollection[0].Groups["Sleeve"].Captures;
foreach (Capture sleeve in collection)
{
result[sleeve.Value] += kvp.Value;
}
}
}
return result
.Where(kvp => kvp.Value != 0)
.ToDictionary(kvp =>
kvp.Key switch
{
"16" => new Product("11600011001"),
"20" => new Product("11600021001"),
"25" => new Product("11600031001"),
"32" => new Product("11600041001"),
"40" => new Product("11600051001"),
"50" => new Product("11397711002"),
"63" => new Product("11397811002"),
_ => throw new Exception($"Неизвестный диаметр {kvp.Key}")
}, kvp => kvp.Value);
} }
} }