springboot+activiti整合并简单开发审批流程以及流程打回发起人

如果想更好的理解activity.这里有权威指南.pdf

百度网盘:链接: https://pan.baidu.com/s/1G8eLj--R5BjVCWwDbuu4Yg 。密码请关注。情感宣泄馆。回复668899

1、maven 引入依赖。都说springboot2.x要配activiti7.x。我的springboot版本是2.1.7

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M1</version>
</dependency>

2、接着在yml中配置activity。在spring级别下

spring:
  activiti:
    database-schema-update: true #是否每次都更新数据库(会自动建表)
           # 自动部署验证设置:true-开启(默认)、false-关闭
    check-process-definitions: false # activti是否自动部署
    process-definition-location-prefix: classpath:/processes/
           #process-definition-location-suffixes: .bpmn
    history-level: full
    db-history-used: true
    db-identity-used: true

启动后会建立25张表。如果少建了。请确定 配置文件中这三项history-level=full和db-history-used= true,database-schema-update=true。

ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。

ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 'GE'表示general。通用数据, 用于不同场景下,如存放资源文件。

 

3、继续后面的就是创建bpmn文件。我这里用的idea。需要搜索actiBPM插件。进行创建

安装后创建bpmn文件。跟着步骤走

 

接下来就开始画图

 

能看懂吗。别急我来解释

 

因为审批肯定有审核不通过的。所以我这边是根据条件判断走向的。具体看图

监听代码如下:

@Service
public class MyTaskListener1 implements ExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        ProcessEngine services = ProcessEngines.getDefaultProcessEngine();
        ExecutionEntity entity = (ExecutionEntity) execution;
        String  processInstId=entity.getProcessInstanceId();          //流程实例Id
//根据审批传入的参数判断是否打回
        Object value = execution.getVariableInstance("isSuccess").getValue();
        if(ObjectUtils.isEmpty(value)){
            value = execution.getParent().getVariableInstance("isSuccess").getValue();
        }
        ;
        if(!ObjectUtils.isEmpty(value)&&(boolean)(value)==true){
            return;
        }
        List<HistoricTaskInstance> list=services.getHistoryService().createHistoricTaskInstanceQuery().orderByTaskCreateTime().asc()
                .processInstanceId(processInstId)
                .list();
        if(list!=null){
            String user=list.get(0).getAssignee(); //获取最新的一个责任人信息回退给他
            execution.setVariable("inputUser", user);
        }

    }
}

 

自己拟写了一个controller。简单实现调用代码如下。

@Controller
@RequestMapping("/app")
public class TestController {
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private TaskService taskService;
  /*  @Autowired
    private IdentitySer identityService;*/
  @Autowired
  private ModelRollBack modelRollBack;


    /**
     * 流程部署。部署一次就可以了。
     * @return
     */
    @RequestMapping("/t")
    @ResponseBody
    public Object get(){
    //第一步
      DeploymentBuilder builder=  repositoryService.createDeployment();
        builder.addClasspathResource("processes/le.bpmn");
        String id = builder.deploy().getId();
        repositoryService.setDeploymentKey(id,"nnffnn4d");
        System.out.println(id);

        return null;
    }

    /**
     * 人员重新申请
     * @return
     */
    @RequestMapping("/rePack")
    @ResponseBody
    public Object rePack(){
        Authentication.setAuthenticatedUserId("wwz");
        Map<String, Object> variables = new HashMap<>();
        //根据流程id获取属于自己的待办。
        List<Task> list = taskService.createTaskQuery().taskAssignee("wwz").processInstanceId("60dbc3ce-9f1b-11ea-bbc3-16fd52790d6f").list();
        if(!ObjectUtils.isEmpty(list)){
            for(Task item:list){
                taskService.complete(item.getId(),variables);

            }
        }
        return list;
    }

