feat: доработал заявку перемещение тмц
Tests / frontend-test (push) Successful in 4m45s

This commit is contained in:
Тимур Городецкий
2026-09-10 11:19:16 +05:00
parent c5958c3348
commit 11eb127764
17 changed files with 429 additions and 15 deletions
@@ -0,0 +1,58 @@
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 в колонку cree9_portalrequesturl.
*
* Заголовок 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}`);
}
}