文章目录
1.创建流程图方法
点击ActivitiTest项目,在src/main/java目录下创建一个diagrams目录用来存放流程图
在当前项目右键选择Activiti Diagram流程图输入流程图名称HelloWorld,然后点击OK
在控制面板的右边栏有相关的画图图标操作
其中一个流程必须包含一个开始节点和一个结束节点,结束节点可以有多个。
然后使用StartEvent, UserTask,EndEvent画出下面的流程图,然后用Connection中的SequenceFlow连线连接起来。
2.创建流程图,如下图
2.1.指定流程图名称,ID和UserTask的处理人
1)选中第一个节点,在name属性中输入当前节点的名称,在Assignee中输入该节点的处理人,然后以此类推将3个节点的值设置完成。
2)然后在流程图旁边的空白出点击一下,输入流程的ID和Name值,然后保存
3.将流程图部署到Activiti的数据表中
/**
* 部署流程定义(操作数据表:act_re_deployment、act_re_procdef、act_ge_bytearray)
*/
public void test1(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
RepositoryService service = processEngine.getRepositoryService();
Deployment deployment = service.createDeployment()
.name("helloworld入门")
.addClasspathResource("diagrams/helloworld.bpmn")
.addClasspathResource("diagrams/helloworld.png")
.deploy();
System.out.println("流程定义部署ID:"+deployment.getId());
System.out.println("流程定义部署NAME:"+deployment.getName());
}
4. 查询流程定义列表
/**
* 查询流程定义列表
*/
public void test2() {
// 流程定义查询对象,用于查询表act_re_procdef
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
// 添加过滤条件
query.processDefinitionKey("helloworldkey");
// 添加排序条件
query.orderByProcessDefinitionVersion().desc();
// 添加分页查询
query.listPage(0, 10);
List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() + "--" + pd.getName());
}
}
5.启动流程实例
其中runtimeService.startProcessInstanceByKey("helloworldkey");
中的helloworldkey
对应流程图中的id值,在数据表中对应act_re_procdef
流程定义表中的key字段
public void flowStart(){
String processDefinitionKey = "helloworldkey";
//获取正在执行流程实例和执行对象相关的service
RuntimeService runtimeService = processEngine.getRuntimeService();
//使用流程定义key启动流程实例,key对象是HelloWorld.bpmn文件中的ID属性值,对应的是act_re_procdef表中的key
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId()); //流程实例ID
}
启动完流程后在act_ru_execution
表中会产生一条数据,这条数据为当前流程正在执行的任务,其中act_id_字段的值对应流程图节点的ID值
在act_ru_task
表中会产生一条任务数据,execution_id_
对应act_ru_execution
主键,proc_inst_id_
为流程实例ID,name_
值为流程节点名称,assignee_
字段为该待办当前的处理
5.查询待办任务
/**
* 查询个人任务列表
*/
public void test7() {
TaskQuery query = processEngine.getTaskService().createTaskQuery();
String assignee = "张三";
query.taskAssignee(assignee);
List<Task> list = query.list();
for (Task task : list) {
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());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
}
}
6.完成待办任务
/**
* 办理任务
*/
public void test8(){
String taskId= "7504";
processEngine.getTaskService().complete(taskId);
System.out.println("办理完成,任务ID是:"+taskId);
}
其中taskId对应act_ru_task
表的主键ID,因为当前待办任务为第一个节点提交申请,当执行完这个待办后下一条待办数据将会流转到审批【部门经理】那,然后以此类推可以将部门经理和总经理的待办任务全部查询和执行完成。
7.小结
Activiti框架提供的Service对象
RepositoryService----操作静态的资源(流程定义,bpmn、png)
RuntimeService-----操作流程实例(启动流程实例、查询流程实例、结束流程实例)
TaskService-----操作任务(查询任务、办理任务)
HistoryService----操作历史数据
Activiti框架提供的对象(和表有对应关系)
Deployment-----act_re_deployment
ProcessDefinition----act_re_procdef
ProcessInstance-----act_ru_execution
Task-----act_ru_task