food-market/docs/weighted-progress.md
nns 12406d2503
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
docs(weighted): финальный итог — оба бага устранены, ворота зелёные
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:31:12 +05:00

62 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Весовой товар и поиск по штрихкоду — прогресс
Реальный сценарий владельца (09.10.2026): **весов с печатью этикеток НЕТ**. Штрихкоды
весовых товаров (631 шт, вид «27xxxxx», 7 цифр) — коды, которые владелец сам генерирует
и задаёт в карточке товара. Кассир сканирует код товара, вес — с весов на кассе (или
вручную). Задача ЗАМЕНЯЕТ прежнюю про весовые этикетки.
Легенда: [x] готово · [~] частично · [ ] не начато.
## Найденные баги (корень)
- (а) Весовая «этикетка» сопоставлялась с товаром **по артикулу**: `ByBarcode` имел
`|| (parsed.IsWeighted && p.Article == lookup)` → вода с артикулом 12345 находилась
по PLU 12345 из «этикетки» 2112345015007 и возвращала 1,5 кг. Поиск по ШК НЕ должен
матчить по артикулу нигде.
- (б) Разбор весовых этикеток был **включён по умолчанию** (`WeightedBarcodeSettings.
Enabled=true`, `Organization.WeightBarcodeEnabled` DEFAULT true, префикс 27 в ценовых)
→ внутренние/обычные коды принимались за весовые.
## План / статус
1. [x] Разбор весовых этикеток ВЫКЛ по умолчанию (`WeightedBarcodeSettings.Enabled=false`,
`Organization.WeightBarcodeEnabled=false` + Phase40 выключает у существующих). Поиск по ШК
(`ByBarcode`) — сначала точное совпадение (вкл. «27xxxxx»); матч по артикулу убран везде.
2. [x] Настройка орг «Весы с печатью этикеток»: выкл по умолчанию; при вкл — префиксы +
формат; **сначала точный ШК, потом разбор**. `OrganizationSettingsController`.
3. [x] Касса: весовой товар → вес с весов (Масса-К/CAS) или ручной ввод (модалка); сумма =
цена/кг × вес; подпись «1,235 кг × 690 ₸/кг». `ScaleMonitor` + Scan/AddWeighed flow.
4. [x] Генератор ШК: штучный — EAN-13; весовой — короткий «27+N» (next-free) или EAN-13 по
`weightedCodeFormat`; уникальность. `GenerateUniqueWeightedShortCodeAsync`.
5. [x] `/api/pos/v1/sync`: + `unitShort` («шт»/«кг»/«л») рядом с `unitCode` (ОКЕИ); в строках
возврата тоже; shared `UnitShort`; docs/mobile-api.md обновлён.
6. [x] Тесты: unit 321/321 ✓ (WeightedBarcode/UnitShort/ScaleMonitor/PosBarcode); integration
19/19 ✓ (MobileApi/SignupFlow/DemoSeeder/ProductCardParity/Oversell). full-chain 16/16 ✓,
filters-sweep 21/21 ✓, деплой на стенд ✓.
### Автопоиск весов (данные sysadmin: МойСклад-касса спамит «Порт не выбран»/«Таймаут»)
- [x] Автоскан всех COM (вкл. USB-COM CH340/Prolific) × Масса-К/CAS × скорости; кнопка
«Найти весы» в верхней панели; найденный порт запоминается (kv) и восстанавливается.
`ScaleDiscovery` + `AppServices.DiscoverScaleAsync/RestoreScaleFromSettings`.
- [x] Весы не отвечают → «Весы не подключены» + ручной ввод; опрос только при весовом товаре.
- [x] В логе — одна запись о потере/восстановлении связи (тест: 100 опросов → 1 запись).
## Итог (2026-10-09)
Оба бага владельца устранены по корню и проверены на стенде:
- Поиск по ШК больше НЕ матчит по артикулу (вода арт.12345 + этикетка 2112345015007 → 404,
а не «1,5 кг»); разбор этикеток ВЫКЛ по умолчанию (Phase40 выключил и у существующих орг).
- Поиск по ШК — сначала точное совпадение (вкл. короткие «27xxxxx»), разбор этикетки лишь
если включён в орг И точного кода нет.
Сделано «лучше МойСклада» (данные sysadmin про спам «Порт не выбран»):
- Касса сама находит весы (автоскан COM × Масса-К/CAS × скорости), запоминает порт; весы не
отвечают → ручной ввод, опрос только при весовом товаре, одна запись в лог о потере связи.
- Генератор кода нового весового товара: короткий «27xxxxx» (next-free) или EAN-13 по настройке
— проверено на стенде (создан товар → код 2700001).
- unitShort («кг») на кассе вместо кода ОКЕИ («796»); на реальном окне Windows 11 плитки
показывают «690 ₸/кг», строка «1,235 кг × 690 ₸/кг».
Приёмочные ворота: unit 321/321, integration 19/19, full-chain 16/16, filters-sweep 21/21 —
зелёные. Коммиты в main (Co-Authored-By: Claude Opus 5.5), запушено; global.json не трогали.
## Что НЕ трогаем
Прод, shared-postgres, global.json, gateway nginx, sklad.