feat(ct): поставщик-победитель записывается в шапку СТ на шаге 3
По «Сохранить и продолжить» выбранный поставщик пишется в лукап winSupplier: на шаге 4 меняется только статус, а поставщик мог быть как обычной колонкой, так и добавленным на шаге 3.
This commit is contained in:
@@ -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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user