增加工作流引擎全套模块,提供在线配置化工作流,发布,启动,可配置流程节点,无侵入其他模块,实时同步系统用户角色到引擎表。

This commit is contained in:
zxm 2018-01-28 14:38:29 +08:00
parent fa177b4609
commit 631af3704a
5 changed files with 691 additions and 6 deletions

View File

@ -55,5 +55,6 @@ public class WebMvcConfig extends WebMvcConfigurerAdapter {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/plugin/**","/static/**")
.addResourceLocations("classpath:/plugin/","classpath:/static/");
registry.addResourceHandler("/ftl/**").addResourceLocations("classpath:/ftl/");
}
}

View File

@ -0,0 +1,373 @@
package test;
import com.len.Application;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
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.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
/**
* @author zhuxiaomeng
* @date 2018/1/11.
* @email 154040976@qq.com
*
* 本demo 根据官网doc教程 addresshttp://www.mossle.com/docs/activiti/index.html
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class ActivitiDemo {
@Autowired
RuntimeService runtimeService;
@Autowired
RepositoryService repositoryService;
@Autowired
TaskService taskService;
@Autowired
HistoryService historyService;
/**
* 发布流程
*/
@Test
public void test(){
repositoryService.createDeployment()
.name("demo.bar")
.addClasspathResource("bpmn/demo.xml")
.deploy();
System.out.println(repositoryService.createDeploymentQuery().count());
/*long count = runtimeService.createProcessInstanceQuery()
.count();
System.out.println(count);*/
}
/**
* 启动一个流程
*/
@Test
public void startUp(){
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employeeName", "张三");//张三
variables.put("numberOfDays", new Integer(4));//请假四天
variables.put("vacationMotivation", "太累了");//原因
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);
System.out.println( runtimeService.createProcessInstanceQuery().count());
}
/**
* 完成流程
*/
@Test
public void complete(){
List<Task> taskList=taskService.createTaskQuery().taskCandidateGroup("management").list();
for(Task task:taskList){
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());
}
Task task=taskList.get(0);
Map<String, Object> taskVariables = new HashMap<String, Object>();
taskVariables.put("vacationApproved", "false");
taskVariables.put("managerMotivation", "我们时间很紧!");
taskService.complete(task.getId(), taskVariables);
}
/**
* 激活挂起
*/
@Test
public void gq(){
repositoryService.suspendProcessDefinitionByKey("vacationRequest");
try {
runtimeService.startProcessInstanceByKey("vacationRequest");
} catch (ActivitiException e) {
e.printStackTrace();
}
}
/**---------请假流程------------*/
/**
* 发布流程
*/
@Test
public void leaveStart(){
//InputStream in = this.getClass().getClassLoader().getResourceAsStream("bpmn/leave.zip");
// ZipInputStream zipInputStream = new ZipInputStream(in);
//使用deploy方法发布流程
Deployment deployment=repositoryService.createDeployment()
///.addZipInputStream(zipInputStream)
.addClasspathResource("bpmn/leave.bpmn")
.addClasspathResource("bpmn/leave.png")
.name("请假流程")
.deploy();
System.out.println("流程id:"+deployment.getId());
System.out.println("流程名称:"+deployment.getName());
}
/**
* 获取流程详细信息
*/
@Test
public void queryProcdef(){
//创建查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("process");//通过key获取
// .processDefinitionName("Myleave");//通过name获取
// .orderByProcessDefinitionId()//根据ID排序
//执行查询获取流程定义明细
List<ProcessDefinition> pds = query.list();
for (ProcessDefinition pd : pds) {
System.out.println("ID:"+pd.getId()+"\nNAME:"+pd.getName()+"\nKEY:"+pd.getKey()+"\nVERSION:"+pd.getVersion()+""
+ "\nRESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
}
}
/**
* 发布流程 根据流程定义表的key 也就是 xml中的 id
*
* 绑定 userid 并且获取流程定义id 插入到请假表中
*/
@Test
public void startFlow(){
Map<String, Object> variables=new HashMap<>();
variables.put("userId","2211fec3e17c11e795ed201a068c6482");
variables.put("userRole","0ea934e5e55411e7b983201a068c6482");
variables.put("hrRole","2619a672e53811e7b983201a068c6482");
variables.put("msg","请假一天");
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("process",variables);
//System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());
System.out.println("流程实例id:"+processInstance.getId());
System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
}
@Test
public void queryTask(){
List<Task> taskList=taskService.createTaskQuery().taskAssignee("张三")
.list();
for(Task task:taskList){
System.out.println("ID:"+task.getId()+"\n姓名:"+task.getName()+"\n接收人:"+task.getAssignee()+"\n开始时间:"+task.getCreateTime());
}
}
/**
* 完成审批
*/
@Test
public void startTask(){
//taskId 就是查询任务中的 ID
String taskId = "30002";
//完成请假申请任务
taskService.complete(taskId );
}
@Test
public void queryTaskBoss(){
List<Task> taskList=taskService.createTaskQuery().taskAssignee("老板")
.list();
for(Task task:taskList){
System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",开始时间:"+task.getCreateTime());
}
}
/**
* 完成审批
*/
@Test
public void startTaskBoss(){
//taskId 就是查询任务中的 ID
String taskId = "82502";
//完成请假申请任务
taskService.complete(taskId );
}
@Test
public void isRun(){
ProcessInstance instance= runtimeService.createProcessInstanceQuery()
.processInstanceId("25001").singleResult();
if(instance!=null){
System.out.println("流程正在执行");
}else{
System.out.println("流程执行完毕");
}
}
@Test
public void history(){
List<HistoricTaskInstance> instances= historyService.createHistoricTaskInstanceQuery()//创建历史实例查询
.processInstanceId("25001") //流程实例id
.finished().list();//已经完成流程实例
for(HistoricTaskInstance hTask:instances){
System.out.println("历史id:"+hTask.getId());
System.out.println("流程实例id:"+hTask.getProcessInstanceId());
System.out.println("任务名称:"+hTask.getName());
System.out.println("办理人:"+hTask.getAssignee());
}
}
@Test
public void getDay(){
Map<String,Object> map =taskService.getVariables("80008");
System.out.println(map.get("userId"));
System.out.println(map.get("msg"));
}
@Test
public void getTask(){
List<Task> taskList=taskService
.createTaskQuery().taskCandidateUser("acfc0e9232f54732a5d9ffe9071bf572").list();//.taskAssignee("王五").list();
for(Task task:taskList){
System.out.println("任务id:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("创建时间:"+task.getCreateTime());
System.out.println("委派人:"+task.getAssignee());
System.out.println("流程实例id:"+task.getProcessInstanceId());
}
}
@Test
public void getMsg(){
/* Map<String,Object> map =taskService.getVariables("70002");
System.out.println(map.get("mesage"));*/
/*List<Task> taskList=taskService.createTaskQuery()
.taskCandidateOrAssigned("2211fec3e17c11e795ed201a068c6482").orderByTaskCreateTime().desc().list();
System.out.println(taskList.size());*/
/*List<HistoricTaskInstance> instances=historyService.createHistoricTaskInstanceQuery()
.taskCandidateUser("acfc0e9232f54732a5d9ffe9071bf572")
.list();
System.out.println(instances.size());*/
/* ProcessInstance pi = runtimeService//表示正在执行的流程实例和执行对象
.createProcessInstanceQuery()//创建流程实例查询
.processInstanceId("67501")//使用流程实例ID查询
.singleResult();
if(pi!=null){
System.out.println("还在运行");
}else{
System.out.println("已经结束");
}
HistoricActivityInstance hai=historyService.createHistoricActivityInstanceQuery()//
.processInstanceId("67501")//
.unfinished()//未完成的活动(任务)
.singleResult();
System.out.println(hai);*/
String deploymentId="90004";
ProcessDefinition processDefinition=repositoryService
.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
ProcessDefinitionEntity processDefinitionEntity=(ProcessDefinitionEntity)((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(processDefinition.getId());
List<ActivityImpl> activityList=processDefinitionEntity.getActivities();
for(ActivityImpl activiti:activityList) {
System.out.println("节点ID:"+activiti.getId());
System.out.println("节点名称:"+activiti.getProperty("name"));
}
}
/**
* 根据 流程部署id和资源文件名获取图片
* @throws Exception
*/
@Test
public void imageById()throws Exception{
InputStream inputStream=repositoryService.getResourceAsStream("12501","bpmn/leave.png");
FileOutputStream outputStream=new FileOutputStream("F:/a.png");
byte[] b=new byte[1024];
int red=inputStream.read(b);
while(red!=-1){
outputStream.write(b,0,red);
red=inputStream.read(b);
}
outputStream.write(b);
inputStream.close();
outputStream.close();
}
@Test
public void del(){
repositoryService.deleteDeployment("137534", true); // 默认是false true就是级联删除
System.out.println("刪除流程定义");
}
@Autowired
ProcessEngineFactoryBean processEngine;
@Autowired
ProcessEngineConfiguration processEngineConfiguration;
@Test
public void image() throws Exception {
String processInstanceId="147540";
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<String> activeActivityIds = runtimeService.getActiveActivityIds(processInstanceId);
processEngineConfiguration = processEngine.getProcessEngineConfiguration();
Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
List<String> activeIds = this.runtimeService.getActiveActivityIds(processInstance.getId());
InputStream imageStream=diagramGenerator.generateDiagram(
bpmnModel, "png",
activeIds, Collections.<String>emptyList(),
processEngine.getProcessEngineConfiguration().getActivityFontName(),
processEngine.getProcessEngineConfiguration().getLabelFontName(),
"宋体",
null, 1.0);
byte[] b = new byte[1024];
int len;
FileOutputStream outputStream=new FileOutputStream("F:/1.png");
while ((len = imageStream.read(b, 0, 1024)) != -1) {
outputStream.write(b,0,len);
}
}
}

View File

@ -0,0 +1,180 @@
package test;
import com.len.Application;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
/**
* @author zhuxiaomeng
* @date 2018/1/11.
* @email 154040976@qq.com
*
* 本demo 根据官网doc教程 addresshttp://www.mossle.com/docs/activiti/index.html
*
* 网关
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class ActivitiGateWay {
@Autowired
RuntimeService runtimeService;
@Autowired
RepositoryService repositoryService;
@Autowired
TaskService taskService;
@Autowired
HistoryService historyService;
/**---------请假流程------------*/
/**
* 发布流程
*/
@Test
public void leaveStart(){
//使用deploy方法发布流程
Deployment deployment=repositoryService.createDeployment()
.addClasspathResource("bpmn/leave2.bpmn")
.addClasspathResource("bpmn/leave2.png")
.name("请假流程2")
.deploy();
System.out.println("流程id:"+deployment.getId());
System.out.println("流程名称:"+deployment.getName());
}
/**
* 获取流程详细信息
*/
@Test
public void queryProcdef(){
//创建查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("studentLeaveProcess2");//通过key获取
//执行查询获取流程定义明细
List<ProcessDefinition> pds = query.list();
for (ProcessDefinition pd : pds) {
System.out.println("ID:"+pd.getId()+"\nNAME:"+pd.getName()+"\nKEY:"+pd.getKey()+"\nVERSION:"+pd.getVersion()+""
+ "\nRESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
}
}
/**
* 发布流程 根据流程定义表的key 也就是 xml中的 id
*/
@Test
public void startFlow(){
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("studentLeaveProcess2");
System.out.println("流程实例id:"+processInstance.getId());
System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
}
@Test
public void queryTask(){
List<Task> taskList=taskService.createTaskQuery().taskAssignee("张三")
.list();
for(Task task:taskList){
System.out.println("ID:"+task.getId()+"\n姓名:"+task.getName()+"\n接收人:"+task.getAssignee()+"\n开始时间:"+task.getCreateTime());
}
}
/**
* 完成审批
*/
@Test
public void startTask(){
//taskId 就是查询任务中的 ID
String taskId = "30002";
//完成请假申请任务
taskService.complete(taskId );
}
@Test
public void queryTaskBoss(){
List<Task> taskList=taskService.createTaskQuery().taskAssignee("老板")
.list();
for(Task task:taskList){
System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",开始时间:"+task.getCreateTime());
}
}
/**
* 完成审批
*/
@Test
public void startTaskBoss(){
//taskId 就是查询任务中的 ID
String taskId = "22502";
//完成请假申请任务
taskService.complete(taskId );
}
@Test
public void isRun(){
ProcessInstance instance= runtimeService.createProcessInstanceQuery()
.processInstanceId("25001").singleResult();
if(instance!=null){
System.out.println("流程正在执行");
}else{
System.out.println("流程执行完毕");
}
}
@Test
public void history(){
List<HistoricTaskInstance> instances= historyService.createHistoricTaskInstanceQuery()//创建历史实例查询
.processInstanceId("25001") //流程实例id
.finished().list();//已经完成流程实例
for(HistoricTaskInstance hTask:instances){
System.out.println("历史id:"+hTask.getId());
System.out.println("流程实例id:"+hTask.getProcessInstanceId());
System.out.println("任务名称:"+hTask.getName());
System.out.println("办理人:"+hTask.getAssignee());
}
}
/**
* 根据 流程部署id和资源文件名获取图片
* @throws Exception
*/
@Test
public void imageById()throws Exception{
InputStream inputStream=repositoryService.getResourceAsStream("12501","bpmn/leave2.png");
FileOutputStream outputStream=new FileOutputStream("F:/a.png");
byte[] b=new byte[1024];
int red=inputStream.read(b);
while(red!=-1){
outputStream.write(b,0,red);
red=inputStream.read(b);
}
outputStream.write(b);
inputStream.close();
outputStream.close();
}
}

View File

@ -0,0 +1,132 @@
package test;
import com.len.Application;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
/**
* @author zhuxiaomeng
* @date 2018/1/20.
* @email 154040976@qq.com
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class ActivitiVariable {
@Autowired
RuntimeService runtimeService;
@Autowired
RepositoryService repositoryService;
@Autowired
TaskService taskService;
@Autowired
HistoryService historyService;
/**
* 发布流程
*/
@Test
public void leaveStart(){
//使用deploy方法发布流程
Deployment deployment=repositoryService.createDeployment()
.addClasspathResource("bpmn/leave.bpmn")
.addClasspathResource("bpmn/leave.png")
.name("请假流程")
.deploy();
System.out.println("流程id:"+deployment.getId());
System.out.println("流程名称:"+deployment.getName());
}
/**
* 获取流程详细信息
*/
@Test
public void queryProcdef(){
//创建查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("studentLeaveProcess");//通过key获取
List<ProcessDefinition> pds = query.list();
for (ProcessDefinition pd : pds) {
System.out.println("ID:"+pd.getId()+"\nNAME:"+pd.getName()+"\nKEY:"+pd.getKey()+"\nVERSION:"+pd.getVersion()+""
+ "\nRESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
}
}
/**
* 发布流程
*/
@Test
public void startFlow(){
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("studentLeaveProcess");
System.out.println("流程实例id:"+processInstance.getId());
System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
}
@Test
public void queryTask(){
List<Task> taskList=taskService.createTaskQuery().taskAssignee("李四")
.list();
for(Task task:taskList){
System.out.println("ID:"+task.getId()+"\n姓名:"+task.getName()+"\n接收人:"+task.getAssignee()+"\n开始时间:"+task.getCreateTime());
}
}
/**
* 完成审批
*/
@Test
public void startTask(){
//taskId 就是查询任务中的 ID
String taskId = "55002";
//完成请假申请任务
taskService.complete(taskId );
}
@Test
public void setMsg(){
Map<String,Object> objectMap=new HashMap<>();
objectMap.put("day",5);
objectMap.put("date",new Date());
objectMap.put("reason","测试请假");
taskService.setVariables("47504",objectMap);
}
/**
* 运行时设置任务变量 taseService.setVariables
* 也可以设置流程变量 runtimeService.setVariables 效果一样
* 流程启动设置流程变量
*
*/
@Test
public void getMsg(){
Map<String,Object> objectMap=taskService.getVariables("55002");
//runtimeService.setVariables();
System.out.println(objectMap.get("day"));
System.out.println(objectMap.get("date"));
System.out.println(objectMap.get("reason"));
}
}

View File

@ -19,29 +19,28 @@
password="" />
<!--mode-->
<javaModelGenerator targetPackage="com.len.entity"
targetProject="len-sys/src/main/java">
targetProject="len-activiti/src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="com.len.mapper" targetProject="len-sys/src/main/java" >
<sqlMapGenerator targetPackage="com.len.mapper" targetProject="len-activiti/src/main/java" >
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator targetPackage="com.len.mapper"
targetProject="len-sys/src/main/java" type="XMLMAPPER" >
targetProject="len-activiti/src/main/java" type="XMLMAPPER" >
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成table 先建表 后生成 勿随意覆盖本身table 避免功能缺失 测试 自己找其他表测试 by zxm-->
<!--<table tableName="sys_user" domainObjectName="SysUser"/>-->
<!-- <table tableName="sys_job" domainObjectName="SysJob"
<table tableName="act_assignee" domainObjectName="ActAssignee"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"
/>-->
/>
</context>