ProcessService

ru.bgcrm.model.process.service.ProcessService — основной сервис чтения и изменения процессов. Он объединяет операции над самим процессом, создание, группы, исполнителей и привязки.

Используйте его вместо ProcessDAO: сервис работает в текущем ServerContext, выполняет проверки и публикует доменные события.

Получение сервиса

val processService = ServerContext.get().getService<ProcessService>()
ProcessService processService = ServerContext.lookup(ProcessService.class);

В JEXL-контексте процесса тот же интерфейс доступен как processService.

Состав сервиса

Интерфейс Назначение

CommonProcessService

Получение и удаление процесса, описание, статус, приоритет

ProcessCreatorService

Создание обычного или связанного процесса

ProcessGroupsService

Группы процесса

ProcessExecutorsService

Исполнители процесса

LinkService

Процессы, контрагенты, договоры и произвольные привязки

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

Процесс и тип процесса

Метод Поведение

getProcess(id): Process

Возвращает процесс или выбрасывает BGMessageException, если он не найден

findProcess(id): Optional<Process>

Возвращает пустой Optional, если процесса нет

getProcessList(ids): List<Process>

Загружает процессы по коллекции идентификаторов

getProcessType(typeId): ProcessType

Берёт тип из ProcessTypeCache; при отсутствии выбрасывает BGMessageException

removeProcess(id)

Удаляет процесс через repository. Метод не публикует события удаления

Для обязательной сущности используйте getProcess, для ожидаемого отсутствия — findProcess.

Описание, статус и приоритет

Метод Поведение

setDescription(id, description)

Полностью заменяет описание и публикует событие изменения

addDescription(id, message)

Добавляет непустое сообщение по шаблону типа процесса

addDescription(id, pattern, message)

Добавляет сообщение по явному шаблону; доступны ${description}, ${text}, ${time}, ${user}

updateStatus(id, statusId, comment)

Проверяет существование статуса, записывает историю и публикует события до/после изменения

setPriority(id, priority)

Ограничивает значение диапазоном 0..9 и публикует события до/после изменения

При переходе в закрывающий статус updateStatus дополнительно публикует события для связанных процессов типов processMade, processDepend и processLink.

Создание процесса

Метод Назначение

createProcess(typeId, title)

Создать процесс без привязки

createLinkedProcess(typeId, title, linkedProcessId, linkType)

Создать процесс, связанный с другим процессом

createLinkedProcess(typeId, title, linkedProcess, linkType)

То же, если объект процесса уже загружен

createLinkedProcess(typeId, title, linkedCustomer)

Создать процесс с привязкой к контрагенту

createLinkedProcess(typeId, title, linkedContract)

Создать процесс с привязкой к договору биллинга

createLinkedProcess(typeId, title, linkedCommonContract)

Создать процесс с привязкой к единому договору

createLinkedProcess(typeId, title, link)

Создать процесс с произвольной CommonObjectLink

createWithParameters(typeId, title, parameterValues)

Создать процесс и заполнить параметры через ParameterService

title = null преобразуется в пустую строку. Создание запрещено для архивного типа и типа без существующего начального статуса. Сервис назначает начальный статус и группы типа процесса, затем публикует соответствующее событие создания.

Допустимые типы связи процессов определены константами Process:

  • processLink — обычная связь;

  • processMade — связанный процесс создан из исходного;

  • processDepend — зависимость между процессами.

Группы процесса

Метод Назначение

getProcessGroups(id, roleId = 0)

Вернуть группы только для указанной роли

getProcessGroupByUser(id, user, roleId, firstSuitableGroup = false)

Подобрать группу пользователя с учётом разрешённых групп типа

addProcessGroups(id, groups)

Добавить группы к существующим

addProcessGroups(id, groups, checkAllowedDescendants)

То же с выбором проверки точного списка либо списка с потомками

updateProcessGroups(id, groups)

Полностью заменить группы

removeProcessGroup(id, group)

Удалить одну группу

значение roleId = 0 не означает «все роли»: сервис фильтрует записи по роли 0.

Если подходящих групп пользователя несколько и firstSuitableGroup == false, сервис выбрасывает BGMessageException. Изменение полного набора групп публикует события groupsChanging и groupsChanged.

