Assign to User in Group with the least assignments

Introduction

Ensuring tasks are evenly distributed among participants is essential for workload balance in a business process. This documentation explains how to dynamically assign tasks to users within a group with the fewest open assignments. This can help optimize task allocation and prevent overloading any single participant.

How does it work?

This solution uses a Bean Shell script within the Map Participants to Users feature of Joget DX8. The script retrieves all users from a specified group and checks their current open assignments. It then assigns the task to the user with the fewest open assignments. This method ensures that tasks are distributed based on current workloads.

import java.util.Collection;
import org.joget.apps.app.service.AppUtil;
import org.joget.directory.model.User;
import org.joget.directory.model.service.ExtDirectoryManager;
import org.joget.workflow.shark.model.dao.WorkflowAssignmentDao;
  
ExtDirectoryManager directoryManager = (ExtDirectoryManager) AppUtil.getApplicationContext().getBean("directoryManager");
WorkflowAssignmentDao workflowAssignmentDao = (WorkflowAssignmentDao) AppUtil.getApplicationContext().getBean("workflowAssignmentDao");
//set groupId
String groupId = "G-001";
//Get users of the group using directory manager, sorted by firstName
Collection userList = directoryManager.getUsers(null, null, null, null, groupId, null, null, "firstName", false, null, null);
//initialize
String assignTo = "";
int lowestAssignmentCount = -1;
Collection assignees = new ArrayList();
//loop through the users
for(Object u : userList){
    User user = (User) u;
     
    //get open assignment count of the current user
    //refer to https://github.com/jogetworkflow/jw-community/blob/5.0-SNAPSHOT/wflow-wfengine/src/main/java/org/joget/workflow/shark/model/dao/WorkflowAssignmentDao.java#L198 to refine search conditions
    int userAssignmentSize = workflowAssignmentDao.getAssignmentSize(null, null, null, null, u.getUsername(), "open");
     
    //System.out.println(u.getUsername() + " has " + userAssignmentSize);
    if(lowestAssignmentCount == -1){
        //assign to the first person first
        lowestAssignmentCount = userAssignmentSize;
        assignTo = u.getUsername();
    }else if(userAssignmentSize < lowestAssignmentCount){
        assignTo = u.getUsername();
        lowestAssignmentCount = userAssignmentSize;
    }
}
//System.out.println("Will assign to " + assignTo);
assignees.add(assignTo);
return assignees;

In this code, you will get all the users from the group with ID "G-001". Then, we will traverse through each user and obtain each user's assignment count.

The first user with the least assignment count will be picked as the assignee of the current assignment. You may use this as a reference to your future coding needs.

Related documentation

Created by Julieth Last modified by Aadrian on Dec 13, 2024