Implement Couplings Calculator
This commit is contained in:
parent
1b72c00b1e
commit
9fd1fd8266
@ -25,7 +25,6 @@ public sealed class RhSolutionsAddIn : IExcelAddIn
|
|||||||
.AddSingleton<IAddInConfiguration, AddInConfiguration>()
|
.AddSingleton<IAddInConfiguration, AddInConfiguration>()
|
||||||
.AddSingleton<IDatabaseClient, DatabaseClient>()
|
.AddSingleton<IDatabaseClient, DatabaseClient>()
|
||||||
.AddSingleton<ICurrencyClient, CurrencyClient>()
|
.AddSingleton<ICurrencyClient, CurrencyClient>()
|
||||||
.AddSingleton<IFittingsCalculator, SleevesCalculator>()
|
|
||||||
.AddTransient<IFileDialog, FileDialog>();
|
.AddTransient<IFileDialog, FileDialog>();
|
||||||
|
|
||||||
Services.AddSingleton<WriterFactory>();
|
Services.AddSingleton<WriterFactory>();
|
||||||
@ -42,6 +41,12 @@ public sealed class RhSolutionsAddIn : IExcelAddIn
|
|||||||
Services.AddTransient<GuessReader>()
|
Services.AddTransient<GuessReader>()
|
||||||
.AddTransient<IReader, GuessReader>(s => s.GetService<GuessReader>());
|
.AddTransient<IReader, GuessReader>(s => s.GetService<GuessReader>());
|
||||||
|
|
||||||
|
Services.AddSingleton<FittingsCalculatorFactory>();
|
||||||
|
Services.AddTransient<CouplingsCalculator>()
|
||||||
|
.AddTransient<IFittingsCalculator, CouplingsCalculator>(s => s.GetService<CouplingsCalculator>());
|
||||||
|
Services.AddTransient<SleevesCalculator>()
|
||||||
|
.AddTransient<IFittingsCalculator, SleevesCalculator>(s => s.GetService<SleevesCalculator>());
|
||||||
|
|
||||||
Services.AddSingleton<ToolFactory>();
|
Services.AddSingleton<ToolFactory>();
|
||||||
|
|
||||||
ServiceProvider = Services.BuildServiceProvider();
|
ServiceProvider = Services.BuildServiceProvider();
|
||||||
|
@ -29,7 +29,8 @@ public class RibbonController : ExcelRibbon
|
|||||||
<button id='convert' getEnabled='GetConvertEnabled' label='Актуализировать' size='normal' imageMso='FileUpdate' onAction='OnToolPressed'/>
|
<button id='convert' getEnabled='GetConvertEnabled' label='Актуализировать' size='normal' imageMso='FileUpdate' onAction='OnToolPressed'/>
|
||||||
<button id='merge' label='Объединить' size='normal' imageMso='Copy' onAction='OnToolPressed'/>
|
<button id='merge' label='Объединить' size='normal' imageMso='Copy' onAction='OnToolPressed'/>
|
||||||
<button id='guess' getEnabled='GetGuessEnabled' label='Найти и экспортировать' size='normal' imageMso='ControlWizards' onAction='OnToolPressed'/>
|
<button id='guess' getEnabled='GetGuessEnabled' label='Найти и экспортировать' size='normal' imageMso='ControlWizards' onAction='OnToolPressed'/>
|
||||||
<button id='fillsleeves' getEnabled='GetSleevesEnabled' label='Подобрать гильзы' size='normal' imageMso='CreateQueryFromWizard' onAction='OnToolPressed'/>
|
<button id='fillsleeves' getEnabled='GetFittingsCalcEnabled' label='Подобрать гильзы' size='normal' imageMso='CreateQueryFromWizard' onAction='OnToolPressed'/>
|
||||||
|
<button id='fillcouplings' getEnabled='GetFittingsCalcEnabled' label='Подобрать муфты' size='normal' imageMso='CreateQueryFromWizard' onAction='OnToolPressed'/>
|
||||||
<button id='dxfexport' getEnabled='GetDxfEnabled' label='Экспортировать в DXF' size='normal' imageMso='ExportExcel' onAction='OnToolPressed'/>
|
<button id='dxfexport' getEnabled='GetDxfEnabled' label='Экспортировать в DXF' size='normal' imageMso='ExportExcel' onAction='OnToolPressed'/>
|
||||||
</group>
|
</group>
|
||||||
<group id='rausettings' getLabel='GetVersionLabel'>
|
<group id='rausettings' getLabel='GetVersionLabel'>
|
||||||
@ -85,7 +86,7 @@ public class RibbonController : ExcelRibbon
|
|||||||
|
|
||||||
public bool GetConvertEnabled(IRibbonControl control) => _workbookIsValid;
|
public bool GetConvertEnabled(IRibbonControl control) => _workbookIsValid;
|
||||||
public bool GetDxfEnabled(IRibbonControl control) => _workbookIsValid;
|
public bool GetDxfEnabled(IRibbonControl control) => _workbookIsValid;
|
||||||
public bool GetSleevesEnabled(IRibbonControl control) => _workbookIsValid;
|
public bool GetFittingsCalcEnabled(IRibbonControl control) => _workbookIsValid;
|
||||||
public bool GetGuessEnabled(IRibbonControl control) => RhSolutionsAddIn.Excel.ActiveWorkbook != null && !_workbookIsValid;
|
public bool GetGuessEnabled(IRibbonControl control) => RhSolutionsAddIn.Excel.ActiveWorkbook != null && !_workbookIsValid;
|
||||||
|
|
||||||
public bool GetExportEnabled(IRibbonControl control)
|
public bool GetExportEnabled(IRibbonControl control)
|
||||||
|
@ -1,9 +1,67 @@
|
|||||||
namespace RhSolutions.Services;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace RhSolutions.Services;
|
||||||
|
|
||||||
public class CouplingsCalculator : IFittingsCalculator
|
public class CouplingsCalculator : IFittingsCalculator
|
||||||
{
|
{
|
||||||
|
private static readonly string pattern =
|
||||||
|
@"(^|\W)труба.*(?'Diameter'16|20|25|32|40|50|63).*(отрезки|бухт[ае])\D*(?'Length'\d{1,3})(\D|$)";
|
||||||
|
|
||||||
public Dictionary<Product, double> Calculate(Dictionary<Product, double> products)
|
public Dictionary<Product, double> Calculate(Dictionary<Product, double> products)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
Dictionary<string, double> result = new()
|
||||||
|
{
|
||||||
|
["16"] = 0,
|
||||||
|
["20"] = 0,
|
||||||
|
["25"] = 0,
|
||||||
|
["32"] = 0,
|
||||||
|
["40"] = 0,
|
||||||
|
["50"] = 0,
|
||||||
|
["63"] = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
var rautitanProducts = products.Where(kvp => kvp.Key.ProductLines.Contains("RAUTITAN"));
|
||||||
|
Regex regex = new(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
|
foreach (var kvp in rautitanProducts)
|
||||||
|
{
|
||||||
|
var match = regex.Match(kvp.Key.Name);
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
string diameter = match.Groups["Diameter"].Value;
|
||||||
|
int packingLength = int.Parse(match.Groups["Length"].Value);
|
||||||
|
result[diameter] += GetCouplesCount(kvp.Value, packingLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
.ToDictionary(kvp =>
|
||||||
|
kvp.Key switch
|
||||||
|
{
|
||||||
|
"16" => new Product("11600111001"),
|
||||||
|
"20" => new Product("11600121001"),
|
||||||
|
"25" => new Product("11600131001"),
|
||||||
|
"32" => new Product("11600141001"),
|
||||||
|
"40" => new Product("11600151001"),
|
||||||
|
"50" => new Product("14563021001"),
|
||||||
|
"63" => new Product("14563031001"),
|
||||||
|
_ => throw new Exception($"Неизвестный диаметр {kvp.Key}")
|
||||||
|
}, kvp => kvp.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int GetCouplesCount(double amount, int packingLength)
|
||||||
|
{
|
||||||
|
if (amount < packingLength)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (amount % packingLength == 0)
|
||||||
|
{
|
||||||
|
return (int)amount / packingLength - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)amount / packingLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
21
RhSolutions.AddIn/Services/FittingsCalculatorFactory.cs
Normal file
21
RhSolutions.AddIn/Services/FittingsCalculatorFactory.cs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
namespace RhSolutions.Services;
|
||||||
|
|
||||||
|
public class FittingsCalculatorFactory
|
||||||
|
{
|
||||||
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
|
public FittingsCalculatorFactory(IServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
_serviceProvider = serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IFittingsCalculator GetFittingsCalculator(string calculatorName)
|
||||||
|
{
|
||||||
|
return calculatorName switch
|
||||||
|
{
|
||||||
|
"Sleeves" => (IFittingsCalculator)_serviceProvider.GetService(typeof(SleevesCalculator)),
|
||||||
|
"Couplings" => (IFittingsCalculator)_serviceProvider.GetService(typeof(CouplingsCalculator)),
|
||||||
|
_ => throw new ArgumentException($"Незвестный интерфейс {nameof(IFittingsCalculator)}: {calculatorName}")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -36,6 +36,7 @@ namespace RhSolutions.Tools
|
|||||||
RibbonController.RefreshControl("dxfexport");
|
RibbonController.RefreshControl("dxfexport");
|
||||||
RibbonController.RefreshControl("guess");
|
RibbonController.RefreshControl("guess");
|
||||||
RibbonController.RefreshControl("fillsleeves");
|
RibbonController.RefreshControl("fillsleeves");
|
||||||
|
RibbonController.RefreshControl("fillcouplings");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RefreshExportButton(object sh, Range target)
|
private static void RefreshExportButton(object sh, Range target)
|
||||||
|
25
RhSolutions.AddIn/Tools/FittingsTool.cs
Normal file
25
RhSolutions.AddIn/Tools/FittingsTool.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
namespace RhSolutions.Tools;
|
||||||
|
|
||||||
|
internal class FittingsTool : Tool
|
||||||
|
{
|
||||||
|
private readonly FittingsCalculatorFactory _factory;
|
||||||
|
private string _calculatorName;
|
||||||
|
|
||||||
|
public FittingsTool(ReaderFactory readerFactory, WriterFactory writerFactory, FittingsCalculatorFactory calculatorFactory, string calculatorName) : base(readerFactory, writerFactory)
|
||||||
|
{
|
||||||
|
_factory = calculatorFactory;
|
||||||
|
_calculatorName = calculatorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Execute()
|
||||||
|
{
|
||||||
|
Application app = RhSolutionsAddIn.Excel.Application;
|
||||||
|
Worksheet worksheet = app.ActiveWorkbook.ActiveSheet;
|
||||||
|
_reader = _readerFactory.GetReader("Excel");
|
||||||
|
var products = _reader.ReadProducts(new[] { worksheet });
|
||||||
|
var calculator = _factory.GetFittingsCalculator(_calculatorName);
|
||||||
|
var fittings = calculator.Calculate(products.Select(p => p.Item2).First());
|
||||||
|
_writer = _writerFactory.GetWriter("CurrentPrice");
|
||||||
|
_writer.WriteProducts(fittings);
|
||||||
|
}
|
||||||
|
}
|
@ -1,22 +0,0 @@
|
|||||||
namespace RhSolutions.Tools;
|
|
||||||
|
|
||||||
internal class SleevesTool : Tool
|
|
||||||
{
|
|
||||||
private readonly IFittingsCalculator _sleevesCaluculator;
|
|
||||||
|
|
||||||
public SleevesTool(ReaderFactory readerFactory, WriterFactory writerFactory, IFittingsCalculator sleevesCaluculator) : base(readerFactory, writerFactory)
|
|
||||||
{
|
|
||||||
_sleevesCaluculator = sleevesCaluculator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Execute()
|
|
||||||
{
|
|
||||||
Application app = RhSolutionsAddIn.Excel.Application;
|
|
||||||
Worksheet worksheet = app.ActiveWorkbook.ActiveSheet;
|
|
||||||
_reader = _readerFactory.GetReader("Excel");
|
|
||||||
var products = _reader.ReadProducts(new[] { worksheet });
|
|
||||||
var sleeves = _sleevesCaluculator.Calculate(products.Select(p => p.Item2).First());
|
|
||||||
_writer = _writerFactory.GetWriter("CurrentPrice");
|
|
||||||
_writer.WriteProducts(sleeves);
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,7 +4,7 @@ internal class ToolFactory
|
|||||||
{
|
{
|
||||||
static ReaderFactory readerFactory = RhSolutionsAddIn.ServiceProvider.GetService<ReaderFactory>();
|
static ReaderFactory readerFactory = RhSolutionsAddIn.ServiceProvider.GetService<ReaderFactory>();
|
||||||
static WriterFactory writerFactory = RhSolutionsAddIn.ServiceProvider.GetService<WriterFactory>();
|
static WriterFactory writerFactory = RhSolutionsAddIn.ServiceProvider.GetService<WriterFactory>();
|
||||||
static IFittingsCalculator sleevesCaluculator = RhSolutionsAddIn.ServiceProvider.GetService<IFittingsCalculator>();
|
static FittingsCalculatorFactory fittingsCalculatorFactory = RhSolutionsAddIn.ServiceProvider.GetService<FittingsCalculatorFactory>();
|
||||||
|
|
||||||
public Tool GetTool(string toolName)
|
public Tool GetTool(string toolName)
|
||||||
{
|
{
|
||||||
@ -15,7 +15,8 @@ internal class ToolFactory
|
|||||||
"merge" => new MergeTool(readerFactory, writerFactory),
|
"merge" => new MergeTool(readerFactory, writerFactory),
|
||||||
"dxfexport" => new DxfTool(readerFactory, writerFactory),
|
"dxfexport" => new DxfTool(readerFactory, writerFactory),
|
||||||
"guess" => new GuessTool(readerFactory, writerFactory),
|
"guess" => new GuessTool(readerFactory, writerFactory),
|
||||||
"fillsleeves" => new SleevesTool(readerFactory, writerFactory, sleevesCaluculator),
|
"fillsleeves" => new FittingsTool(readerFactory, writerFactory, fittingsCalculatorFactory, "Sleeves"),
|
||||||
|
"fillcouplings" => new FittingsTool(readerFactory, writerFactory, fittingsCalculatorFactory, "Couplings"),
|
||||||
_ => throw new Exception($"Неизвестный инструмент {toolName}"),
|
_ => throw new Exception($"Неизвестный инструмент {toolName}"),
|
||||||
};
|
};
|
||||||
return tool;
|
return tool;
|
||||||
|
Loading…
Reference in New Issue
Block a user