工作流引擎之九

目录

一,设置 local 流程变量

1.1 任务办理时设置

 1.2 通过当前任务设置

1.3 Local 变量测试 1

1.4 Local 变量测试 2

二,组任务

        2.1 Candidate-users 候选人

                2.1.1 需求

                2.1.2 设置任务候选人

三,办理组任务

        3.1 组任务办理流程

        3.2 用户查询组任务

        3.3  用户拾取组任务

 3.4 用户查询个人待办任务

3.5 用户办理个人任务

3.6 归还组任务

3.7  任务交接

3.8 数据库表操作


一,设置 local 流程变量

1.1 任务办理时设置

任务办理时设置 local 流程变量,当前运行的流程实例只能在该任务结束前使用,任务结束该变量无 法在当前流程实例使用,可以通过查询历史任务查询。

    /**
     * 办理任务时设置local流程变量
     */
    @Test
    public void completTask() {
        //任务id
        String taskId = "";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        // 定义流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        Holiday holiday = new Holiday ();
        holiday.setNum(3F);
        //变量名是holiday,变量值是holiday对象
        variables.put("holiday", holiday);
        // 设置local变量,作用域为该任务
        taskService.setVariablesLocal(taskId, variables);
        taskService.complete(taskId);
    }

>说明: 设置作用域为任务的 local 变量,每个任务可以设置同名的变量,互不影响。

 1.2 通过当前任务设置

    @Test
    public void setLocalVariableByTaskId(){
        //当前待办任务id
        String taskId="1404";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Holiday holiday = new Holiday ();
        holiday.setNum(3);
        //通过任务设置流程变量
        taskService.setVariableLocal(taskId, "holiday", holiday);
        //一次设置多个值
        //taskService.setVariablesLocal(taskId, variables)
    }
    

>注意: 任务 id 必须是当前待办任务 id,act_ru_task 中存在。

1.3 Local 变量测试 1

>如果上边例子中设置 global 变量改为设置 local变量是否可行?为什么?

>Local 变量在任务结束后无法在当前流程实例执行中使用,如果后续的流程执行需要用到此变量则会 报错。

1.4 Local 变量测试 2

>在部门经理审核、总经理审核、人事经理审核时设置 local 变量,可通过 historyService 查询每个历 史任务时将流程变量的值也查询出来。

    /**
     * 查询历史流程变量
     */
    @Test
    public void queryHistory(){
        // 创建历史任务查询对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoryService historyService = processEngine.getHistoryService();
        HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
        List<HistoricTaskInstance> list = historicTaskInstanceQuery.includeTaskLocalVariables().finished().list();


        for (HistoricTaskInstance historicTaskInstance : list) {
            System.out.println("==============================");
            System.out.println(" 任 务 id : " +historicTaskInstance.getId());
            System.out.println(" 任 务 名 称 : " +historicTaskInstance.getName());
            System.out.println(" 任 务 负 责 人 : " +historicTaskInstance.getAssignee());
            System.out.println(" 任 务 local 变 量 : "+historicTaskInstance.getTaskLocalVariables());
        }
    }

>注意:查询历史流程变量,特别是查询 pojo 变量需要经过反序列化,不推荐使用。如果要查pojo 变量,需了解如何反序列化。

二,组任务

        2.1 Candidate-users 候选人

                2.1.1 需求

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

                2.1.2 设置任务候选人

           在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。

 

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

三,办理组任务

        3.1 组任务办理流程

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

        第三步:查询个人任务 查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。         第四步:办理个人任务

        3.2 用户查询组任务

                根据候选人查询组任务

    /**
     * 根据候选人查询组任务
     */
    @Test
    public void findGroupTaskList() {
        // 流程定义key
        String processDefinitionKey = "holiday4";
        // 任务候选人
        String candidateUser = "zhangsan";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 创建TaskService
        TaskService taskService = processEngine.getTaskService();
        //查询组任务
        List<Task> list = taskService.createTaskQuery()//
                .processDefinitionKey(processDefinitionKey)//
                .taskCandidateUser(candidateUser)//根据候选人查询
                .list();
        for (Task task : list) {
            System.out.println("----------------------------");
            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        }
    }

        3.3  用户拾取组任务

                候选人员拾取组任务后该任务变为自己的个人任务。

    /**
     * 候选人员拾取组任务后该任务变为自己的个人任务。
     */
    @Test
    public void claimTask(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        //要拾取的任务id
        String taskId = "6302";
        //任务候选人id
        String userId = "lisi";
        //拾取任务
        //即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
        //校验该用户有没有拾取任务的资格
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskCandidateUser(userId)//根据候选人查询
                .singleResult();
        if(task!=null){
            taskService.claim(taskId, userId);
            System.out.println("任务拾取成功");
        }
    }

说明:即使该用户不是候选人也能拾取,建议拾取时校验是否有资格 组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务

 3.4 用户查询个人待办任务

        查询方式同个人任务查询一样

    /**
     *用户查询个人待办任务
     */
    @Test
    public void findPersonalTaskList() {
        // 流程定义key
        String processDefinitionKey = "holiday4";
        // 任务负责人
        String assignee = "zhangsan";
        // 创建TaskService
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()//
                .processDefinitionKey(processDefinitionKey)//
                .taskAssignee(assignee).list();
        for (Task task : list) {
            System.out.println("----------------------------");
            System.out.println(" 流 程 实 例 id : " +
                    task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        }
    }

3.5 用户办理个人任务

        同个人任务办理

    /**完成任务*/
    @Test
    public void completeTask(){
        //任务ID
        String taskId = "12304";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        processEngine.getTaskService()//
                .complete(taskId);
        System.out.println("完成任务:"+taskId);
    }

3.6 归还组任务

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

    // 归还组任务,由个人任务变为组任务,还可以进行任务交接
    @Test
    public void setAssigneeToGroupTask() {
        // 查询任务使用TaskService
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        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 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议不要这样使用)

3.7  任务交接

        任务交接,任务负责人将任务交给其它候选人办理该任务

    /**
     * 任务交接,任务负责人将任务交给其它候选人办理该任务
     */
    @Test
    public void setAssigneeToCandidateUser() {
        // 查询任务使用TaskService
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "6004";
        // 任务负责人
        String userId = "zhangsan2";
        // 将此任务交给其它候选人办理该 任务
        String candidateuser = "zhangsan";
        // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();
        if (task != null) {
            taskService.setAssignee(taskId, candidateuser);
        }
    }

3.8 数据库表操作

SELECT * FROM act_ru_task #任务执行表,记录当前执行的任务,由于该任务当前是组任务,所有 assignee 为空,当拾取任务后该字段就是拾取用户的 id

 

SELECT * FROM act_ru_identitylink #任务参与者,记录当前参考任务用户或组,当前任务如果设置 了候选人,会向该表插入候选人记录,有几个候选就插入几个

 于 act_ru_identitylink 对应的还有一张历史表 act_hi_identitylink,向 act_ru_identitylink 插入记录的同 时也会向历史表插入记录。任务完成

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vegetari

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值