Кнопка «Перейти к активной задаче пользователя». Настройка на C#
Введение
Здесь представлен пример С#-скрипта для кнопки на форме записи, связанной с процессом. Нажав эту кнопку пользователь может перейти к своей активной задаче, связанной с этой записью.
Скрипт проверяет наличие задач, связанных с записью, находит первую задачу, назначенную текущему пользователю, и выполняет переход к ней.
Активная задача пользователя
Приведённый здесь скрипт осуществляет переход к активной задаче пользователя:
- если задаче назначен только один исполнитель, то она считается активной для этого пользователя.
- если задаче назначено несколько возможных исполнителей, пользователь должен принять задачу в работу. Только принятая в работу задача будет назначена пользователю как активная. См. «Кнопка «Принять в работу» для задачи. Настройка на C#»
Прикладная задача
В бизнес-процессе с несколькими задачами пользователю требуется быстро перейти к своей активной задаче из записи, связанной с процессом.
Например, в процессе согласования договора менеджер открывает запись договора и хочет сразу перейти к своей задаче на согласование, не выполняя поиск в списке задач.
При нажатии кнопки «Перейти к задаче» скрипт должен выполнять следующие действия:
- проверить наличие задач, связанных с открытой записью;
- найти первую задачу, назначенную текущему пользователю;
- открыть найденную задачу;
- подходящая задача не найдена, показать пользователю соответствующее сообщение.
Настройка скрипта
Логика работы скрипта
Представленный здесь скрипт работает следующим образом:
- Получает ID текущего пользователя из контекста операции кнопки.
- Получает ID записи из контекста операции кнопки.
- Получает словарь ссылок на объекты, связанные с текущей записью.
- Проверяет наличие в словаре ссылок на задачи по ключу
cmw.task.objectId. - Получает коллекцию ID задач, связанных с текущей записью.
- Перебирает найденные задачи и ищет первую, назначенную текущему пользователю.
- Выполняет переход к найденной задаче или возвращает сообщение об ошибке.
-
В шаблоне записи, связанном с шаблоном процесса, создайте кнопку со следующими свойствами:
- Отображаемое название: Перейти к задаче
- Контекст операции: запись
- Операция: C#-скрипт
- Результат выполнения: навигация
-
На вкладке «Скрипт» введите следующий код:
Важно: подстановка ID процесса
Обязательно замените в коде значение
pa.1в строкеContainerId = "pa.1"на фактический ID процесса, связанного с шаблоном записей, из которых пользователь должен переходить к задачам.ID процесса отображается в списке шаблонов процессов и в URL при настройке процесса.
Скрипт для перехода к активной задаче пользователя// Импорт базовых типов и функций .NET Framework для работы с данными.using System;// Импорт классов коллекций и словарей для хранения данных.using System.Collections.Generic;// Импорт классов для работы с LINQ-запросами.using System.Linq;// Импорт классов для работы с сущностями данных.using Comindware.Data.Entity;// Импорт классов для обработки нажатий кнопок// и возврата результатов выполнения скрипта.using Comindware.TeamNetwork.Api.Data.UserCommands;// Импорт основных классов для работы с данными в {{ productName }}.using Comindware.TeamNetwork.Api.Data;class Script{// userCommandContext содержит данные контекста при нажатии кнопки.public static UserCommandResult Main(UserCommandContext userCommandContext, Comindware.Entities entities){// Получаем ID текущего пользователя, нажавшего кнопку.var currentUser = userCommandContext.CurrentUserId;// Получаем ID записи из контекста операции кнопки.var objectId = userCommandContext.ObjectIds[0];// Получаем словарь ссылок на все объекты, связанные с записью:// ключи — типы ссылок,// значения — коллекции ID связанных объектов.var refData = Api.Base.OntologyService.GetReferences(objectId);// Проверяем в словаре наличие ссылок на задачи// по ключу cmw.task.objectId// и получаем коллекцию ID задач, связанных с текущей записью.if (refData.ContainsKey("cmw.task.objectId") && refData["cmw.task.objectId"].Any()){var taskRefs = refData["cmw.task.objectId"];string idTask = null;// Ищем первую задачу, назначенную текущему пользователю.foreach (var taskRef in taskRefs){var taskId = taskRef.ToString();var task = Api.TeamNetwork.UserTaskService.Get(taskId);if (task.Assignee == currentUser){idTask = taskId;break;}}if (idTask != null){// Переходим к найденной задаче.return new UserCommandResult(){Success = true,Commited = true,ResultType = UserCommandResultType.Navigate,NavigationResult = new UserCommandNavigationResult{// Обязательно замените значение `pa.1`// на фактический ID процесса.ContainerId = "pa.1",ObjectId = idTask,Context = ContextType.Task}};}else{// Подходящая задача не найдена.return new UserCommandResult(){Success = false,ResultType = UserCommandResultType.Notificate,Messages = new[]{new UserCommandMessage{Severity = SeverityLevel.Normal,Text = "У пользователя нет активной задачи по данной записи"}}};}}else{// Поле cmw.task.objectId отсутствует или пусто.return new UserCommandResult(){Success = false,ResultType = UserCommandResultType.Notificate,Messages = new[]{new UserCommandMessage{Severity = SeverityLevel.Normal,Text = "Нет задач, связанных с данной записью."}}};}}} -
Сохраните кнопку.
- Поместите кнопку «Перейти к задаче» на форму в шаблоне записи, связанном с шаблоном процесса.
Тестирование
- Запустите процесс с пользовательской задачей, назначенной текущему пользователю.
- Откройте запись, связанную с процессом.
- Нажмите кнопку «Перейти к задаче».
- Убедитесь, что открылась задача, назначенная текущему пользователю.
-
Проверьте работу скрипта в следующих случаях:
- когда у пользователя нет активной задачи по текущей записи, должно отобразиться сообщение «У пользователя нет активной задачи по данной записи»;
- когда с записью не связаны никакие задачи (например, она не связана с процессом или связана с другим процессом), должно отобразиться сообщение «Нет задач, связанных с данной записью».
Эта статья была полезна 1 чел.