feat: отметки «@» в чате заявки и письма через поток Power Automate
В поле ввода чата «@» открывает подсказку с участниками заявки (инициатор и все из маршрута). Отметка — обычный текст «@ФИО», без штатного упоминания SharePoint, чтобы не уходило его собственное письмо. После отправки сообщения портал вызывает поток FLOW_CHAT_NOTIFY_URL: отмеченным — «Вас упомянули», инициатору — «Новое сообщение по вашей заявке». О своих сообщениях писем нет; для проверки это включается свойством веб-части «Чат: уведомлять о своих сообщениях» (по умолчанию выключено) — тогда же можно отметить себя. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user