Дерево страниц
Skip to end of metadata
Go to start of metadata

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 6 Следующий »

Сервис для работы с мониторами процессов, их создания, получения, обновления, удаления.

ru.intertrust.cmj.rest.tunable.object.processes.service.MonitorProcessingServiceImpl

extends: -

properties

name

return value

description

get

MonitorProcessingServiceПолучения сервиса из JS-обработчика

getData

TunableObjectREST.Resource

Возвращает ресурс, необходимый клиенту для использования на текущем шаге процесса

Параметры:

  • monitorId - String - UNID монитора процесса



methods

name

return value

description

updateProgress


Обновление прогресса операции, выполняющейся на сервере и отправка её на клиент по WebSocket

Параметры:

  • monitorId - String - UNID монитора процесса
  • total - Integer - сколько необходимо для завершения операции, в %
  • done - Integer - сколько пройдено, в %

updateByHandler


Запись в монитор разультатов работы обработчика

Параметры:

  • monitorId - String - UNID монитора процесса
  • command - IProcessMonitor.Command - команда для выполения веб-клиентом
  • currentStageTitle - String - заголовок текущего состояния процесса для отображения
  • data  - TunableObjectREST.Resource - ресурс, необходимый для следующего шаге процесса
  • params - Map<String,String> - параметры процесса, необходимые на следующих шагах проесса



deleteMonitorboolean

Удаляет монитор из хранилища

@param monitorId
     * @return - true, если монитор удалён

getMonitorIProcessMonitor
getAll  List<IProcessMonitor>Возвращает мониторы всех процессов в системе
getAllByPersonIProcessMonitor

    List<IProcessMonitor> getAllByPerson(SOPersonSystem person);

Возвращает мониторы для всех запущенных процессов указанного пользователя

@param - SOPersonSystem - person - владелец процессов
     * @return - мониторы всех процесов, запущенных указанным ползователем

getAllByClientId

  List<IProcessMonitor> getAllByClientId(String clientId);

Возвращает все мониторы проессовпо идентификатору активной вкладки браузера
     *
     * @param clientId - идентификатор сессии web-клиента. Привязан к вкладке браузера
     * @return

getParams(String monitorId)

getParams(String monitorId);

Возвращает патаметры процесса
     *
     * @param monitorId
     * @return параметры процесса

getData

    TunableObjectREST.Resource getData(String monitorId);

Возвращает ресурс, необходимый клиенту для испльзования на текущем шаге процесса
     *
     * @param monitorId
     * @return

setStatus

Установка опрдленного статуса процесса

setStatus(String monitorId, IProcessMonitor.Status status);

* @param monitorId
     * @param status    устанавливамый статус

setServerStatus
Установка опредленного статуса серверной обработки процесса.
     *
     * @param monitorId
     * @param serverStatus устанавливамый статус
     */
    void setServerStatus(String monitorId, IProcessMonitor.ServerStatus serverStatus);
prepareForHandlerProcessMonitor/**
     * Заполнение монитора данными перед запуском обработчика
     *
     * @param monitorId
     * @param currentStageTitle - заголовок текущего состояния процесса для отображения
     * @param handlerName       - название обработчика, который должен вызваться в рамках процесса
     * @param data              - ресурс, необходимый для следующего шаге процесса
     * @param httpSessionId     - дентификатор http-сессии пользователя
     * @param clientId          - идентификатор сессии web-клиента. Привязан к вкладке браузера
     */
    ProcessMonitor prepareForHandler(String monitorId, String currentStageTitle, String handlerName, TunableObjectREST.Resource data,
            String httpSessionId, String clientId);
updateByHandler
/**
     * Запись в монитор разультатов работы обработчика
     *
     * @param monitorId
     * @param command           - команда для выполения веб-клиентом
     * @param currentStageTitle - заголовок текущего состояния процесса для отображения
     * @param data              - ресурс, необходимый для следующего шаге процесса
     * @param params            - параметры процесса, необходимые на следующих шагах проесса
     */
    void updateByHandler(String monitorId, IProcessMonitor.Command command, String currentStageTitle, TunableObjectREST.Resource data,
            Map<String, String> params);
notifyClients(String monitorId);

  
 Отправка представления монитора всем клиентам по WebSocket с целью информирования о текущем состоянии процесса

* @param monitorId

