Activiti(三)流程变量和流程实例

请假的大致流程图

 

 如果请假的人的天数小于等于三天的话可以直接绕过领导,请假人和各种角色都不是固定的,这样的流程实现方式如下

 

 

 一:人员不固定

Assignee属性的设置使用UEL表达式进行设置,assignee01(自己定义)代表请假人,assignee02代表部门经理等等

二:流程分支判断

 

 点击流程线 添加UEL表达式

三:进行流程的部署

前置方法

   ProcessEngine processEngine;

    @Before
    public void connection() {
        ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
        processEngine = processEngineConfigurationFromResource.buildProcessEngine();
    }

流程部署

 //1.流程部署
    @Test
    public void createDeployment() {
        System.out.println(processEngine);
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn2/holiday.bpmn")
                .addClasspathResource("bpmn2/holiday.png")
                .name("请假流程-人员未绑定-流程有分支")
                .key("myHoliday")
                .deploy();
        System.out.println(deployment.getName());
        System.out.println(deployment.getKey());
        System.out.println(deployment.getId());
    }

创建流程实例并预先绑定map集合

  //2.创建流程实例
    @Test
    public void startProcessInstance() {
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //动态指定任务执行人
        Map assigneesMap=new HashMap();
        //分别设置四个执行人
        assigneesMap.put("assignee01","tianyan");
        assigneesMap.put("assignee02","douying");
        assigneesMap.put("assignee03","guo");
        assigneesMap.put("assignee04","xiediao");
        //设置请假天数
        Detail detail=new Detail();
        //请假天数小于等于3跳过总经理流程
        detail.setDay(3);
        detail.setName("tianyan");
        assigneesMap.put("details",detail);
        //赋值并启动
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1",assigneesMap);
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getDeploymentId());
        System.out.println(processInstance.getActivityId());
    }

任务的查询和处理

  //3.任务查询
    @Test
    public  void findPersonalTaskList(){
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_1")
                .taskAssignee("tianyan").list();

        Iterator<Task> iterator = list.iterator();
        while (iterator.hasNext()){
            Task next = iterator.next();
            System.out.println(next);
            //4.处理任务
            processEngine.getTaskService().complete(next.getId());
            System.out.println("完成任务");
        }
    }

 使用UEL表达式的注意事项

1、如果UEL 表达式中流程变量名不存在则报错。
2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
3、如果UEL 表达式都不符合条件,流程结束
4、如果连线不设置条件,会走flow 序号小的那条线

posted @ 2020-04-06 18:09  天戈  阅读(771)  评论(0编辑  收藏  举报