feat(ct): поставщик-победитель записывается в шапку СТ на шаге 3

По «Сохранить и продолжить» выбранный поставщик пишется в лукап winSupplier: на шаге 4 меняется
только статус, а поставщик мог быть как обычной колонкой, так и добавленным на шаге 3.
This commit is contained in:
Тимур Городецкий
2026-10-20 14:28:45 +05:00
parent 5192311fff
commit c1e8792174
2 changed files with 30 additions and 0 deletions
@@ -810,6 +810,17 @@ export function useStep3Matrix(args: UseStep3MatrixArgs) {
column => column.spId ?? extraSupSpIds[column.id], 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 — // 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. // render keys use React IDs, so SP IDs in session cause empty cells on remount.
@@ -1434,6 +1434,25 @@ export class CtService {
throw new Error(`Ошибка сохранения комментария ИИ: ${res.status}`); throw new Error(`Ошибка сохранения комментария ИИ: ${res.status}`);
} }
// Запись поставщика-победителя в шапку СТ (лукап winSupplier → «Поставщики»), Шаг 3.
async saveWinSupplier(ctId: string, supplierSpId: number): Promise<void> {
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 (без скачивания на диск). // Сформировать отчёт СТ и вернуть его как blob (без скачивания на диск).
// Нужен для подписания через NCALayer и сборки карточки SIGEX. // Нужен для подписания через NCALayer и сборки карточки SIGEX.
async getCtReportBlob(ctId: string, format: string = "xlsx"): Promise<Blob> { async getCtReportBlob(ctId: string, format: string = "xlsx"): Promise<Blob> {