sendToClient
Отправка представления монитора на клиент по WebSocket с целью выполнения действий на клиенте
     *
     * @param monitorId
     */
    void sendToClient(String monitorId);
sendToClientForSelectNewActiveSession

Отправка предсталения монитора всем клиентам для выбора клиента, который будет стартовать автоматическую операцию.
     * <p>
     * Выбор клиента происходит по следующей логике:
     * - первому попавшемуся клиенту отправляется монитор с разрешением на выполнение клиентской операции
     * без привлечения внимания пользовтеля. При этом SessionId этого клиента записывается в монитор.
     * - всем остальным клиентам монитор отправляется без такого разрашения.
     * <p>
     * При этом, если клиент с сохраненным SessionId отключится, то берется следующий первый попавшийся клиент.
     *
     * @param monitor                     - монитор процесса
     * @param person                      - инициатор процесса
     * @param needSendToNotActiveSessions - true, если необходимо ли рассылать монитор всем клиентам,
     */

  void sendToClientForSelectNewActiveSession(IProcessMonitor monitor, SOPersonSystem person, boolean needSendToNotActiveSessions);

setActiveSessionAndSentAutoStartCommand

Установка активной websocket-сессии и отправка клиенту по этой сессии команды для автозапуска операции на клиенте

@param monitorId           - монитор процесса
     * @param person              - инициатор процесса
     * @param activeWSSessionId   - id webSocket-сессии для которой надо выдать разрешение для авторзапуска клиентской операции
     * @param activeHttpSessionId - id http-сессии для которой надо выдать разрешение для авторзапуска клиентской операции
     * @param activeClientId      - id клиента который подключился, однозначно идентифицирует вкладку браузера.
     */
    void setActiveSessionAndSentAutoStartCommand(String monitorId, SOPersonSystem person, String activeWSSessionId,
            String activeHttpSessionId, String activeClientId);

startClientOperationboolean  /**
     * Выдача разрешения клиенту на обработку процесса, если процесс еще не занят другим клиентом.
     * При этом статус меняется с WAIT_DATA_FROM_USER на CLIENT_PROCESSING
     *
     * @param monitorId - UNID монитора процесса
     * @param clientId  - идентификатор клиента
     * @return true, если пазрешение выдано. false - если нет.
     */
    boolean startClientOperation(String monitorId, String clientId);
releaseClientOperation
  /**
     * Освобождение монитора клиентом, если пользователь отказался продолжать процесс прямо сейчас, но не превал её.
     * При этом статус меняется с CLIENT_PROCESSING на WAIT_DATA_FROM_USER
     *
     * @param monitorId - UNID монитора процесса
     */
    void releaseClientOperation(String monitorId, boolean needNotify);
 
updateProgress
  /**
     * Обновление прогресса операции, выполняющейся на сервере и отправка её на клиент по WebSocket
     *
     * @param monitorId - UNID монитора процесса
     * @param total     - сколько необходимо для завершения операции, в %
     * @param done      - сколько пройдено, в %
     */
    void updateProgress(String monitorId, int total, int done);
writeErrorDialog
  /**
     * Запись ошибки, блокирующей продолжение процесса.
     * Формирование завершащего диалога для показа ошибки
     *
     * @param monitorId - id монитора процесса
     * @param errorText - текст ошибки
     */
    void writeErrorDialog(String monitorId, String errorText, String stacktrace);
  markFinished

Помечает процесс заверешённым

  void markFinished(String monitorId);

markAborted

Помечает процесс прерванным. Нужно для запуска отката изменений
     *
     * @param monitorId - id монитора процесса

void markAborted(String monitorId);

markDeleted

Помечает процесс удалённым. такой монитор не возвращается клиенту,
     * и игнорирует попытки что-либо с ним сделать по инициативе клиента.

 *
     * @param monitorId - id монитора процесса
     */
    void markDeleted(String monitorId);

updateStatus
  /**
     * Устанавливает статус в монитор с сохранением в базу
     *
     * @param monitorId - id монитора процесса
     * @param status - статус монитора
     */
    void updateStatus(String monitorId, IProcessMonitor.Status status);

5.Работа с монитором

Сервис работы с монитором подключается так:

Java-код:

@Autowired    
private MonitorProcessingService monitorService;


JS-код:

var monitorService = MonitorProcessingServiceImpl.get();


При старте обработчика необходимо изменить статус монитора

