Bonjour,
Dans mes processus, les tâches sont réalisables par plusieurs utilisateurs en fonction de rôle/groupe.
Les tâches sont donc à un état “Non assigné”. Il faut qu’une des personnes pouvant réaliser une tâche se l’assigne pour pouvoir la réaliser.
J’ai mis à jour l’organisation suite à des changements de responsabilité. Mon problème est que ces changements sont sans impact sur les tâches en cours.
Comment indiquer à Bonita de mettre à jour la liste des personnes éligibles suite à un changement d’organisation ?
D’avance merci
Cordialement
Je ne sais pas si on peut le faire au niveau d’un tenant, mais on peut demander à Bonita de mettre à jour les acteurs d’une tâche via : processAPI.updateActorsOfUserTask(taskId);
Voici un bout de code pour mettre à jour l’ensemble des tâches en attente et non assignée : SearchOptionsBuilder pendingHumanTaskSearchBuilder = new SearchOptionsBuilder(0, 100); pendingHumanTaskSearchBuilder.filter(HumanTaskInstanceSearchDescriptor.ASSIGNEE_ID, 0); SearchResult<HumanTaskInstance> searchPendingHumanTaskResults = processAPI.searchHumanTaskInstances(pendingHumanTaskSearchBuilder.done() ); for(HumanTaskInstance pendingHumanTaskInstance : searchPendingHumanTaskResults.getResult()) { logger.info("Found task : " + pendingHumanTaskInstance); try { processAPI.updateActorsOfUserTask(pendingHumanTaskInstance.getId()); } catch (Exception e) { logger.warn("Update actors for task : " + pendingHumanTaskInstance.getId() + " has failed ! " + e.getMessage()); } }
Mais cela ne fonctionne pas pour certaines tâches :
org.bonitasoft.engine.transaction.STransactionCommitException: bitronix.tm.internal.BitronixRollbackException: RuntimeException thrown during beforeCompletion cycle caused transaction rollback
En affichant le stacktrace, voici l’erreur :
Caused by: org.postgresql.util.PSQLException.: ERROR: duplicate key value violates unique constraint "idx_uq_pending_mapping" Detail: Key (tenantid, activityid, userid, actorid)=(1, 60033, 7, 0) already exists.
La méthode updateActorsOfUserTask semble donc faire des insertions de doublons dans la table pendingMapping.
J’ai ouvert un ticket avec une proposition d’évolution : https://bonita.atlassian.net/browse/BBPMC-445
Mon filtre d’acteurs renvoi des doublons. Je vais corriger mon filtre d’acteurs pour éliminer ces doublons.
Ne faudrait-il pas que la méthode updateActorsOfUserTask gère cela, et plus particulièrement la méthode createPendingMappingsAndAssignHumanTask?
Voici la méthode actuelle :
private void createPendingMappingsAndAssignHumanTask(final long humanTaskInstanceId, final FilterResult result) throws SBonitaException { final TenantServiceAccessor tenantAccessor = getTenantAccessor(); final List<Long> userIds = result.getResult(); for (final Long userId : userIds) { createPendingMappingForUser(humanTaskInstanceId, userId); } if (userIds.size() == 1 && result.shouldAutoAssignTaskIfSingleResult()) { tenantAccessor.getActivityInstanceService().assignHumanTask(humanTaskInstanceId, userIds.get(0)); } }
Voici une proposition de modification :
private void createPendingMappingsAndAssignHumanTask(final long humanTaskInstanceId, final FilterResult result) throws SBonitaException {
final TenantServiceAccessor tenantAccessor = getTenantAccessor();
final List<Long> userIds = result.getResult();
final Set<Long> uniqUserIds = new HashSet<Long>(userIds);
for (final Long userId : uniqUserIds) {
createPendingMappingForUser(humanTaskInstanceId, uniqUserIds);
}
if (uniqUserIds.size() == 1 && result.shouldAutoAssignTaskIfSingleResult()) {
tenantAccessor.getActivityInstanceService().assignHumanTask(humanTaskInstanceId, ((Long[])uniqUserIds.toArray())[0]);
}
}