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

5.8 KiB
Raw Blame History

Весовой товар и поиск по штрихкоду — прогресс

Реальный сценарий владельца (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. Разбор весовых этикеток ВЫКЛ по умолчанию (WeightedBarcodeSettings.Enabled=false, Organization.WeightBarcodeEnabled=false + Phase40 выключает у существующих). Поиск по ШК (ByBarcode) — сначала точное совпадение (вкл. «27xxxxx»); матч по артикулу убран везде.
  2. Настройка орг «Весы с печатью этикеток»: выкл по умолчанию; при вкл — префиксы + формат; сначала точный ШК, потом разбор. OrganizationSettingsController.
  3. Касса: весовой товар → вес с весов (Масса-К/CAS) или ручной ввод (модалка); сумма = цена/кг × вес; подпись «1,235 кг × 690 ₸/кг». ScaleMonitor + Scan/AddWeighed flow.
  4. Генератор ШК: штучный — EAN-13; весовой — короткий «27+N» (next-free) или EAN-13 по weightedCodeFormat; уникальность. GenerateUniqueWeightedShortCodeAsync.
  5. /api/pos/v1/sync: + unitShort («шт»/«кг»/«л») рядом с unitCode (ОКЕИ); в строках возврата тоже; shared UnitShort; docs/mobile-api.md обновлён.
  6. Тесты: unit 321/321 ✓ (WeightedBarcode/UnitShort/ScaleMonitor/PosBarcode); integration 19/19 ✓ (MobileApi/SignupFlow/DemoSeeder/ProductCardParity/Oversell). full-chain 16/16 ✓, filters-sweep 21/21 ✓, деплой на стенд ✓.

Автопоиск весов (данные sysadmin: МойСклад-касса спамит «Порт не выбран»/«Таймаут»)

  • Автоскан всех COM (вкл. USB-COM CH340/Prolific) × Масса-К/CAS × скорости; кнопка «Найти весы» в верхней панели; найденный порт запоминается (kv) и восстанавливается. ScaleDiscovery + AppServices.DiscoverScaleAsync/RestoreScaleFromSettings.
  • Весы не отвечают → «Весы не подключены» + ручной ввод; опрос только при весовом товаре.
  • В логе — одна запись о потере/восстановлении связи (тест: 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.