zoukankan      html  css  js  c++  java
  • Activiti组任务(十)

    1 Candidate-users 候选人

    1.1需求

    在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置
    .bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。
    针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。
    设置任务候选人
    在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。

     查看 bpmn 文件:

     我们可以看到部门经理的审核人已经设置为 zhangsan,lishi 这样的一组候选人,可以使用
    activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人 。

    1.1.1 组任务办理流程

    第一步:查询组任务
    指定候选人,查询该候选人当前的待办任务。
    候选人不能办理任务。
    第二步:拾取(claim)任务
    该组任务的所有候选人都能拾取。
    将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
    如果拾取后不想办理该任务?
    需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
    第三步:查询个人任务
    查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。
    第四步:办理个人任务

    1.1.2 用户查询组任务

    先部署项目

    //1.部署流程定义
        public static void main(String[] args) {
            //1.创建ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到RepositoryService实例
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //3.进行部署
            Deployment deployment = repositoryService.createDeployment()
                    .addClasspathResource("diagram/holiday5.bpmn")  //添加bpmn资源
                    // .addClasspathResource("diagram/holiday5.png")
                    .name("请假申请单流程")
                    .deploy();
    
            //4.输出部署的一些信息
            System.out.println(deployment.getName());
            System.out.println(deployment.getId());
        }

    启动实例

     //2.启动流程实例
        public static void main(String[] args) {
                //1.得到ProcessEngine对象
                ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
                //2.得到RunService对象
                RuntimeService runtimeService = processEngine.getRuntimeService();
    
                //3.创建流程实例  流程定义的key需要知道 holiday
                ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
    
    
                //4.输出实例的相关信息
                System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());//holiday:1:4
                System.out.println("流程实例ID"+processInstance.getId());//2501
        }

    填写请假单的任务要执行完成

    //3.填写请假单的任务要执行完成
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.查询当前用户的任务
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey("myProcess_1")
                    .taskAssignee("xiaozhang")
                    .singleResult();
    
            //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
            if(task!=null){
                taskService.complete(task.getId());
                System.out.println("用户任务执行完毕...");
            }
    
    
            //5.输出任务的id
            System.out.println(task.getId());
        }

     根据候选人查询组任务 

    //4.查询候选用户的组任务
    
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.设置一些参数,流程定义的key,候选用户
            String key = "myProcess_1";
            String candidate_users="zhangsan";
    
            //4.执行查询
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskCandidateUser(candidate_users)//设置候选用户
                    .list();
            //5.输出
            for(Task task :list){
                System.out.println(task.getProcessInstanceId());
                System.out.println(task.getId());
                System.out.println(task.getName());
                System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
            }
        }

     

    来拾取组任务
    //5.测试zhangsan用户,来拾取组任务
        //抽取任务的过程就是将候选用户转化为真正任务的负责人(让任务的assignee有值)
       public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.设置一些参数,流程定义的key,候选用户
            String key = "myProcess_1";
            String candidate_users="zhangsan";
    
            //4.执行查询
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskCandidateUser(candidate_users)//设置候选用户
                    .singleResult();
            if(task!=null){
                taskService.claim(task.getId(),candidate_users);//第一个参数任务ID,第二个参数为具体的候选用户名
                System.out.println("任务拾取完毕!");
            }
        }

     当前的用户查询自己的任务

    //6.当前的用户查询自己的任务
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.设置一些参数,流程定义的key,用户
            String key = "myProcess_1";
            String assignee="zhangsan";
    
            //4.执行查询
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskAssignee(assignee)  //设置任务的负责人
                    .list();
            //5.输出
            for(Task task :list){
                System.out.println(task.getProcessInstanceId());
                System.out.println(task.getId());
                System.out.println(task.getName());
                System.out.println(task.getAssignee());//任务的执行人
            }
        }

    当前用户完成自己的任务

     //7.当前用户完成自己的任务
       public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.设置一些参数,流程定义的key,用户
            String key = "myProcess_1";
            String assignee="zhangsan";
    
            //4.执行查询
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskAssignee(assignee)  //设置任务的负责人
                    .singleResult();
            //5.执行当前的任务
            if(task!=null){
                taskService.complete(task.getId());
                System.out.println("任务执行完毕!");
            }
    
        }

     归还组任务
    如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人

    // 归还组任务,由个人任务变为组任务,还可以进行任务交接
    @Test
    public void setAssigneeToGroupTask() {
        // 查询任务使用TaskService
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "6004";
        // 任务负责人
        String userId = "zhangsan2";
        // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
        if (task != null) {
        // 如果设置为null,归还组任务,该 任务没有负责人
        taskService.setAssignee(taskId, null);
        }
    }

    说明: 建议归还任务前校验该用户是否是该任务的负责人
    也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议
    不要这样使用)

    任务交接

    //8.任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
        public static void main(String[] args) {
            //1.得到ProcessEngine对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //2.得到TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //3.设置一些参数,流程定义的key,用户
            String key = "myProcess_1";
            String assignee="zhangsan";
    
            //4.执行查询
            Task task = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskAssignee(assignee)  //设置任务的负责人
                    .singleResult();
            //5.判断是否有这个任务
            if(task!=null){
                taskService.setAssignee(task.getId(),"lisi");//交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
                System.out.println("交接任务完成~!");
            }
        }

     






  • 相关阅读:
    透明PNG格式图片兼容IE6浏览器
    CSS英文单词强制换行
    未能加载文件或程序集“Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项。试图加载格式不正确的程序
    使用IIS 无法命中Application_Start中的断点问题
    win7 x64 后蓝牙u盘搜索不到其他设备
    使用Html.BeginForm<T>后客户端脚本验证出错的问题
    为什么使用sealed修饰符
    vs2010调试时发生监视显示表达式为false,但却进入了if块中
    MicrosoftMvcJQueryValidation.js 启用客户端验证,form无法提交
    Jquery 操作页面中iframe自动跟随窗口大小变化,而不出现滚动条,只在iframe内部出滚动条
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11898379.html
Copyright © 2011-2022 走看看