diff --git a/Home.md b/Home.md new file mode 100644 index 0000000..3283d2e --- /dev/null +++ b/Home.md @@ -0,0 +1,106 @@ +## Назначение +Программа облегчает большое количество рутинных операций с таблицами (импорт, экспорт, объединение, подбор артикулов и т.д.) + +## Описание +Проект состоит из нескольких компонентов: +- Надстройка для Excel +() +- Серверное приложение для мультиклассовой классификации с помощью ML.NET и полнотекстового поиска в базе данных () +- Небольшая библиотека с моделями описывающими продукт из прайс-листа, парсер артикулов () + +### Использованные библиотеки +Надстройка написана на C# с использованием библиотеки [Excel-DNA](https://github.com/Excel-DNA/). Основы создания подобной надстройки я описал в статьях на Хабре: ++ [Пишем надстройку для Excel на .NET с помощью библиотеки Excel-DNA](https://habr.com/ru/articles/741110/) ++ [Пишем надстройку Excel на Excel-DNA. Часть 2](https://habr.com/ru/articles/741732/) + +Также в этой работе я использовал библиотеки + - [Newtonsoft.Json](https://www.newtonsoft.com/json) - для сериализации и десериализации классов в JSON при передаче по REST API + - [netDxf](https://github.com/haplokuon/netDxf) - для создания файлов спецификации По ГОСТ 21.110-2013 в чертежном формате + - [ClosedXML](https://github.com/ClosedXML/ClosedXML) - для парсинга xls файлов при загрузке через POST-запрос в удаленную базу данных + - [Npgsql](https://www.npgsql.org/) - для работы серверного приложения с базой данных PostgreSQL и реализации полнотекстового поиска + - [ML.NET](https://learn.microsoft.com/en-us/dotnet/machine-learning/) - для мультиклассовой классификации артикулов в целях поиска в базе данных + +## Демонстрация +### Инструменты + +- _Экспорт массива ячеек вида "Артикул - Количество" в прайс-лист_ +Выделив рядом идущие ячейки с артикулом и количеством и нажав одну кнопку можно выгрузить данные позиции в таблицу с прайс-листом +Данный инструмент: + 1. Читает массив выделенных ячеек + 2. Проверяет построчно на наличие верного артикула + 3. Собирает словарь с парой ключ - значение: экземпляр модели продукта - количество + 4. Открывает предварительно заданные в настройках пустой шаблонный файл таблицы прайс-листа + 5. Заполняет с помощью словаря шаблонный файл + +- _Актуализация прайс-листа до последней версии_ +Одной кнопкой актуализирует спецификацию заполненную в устаревшей версии прайс-листа с заменой изменившихся артикулов на новый вариант +Данный инструмент: + 1. Читает открытый прайс-лист + 2. Собирает словарь с парой ключ - значение: экземпляр модели продукта - количество + 4. Открывает пустой шаблонный файл + 5. Заполняет шаблонный файл + +- _Объединение нескольких прайс-листов в один файл_ +Объединение с разнесением данных по столбцам и суммированием в итоговом столбце количества +Данный инструмент: + 1. Открывает выбранные в диалоге файлы прайс-листов + 2. Собирает лист из словарей со значениями продукт - количество + 4. Открывает пустой шаблонный файл + 5. Заполняет шаблонный файл + +- _Поиск пар артикул-количество в любой сторонней таблице и экспорт в таблицу заказов_ +Автоматическое определение столбцов с артикулами и количеством в любой таблице и экспорт пар в прайс-лист +Данный инструмент: + 1. Читает открытую таблицу по столбцам, проверяя на наличие столбца со значениями артикулов + 2. Если столбец с артикулами найден, ищет ближайший столбец с числовыми значениями, который принимает как столбец с количеством + 3. Если столбцы с артикулом и количеством определены, заполняет словарь продукт - количество + 4. Открывает пустой шаблонный файл + 5. Заполняет шаблонный файл + +- _Подбор монтажных гильз для фитингов_ +Просмотр названий артикулов и подсчет с помощью регулярных выражений количества монтажных гильз для монтажа соответствующих фитингов. Занесение итогового количества в таблицу +Данный инструмент: + 1. Читает открытый прайс-лист + 2. Собирает словарь с парой ключ - значение: экземпляр модели продукта - количество + 3. По регулярному выражению проверяет названия артикулов и собирает словарь со значениями продукт (монтажная гильза конкретного диаметра) - количество + 4. Заполняет открытый прайс-лист значениями словаря из п.3 + +- _Экспорт таблицы заказов в девятиграфку по ГОСТ_ +Экспорт спецификации из открытого прайс-листа в спецификацию-девятиграфку по ГОСТ в чертежном формате. +Данный инструмент: + 1. Читает открытый прайс-лист + 2. Собирает словарь с парой ключ - значение: экземпляр модели продукта - количество + 3. С помощью библиотеки netDXF создает файл чертежа с таблицей по ГОСТ и заполняет ее полученными значениями + 4. Открывает полученный файл чертежа в программе-редакторе файлов *.dxf + +### Формулы +- ```=RHSOLUTIONS()``` и ```=РЕХАУ()``` - поиск артикула через GET-запрос в базе данных +Данная формула делает GET-запрос в серверное приложение. В серверной части производится классификация искомой строки, парсинг с помощью соответствующего присвоенному классу парсера и формирование строки запроса для полнотекстового поиска по подготовленной предварительно из прайс-листа базе данных PostgreSQL. Приложение запущено на VPS в docker-контейнере, рядом с docker-контейнером базы данных. +- ```=РЕХАУАРТИКУЛ()``` - экстракция артикула РЕХАУ из любой строки по регулярному выражению +Формула использует парсер артикулов по регулярному выражению, определенный в классе модели продукта. +Так как данный класс используется и в надстройке, и в серверном приложении полнотекстового поиска, я собрал NuGet пакет для него и загрузил в репозиторий своего инстанса Gitea. +- ```=РЕХАУИМЯ()``` - поиск названия артикула по номеру +Формула делает запрос артикула в серверную базу данных и выдает имя найденного артикула +- ```=РЕХАУЦЕНА()``` - поиск цены в евро по номеру артикула +Формула делает запрос артикула в серверную базу данных и выдает цену в евро найденного артикула +- ```=РЕХАУЦЕНАРУБ()``` - поиск цены в рублях по номеру артикула и курсу ЦБ на любую дату +Формула делает: + - Запрос артикула в серверную базу данных + - Запрос курса евро на нужную дату - используется открытый API Центрального банка РФ и парсится XML c ответом + - Выдает произведение цены в евро и курса +- ```=КУРСЕВРО()``` - курс евро ЦБ на дату +Формула делает запрос курса евро на нужную дату в API Центрального банка РФ + +## Заключение +В проекте +- Применял принципы _ООП_, наследование и полиморфизм. Использовал абстрактные классы, переопределение методов. +- Изучал _Dependency Injection_: определял нужные интерфейсы, внедрял различные их реализации +- Работал со сторонним _REST API_ и написал свой +- Работал с популярными библиотеками, такими как _Newtonsoft.Json_, _ClosedXML_, _Npgsql_ +- Разработал несколько регулярных выражений с различными целями +- Делал кросс-сборку проекта под различные версии .NET +- Делал сериализацию и десериализацию классов в _JSON_ и _XML_ +- Работал с _PostgreSQL_ и его полнотекстовым поиском +- Освоил объектную модель _Excel_ +- Собирал _Docker_-образы со своими приложениями и базами данных, разворачивал их на своем сервере +- Применил ML с помощью ML.NET