62 lines
5.8 KiB
Markdown
62 lines
5.8 KiB
Markdown
# Весовой товар и поиск по штрихкоду — прогресс
|
||
|
||
Реальный сценарий владельца (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.
|