//通过ProcessEngineConfiguration来生成ProcessEngine流程引擎对象
public void generateTables(){
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
configuration.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
configuration.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
configuration.setJdbcUsername("qsw");
configuration.setJdbcPassword("admin");
//设置自动建表,一共生成25张表
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
configuration.buildProcessEngine();
}
a.RepositoryService通过ProcessEngine来获取
b.RepositoryService主要是用来操作操作流程部署和定义、查询流程部署和定义的信息,主要涉及到4张表act_re_deployment(流程部署信息)、act_re_procdef(流程定义信息)、act_ge_bytearray(里面保存了流程图)、act_ge_property(里面涉及到流程的版本号)
c.RepositoryService的几个常用功能:
@Test
public void deployProcess(){
//只部署bmpn文件(数据库保存的时候自动生成图片)
// repositoryService.createDeployment()
// .addClasspathResource("diagrams/leave.bpmn")
// .name("请假流程")
// .deploy();
//部署bpmn文件和图片,数据库不会自动生成图片,会使用你上传的图片
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("diagrams/leave.bpmn")
.addClasspathResource("diagrams/leave.png")
.name("请假流程")
.deploy();
System.out.println(deploy.getId()+","+deploy.getName()+","+deploy.getDeploymentTime());
}
2.RepositoryService用来查询流程部署的信息和流程定义的信息
//查询流程部署的信息
public void queryDeployment(){
List deployments = repositoryService.createDeploymentQuery()
.deploymentId("1")
.deploymentName("请假流程").list();
for (Deployment dep :
deployments) {
System.out.println(dep.getId()+","+dep.getName());
}
}
//流程定义信息的查询
@Test
public void queryProcessDefined(){
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition definition :
list) {
System.out.println(definition.getId()+","+definition.getDeploymentId());
}
}
3.查询流程图
@Test
public void queryProcessPicture() throws IOException {
InputStream is = repositoryService.getProcessDiagram("leaveProcess:2:2504");
OutputStream os = new FileOutputStream("e:/demo.png");
FileUtil.copyStream(is,os);
}
4.流程定义的删除(这里就不演示代码了。。。)
5.流程定义的修改,注意,流程定义部署之后无法修改,可以重新部署一个
a.主要用来执行管理(包括了流程实例的启动,推进和删除等操作),主要涉及到的表act_ru_execution(流程实例的执行),ACT_RU_TASK(流程实例额任务),ACT_RU_IDENTITYLINK(流程实例对应的任务的代理人),ACT_HI_ACTINST(流程实例的活动历史,这里的活动指的是从startPoint到endPoint这一整个流程的每个活动点的统称),ACT_HI_TASKINST(任务历史,任务指的就是bpmn中那个带人的方块)
b.要注意的是流程定义和流程实例不是一个概念,就类似于汽车的设计图和汽车不是一个概念一样,一个流程定义可以启动多个‘新’流程实例。
c.RuntimeService的几个常见操作
1流程实例的启动(可以根据流程定义的id,流程定义的key,消息的名字来启动),
//流程的启动(流程实例的启动)
@Test
public void processInstanceStart(){
//1通过流程定义的id
// ProcessInstance processInstance = runtimeService.startProcessInstanceById("leaveProcess:2:2504");
// System.out.println("流程实例的id"+processInstance.getId()+",流程实例的名字"+processInstance.getName());
// System.out.println("流程实例对应的流程定义"+processInstance.getProcessDefinitionId());
//通过流程定义的key来启动
ProcessInstance leaveProcess = runtimeService.startProcessInstanceByKey("leaveProcess");
System.out.println("流程实例的id"+leaveProcess.getId()+",流程实例的name"+leaveProcess.getName());
System.out.println("流程定义的name"+leaveProcess.getProcessDefinitionKey());
}
2流程实例的查询(也不编码了,毕竟会了RepositoryService,下面都基本的套路。。。)
3流程当前节点的坐标(查看当前流程运行的位置)
//获取当前流程的节点坐标,为了让用户能够看到当前流程执行到哪个活动点,可以获取图像信息,在页面中通过div来给当前所在节点进行标红
//单个节点
@Test
public void getActiveNodeZuoBiao(){
String act_id = "doApplicate";
GraphicInfo info = repositoryService.getBpmnModel("leaveProcess:2:2504").getGraphicInfo(act_id);
System.out.println("宽度"+info.getWidth());
System.out.println("高度"+info.getHeight());
System.out.println("x轴"+info.getX());
System.out.println("y轴"+info.getY());
}
4流程实例的强行删除(应用场景,例如小王申请离职,但是后悔了,立马撤销离职申请...)
//流程实例的硬性删除
@Test
public void deleteProcessInstance(){
runtimeService.deleteProcessInstance("5001","操作失误,不想离职");
}
查看个人代办任务
//查询个人待办任务
@Test
public void querySelfUncompleteTask(){
List tasks = taskService.createTaskQuery()
.taskAssignee("张三")
.list();
for (Task task :
tasks) {
System.out.println(task.getId()+","+task.getAssignee());
}
}
个人待办任务完成
//完成个人代办任务
@Test
public void completeTask(){
taskService.complete("7504"); //任务id去act_hi_taskinst表中获取
}
}
此外还有HistoryService(历史管理)、IdentityService(组织机构管理)、FormService(任务表单管理)以及ManagerService就不一一列举了,以上几个API是最常用的,我个人觉得会一个其他也就跟着就会了,但是要对那25张表够熟悉才行。