docs: release notes v2.21 (полный диф от v2.19)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,21 +5,23 @@
|
|||||||
|
|
||||||
## Что нового
|
## Что нового
|
||||||
|
|
||||||
### Исправление: сбой синхронизации при дублях lot_name в прайслисте
|
### Короткие ссылки на проекты и варианты
|
||||||
|
|
||||||
При загрузке нового прайслиста (W-2026-06-25-001) синхронизация прерывалась с ошибкой `UNIQUE constraint failed: local_pricelist_items.pricelist_id, local_pricelist_items.lot_name` — в серверной таблице `qt_pricelist_items` оказались дубли `lot_name` для одного прайслиста. QF теперь дедуплицирует позиции при загрузке и пропускает повторные вхождения с предупреждением в лог.
|
- `GET /:code` — редирект на проект по коду опти (регистронезависимо);
|
||||||
|
- `GET /:code/:variant` — редирект на конкретный вариант проекта;
|
||||||
|
- валидация кода опти и имени варианта: только URL-безопасные символы `[A-Za-z0-9._-]` — проверка на бэкенде и в форме с подсказкой `«Используется в URL: /КОД/Вариант»`.
|
||||||
|
|
||||||
### Исправление: race condition при параллельном запуске синхронизации
|
### Ревизия «до обновления цен»
|
||||||
|
|
||||||
Если фоновый тикер и ручной запуск «Синхронизировать» срабатывали одновременно, оба потока пытались записать items в одну таблицу, что приводило к UNIQUE constraint ошибке. `SyncPricelists()` теперь защищена тем же мьютексом, что и фоновый `SyncPricelistsIfNeeded()`.
|
При нажатии «Обновить цены» автоматически создаётся ревизия текущего состояния конфигурации до применения новых цен, после чего сохраняется ревизия с обновлёнными ценами. История изменений теперь полная.
|
||||||
|
|
||||||
### Улучшение: ошибки отправки изменений попадают в лог синхронизации
|
### Исправления
|
||||||
|
|
||||||
`PushPendingChanges` теперь записывает результат в `sync_log` (тип `changes`) — ошибки отправки конфигураций и проектов на сервер видны в диалоге «Информация о синхронизации» и в support bundle.
|
- Старая цена в итоге конфигурации больше не зачёркивается, если цены фактически не изменились.
|
||||||
|
- Устранён race condition: `SyncPricelists()` теперь защищена мьютексом — параллельный запуск фонового тикера и ручной синхронизации больше не приводит к `UNIQUE constraint failed`.
|
||||||
### Улучшение: состояние клиента всегда отправляется на сервер после синхронизации
|
- Дублирующиеся `lot_name` в серверном прайслисте пропускаются при загрузке вместо аварийного завершения синхронизации.
|
||||||
|
- Ошибки отправки конфигураций и проектов на сервер теперь видны в диалоге «Информация о синхронизации» и в support bundle (`sync_log`, тип `changes`).
|
||||||
`reportClientSchemaState` теперь вызывается по завершении синхронизации через `defer` — актуальное состояние (включая ошибки) уходит на сервер независимо от того, завершился sync успехом или сбоем.
|
- Состояние клиента (`last_sync_error_code` и др.) отправляется на сервер по завершении синхронизации независимо от её результата.
|
||||||
|
|
||||||
## Запуск на macOS
|
## Запуск на macOS
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user