Activiti7的使用(七)

在之前的文章已经介绍过Activiti7的基本使用,现在就使用springboot整合Activiti7,完成一个完整的请假流程。

Activiti7 发布正式版之后,它与 SpringBoot2.x 已经完全支持整合开发。

Activti7 新支持ProcessRuntime 接口和TaskRuntime 接口,我没有尝试用这两个接口,想用的朋友可以自己研究。

首先创建一个springboot项目,添加Activiti依赖,如下:

  org.activiti

  activiti-spring-boot-starter

  7.0.0.Beta2

因为 Activiti7 与 SpringBoot 整合后,默认情况下,集成了 SpringSecurity 安全框架,所以我们就要去准备 SpringSecurity 整合进来的相关用户权限配置信息(该配置我就不贴出来了)。

项目搭建好后,就要画流程图:

整个流程是这样:请假人填写请假信息提交后,就开启一个流程实例,并完成“填写请假信息”任务,然后到“部门主管审批”,审批不通过就返回“填写请假信息”,审批通过并且请假天数小于等于5天,就转到“人事存档”,审批通过并且请假天数大于5天,转到“总经理审批”,经理审批不通过就跳回“填写请假信息”,经理审批通过就转到“人事存档”,“人事存档”完成任务就转到“行政考勤”和“财务统计”,当“行政考勤”和“财务统计”都完成任务,整个流程结束。

下边是流程图的详细信息:

 

   

   

   

     

       

     

   

   

   

     

       

     

   

   

   

     

       

     

   

   

   

     

       

     

   

   

     

       

     

   

   

   

   

   

   

   

     

   

   

      5}]]>

   

   

   

     

   

   

   

   

   

   

   

   

     

   

   

     

   

 

 

   

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

       

         

       

     

     

       

       

       

       

         

       

     

   

 

在除了“填写请假信息”外的所有任务,都添加了监听器,作用是在这些任务创建时,添加任务的候选人,然后这些候选人都可以查看到这些任务,然后可以领取任务并完成任务。在排他网关的出口都添加判断条件,这些条件在上面xml中都有。

然后我们启动springboot项目,发现数据库表只有17张,但不影响操作;

首先部署流程:

//部署流程定义

@RequestMapping(value= "deploy/{zipName}")

@ResponseBody

public Respon deploy(@PathVariable(name="zipName")String zipName){

    Respon respon=new Respon();

    //转化出ZipInputStream流对象

    InputStream is = TestController.class.getClassLoader().getResourceAsStream("diagram/"+zipName+".zip");

    //将 inputstream流转化为ZipInputStream流

    ZipInputStream zipInputStream = new ZipInputStream(is);

    //进行部署

    Deployment deployment = repositoryService.createDeployment()

            .addZipInputStream(zipInputStream).deploy();

    //输出部署的一些信息

    System.out.println(deployment.getId());

    respon.setCode(Constant.CODE_SUCCESS);

    respon.setMsg(Constant.CODE_SUCCESS_STRING);

    return respon;

}

开始请假

//开始一个请假流程,并完成填写请假申请信息

@RequestMapping(value= "startTest/{userName}/{totalDay}")

@ResponseBody

public Respon startTest(@PathVariable(name="userName")String userName, @PathVariable(name="totalDay")Float totalDay){

    Respon respon=new Respon();

    String key="qingjia_1";

    ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(key);

    String processInstanceId=processInstance.getProcessInstanceId();

    System.out.println(processInstanceId);

    System.out.println("开启了流程实例");

    List list=taskService.createTaskQuery()

            .processDefinitionKey(key)//流程实例key

            .processInstanceId(processInstanceId)

            .list();

    for(Task task:list){

        System.out.println("任务id:"+list.get(0).getId());

        System.out.println("任务名称:"+list.get(0).getName());

        taskService.setAssignee(list.get(0).getId(),userName);

        Map map=new HashMap();

        map.put("totalDay",totalDay);

        map.put("applyUserName",userName);

        taskService.complete(task.getId(),map);

        //这里完成任务后,监听器马上触发,所以是监听器代码先运行。

        System.out.println(userName+"-->完成任务:"+task.getId()+"."+task.getName());

    }

    respon.setData(processInstanceId);

    respon.setCode(Constant.CODE_SUCCESS);

    respon.setMsg(Constant.CODE_SUCCESS_STRING);

    return respon;

}

