文章目录

1.创建流程图方法

点击ActivitiTest项目,在src/main/java目录下创建一个diagrams目录用来存放流程图
在当前项目右键选择Activiti Diagram流程图输入流程图名称HelloWorld,然后点击OK
《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_数据
在控制面板的右边栏有相关的画图图标操作

其中一个流程必须包含一个开始节点和一个结束节点,结束节点可以有多个。
然后使用StartEvent, UserTask,EndEvent画出下面的流程图,然后用Connection中的SequenceFlow连线连接起来。

2.创建流程图,如下图

《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_流程图_02

2.1.指定流程图名称,ID和UserTask的处理人

1)选中第一个节点,在name属性中输入当前节点的名称,在Assignee中输入该节点的处理人,然后以此类推将3个节点的值设置完成。
《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_数据_03
《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_数据_04
《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_流程图_05

2)然后在流程图旁边的空白出点击一下,输入流程的ID和Name值,然后保存
《Activiti工作流框架》专题(三)-Activiti工作流框架HelloWorld程序_流程图_06

3.将流程图部署到Activiti的数据表中

/**
* 部署流程定义(操作数据表:act_re_deployment、act_re_procdef、act_ge_bytearray)
*/
@Test
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. 查询流程定义列表

/**
* 查询流程定义列表
*/
@Test
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字段

@Test
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.查询待办任务

/**
* 查询个人任务列表
*/
@Test
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.完成待办任务

/**
* 办理任务
*/
@Test
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