Отправка оповещений пользователям
Для отправки оповещений пользователям Web-клиента могут быть использованы функции SignalR, реализованные в сервисе IRealtimeCommunicationService. Данный сервис позволяет отправлять оповещения всем пользователям или определённому пользователю.
Не следует путать оповещение с функцией отображения диалоговых окон (пункт "Отображение сообщений, запросов, предупреждений").
Текстовые оповещения отображаются в правом нижнем углу окна Web-клиента.
На стороне клиента также предоставляется доступ к механизму оповещения, позволяющий передавать сообщения между вкладками браузера и на сервер 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 System.Web.Http;
namespace SignalForUsersExtension
{
public class ServiceController : ApiController
{
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 (проект) для отправки оповещения всем пользователям.
Функция |