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
@@ -0,0 +1,70 @@
import { IChatParticipant, extractMentionedEmails } from './chatMentions';
/**
* Тело запроса к потоку оповещения о сообщении в чате (FLOW_CHAT_NOTIFY_URL).
* Контракт потока: все поля — строки, кроме mentionedEmails; никого не
* отметили — пустой массив, а не null и не пропущенное поле.
*/
export interface IChatNotifyBody {
initiatorEmail: string;
mentionedEmails: string[];
authorName: string;
messageText: string;
RequestUniqueCode: string;
requestUrl: string;
requestTitle: string;
}
export interface IChatNotifyInput {
/** Инициатор заявки (автор строки списка данных). */
initiatorEmail: string;
/** Кого можно было отметить — по ним ищутся «@ФИО» в тексте. */
participants: IChatParticipant[];
authorName: string;
authorEmail: string;
messageText: string;
requestCode: string;
requestUrl: string;
requestTitle: string;
/** Режим проверки (свойство веб-части chatSelfNotify): письма и о своих сообщениях. */
selfNotify: boolean;
}
const sameEmail = (a: string, b: string): boolean => a.toLowerCase() === b.toLowerCase();
/**
* Собрать тело запроса к потоку или undefined, если писать некому.
*
* Поток шлёт инициатору письмо ВСЕГДА, когда его нет среди отмеченных. Значит,
* когда пишет сам инициатор (а режим проверки выключен), письмо «новое сообщение
* по вашей заявке» ушло бы ему же. Отключить его в контракте потока нечем,
* поэтому:
* — никого не отметил → поток не вызываем вовсе;
* — кого-то отметил → в initiatorEmail кладём первого отмеченного: по
* контракту отмеченный инициатор получает только «Вас упомянули», и
* лишнего письма никому не уходит.
*/
export function buildChatNotifyBody(input: IChatNotifyInput): IChatNotifyBody | undefined {
const mentioned = extractMentionedEmails(input.messageText, input.participants).filter(
(email) => input.selfNotify || !sameEmail(email, input.authorEmail)
);
let initiatorEmail = input.initiatorEmail;
const authorIsInitiator =
!!initiatorEmail && !!input.authorEmail && sameEmail(initiatorEmail, input.authorEmail);
if (authorIsInitiator && !input.selfNotify) {
if (mentioned.length === 0) return undefined;
initiatorEmail = mentioned[0];
}
if (!initiatorEmail && mentioned.length === 0) return undefined;
return {
initiatorEmail,
mentionedEmails: mentioned,
authorName: input.authorName,
messageText: input.messageText,
RequestUniqueCode: input.requestCode,
requestUrl: input.requestUrl,
requestTitle: input.requestTitle
};
}