LoadPrice дробил прайс на страницы по 20000, а сервер на каждую страницу заново прогонял тяжёлую оконную дедупликацию + COUNT. При всех подключённых прайсах (~52к позиций) это ~6-7с. Тянем всё одним запросом → один прогон (~1.2с). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| Assets | ||
| Styles | ||
| ViewModels | ||
| Views | ||
| App.axaml | ||
| App.axaml.cs | ||
| app.manifest | ||
| Elfisa.Avalonia.csproj | ||
| Program.cs | ||
| README.md | ||
| ViewLocator.cs | ||
ЭльФиСА — кросс-платформенный клиент (Avalonia)
Порт десктопного клиента с WinForms на Avalonia UI (.NET 8) — работает на Windows, macOS и Linux из одного кода. Начат как замена WinForms-версии (которая только под Windows).
Что уже готово (фундамент + эталонный экран)
- Elfisa.Core — переносимая бизнес-логика (без UI):
ApiClient(логин, отчёт покупателя, ИИ-отчёт), DTO,AppConfig,Session. - Дизайн-система в фирменной бирюзе (#0F766E): светлая/тёмная тема,
стили кнопок, полей, карточек, таблицы, сайдбара (
Styles/Elfisa.axaml). - Экран входа (
LoginView) — реальная авторизация через/auth/login. - Шелл (
ShellView) — сайдбар-навигация + карточка пользователя + выход. - Отчёты (
ReportsView) — ПОЛНОСТЬЮ рабочий эталонный раздел: период, 4 типа отчёта (агрегация как в WinForms), авто-загрузка, свободный ИИ-запрос → Word/Excel (через/ai), таблица с динамическими колонками. Данные скоупятся по JWT — только заказы этого покупателя. - Заглушки остальных разделов (Прайс-лист, Заказы, Накладные, Отправить, Отказы, Справочник).
Архитектура
MVVM (CommunityToolkit.Mvvm) + ViewLocator (VM → View по имени).
Program → App → MainWindow(RootViewModel)
RootViewModel: LoginViewModel ⇄ ShellViewModel
ShellViewModel.CurrentPage: ReportsViewModel | PlaceholderPageViewModel | …
Вся сетевая логика — в Elfisa.Core (переиспользуется и десктопом, и
будущим мобильным/веб-клиентом Avalonia).
Запуск
dotnet run --project src/Elfisa.Avalonia
Dev-автологин (удобно при разработке — минуя экран входа):
# Windows PowerShell
$env:ELF_DEV_USER="user@example.com"; $env:ELF_DEV_PASS="***"; dotnet run --project src/Elfisa.Avalonia
Переопределение адресов (по умолчанию https://24pharmdata.ru и .../ai):
ELF_API_BASE_URL, ELF_AI_BASE_URL.
Сборка под конкретную ОС:
dotnet publish src/Elfisa.Avalonia -c Release -r osx-arm64 --self-contained # Mac (M-серия)
dotnet publish src/Elfisa.Avalonia -c Release -r win-x64 --self-contained # Windows
Дорожная карта портирования
Логика этих экранов частично уже есть в WinForms ApiClient — переносится
в Elfisa.Core метод за методом, UI пишется по образцу ReportsView.
| Раздел | Что нужно | Сложность |
|---|---|---|
| ✅ Прайс-лист | поиск + грид (/api/supplier-prices/summary) | готово (без добавления в заказ) |
| ✅ Заказы | список + карточка заказа с позициями | готово |
| ✅ Накладные | реестр приходных документов | готово |
| ✅ Отчёты | 4 типа + ИИ → Word/Excel | готово |
| ✅ Справочник | профиль + грузополучатели | готово |
| ✅ Отправить | поиск → корзина → создание заказа (POST /api/buyer/orders) | готов UI; реальная отправка не тестировалась (создаёт заказ на проде) |
| ⏳ Отказы | список отказных позиций | нужен серверный эндпоинт (RefuseItemsCount есть только в локальной БД WinForms) |
| ⏳ Автообновление | аналог AutoUpdater под каждую ОС | не начато |
Прайс-лист/Заказы/Накладные строятся на рабочих эндпоинтах
(supplier-prices/summary, buyer/report). «Родные» buyer/orders и
buyer/catalog возвращают 500 (баг квотинга PascalCase в GORM-билдере).
Фикс для buyer/orders готов и застейджен (es_api_service.exe.new,
apply-new-exe.bat) — после деплоя Заказы/Накладные перейдут на него.
Каталог не используется (берём рабочий summary), его фикс — по желанию.
Осталось: Отправить (корзина + создание заказа + DBF) и Отказы, плюс автообновление и сохранение сессии. Логика переносится из WinForms, переписывается только UI (XAML).