Отправка оповещений пользователям

Для отправки оповещений пользователям Web-клиента могут быть использованы функции SignalR, реализованные в сервисе IRealtimeCommunicationService. Данный сервис позволяет отправлять оповещения всем пользователям или определённому пользователю.

Ссылка на пример на GitHub: SignalForUsers.

Не следует путать оповещение с функцией отображения диалоговых окон (пункт "Отображение сообщений, запросов, предупреждений").

Текстовые оповещения отображаются в правом нижнем углу окна Web-клиента.

Пример оповещения
Рисунок 1. Пример оповещения
На стороне клиента также предоставляется доступ к механизму оповещения, позволяющий передавать сообщения между вкладками браузера и на сервер Web-клиента. Данная функциональность реализована в клиентском сервисе $RealtimeCommunicationService (см. описание в JsDocApi).

В качестве примера работы с сервисом IRealtimeCommunicationService реализуем функцию рассылки сообщений всем пользователям, доступную на стороне клиента.

Полный код примера доступен в репозитории на GitHub.

Реализация серверного метода для рассылки оповещений

Во-первых, нужно реализовать серверный метод, использующий функции сервиса IRealtimeCommunicationService для рассылки оповещений.

Для этого разработаем серверное расширение с web-функцией. Ниже приведён код такой функции, реализованной в контроллере.

Файл Controllers\ServiceController.cs
using DocsVision.Platform.WebClient.Models.RealTimeCommunication;
using DocsVision.Platform.WebClient.Models.RealTimeCommunication.NotificationMessage;
using DocsVision.Platform.WebClient.Services;
using System;
using Microsoft.AspNetCore.Mvc;

namespace SignalForUsersExtension
{
    public class ServiceController : ControllerBase
    {
        readonly IRealtimeCommunicationService communicationService;

        public ServiceController(IRealtimeCommunicationService communicationService) (1)
        {
            this.communicationService = communicationService;
        }

        (2)
        [HttpPost]
        public void SendAll([FromBody]SendMessageRequest request)
        {
            var commMessage = new RealtimeCommunicationMessage<NotificationRealtimeMessage>();
            var messageData = new NotificationRealtimeMessage()
            {
                NotificationType = request.MessageType,
                Message = request.Message
            };
            commMessage.Initialize(NotificationRealtimeMessage.MessageType, messageData);
            communicationService.SendAll(commMessage);
        }
    }
}
1 Сервис IRealtimeCommunicationService получаем из конструктора.
2 Отправляет оповещение всем пользователям

<param name="request">Сообщение</param>

Для удобства использования методов серверного расширения разработаем клиентское расширение с сервисом, который будет вызывать web-методы.

Файл src\MessageService.tsx
import { serviceName } from "@docsvision/webclient/System/ServiceUtils";
import { $RequestManager } from "@docsvision/webclient/System/$RequestManager";
import { urlStore } from "@docsvision/webclient/System/UrlStore";

export class MessageService { (1)
    constructor(private services: $RequestManager) {
    }

    sendAll(message: string, messageType: MessageType) { (2)
        let url = urlStore.urlResolver.resolveApiUrl("SendAll", "Service");

        this.services.requestManager.post(url, JSON.stringify({ message, messageType }));
    }
}

export type $MessageService = { messageService: MessageService };
export const $MessageService = serviceName((s: $MessageService) => s.messageService);
1 Клиентский сервис, предоставляющий доступ к серверным методам работы с подсистемой оповещений.
2 Отправляет сообщение message всем пользователям. Тип сообщения messageType влияет на оформление сообщения.

Здесь messageType — ограниченный список значений, которые может принимать тип сообщения:

export enum MessageType {
    Alert = 0,
    Success = 1,
    Warning = 2,
    Error = 3,
    Info = 4
}

Осталось добавить функцию, которая будет обрабатывать, к примеру, нажатие кнопки разметки и вызывать метод MessageService.sendAll:

Файл src\EventHandlers.tsx
import { IEventArgs } from "@docsvision/webclient/System/IEventArgs";
import { Layout } from "@docsvision/webclient/System/Layout";
import { $MessageService, MessageType, MessageService } from "./MessageService";
import { layoutManager } from "@docsvision/webclient/System/LayoutManager";

export function sendMessage(sender: Layout, e: IEventArgs) { (1)
   let messageService = layoutManager.cardLayout.getService<MessageService>($MessageService);
   return messageService.sendAll("В 12:00 планируется перезагрузка {wc}а. Сохраните данные.", MessageType.Warning);
}
1 Функция использует сервис $MessageService (проект) для отправки оповещения всем пользователям.

Функция sendMessage может быть указана в качестве обработчика нажатия кнопки или другого события.