LoadPrice дробил прайс на страницы по 20000, а сервер на каждую страницу заново
прогонял тяжёлую оконную дедупликацию + COUNT. При всех подключённых прайсах
(~52к позиций) это ~6-7с. Тянем всё одним запросом → один прогон (~1.2с).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- UpdateService (Core): проверка Gitea releases/latest + скачивание установщика с CDN
- UpdateWindow/VM: уведомление «доступно обновление», тихая установка поверх с перезапуском
- ShellView: проверка при старте (один раз, офлайн/ошибки игнорируются)
Закрывает пробел: Avalonia-клиент раньше не умел обновляться (апдейтер был только в WinForms).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раздел переделан: вместо поиска по прайсу и корзины с наименованиями — список
неотправленных накладных (черновиков) и кнопка «Отправить все» (плюс отправка
по одной). Отправка создаёт реальный заказ у поставщика и убирает черновик.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Прайс-лист: дропдаун «Мои прайсы» (подключённые прайсы + «Все прайсы»),
выбор фильтрует каталог по price_list_id; один прайс — выбирается сам
- Загрузить: показывает список подключённых прайсов и качает их
- Core: GetBuyerPriceListsAsync + priceListId в GetPriceSummaryAsync
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- База/дозировка вычисляются на клиенте (порт BuildBaseName/ExtractDosage)
- Три панели: базовые наименования → дозировки (МГ) → предложения поставщиков
- Колонка «Заказ»: ввод числа с клавиатуры (многозначно), Enter — добавить
- Фикс: null-безопасная привязка KeyDown (падало в конструкторе → пустой экран)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- при «Сохранить заказ» резервируется настоящий номер через
GET /api/buyer/global-sign/next (fallback ЧРН-… если офлайн)
- при отправке черновика этот EX-номер передаётся в заказ (global_sign),
заказ сохраняет тот же номер
- ApiClient.NextGlobalSignAsync, BuyerOrderCreateRequest.GlobalSign
- DraftStore: номер задаёт вызывающий
Проверено: черновик = EX-0000018, статус «Не отправлен».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CartService: единая корзина для Прайс-листа и Отправить
- Прайс-лист: выбор позиции + кол-во + «Добавить в заказ», индикатор корзины
- Настройки (диалог ⚙ в шапке): адрес API, тема (свет/тьма, применяется
сразу), грузополучатель по умолчанию; сохранение в %APPDATA%
- SettingsStore (Core) + AppConfig читает сохранённый API-адрес
- тема применяется на старте
Проверено вживую: добавление из Прайс-листа в корзину, диалог настроек.
Реальная отправка заказа (POST) — собрана и связана, живой заказ по явному «да»
(автозащита блокирует боевую транзакцию без подтверждения).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Добавлена вкладка «Загрузить» (между Отчёты и Отправить, как в исходной
программе): постраничная загрузка прайса с прогрессом, кэш в памяти
(PriceCache), итог «N позиций от K поставщиков» + timestamp
- Верхняя навигация уплотнена под 8 вкладок (Справочник больше не обрезается)
- Core: PriceCache
Проверено вживую: все 8 вкладок влезают, загрузка прайса работает (500 поз.).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Навигация перенесена из левого сайдбара в ВЕРХНЮЮ горизонтальную
панель, как в исходной программе: логотип слева, вкладки
(иконка+подпись) по центру, пользователь+Выйти справа
- Раздел «Заказы»: мастер-детали (список слева, состав заказа справа
с позициями и итогом), на данных /api/buyer/report
- Числовые колонки выровнены вправо (стиль DataGridCell.num)
- Отчёты: тулбар на WrapPanel, стабильные ширины колонок
Проверено запуском (скриншоты): верхняя навигация, отчёты, заказы.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>