• camunda_18_user_task_assignment


    Camunda 后台数据库内建有几个人员/组织数据表, 但在User task assignment方便, 并不强制我们要将自己的人员/组织数据导入到这些table中. 举例讲, 我们需要将某个user task指派给 demo123 这个用户, 直接在该user task设定 assignee 为 demo123 即可, 就这么简单.

    指定 Assignment 的几种形式:

    • Assignee: 直接指派到人.
    • Candidate Users, 指派多个人, 按逗号分隔.
    • Candidate Groups, 指派到多个组, 按逗号分隔.
      说明: 在TaskList应用中, 对于后两种形式的指派, 操作人员在执行user task之前, 还需要先做任务认领, 谁认领任务, 谁就获得执行权.
      但如果是自己的流程引擎的应用, 其实可以设计认领过程, 也可以省略认领步骤.

    Assignment 的设定时机

    • 流程设计时设定. 在流程设计时即使用固定值指定任务执行人, 比如设定 demo123.
    • 流程启动时设定. Assignee/CandidateUsers/CandidateGroups, 都支持表达式设定, 我们可以在流程设计时, 指定user task的执行人为 ${user} , 在流程启动时间, 设定这些流程变量, 即完成人员指派.
    • 流程流转过程中设定. 流程设计时通过变量设定执行人, 然后在流程流转时, 在前置节点代码指定后续节点的执行人, 或者在本user task的 executionListener的 start 事件或 taskListener 的 create 事件中动态设定执行人. 下图executionListener 和 taskListener 常用event的执行顺序图:
      顺序图

    通过create TaskListener 指派人员的示例代码

    
    public class MyUserTaskListener implements TaskListener {
    
    	@Override
    	public void notify(DelegateTask delegateTask) {
    		if (delegateTask.getEventName().equals("create")) {
    			//直接指派人
    			delegateTask.setAssignee("demo123");
    			//或者, 设定流程变量userId
    			delegateTask.setVariable("userId","demo123");
    		}
    	}
    }
    

    User task 任务处理

    SpringBoot 的引擎项目, DI 容器可以直接注入 TaskService 实例, 然后就可以按照process 和当前用户UserId/group 遍历到要 todo 清单, 进而完成业务处理.
    下面是一个简单的代码示例:

    @SpringBootApplication
    @EnableProcessApplication
    public class WebappExampleProcessApplication {
    	@Autowired
    	TaskService taskService;
    
    	public static void main(String... args) {
    		SpringApplication.run(WebappExampleProcessApplication.class, args);
    	}
    
    	public void doTask() {
    		List<Task> tasks = null;
    		tasks = taskService.createTaskQuery().taskAssignee("demo123").processInstanceBusinessKey("procKey").list();
    		tasks = taskService.createTaskQuery().taskCandidateUser("demo123").processInstanceBusinessKey("procKey").includeAssignedTasks().list();
    		tasks = taskService.createTaskQuery().taskCandidateGroup("Group1").processInstanceBusinessKey("procKey").includeAssignedTasks().list();
    		if (tasks != null && tasks.size() > 0) {
                Task task= tasks.get(0) ;
    			String taskId = task.getId();
    
    			// 业务处理代码省略
    
    			
    			// 如果原来分配到group或candidateUsers, 可设定具体执行人
    			taskService.setAssignee(taskId, "demo123");
    
    			// 提交task
    			taskService.complete(taskId);
    			taskService.handleBpmnError(taskId, "some error"); // 抛出 Bpmn 异常
    
    		}
    	}
    
    }
    

    参考

  • 相关阅读:
    C# 中 Struct 与 Class 的区别,以及两者的适用场合<转转转>
    <转>.NET Framework十年回顾 体积越小功能越强
    一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
    在博客园已经一年多时间了,今天开通博客了!
    C#RSA非对称加解密
    无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动
    JavaScript判断浏览器类型及版本(转)
    SQL Server 海量导入数据
    数据库管理方面必知语句(问答)(转)
    JS实现的购物车
  • 原文地址:https://www.cnblogs.com/harrychinese/p/camunda_18_user_task_assignment.html
Copyright © 2020-2023  润新知