elfisa-pharmacy/src/Elfisa.Avalonia/README.md
Exest b13a867f8d Avalonia: раздел «Отправить» (корзина + создание заказа)
- Отправить: поиск по прайсу → корзина (кол-во через NumericUpDown,
  сумма/итого) → выбор грузополучателя + комментарий → создание заказа
  POST /api/buyer/orders
- Core: CreateOrderAsync + DTO (BuyerOrderCreateRequest/ItemReq/Response)
- Отказы: заглушка с точным пояснением (нужен серверный эндпоинт;
  RefuseItemsCount живёт только в локальной SQLite WinForms)

Итог: 6/7 разделов функциональны (Прайс-лист, Заказы, Накладные, Отчёты,
Справочник, Отправить), Отказы — заглушка. Собирается.
⚠️ Реальная отправка заказа (POST) не тестировалась — создаёт заказ на
проде; проверять вживую отдельно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 10:30:57 +03:00

5.1 KiB
Raw Blame History

ЭльФиСА — кросс-платформенный клиент (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).