/**

* Created by Administrator on 2019/11/22.

* 主管监听器

*/

@Component

public class ZhuGuanListener implements TaskListener{

    @Override

    public void notify(DelegateTask delegateTask) {

        System.out.println("进入主管监听器");

        System.out.println("新产生任务id:"+delegateTask.getId());

        System.out.println("新产生任务名称:"+delegateTask.getName());

        List list=new ArrayList<>();

        list.add("主管-诸葛亮");

        list.add("副主管-刘伯温");

        list.add("副主管-李靖");

        delegateTask.addCandidateUsers(list);

    }

}

所有主管都可以查询到相关任务

//查询可选任务

@RequestMapping(value= "listTask/{userName}")

@ResponseBody

public Respon listTask(@PathVariable(name="userName")String userName){

    Respon respon=new Respon();

    List list=taskService.createTaskQuery().taskCandidateUser(userName).list();

    if(list.size()>0){

        String taskId=list.get(0).getId();

        System.out.println("任务id:"+list.get(0).getId());

        System.out.println("任务名称:"+list.get(0).getName());

        respon.setMsg(taskId);

    }else{

        respon.setMsg("没有可选任务");

        return respon;

    }

    respon.setCode(Constant.CODE_SUCCESS);

    return respon;

}

主管领取并完成任务

//主管领取任务并审批

@RequestMapping(value= "claimTask/{userName}/{taskId}/{flag}/{totalDay}")

@ResponseBody

public Respon claimTask(@PathVariable(name="userName")String userName,@PathVariable(name="taskId")String taskId,@PathVariable(name="flag")String flag,@PathVariable(name="totalDay")Float totalDay){

    Respon respon=new Respon();

    //flag="_3"驳回;flag="1"通过

    Map map=new HashMap<>();

    map.put("zhuguanFlag",flag);

    map.put("totalDay",totalDay);

    taskService.claim(taskId,userName);

    taskService.complete(taskId,map);

    System.out.println(userName+":审批任务id:"+taskId);

    respon.setCode(Constant.CODE_SUCCESS);

    respon.setMsg(Constant.CODE_SUCCESS_STRING);

    return respon;

}

我这里主管审批通过了,所以下一步就是总经理可以查看到任务

总经理审批任务不通过

//经理领取任务并审批

@RequestMapping(value= "claimTask2/{userName}/{taskId}/{flag}")

@ResponseBody

public Respon claimTask2(@PathVariable(name="userName")String userName,@PathVariable(name="taskId")String taskId,@PathVariable(name="flag")String flag){

    Respon respon=new Respon();

    //flag="2"驳回;flag="1"通过

    Map map=new HashMap<>();

    map.put("jingliFlag",flag);

    taskService.claim(taskId,userName);

    taskService.complete(taskId,map);

    System.out.println(userName+":审批任务id:"+taskId);

    respon.setCode(Constant.CODE_SUCCESS);

    respon.setMsg(Constant.CODE_SUCCESS_STRING);

    return respon;

}

审批没通过就返回到“填写请假信息”,我不知道是什么原因,这里驳回不用写其他代码,在网上看过很多驳回的例子都是要写很多东西,但那都是Activiti6及更低的版本,可能Activiti7就不需要。

那现在就查看是否进行到“填写请假信息”这个任务

//查询该流程实例有什么任务

@RequestMapping(value= "processTask/{processInstanceId}")

@ResponseBody

public Respon processTask(@PathVariable(name="processInstanceId")String processInstanceId){

    Respon respon=new Respon();

    String key="qingjia_1";

    List list=taskService.createTaskQuery().processDefinitionKey(key)//流程实例key

            .processInstanceId(processInstanceId).list();

    if(list.size()>0){

        String taskId=list.get(0).getId();

        System.out.println("任务id:"+list.get(0).getId());

        System.out.println("任务名称:"+list.get(0).getName());

        respon.setMsg(taskId);

    }else{

        respon.setMsg("没有可选任务");

        return respon;

    }

    respon.setCode(Constant.CODE_SUCCESS);

    return respon;

}

到这里差不多了,剩下的步骤和上面的都类似,所有我就不一一操作,如各位有什么问题和意见都可以提出来,大家一起研究。

最后希望这篇文章能帮到各位学习到更多,谢谢。

你可能感兴趣的:(Activiti7的使用(七))