Files
request-portal/src/webparts/requestPortal/shared/dataverse/demandLine.service.ts
T
Тимур Городецкий 7f1e36874a fix: ссылку на заявку ТМЦ писать в колонку cree9_tmctransferurl в Dataverse
Владельцы внешней системы указали другую колонку строки заявки
(cr498_cree9_tmctransferurl) вместо прежней cr498_portalrequesturl.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:33:14 +05:00

59 lines
2.7 KiB
TypeScript

import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';
import { WebPartContext } from '@microsoft/sp-webpart-base';
import {
DATAVERSE_API_VERSION,
DATAVERSE_DEMANDLINE_ENTITY_SET,
DATAVERSE_DEMANDLINE_LINK_FIELD,
DATAVERSE_RESOURCE_URL
} from '../config';
/**
* Обратная связь во внешнюю систему: записать ссылку на заявку портала в
* строку-источник таблицы Dataverse «Строка заявки» (cree9_demandline).
*
* positionId — GUID первичного ключа строки (приходит в URL как positionId, см.
* shared/routing). Адресуем строку напрямую: <entitySet>(<guid>). PATCH пишет
* URL в колонку DATAVERSE_DEMANDLINE_LINK_FIELD (см. shared/config).
*
* Заголовок If-Match: * ОБЯЗАТЕЛЕН: без него PATCH в Dataverse — это upsert (нет
* строки с таким id → СОЗДАЁТ новую). Нам нужно строго обновление существующей
* строки-источника; If-Match: * это гарантирует — если строки нет, вернётся 404,
* а не появится «пустая» запись.
*
* Авторизация — AadHttpClient с ресурсом среды Dataverse (SSO текущего
* пользователя); заголовки OData — как в stroy-bot-report/DataverseService.
*/
export async function writeDemandLinePortalLink(
context: WebPartContext,
positionId: string,
portalRequestUrl: string
): Promise<void> {
const client = await context.aadHttpClientFactory.getClient(DATAVERSE_RESOURCE_URL);
const url =
`${DATAVERSE_RESOURCE_URL}/api/data/${DATAVERSE_API_VERSION}/` +
`${DATAVERSE_DEMANDLINE_ENTITY_SET}(${positionId})`;
const response: HttpClientResponse = await client.fetch(url, AadHttpClient.configurations.v1, {
method: 'PATCH',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;odata.metadata=minimal',
'OData-MaxVersion': '4.0',
'OData-Version': '4.0',
// Только обновление существующей строки, без upsert-создания.
'If-Match': '*'
},
body: JSON.stringify({ [DATAVERSE_DEMANDLINE_LINK_FIELD]: portalRequestUrl })
});
if (!response.ok) {
let errBody = '';
try {
errBody = await response.text();
} catch {
// тело ошибки прочитать не удалось — оставляем пустым
}
throw new Error(`Dataverse PATCH ${DATAVERSE_DEMANDLINE_ENTITY_SET}: ${response.status} — ${errBody}`);
}
}