Add Home
parent
469a198f40
commit
7e440bad65
106
Home.md
Normal file
106
Home.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
## Назначение
|
||||||
|
Программа облегчает большое количество рутинных операций с таблицами (импорт, экспорт, объединение, подбор артикулов и т.д.)
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
Проект состоит из нескольких компонентов:
|
||||||
|
- Надстройка для Excel
|
||||||
|
(<https://gitea.cebotari.ru/chebser/RhSolutions-AddIn>)
|
||||||
|
- Серверное приложение для мультиклассовой классификации с помощью ML.NET и полнотекстового поиска в базе данных (<https://gitea.cebotari.ru/chebser/RhSolutions>)
|
||||||
|
- Небольшая библиотека с моделями описывающими продукт из прайс-листа, парсер артикулов (<https://gitea.cebotari.ru/chebser/RhSolutions.Sku>)
|
||||||
|
|
||||||
|
### Использованные библиотеки
|
||||||
|
Надстройка написана на 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
|
Loading…
x
Reference in New Issue
Block a user