Mise à jour des droits (organisation) sans impact sur les tâches en cours

1
0
-1

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

Comments

Submitted by erwan.bodere on Mon, 01/09/2017 - 15:58

J'ai ouvert un ticket avec une proposition d'évolution : https://bonita.atlassian.net/browse/BBPMC-445

3 answers

1
0
-1

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.

Comments

Submitted by erwan.bodere on Mon, 01/09/2017 - 14:46

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]);
        }
    }

1
0
-1

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

1
0
-1

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);

Notifications