Исполнители

Метод Назначение

getProcessExecutors(id, roleId = 0)

Вернуть исполнителей только для указанной роли

addProcessExecutors(id, executors)

Добавить готовые ProcessExecutor

addProcessExecutors(id, executors, checkAllowedDescendants)

Добавить с проверкой разрешённых групп

addProcessExecutors(id, users, roleId, firstSuitableGroup)

Преобразовать пользователей в исполнителей через подходящие группы

updateProcessExecutors(…​)

Полностью заменить исполнителей; доступны те же варианты аргументов

removeProcessExecutor(id, executor)

Удалить конкретную запись исполнителя

removeProcessExecutor(id, user)

Удалить все записи пользователя в процессе

При обновлении исполнителей сервис автоматически добавляет отсутствующие группы процесса и публикует события executorsChanging и executorsChanged.

Привязки

Процессы

Метод Назначение

getLinkedProcesses(id, linkTypes, processTypes, statuses)

Процессы, на которые ссылается текущий процесс; пустой фильтр не ограничивает выборку

getLinkingProcesses(linkedProcessId, linkTypes, processTypes)

Процессы, которые ссылаются на текущий

addLinkedProcess(…​), addLinkedProcesses(…​)

Добавить одну или несколько связей

removeLinkedProcess(…​)

Удалить связь указанного типа

По умолчанию выборка учитывает processLink, processDepend и processMade.

Контрагенты и договоры

Метод Назначение

getLinkedCustomers(id)

Получить привязанных контрагентов

addLinkedCustomer(id, customerId), addLinkedCustomer(id, customer)

Добавить контрагента по идентификатору или объекту

addLinkedCustomers(id, customers)

Добавить коллекцию контрагентов

updateLinkedCustomers(id, customerIds)

Полностью заменить привязанных контрагентов

removeLinkedCustomer(id, customerId), removeLinkedCustomers(id, customers)

Удалить одного или несколько контрагентов

getLinkedContracts(id)

Получить привязанные договоры биллинга

addLinkedContract(id, contract), addLinkedContracts(id, contracts)

Добавить один или несколько договоров

updateLinkedContracts(id, contracts)

Заменить привязанные договоры

removeLinkedContract(id, contract)

Удалить договор

getLinkedCommonContracts(id)

Получить привязанные единые договоры

addLinkedCommonContract(id, commonContractId), addLinkedCommonContract(id, commonContract)

Добавить единый договор

addLinkedCommonContracts(id, commonContracts)

Добавить коллекцию единых договоров

updateLinkedCommonContracts(id, commonContractIds)

Полностью заменить единые договоры

removeLinkedCommonContract(id, commonContractId)

Удалить единый договор

Методы с update заменяют текущий набор соответствующих привязок. Для договоров биллинга текущая реализация updateLinkedContracts делегирует общей замене привязок и может затронуть привязки других типов; перед применением проверьте состав связей процесса. Для точечного изменения безопаснее использовать addLinkedContract и removeLinkedContract.

Произвольные объекты

Метод Назначение

getLinkedObjects(id)

Все исходящие CommonObjectLink

getLinkedObjects(id, regexPattern)

Исходящие привязки, тип которых полностью совпал с регулярным выражением

getLinkingObjects(id)

Входящие привязки

addLinkedObject(id, link)

Добавить привязку

updateLinkedObjects(id, links)

Удалить все исходящие привязки и добавить переданный набор

removeLinkedObject(id, link)

Удалить одну привязку

removeLinkedObjects(id)

Удалить все исходящие привязки

Изменения привязок публикуют события linkAdding/linkAdded и linkRemoving/linkRemoved.

Транзакции и ошибки

Сервис использует соединения текущего ServerContext. В транзакционном контексте изменения становятся окончательными только после commit; при перехваченной ошибке вызывающий код должен осознанно выполнить rollback и завершить контекст. Подробнее: Соединения и транзакции.

Ожидайте BGMessageException для отсутствующего процесса, типа, контрагента или единого договора и IllegalArgumentException для неизвестного статуса либо пустого сообщения, добавляемого в описание.

Не смешивайте сервисные операции с отдельным соединением, созданным вручную: они окажутся в разных транзакциях.