From 009a9d8a508fa77da7ec2d8a9eb920f29442c3cb Mon Sep 17 00:00:00 2001 From: nns Date: Thu, 8 Oct 2026 02:10:11 +0500 Subject: [PATCH] =?UTF-8?q?fix(web):=20EAN-13=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D1=86=D0=B8=D1=84?= =?UTF-8?q?=D1=80=D0=B0,=20=D0=B2=D0=B0=D0=BB=D1=8E=D1=82=D1=8B=20=D0=B2?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC=D0=BA=D0=B5=20=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=D0=BC,=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=20=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) digitsChecksum считал веса слева — для 12-значного тела (EAN-13) чётность переворачивалась и контрольная цифра была неверной; теперь справа налево (EAN-8/UPC-A не изменились). 2) SupplyScanPage читал /api/catalog/currencies как массив, а это PagedResult {items} → список валют пуст (нет KZT). 3) InvoiceReviewPage слал ?q=, а API ждёт ?search= (PagedRequest.Search). Co-Authored-By: Claude Opus 5.5 --- src/food-market.web/src/lib/barcode.ts | 13 ++++++++----- src/food-market.web/src/pages/InvoiceReviewPage.tsx | 4 +++- src/food-market.web/src/pages/SupplyScanPage.tsx | 7 +++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/food-market.web/src/lib/barcode.ts b/src/food-market.web/src/lib/barcode.ts index a3e0666..b798102 100644 --- a/src/food-market.web/src/lib/barcode.ts +++ b/src/food-market.web/src/lib/barcode.ts @@ -6,12 +6,15 @@ import { BarcodeType } from '@/lib/types' function digitsChecksum(first: string, weightAtOdd: number): number { - // Общая EAN/UPC-подобная формула: сумма с чередующимися весами, остаток от 10. - // Нечётные позиции (с индекса 0) — weightAtOdd, чётные — 1. + // Контрольная цифра EAN/UPC: веса идут СПРАВА НАЛЕВО (цифра перед контрольной + // имеет вес 3, затем 1,3,1…). Нельзя привязывать вес к индексу слева: для + // чётной длины тела (EAN-13 = 12 цифр) чётность переворачивается и check-digit + // получается неверным. Для нечётной длины (EAN-8=7, UPC-A=11) результат тот же. let sum = 0 - for (let i = 0; i < first.length; i++) { - const d = first.charCodeAt(i) - 48 - sum += i % 2 === 0 ? d * weightAtOdd : d + let w = weightAtOdd + for (let i = first.length - 1; i >= 0; i--) { + sum += (first.charCodeAt(i) - 48) * w + w = w === weightAtOdd ? 1 : weightAtOdd } return (10 - (sum % 10)) % 10 } diff --git a/src/food-market.web/src/pages/InvoiceReviewPage.tsx b/src/food-market.web/src/pages/InvoiceReviewPage.tsx index 82bd047..477a631 100644 --- a/src/food-market.web/src/pages/InvoiceReviewPage.tsx +++ b/src/food-market.web/src/pages/InvoiceReviewPage.tsx @@ -595,7 +595,9 @@ function ProductSearchDialog({ q, onClose, onPick }: { queryKey: ['product-search', query], queryFn: async () => { if (query.trim().length < 2) return [] - const { data } = await api.get<{ items: ProductSearchHit[] }>(`/api/catalog/products?q=${encodeURIComponent(query)}&pageSize=20`) + // API ждёт параметр `search` (PagedRequest.Search), а не `q` — иначе + // фильтр игнорируется и поиск товара на экране накладной не работает. + const { data } = await api.get<{ items: ProductSearchHit[] }>(`/api/catalog/products?search=${encodeURIComponent(query)}&pageSize=20`) return data.items ?? [] }, enabled: query.trim().length >= 2, diff --git a/src/food-market.web/src/pages/SupplyScanPage.tsx b/src/food-market.web/src/pages/SupplyScanPage.tsx index 3238258..c2e4609 100644 --- a/src/food-market.web/src/pages/SupplyScanPage.tsx +++ b/src/food-market.web/src/pages/SupplyScanPage.tsx @@ -65,8 +65,11 @@ export function SupplyScanPage() { const main = r.data.items?.find(s => s.isMain) ?? r.data.items?.[0] if (main) setStoreId(main.id) }) - api.get('/api/catalog/currencies?pageSize=20').then(r => { - const list = Array.isArray(r.data) ? r.data : [] + // /api/catalog/currencies отдаёт PagedResult {items,...}, а не голый массив — + // раньше Array.isArray(r.data) давал пустой список валют, и черновик приёмки + // сканированием не сохранялся (нет currencyId, в т.ч. KZT по умолчанию). + api.get<{ items: Currency[] }>('/api/catalog/currencies?pageSize=20').then(r => { + const list = r.data?.items ?? [] setCurrencies(list) const kzt = list.find(c => c.code === 'KZT') ?? list[0] if (kzt) setCurrencyId(kzt.id)