    /**
     * 人员提交申请
     * @return
     */
    @RequestMapping("/app1")
    @ResponseBody
    public Object ff(){
        Authentication.setAuthenticatedUserId("wwz");
        Map<String, Object> variables = new HashMap<>();
        //inputUser就是在bpmn中Assignee配置的参数
        variables.put("inputUser", "wwz");
        //开启流程。myProcess_2为流程名称。获取方式把bpmn改为xml文件就可以看到流程名
        ProcessInstance processInstance = ProcessEngines.getDefaultProcessEngine().getRuntimeService().startProcessInstanceByKey("myProcess_2",variables);
        Task tmp = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId())
                .singleResult();
        tmp.setAssignee("wwz");
        //完成此节点。由下一节点审批。完成后act_ru_task会创建一条由下节点审批的数据
        taskService.complete(tmp.getId(),variables);
        return null;
    }

    /**
     * 人事经理审批
     * @return
     */
    @RequestMapping("/app2")
    @ResponseBody
    public Object ff2(){
        //根据角色信息获取自己的待办
        List<Task> T = taskService.createTaskQuery().taskAssignee("rs").list();
        if(!ObjectUtils.isEmpty(T)) {
            for (Task item : T) {
                Map<String, Object> variables = new HashMap<>();
                variables.put("inputUser", "wwz1");
                variables.put("isSuccess", true);
                item.setAssignee("rs");
                //设置本地参数。在myListener1监听中获取。防止审核通过进行驳回
                taskService.setVariableLocal(item.getId(),"isSuccess",true);
                //增加审批备注
                taskService.addComment(item.getId(),item.getProcessInstanceId(),"人事经理同意");
                //完成此次审批。由下节点审批
                taskService.complete(item.getId(), variables);
            }
        }
        return null;
    }

    /**
     * 总经理审批
     * @return
     */
    @RequestMapping("/app3")
    @ResponseBody
    public Object app3(){
        //根据角色信息获取自己的待办
        List<Task> T = taskService.createTaskQuery().taskAssignee("zj").list();
        if(!ObjectUtils.isEmpty(T)) {
            for (Task item : T) {
                Map<String, Object> variables = new HashMap<>();
                variables.put("inputUser", "wwz2");
                item.setAssignee("zj");
                variables.put("isSuccess", true);
                //设置本地参数。在myListener1监听中获取。防止审核通过进行驳回
                taskService.setVariableLocal(item.getId(),"isSuccess",true);
                //增加审批备注
                taskService.addComment(item.getId(),item.getProcessInstanceId(),"总经理同意");
                //完成此次审批。如果下节点为endEvent。结束流程
                taskService.complete(item.getId(), variables);
            }
        }
        return null;
    }

    /**
     * 查询wwz未完成的历史记录
     * @return
     */
    @RequestMapping("/unfinish")
    @ResponseBody
    public Object app4(){
        return ProcessEngines.getDefaultProcessEngine().getHistoryService().createHistoricProcessInstanceQuery().startedBy("wwz").unfinished().list();

    }
    /**
     * 查询wwz完成的历史记录
     * @return
     */
    @RequestMapping("/finish")
    @ResponseBody
    public Object finish(){
        return ProcessEngines.getDefaultProcessEngine().getHistoryService().createHistoricProcessInstanceQuery().startedBy("wwz").finished().list();
    }

    /**
     * 总经理审核不通过(不通过打回到发起人。发起人可以根据流程id。重新提交)rePack
     * @return
     */
    @RequestMapping("/reject")
    @ResponseBody
    public Object reject(){
        List<Task> T = taskService.createTaskQuery().taskAssignee("zj").list();
        if(!ObjectUtils.isEmpty(T)) {
            for (Task item : T) {
                Map<String, Object> variables = new HashMap<>();
                //isSuccess来决定流程走向。具体看bpmn图
                variables.put("isSuccess", false);
                item.setAssignee("zj");
                taskService.setVariableLocal(item.getId(),"isSuccess",false);
                taskService.complete(item.getId(), variables);
               // modelRollBack.init(item.getId());

            }
        }
       return null;
    }

    /**
     * 人事经理审核不通过。(不通过打回到发起人。发起人可以根据流程id。重新提交)。rePack
     * @return
     */
    @RequestMapping("/reject1")
    @ResponseBody
    public Object reject1(){
        List<Task> T = taskService.createTaskQuery().taskAssignee("rs").list();
        if(!ObjectUtils.isEmpty(T)) {
            for (Task item : T) {
                Map<String, Object> variables = new HashMap<>();
                variables.put("isSuccess", false);
                item.setAssignee("rs");
                taskService.setVariableLocal(item.getId(),"isSuccess",false);
                taskService.complete(item.getId(), variables);
                // modelRollBack.init(item.getId());

            }
        }
        return null;
    }

}

 

至此结束。希望能帮到你

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章