博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot+activiti整合并简单开发审批流程以及流程打回发起人
阅读量:4028 次
发布时间:2019-05-24

本文共 7397 字,大约阅读时间需要 24 分钟。

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

百度网盘:密码请关注。情感宣泄馆。回复668899

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

org.activiti
activiti-spring-boot-starter
7.1.0.M1

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文件。跟着步骤走

 

接下来就开始画图

 

能看懂吗。别急我来解释

 

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

监听代码如下:

@Servicepublic 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
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
variables = new HashMap<>(); //根据流程id获取属于自己的待办。 List
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
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
T = taskService.createTaskQuery().taskAssignee("rs").list(); if(!ObjectUtils.isEmpty(T)) { for (Task item : T) { Map
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
T = taskService.createTaskQuery().taskAssignee("zj").list(); if(!ObjectUtils.isEmpty(T)) { for (Task item : T) { Map
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
T = taskService.createTaskQuery().taskAssignee("zj").list(); if(!ObjectUtils.isEmpty(T)) { for (Task item : T) { Map
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
T = taskService.createTaskQuery().taskAssignee("rs").list(); if(!ObjectUtils.isEmpty(T)) { for (Task item : T) { Map
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; }}

 

至此结束。希望能帮到你

转载地址:http://vlvbi.baihongyu.com/

你可能感兴趣的文章
spring的beanFactory和factoryBean
查看>>
性能测试中用LambdaProbe监控Tomcat Tomcat和Probe的配置
查看>>
Java RMI之HelloWorld篇
查看>>
Oracle 物化视图
查看>>
利用VMware搭建虚拟开发环境及VMware虚拟机上网
查看>>
spring系列之 回调函数的使用
查看>>
Java中的枚举(一)
查看>>
Java中的枚举(二)
查看>>
request.getInputStream()读取post传递的xml文件问题
查看>>
用Java实现断点续传(HTTP)
查看>>
Oracle树查询及相关函数
查看>>
Struts2中配置Servlet详解
查看>>
weblogic10和hibernate3 冲突解决方案
查看>>
WebLogic部署SSH2项目的小结
查看>>
JS+Struts2多文件上传完整示例
查看>>
Hibernate中DetachedCriteria的使用
查看>>
ORM是什么?
查看>>
关于Hibernate的一些常规问题
查看>>
Oracle中视图的创建和处理方法
查看>>
在Hibernate应用中使用视图
查看>>