diff options
-rw-r--r-- | Assistant/IProduct.cs | 9 | ||||
-rw-r--r-- | Assistant/Product.cs | 21 | ||||
-rw-r--r-- | Assistant/SkuAssist.cs | 16 | ||||
-rw-r--r-- | Functions.cs | 46 | ||||
-rw-r--r-- | Rehau.Sku.Assist.csproj | 23 | ||||
-rw-r--r-- | packages.config | 5 |
6 files changed, 101 insertions, 19 deletions
diff --git a/Assistant/IProduct.cs b/Assistant/IProduct.cs new file mode 100644 index 0000000..aca3ff5 --- /dev/null +++ b/Assistant/IProduct.cs @@ -0,0 +1,9 @@ +namespace Rehau.Sku.Assist +{ + interface IProduct + { + string Sku { get; } + string Name { get; } + string Uri { get; } + } +} diff --git a/Assistant/Product.cs b/Assistant/Product.cs new file mode 100644 index 0000000..17a7065 --- /dev/null +++ b/Assistant/Product.cs @@ -0,0 +1,21 @@ +namespace Rehau.Sku.Assist +{ + public class Product : IProduct + { + public string Sku { get; } + public string Name { get; } + + public string Uri => throw new System.NotImplementedException(); + + public Product(string sku, string name) + { + Sku = sku; + Name = name; + } + + public override string ToString() + { + return $"{this.Name} ({this.Sku})"; + } + } +}
\ No newline at end of file diff --git a/Assistant/SkuAssist.cs b/Assistant/SkuAssist.cs index 1167274..9eb3328 100644 --- a/Assistant/SkuAssist.cs +++ b/Assistant/SkuAssist.cs @@ -1,8 +1,8 @@ -using System.Net.Http; -using System.Threading.Tasks; -using AngleSharp; +using AngleSharp; using System.Linq; using System.Net; +using System.Net.Http; +using System.Threading.Tasks; namespace Rehau.Sku.Assist { @@ -23,16 +23,14 @@ namespace Rehau.Sku.Assist return await context.OpenAsync(req => req.Content(source)); } - public static string GetResultFromDocument(AngleSharp.Dom.IDocument document) + public static IProduct GetProductFromDocument(AngleSharp.Dom.IDocument document) { - var result = document + return document .All .Where(e => e.ClassName == "product-item__desc-top") - .Select(e => new { sku = e.Children[0].TextContent, title = e.Children[1].TextContent.Trim(new[] { '\n', ' ' }) }) - .Where(t => !t.sku.Any(c => char.IsLetter(c))) + .Select(e => new Product(e.Children[0].TextContent, e.Children[1].TextContent.Trim(new[] { '\n', ' ' }))) + // .Where(product => !product.Sku.Any(c => char.IsLetter(c))) .FirstOrDefault(); - - return result == null ? "Не найдено" : $"{result.title} ({result.sku})"; } } } diff --git a/Functions.cs b/Functions.cs index aefdd87..9d3eb28 100644 --- a/Functions.cs +++ b/Functions.cs @@ -1,27 +1,53 @@ using ExcelDna.Integration; +using System.Runtime.Caching; using System.Net.Http; namespace Rehau.Sku.Assist { public class Functions : IExcelAddIn { - static readonly HttpClient httpClient = new HttpClient(); + private static HttpClient _httpClient; + private static ObjectCache _resultCache = MemoryCache.Default; - public static object RAUNAME(string request) + public void AutoClose() { - return ExcelAsyncUtil.Run("RAUNAME", request, delegate - { - var document = SkuAssist.GetDocumentAsync(request, httpClient).Result; - return SkuAssist.GetResultFromDocument(document); - }); } - - public void AutoClose() + public void AutoOpen() { + _httpClient = new HttpClient(); } - public void AutoOpen() + [ExcelFunction] + public static object RAUNAME(string request) { + string cachedResult = _resultCache[request] as string; + + if (cachedResult != null) + { + return cachedResult; + } + + else + { + object result = ExcelAsyncUtil.Run("RAUNAME", null, + delegate + { + var document = SkuAssist.GetDocumentAsync(request, _httpClient).Result; + var product = SkuAssist.GetProductFromDocument(document); + return product.ToString(); + }); + + if (result.Equals(ExcelError.ExcelErrorNA)) + { + return "Загрузка..."; + } + + else + { + _resultCache.Add(request, result, System.DateTime.Now.AddMinutes(20)); + return result.ToString(); + } + } } } }
\ No newline at end of file diff --git a/Rehau.Sku.Assist.csproj b/Rehau.Sku.Assist.csproj index 2fc2307..29cdb12 100644 --- a/Rehau.Sku.Assist.csproj +++ b/Rehau.Sku.Assist.csproj @@ -38,26 +38,49 @@ </Reference> <Reference Include="ExcelDna.Integration, Version=1.1.0.0, Culture=neutral, PublicKeyToken=f225e9659857edbe, processorArchitecture=MSIL"> <HintPath>packages\ExcelDna.Integration.1.5.0\lib\net452\ExcelDna.Integration.dll</HintPath> + <Private>False</Private> </Reference> <Reference Include="System" /> <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath> </Reference> + <Reference Include="System.Configuration" /> + <Reference Include="System.Configuration.ConfigurationManager, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> + <HintPath>packages\System.Configuration.ConfigurationManager.6.0.0\lib\net461\System.Configuration.ConfigurationManager.dll</HintPath> + </Reference> <Reference Include="System.Core" /> + <Reference Include="System.Data.OracleClient" /> + <Reference Include="System.Net" /> + <Reference Include="System.Runtime.Caching" /> <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <HintPath>packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath> </Reference> + <Reference Include="System.Security" /> + <Reference Include="System.Security.AccessControl, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\System.Security.AccessControl.6.0.0\lib\net461\System.Security.AccessControl.dll</HintPath> + </Reference> + <Reference Include="System.Security.Permissions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> + <HintPath>packages\System.Security.Permissions.6.0.0\lib\net461\System.Security.Permissions.dll</HintPath> + </Reference> + <Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath> + </Reference> + <Reference Include="System.ServiceProcess" /> <Reference Include="System.Text.Encoding.CodePages, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <HintPath>packages\System.Text.Encoding.CodePages.5.0.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath> </Reference> + <Reference Include="System.Transactions" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.Net.Http" /> <Reference Include="System.Xml" /> + <Reference Include="WindowsBase" /> </ItemGroup> <ItemGroup> + <Compile Include="Assistant\IProduct.cs" /> + <Compile Include="Assistant\Product.cs" /> <Compile Include="Functions.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Assistant\SkuAssist.cs" /> diff --git a/packages.config b/packages.config index 07a90ac..840c4e8 100644 --- a/packages.config +++ b/packages.config @@ -4,6 +4,11 @@ <package id="ExcelDna.AddIn" version="1.5.0" targetFramework="net48" /> <package id="ExcelDna.Integration" version="1.5.0" targetFramework="net48" /> <package id="System.Buffers" version="4.5.1" targetFramework="net48" /> + <package id="System.Configuration.ConfigurationManager" version="6.0.0" targetFramework="net48" /> + <package id="System.Runtime.Caching" version="6.0.0" targetFramework="net48" /> <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0" targetFramework="net48" /> + <package id="System.Security.AccessControl" version="6.0.0" targetFramework="net48" /> + <package id="System.Security.Permissions" version="6.0.0" targetFramework="net48" /> + <package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net48" /> <package id="System.Text.Encoding.CodePages" version="5.0.0" targetFramework="net48" /> </packages>
\ No newline at end of file |