feat: отметки «@» в чате заявки и письма через поток Power Automate

В поле ввода чата «@» открывает подсказку с участниками заявки (инициатор
и все из маршрута). Отметка — обычный текст «@ФИО», без штатного упоминания
SharePoint, чтобы не уходило его собственное письмо.

После отправки сообщения портал вызывает поток FLOW_CHAT_NOTIFY_URL:
отмеченным — «Вас упомянули», инициатору — «Новое сообщение по вашей
заявке». О своих сообщениях писем нет; для проверки это включается
свойством веб-части «Чат: уведомлять о своих сообщениях» (по умолчанию
выключено) — тогда же можно отметить себя.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-10-14 14:06:07 +05:00
parent d4b8c4e7e4
commit e38156fd1c
16 changed files with 658 additions and 32 deletions
@@ -12,14 +12,15 @@ export interface INotifyTarget {
approvalListName: string; // ApproveListName (список согласования)
}
// POST в поток оповещения (Entra-триггер) через AadHttpClient — обычный fetch → 401,
// AadHttpClient даёт токен Flow Service (и снимает вопрос CORS).
async function postNotify(context: WebPartContext, body: Record<string, unknown>): Promise<void> {
if (!FLOW_NOTIFY_URL) {
// POST в поток Power Automate (Entra-триггер) через AadHttpClient — обычный fetch → 401,
// AadHttpClient даёт токен Flow Service (и снимает вопрос CORS). Общий для всех
// потоков оповещения портала (согласование, чат заявки — shared/chat/chatNotify.service.ts).
export async function postToFlow(context: WebPartContext, flowUrl: string, body: object): Promise<void> {
if (!flowUrl) {
return;
}
const client = await context.aadHttpClientFactory.getClient(FLOW_RESOURCE);
const res = await client.post(FLOW_NOTIFY_URL, AadHttpClient.configurations.v1, {
const res = await client.post(flowUrl, AadHttpClient.configurations.v1, {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
@@ -68,7 +69,7 @@ async function notifyRow(
if (!(await isNotifyAllowed(approval, row.approverId))) {
return;
}
await postNotify(context, {
await postToFlow(context, FLOW_NOTIFY_URL, {
RequestTypeId: target.requestTypeId,
RowID: row.id,
RequestID: requestId,