前两天做了一个SpringBoot整合Activiti的完整示例,功能包括:退回/通过(节点条件)、指定办理人、生成流程图、高亮显示已办节点、查询任务列表(办理人)等,下面先简单记录(含完整代码),十六上班后再详细补充。
1、画流程图:
高亮生成的流程图(流程已至办理):
这个流程图比较简单,这里不介绍如何画的了(记得让文件名称与id相同),下面有最终的流程图源码。
2、设置业户提交、资料不全、已签发的事件触发代码:
点击选择事件节点,下方properties里选择如下图:
找不到properties的话 要选择Activiti模式就可以:
#{activityDemoServiceImpl.updateBizStatus(execution,"tj")} 表示将使用activityDemoServiceImpl服务的updateBizStatus方法,里面有两个参数,execution是当前流程节点对象,可获取流程信息及业务key等,"tj"字符串参数。(这里设置的服务名是小写开头,实际服务名是大写开头,否则找不到——不知道是不是因为我用的5.22)
3、指定受理/审批 办理人员:
也是选中,然后如下图操作:
${activityDemoServiceImpl.findUsersForSL(execution)}跟上面一样,不过注意,事件监听是以#开头,这里是以$符号。
4、增加2、3设置的服务方法(ActivityDemoServiceImpl)
SpringBoot的好处是默认会配置和注入很多服务,所以我们使用起来非常方便,流程图不需要单独部署,直接到服务根据流程名称或id就可以直接获取到想要的内容。
直接上代码了:
package com.example.service.impl;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ActivityDemoServiceImpl {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngineConfigurationImpl processEngineConfiguration;
/**
* 启动流程
* @param bizId 业务id
*/
public void startProcesses(String bizId) {
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo5", bizId);//流程图id,业务表id
System.out.println("流程启动成功,流程id:"+pi.getId());
}
/**
*
* <p>描述: 根据用户id查询待办任务列表</p>
* @author 范相如
* @date 2018年2月25日
*/
public List<Task> findTasksByUserId(String userId) {
List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey("demo5").taskCandidateOrAssigned(userId).list();
return resultTask;
}
/**
*
* <p>描述:任务审批 (通过/拒接) </p>
* @author 范相如
* @date 2018年2月25日
* @param taskId 任务id
* @param userId 用户id
* @param result false OR true
*/
public void completeTask(String taskId,String userId,String result) {
//获取流程实例
taskService.claim(taskId, userId);
Map<String,Object> vars = new HashMap<String,Object>();
vars.put("sign", "true");
taskService.complete(taskId, vars);
}
/**
* 更改业务流程状态#{ActivityDemoServiceImpl.updateBizStatus(execution,"tj")}
* @param execution
* @param status
*/
public void updateBizStatus(DelegateExecution execution,String status) {
String bizId = execution.getProcessBusinessKey();
//根据业务id自行处理业务表
System.out.println("业务表["+bizId+"]状态更改成功,状态更改为:"+status);
}
//流程节点权限用户列表${ActivityDemoServiceImpl.findUsers(execution,sign)}
public List<String> findUsersForSL(DelegateExecution execution){
return Arrays.asList("sly1","sly2");
}
//流程节点权限用户列表${ActivityDemoServiceImpl.findUsers(execution,sign)}
public List<String> findUsersForSP(DelegateExecution execution){
return Arrays.asList("spy1","uspy2");
}
/**
*
* <p>描述: 生成流程图
* 首先启动流程,获取processInstanceId,替换即可生成</p>
* @author 范相如
* @date 2018年2月25日
* @param processInstanceId
* @throws Exception
*/
public void queryProImg(String processInstanceId) throws Exception {
//获取历史流程实例
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//根据流程定义获取输入流
InputStream is = repositoryService.getProcessDiagram(processInstance.getProcessDefinitionId());
BufferedImage bi = ImageIO.read(is);
File file = new File("demo2.png");
if(!file.exists()) file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(bi, "png", fos);
fos.close();