diff --git a/Home.md b/Home.md deleted file mode 100644 index 3283d2e..0000000 --- a/Home.md +++ /dev/null @@ -1,106 +0,0 @@ -## Назначение -Программа облегчает большое количество рутинных операций с таблицами (импорт, экспорт, объединение, подбор артикулов и т.д.) - -## Описание -Проект состоит из нескольких компонентов: -- Надстройка для 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