From 5f5f0e7f816b7874760ee0dcc9ab61bad253e901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Wed, 23 Sep 2026 16:06:26 +0500 Subject: [PATCH] =?UTF-8?q?fix(ct):=D0=BF=D0=BE=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B4=D1=83=D0=B1=D0=BB=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B7=D0=B8=D1=86=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5=20?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B0=D0=BA=D0=B6=D0=B5=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D1=89=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B1=D0=B5=D0=B7=D0=9A=D0=9F=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Step2CommercialOffers/step2Persist.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/step2Persist.ts b/src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/step2Persist.ts index ed1bb99..39f1d0a 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/step2Persist.ts +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/step2Persist.ts @@ -11,15 +11,32 @@ export interface PersistStep2Args { noOfferSuppliers: NoOfferEntry[]; } +// Несколько КП одного поставщика (повторная загрузка, тот же КП под другим именем файла) получают +// один и тот же supplierSpId — saveSupplierWithOffer находит поставщика по имени. Без отбора +// в таблице сравнения появляется дубль колонки с тем же id, а офферы обоих файлов складываются +// в одну ячейку (задвоенные строки позиций). Оставляем последний загруженный файл поставщика, +// но обработанный файл не вытесняем тем, что ещё в процессе. +function pickLatestFilePerSupplier(kpFiles: KpFile[]): KpFile[] { + const fileBySupplier = new Map(); + kpFiles.forEach(f => { + if (!f.supplierName) return; + const supplierKey = f.supplierSpId !== undefined ? String(f.supplierSpId) : f.supplierName; + const existing = fileBySupplier.get(supplierKey); + const canReplace = !existing || f.status === 'done' || existing.status !== 'done'; + if (canReplace) fileBySupplier.set(supplierKey, f); + }); + return Array.from(fileBySupplier.values()); +} + // Строит поставщиков с КП и их офферы из результатов потока (Syntex). Вынесено из persistStep2, // чтобы ту же логику использовал инкрементальный persist в useKpProcessing (поставщик должен // доходить до Шага 3 даже без кнопки «Сохранить и продолжить»). export function buildKpSuppliersAndOffers( - kpFiles: KpFile[], + allKpFiles: KpFile[], currencyRates: CurrencyRate[], ): { suppliers: Supplier[]; offers: SupplierOffer[] } { + const kpFiles = pickLatestFilePerSupplier(allKpFiles); const suppliers: Supplier[] = kpFiles - .filter(f => f.supplierName) .map(f => ({ id: f.supplierSpId ? String(f.supplierSpId) : f.localId, spId: f.supplierSpId,