aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--RhSolutions.AddIn/Services/SleevesCalculator.cs59
1 files changed, 55 insertions, 4 deletions
diff --git a/RhSolutions.AddIn/Services/SleevesCalculator.cs b/RhSolutions.AddIn/Services/SleevesCalculator.cs
index 0c58f35..8e1524a 100644
--- a/RhSolutions.AddIn/Services/SleevesCalculator.cs
+++ b/RhSolutions.AddIn/Services/SleevesCalculator.cs
@@ -1,13 +1,64 @@
-namespace RhSolutions.Services;
+using System.Text.RegularExpressions;
+
+namespace RhSolutions.Services;
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)
{
- int counter = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN")).Count();
- return new Dictionary<Product, double>()
+ Dictionary<string, double> result = new()
{
- [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);
}
}