monitorService.setServerStatus(monitorId, IProcessMonitor.ServerStatus.HANDLER_PROCESSING);


В мониторе все данные можно разделить на 3 типа:

1.системные данные, например, время модификации, инициатор процесса, идентификатор сессии клиента. 

При необходимости можно их взять, получив сам монитор:

String processTitle = monitorService.getMonitor(monitorId).getTitle();

2.ресурс, передаваемый клиент, и получаемый от клиента, как правило, это НР-диалог.

Вычисление ресурса предыдущего диалога:

TunableObjectREST.Resource data = monitorService.getData(monitorId);

3.строковые параметры, в которых можно хранить любую информацию для использования в обработчиках, например UNID-ы выделенных документов, данные которые пользователь вводил в предыдущие диалоги, итд.

пример получения строкового параметра PARAM_LIST_TEMPSTORAGE_IDS - имя параметра

String listTempStorageIdsStr = monitorService.getParams(monitorId).get(PARAM_LIST_TEMPSTORAGE_IDS);


При этом есть набор констант имён системных параметров, они могут использоваться как сервером так и веб-клиентом:

/**, 
* unid бороды инициатора операции
*/
INITIATOR_BEARD_UNID("initiatorBeardUnid"),

/**
* unid-ы обрабатываемых документов
*/
PARAM_IDS("ids"),

/**
* идентификатор нажатой кнопки
*/
PARAM_ACTION_REL("actionRel"),

/**
* число процентов прогресса на текущий момент
*/
PROGRESS_DONE("DONE"),

/**
* общее число процентов для вычисления прогресса в процессе (по умолчанию 100%)
*/
PROGRESS_TOTAL("TOTAL");


Во время работы серверного обработчика пользователь видит прогресс бар процесса. Можно его актуализировать указаным методом, он отпарвляет указанные знаения на веб-клиент по WebSocket.

monitorService.updateProgress(monitorId, 100, 30);


Можно отметить процесс завершённым и ничего больше не возвращать пользователю, например если пользователь его прервал. После этого можно будет больше ничего не писать в монитор:

monitorService.markFinished(monitorId);


В конце нужно обновить состояние монитора, записть в него нужнуые параметры и ресурс для следующего показа клиенту(либо другой команды). Это делается вызовом одного метода, чтобы монитор сохранялся только один раз(не считая вызовов updateProgress(...))

monitorService.updateByHandler(monitorId, IProcessMonitor.Command.SHOW_DIALOG, TITLE_FINISH, dialogResource, params);

В данном примере:

 
IProcessMonitor.Command.SHOW_DIALOG - говорит о том что веб-клеинт должен показать ресурс пользователю как НР-диалог.

Еще предусмотрена команда подписания группы документов в рамках процесса IProcessMonitor.Command.LOCKER_SIGN - в неё передаётся список id подписываемых документов во временном хранилище. подробнее Детальное описание реализации длительных (групповых) операций в CMJ#%D0%94%D0%B5%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%D0%B4%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%28%D0%B3%D1%80%D1%83%D0%BF%D0.11

Пример формирования такого ресурса в методе класса ru.intertrust.cmj.rest.tuning.operations.approving.ApprovingGroupOperationUtils.createResourceForSign(List<String> ids, String signType, String processTitle)

TITLE_FINISH - заоловок завершения данного этапа процесса. покажется пользовалю. Например: "листы согласования успешно сформированы".

dialogResource - ресурс TunableObjectREST.Resource для команды веб-клиенту.

params - карта параметров типа Map<String, String>

6.Вспомогательные методы

Для удобства создан класс  ru.intertrust.cmj.rest.tunable.object.action.OperationHelper , в который вынесены часто используемые методы, например:

createProgressUpdatePlan(int allCount, int startValue, int finishValue) -  метод вычисляющий план обновления прогрессса операци  на основании числа обрабатываемых документов
getSignFailuresMap(TunableObjectREST.Resource data) - Парсинг Tunable-ресурса с информацией о результатах подписания в карту и формирование информации об ошибках подпсиания в виде:"id документа, который не удалось подписать" - "причина, по которой не удалось подписать"


Для работы с процессом согласования создан класс  ru.intertrust.cmj.rest.tuning.operations.approving.ApprovingGroupOperationUtils. Он содержит методы для формирования и обработки НР-диалогов.

Статус

В РАБОТЕ

Комментарий

Методы, свойства, внутренние классы

  • Нет меток