Compare commits
11 Commits
8ac3234473
...
0b952b4cf2
Author | SHA1 | Date | |
---|---|---|---|
|
0b952b4cf2 | ||
|
c045a6047f | ||
|
2506f0fe09 | ||
|
677424f16e | ||
|
b35c9d6978 | ||
|
6ac7b98e59 | ||
|
755d556f09 | ||
|
0ccbf29382 | ||
|
9892b3687f | ||
|
c47301c0db | ||
|
f267b27375 |
@ -1,12 +1,14 @@
|
||||
using ExcelDna.Integration;
|
||||
using RhSolutions.Models;
|
||||
using RhSolutions.Services;
|
||||
using System.Linq;
|
||||
|
||||
namespace RhSolutions.AddIn
|
||||
{
|
||||
public class Functions
|
||||
{
|
||||
[ExcelFunction(Description = "Запрос в удаленную базу данных")]
|
||||
public static object RHSOLUTIONS([ExcelArgument(Name = "Запрос")] string line)
|
||||
[ExcelFunction(Description = "Распознать артикул и попробовать найти его в прайс-листе")]
|
||||
public static object RHSOLUTIONS([ExcelArgument(Name = "\"Строка с названием материала\"")] string line)
|
||||
{
|
||||
object result;
|
||||
|
||||
@ -15,17 +17,40 @@ namespace RhSolutions.AddIn
|
||||
return RhDatabaseClient.GetProduct(line).GetAwaiter().GetResult();
|
||||
});
|
||||
|
||||
string parsedSku = Sku.TryParse(line, out var skus)
|
||||
? skus.First().ToString() : string.Empty;
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(parsedSku))
|
||||
{
|
||||
return ExcelError.ExcelErrorNA;
|
||||
}
|
||||
else
|
||||
{
|
||||
return skus.First().ToString();
|
||||
}
|
||||
}
|
||||
|
||||
if (result.Equals(ExcelError.ExcelErrorNA))
|
||||
{
|
||||
if (string.IsNullOrEmpty(parsedSku))
|
||||
{
|
||||
return "Загрузка...";
|
||||
}
|
||||
else
|
||||
{
|
||||
return skus.First().ToString();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[ExcelFunction]
|
||||
public static void _ResetStatusBar()
|
||||
{
|
||||
RhSolutionsAddIn.Excel.StatusBar = false;
|
||||
}
|
||||
}
|
||||
}
|
@ -9,21 +9,19 @@ namespace RhSolutions.AddIn
|
||||
{
|
||||
class RhSolutionsAddIn : IExcelAddIn
|
||||
{
|
||||
public static Application Excel;
|
||||
public static HttpClient httpClient;
|
||||
public static Application Excel { get; private set; }
|
||||
public static HttpClient HttpClient { get; private set; }
|
||||
|
||||
public void AutoOpen()
|
||||
{
|
||||
Excel = (Application)ExcelDnaUtil.Application;
|
||||
httpClient = new HttpClient();
|
||||
HttpClient = new HttpClient();
|
||||
IntelliSenseServer.Install();
|
||||
RegistryUtil.Initialize();
|
||||
EventsUtil.Initialize();
|
||||
|
||||
ServicePointManager.SecurityProtocol =
|
||||
SecurityProtocolType.Tls12 |
|
||||
SecurityProtocolType.Tls11 |
|
||||
SecurityProtocolType.Tls;
|
||||
SecurityProtocolType.Tls12;
|
||||
}
|
||||
|
||||
public void AutoClose()
|
||||
@ -31,6 +29,7 @@ namespace RhSolutions.AddIn
|
||||
IntelliSenseServer.Uninstall();
|
||||
RegistryUtil.Uninitialize();
|
||||
EventsUtil.Uninitialize();
|
||||
HttpClient.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using RhSolutions.Models;
|
||||
using System.Linq;
|
||||
|
||||
namespace RhSolutions.Controllers
|
||||
{
|
||||
@ -56,9 +57,9 @@ namespace RhSolutions.Controllers
|
||||
{
|
||||
object current = cells[row, column];
|
||||
|
||||
if (Sku.TryParse(current.ToString(), out Sku rauSku))
|
||||
if (Sku.TryParse(current.ToString(), out var rauSku))
|
||||
{
|
||||
sku = rauSku.ToString();
|
||||
sku = rauSku.FirstOrDefault().ToString() ?? null;
|
||||
}
|
||||
|
||||
else if (current.GetType() == typeof(string)
|
||||
|
@ -1,11 +1,15 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace RhSolutions.Models
|
||||
{
|
||||
internal class Sku
|
||||
public class Sku
|
||||
{
|
||||
public string Article { get; private set; }
|
||||
public string Variant { get; private set; }
|
||||
private const string matchPattern = @"([1\D]|\b)(?<Article>\d{6})([1\s-]|)(?<Variant>\d{3})\b";
|
||||
private string _article;
|
||||
private string _variant;
|
||||
|
||||
public Sku(string article, string variant)
|
||||
{
|
||||
@ -13,49 +17,94 @@ namespace RhSolutions.Models
|
||||
Variant = variant;
|
||||
}
|
||||
|
||||
public static bool TryParse(string line, out Sku rehauSku)
|
||||
public string Id
|
||||
{
|
||||
Match match;
|
||||
match = Regex.Match(line, @"\b[1]\d{6}[1]\d{3}\b");
|
||||
if (match.Success)
|
||||
get
|
||||
{
|
||||
string sku = match.Value.Substring(1, 6);
|
||||
string variant = match.Value.Substring(8, 3);
|
||||
rehauSku = new Sku(sku, variant);
|
||||
return true;
|
||||
return $"1{Article}1{Variant}";
|
||||
}
|
||||
set
|
||||
{
|
||||
if (TryParse(value, out IEnumerable<Sku> skus))
|
||||
{
|
||||
if (skus.Count() > 1)
|
||||
{
|
||||
throw new ArgumentException($"More than one valid sku detected: {value}");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Article = skus.First().Article;
|
||||
this.Variant = skus.First().Variant;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException($"Invalid sku input: {value}");
|
||||
}
|
||||
}
|
||||
}
|
||||
public string Article
|
||||
{
|
||||
get
|
||||
{
|
||||
return _article;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == null || value.Length != 6 || value.Where(c => char.IsDigit(c)).Count() != 6)
|
||||
{
|
||||
throw new ArgumentException($"Wrong Article: {Article}");
|
||||
}
|
||||
else
|
||||
{
|
||||
_article = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
public string Variant
|
||||
{
|
||||
get
|
||||
{
|
||||
return _variant;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value == null || value.Length != 3 || value.Where(c => char.IsDigit(c)).Count() != 3)
|
||||
{
|
||||
throw new ArgumentException($"Wrong Variant: {Variant}");
|
||||
}
|
||||
else _variant = value;
|
||||
}
|
||||
}
|
||||
public static IEnumerable<Sku> GetValidSkus(string line)
|
||||
{
|
||||
MatchCollection matches = Regex.Matches(line, matchPattern);
|
||||
if (matches.Count == 0)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (Match m in matches)
|
||||
{
|
||||
yield return new Sku(m.Groups["Article"].Value, m.Groups["Variant"].Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match = Regex.Match(line, @"\b\d{6}\D\d{3}\b");
|
||||
if (match.Success)
|
||||
public static bool TryParse(string line, out IEnumerable<Sku> skus)
|
||||
{
|
||||
string sku = match.Value.Substring(0, 6);
|
||||
string variant = match.Value.Substring(7, 3);
|
||||
rehauSku = new Sku(sku, variant);
|
||||
return true;
|
||||
}
|
||||
|
||||
match = Regex.Match(line, @"\b\d{9}\b");
|
||||
if (match.Success)
|
||||
MatchCollection matches = Regex.Matches(line, matchPattern);
|
||||
if (matches.Count == 0)
|
||||
{
|
||||
string sku = match.Value.Substring(0, 6);
|
||||
string variant = match.Value.Substring(6, 3);
|
||||
rehauSku = new Sku(sku, variant);
|
||||
return true;
|
||||
}
|
||||
|
||||
match = Regex.Match(line, @"\b\d{6}\b");
|
||||
if (match.Success)
|
||||
{
|
||||
string sku = match.Value.Substring(0, 6);
|
||||
string variant = "001";
|
||||
rehauSku = new Sku(sku, variant);
|
||||
return true;
|
||||
skus = Enumerable.Empty<Sku>();
|
||||
return false;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
rehauSku = null;
|
||||
return false;
|
||||
skus = GetValidSkus(line);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace RhSolutions.Models
|
||||
{
|
||||
static class SkuExtensions
|
||||
{
|
||||
public static bool IsRehauSku(this string line)
|
||||
{
|
||||
return Regex.IsMatch(line, @"^[1]\d{6}[1]\d{3}$");
|
||||
}
|
||||
}
|
||||
}
|
@ -87,7 +87,7 @@ namespace RhSolutions.Models
|
||||
if (group == null || name == null || sku == null)
|
||||
continue;
|
||||
|
||||
if (!sku.ToString().IsRehauSku())
|
||||
if (!Sku.TryParse(sku.ToString(), out _))
|
||||
continue;
|
||||
|
||||
Product p = new Product
|
||||
|
@ -1,9 +1,6 @@
|
||||
using ExcelDna.Integration;
|
||||
using Microsoft.Office.Interop.Excel;
|
||||
using Microsoft.Office.Interop.Excel;
|
||||
using RhSolutions.AddIn;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace RhSolutions.Models
|
||||
{
|
||||
@ -13,14 +10,9 @@ namespace RhSolutions.Models
|
||||
|
||||
public abstract void Update();
|
||||
|
||||
private static void ResetStatusBar()
|
||||
{
|
||||
RhSolutionsAddIn.Excel.StatusBar = false;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Task.Delay(5000).ContinueWith(t => ResetStatusBar());
|
||||
Excel.OnTime(DateTime.Now + new TimeSpan(0, 0, 5), "_ResetStatusBar");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,9 @@
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject />
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="ExcelDna.Integration, Version=1.1.0.0, Culture=neutral, PublicKeyToken=f225e9659857edbe, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ExcelDna.Integration.1.6.0\lib\net452\ExcelDna.Integration.dll</HintPath>
|
||||
@ -83,7 +86,6 @@
|
||||
<Compile Include="Models\StatusbarBase.cs" />
|
||||
<Compile Include="Models\Dialog.cs" />
|
||||
<Compile Include="Services\RegistryUtil.cs" />
|
||||
<Compile Include="Models\SkuExtensions.cs" />
|
||||
<Compile Include="Models\ProgressBar.cs" />
|
||||
<Compile Include="Models\ResultBar.cs" />
|
||||
<Compile Include="Controllers\CombineTool.cs" />
|
||||
@ -97,7 +99,7 @@
|
||||
<Compile Include="Models\TargetPriceList.cs" />
|
||||
<Compile Include="Controllers\RibbonController.cs" />
|
||||
<Compile Include="Controllers\ExportTool.cs" />
|
||||
<Compile Include="AddIn\AddIn.cs" />
|
||||
<Compile Include="AddIn\RhSolutionsAddIn.cs" />
|
||||
<Compile Include="AddIn\Functions.cs" />
|
||||
<Compile Include="Models\WorksheetExtensions.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
|
@ -11,15 +11,13 @@ namespace RhSolutions.Services
|
||||
{
|
||||
public static class RhDatabaseClient
|
||||
{
|
||||
private static HttpClient httpClient = RhSolutionsAddIn.httpClient;
|
||||
|
||||
public static async Task<object> GetProduct(string line)
|
||||
{
|
||||
string request = string.Empty;
|
||||
string request;
|
||||
|
||||
if (line.IsRehauSku())
|
||||
if (Sku.TryParse(line, out var skus))
|
||||
{
|
||||
request = @"https://rh.cebotari.ru/api/products/" + line;
|
||||
request = @"https://rh.cebotari.ru/api/products/" + skus.FirstOrDefault().ToString();
|
||||
}
|
||||
|
||||
else
|
||||
@ -27,7 +25,7 @@ namespace RhSolutions.Services
|
||||
request = @"https://rh.cebotari.ru/api/search?query=" + line;
|
||||
}
|
||||
|
||||
var response = await httpClient.GetAsync(request);
|
||||
var response = await RhSolutionsAddIn.HttpClient.GetAsync(request);
|
||||
|
||||
try
|
||||
{
|
||||
@ -41,22 +39,14 @@ namespace RhSolutions.Services
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (line.IsRehauSku())
|
||||
{
|
||||
return product.Name;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $"{product.ProductSku} {product.Name}";
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return $"Ошибка сервера {response.StatusCode}";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user