Activiti中当候选组中只有一个受理人时进行自动签收的方法

        实际工作中,待办事项一般是通过用户ID进行查询的,这样比较简单、方便。在Activiti中,当绘制流程的人工任务节点时,为了便于日后维护,也为了更符合实际的场景,通常不会直接指定受理人,而是指定候选组,也就是通常说的角色。而很多时候,这个角色只有一个用户,但是在Activiti的实现中,这里面需要一个中间环节,就是签收,这个签收的过程,显得不够智能,用户会很自然的觉得多此一举,多了一步没必要的操作,那么能不能把这个环节省掉呢?本文将提供解决这个问题的方法。

        这个问题,只能研究下Activiti的源代码了,如果能找到扩展点,那这个问题就好办了,经过研究,发现并不难,工作量也不大,下面进行详细说明(本文前提是Activiti与Spring集成,其他环境请自行举一反三)。

        一、自定义DefaultActivityBehaviorFactory,自定义该类的目的是创建自定义的UserTaskActivityBehavior,自定义的DefaultActivityBehaviorFactory需要通过set方法注入到SpringProcessEngineConfiguration中;

        二、自定义UserTaskActivityBehavior,通过扩展handleAssignments方法,对于受理人、候选人和候选组进行处理。这里面需要注意的是,至于如何确定一个候选组只有一个用户,如何获取这个唯一的用户,开发者需要自行确定,下面的样例代码仅供参考。

import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory;
import org.activiti.engine.impl.task.TaskDefinition;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ProcessActivityBehaviorFactory extends DefaultActivityBehaviorFactory implements ApplicationContextAware{
    
    private ApplicationContext applicationContext;
    @Override
    public UserTaskActivityBehavior createUserTaskActivityBehavior(
            UserTask userTask, TaskDefinition taskDefinition) {        
        ProcessUserTaskActivityBehavior taskActivityBehavior = (ProcessUserTaskActivityBehavior)applicationContext.getBean("taskActivityBehavior");
        taskActivityBehavior.setTaskDefinition(taskDefinition);
        return taskActivityBehavior;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

 

    

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ActivitiException;
import org.activiti.engine.ActivitiIllegalArgumentException;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.Expression;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
import org.activiti.engine.impl.task.TaskDefinition;
import org.springframework.beans.factory.annotation.Autowired;

public class ProcessUserTaskActivityBehavior extends UserTaskActivityBehavior {
    @Autowired
    private TaskService taskService;
    
    public ProcessUserTaskActivityBehavior() {
        super(null);
    }
    
    public void setTaskDefinition(TaskDefinition taskDefinition){
        super.taskDefinition = taskDefinition;
    }

    public ProcessUserTaskActivityBehavior(TaskDefinition taskDefinition) {
        super(taskDefinition);
    }

    @Override
    protected void handleAssignments(TaskEntity task,ActivityExecution execution) {
        String assignee = null;
        List<String> candidateUserId = null,candidateGroupId = null;
        
        if (taskDefinition.getAssigneeExpression() != null) {
            assignee = (String) taskDefinition.getAssigneeExpression().getValue(execution);
            task.setAssignee(assignee,true,false);
        }
        
        if (taskDefinition.getOwnerExpression() != null) {
          task.setOwner((String) taskDefinition.getOwnerExpression().getValue(execution));
        }

        if (!taskDefinition.getCandidateGroupIdExpressions().isEmpty()) {
          for (Expression groupIdExpr : taskDefinition.getCandidateGroupIdExpressions()) {
            Object value = groupIdExpr.getValue(execution);
            if (value instanceof String) {
                candidateGroupId = extractCandidates((String) value);
                task.addCandidateGroups(candidateGroupId);
            } else if (value instanceof Collection) {
                task.addCandidateGroups((Collection) value);
            } else {
                throw new ActivitiIllegalArgumentException("Expression did not resolve to a string or collection of strings");
            }
          }
        }

        if (!taskDefinition.getCandidateUserIdExpressions().isEmpty()) {
          for (Expression userIdExpr : taskDefinition.getCandidateUserIdExpressions()) {
            Object value = userIdExpr.getValue(execution);
            if (value instanceof String) {
              candidateUserId = extractCandidates((String) value);
              task.addCandidateUsers(candidateUserId);
            } else if (value instanceof Collection) {
              task.addCandidateUsers((Collection) value);
            } else {
              throw new ActivitiException("Expression did not resolve to a string or collection of strings");
            }
          }
        }
        
        if (assignee == null && candidateUserId == null && candidateGroupId.size() ==1){
            String groupId = candidateGroupId.get(0);
            //下面的代码开发者自行确定处理方法
            String sql = "SELECT USER_ID FROM SYS_ROLE_USER WHERE ROLE_ID = '" + groupId + "' AND ROLE_TYPE = '3'";
            CoreTemplate coreTemplate = CoreContextContainer.getContext().getCoreTemplate();
            List data = coreTemplate.find(sql,null,true);
            
            if (data.size() == 1){
                String userId = (String)((Map)data.get(0)).get("user_id");
                taskService.claim(task.getId(),userId);//符合条件的自动签收
            }
        }
    }
}

 

        下面是对应的Spring配置文件,这里面特别需要注意的是,taskActivityBehavior不能是单例的,相应的scope值为prototype。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">    
    <bean id="processEngineConfiguration" class="com.process.ProcessEngineConfiguration">        
          <property name="activityBehaviorFactory" ref="activityBehaviorFactory"/>          
      </bean>      
      <bean id="activityBehaviorFactory" class="com.process.ProcessActivityBehaviorFactory"/>
      <bean id="taskActivityBehavior" class="com.process.ProcessUserTaskActivityBehavior" scope="prototype"/>
</beans>

 

        以上代码在Activiti5.15.1版本中测试通过。

转载于:https://my.oschina.net/liyuj/blog/381865

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti中,候选人组是用于指定具有某个任务的执行权限的一组用户的标识符。任务可以分配给一个或多个候选人组,并且只有属于该组的用户才能执行该任务。这样可以实现任务的协作和分配。 要创建一个候选人组,可以在流程定义文件(BPMN文件)中使用`<candidate-groups>`元素来指定。例如: ```xml <userTask id="task1" name="Task 1" activiti:assignee="${assignee}"> <extensionElements> <activiti:candidateGroups> <activiti:candidateGroup>group1</activiti:candidateGroup> <activiti:candidateGroup>group2</activiti:candidateGroup> </activiti:candidateGroups> </extensionElements> </userTask> ``` 上述示例中,`task1`任务会被分配给`group1`和`group2`这两个候选人组。只有属于这两个组的用户才能执行该任务。 在运行时,可以使用Activiti的API来查询候选人组和候选人信息,并将任务分配给具体的候选人。例如,可以使用以下代码将任务分配给具体的用户: ```java TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskCandidateGroup("group1").singleResult(); taskService.setAssignee(task.getId(), "user1"); ``` 上述代码中,首先通过`taskCandidateGroup`方法查询属于`group1`候选人组的任务,然后使用`setAssignee`方法将任务分配给具体的用户`user1`。 希望以上信息对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值