From c1e8792174792cb3ea4699251ae7a54eba417616 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: Tue, 20 Oct 2026 14:28:45 +0500 Subject: [PATCH] =?UTF-8?q?feat(ct):=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D1=89=D0=B8=D0=BA-=D0=BF=D0=BE=D0=B1=D0=B5=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20=D1=88=D0=B0?= =?UTF-8?q?=D0=BF=D0=BA=D1=83=20=D0=A1=D0=A2=20=D0=BD=D0=B0=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B3=D0=B5=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit По «Сохранить и продолжить» выбранный поставщик пишется в лукап winSupplier: на шаге 4 меняется только статус, а поставщик мог быть как обычной колонкой, так и добавленным на шаге 3. --- .../Step3ComparisonTable/useStep3Matrix.ts | 11 +++++++++++ .../forms/ct/services/CtService.ts | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Matrix.ts b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Matrix.ts index 09140f8..89fd45c 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Matrix.ts +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Matrix.ts @@ -810,6 +810,17 @@ export function useStep3Matrix(args: UseStep3MatrixArgs) { column => column.spId ?? extraSupSpIds[column.id], )); + // Поставщик-победитель → winSupplier в шапке СТ (лукап на «Поставщики»). Пишем сразу по + // «Сохранить и продолжить», а не на Шаге 4 — там меняется только статус, а поставщик мог + // прийти как обычной колонкой (spId уже есть), так и добавленным на этом шаге (spId + // появляется только что, в extraSupSpIds). + if (selectedSupplierId) { + const winSupplierSpId = suppliers.find(s => s.id === selectedSupplierId)?.spId + ?? extraSupSpIds[selectedSupplierId]; + if (winSupplierSpId !== undefined) { + await service.saveWinSupplier(ct.id, winSupplierSpId); + } + } // Persist offers with React IDs (sup.id / pos.id) so they survive F5 / step navigation — // render keys use React IDs, so SP IDs in session cause empty cells on remount. diff --git a/src/webparts/ctFormsPortal/forms/ct/services/CtService.ts b/src/webparts/ctFormsPortal/forms/ct/services/CtService.ts index 09420a1..df8af50 100644 --- a/src/webparts/ctFormsPortal/forms/ct/services/CtService.ts +++ b/src/webparts/ctFormsPortal/forms/ct/services/CtService.ts @@ -1434,6 +1434,25 @@ export class CtService { throw new Error(`Ошибка сохранения комментария ИИ: ${res.status}`); } + // Запись поставщика-победителя в шапку СТ (лукап winSupplier → «Поставщики»), Шаг 3. + async saveWinSupplier(ctId: string, supplierSpId: number): Promise { + const res = await this.http.fetch( + this._liById(LISTS.CT, ctId), + SPHttpClient.configurations.v1, + { + method: "POST", + headers: { + "Content-Type": "application/json;odata=nometadata", + "IF-MATCH": "*", + "X-HTTP-Method": "MERGE", + }, + body: JSON.stringify({ winSupplierId: supplierSpId }), + }, + ); + if (!res.ok) + throw new Error(`Ошибка сохранения поставщика-победителя: ${res.status}`); + } + // Сформировать отчёт СТ и вернуть его как blob (без скачивания на диск). // Нужен для подписания через NCALayer и сборки карточки SIGEX. async getCtReportBlob(ctId: string, format: string = "xlsx"): Promise {