Activiti Demo
BPMN
BPMN(Business Process Modeling Notation)是一個(gè)重要的工作流建模語(yǔ)言的規(guī)范。它利用標(biāo)準(zhǔn)的圖元去描述真實(shí)的業(yè)務(wù)發(fā)生過(guò)程昂勒,保證相同的流程在不同的流程引擎得到的執(zhí)行結(jié)果一致。
本demo中業(yè)務(wù)流程:用戶(hù)發(fā)起請(qǐng)假,然后經(jīng)理審批涌庭,如果請(qǐng)假時(shí)間比較短村砂,請(qǐng)假完成,流程結(jié)束葫笼;如果請(qǐng)假超過(guò)3天深啤,轉(zhuǎn)給總經(jīng)理審批,然后才能請(qǐng)假完成路星。
用到的BPMN圖
activiti配置
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti-version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti-version}</version>
</dependency>
創(chuàng)建數(shù)據(jù)庫(kù)
本demo在本地運(yùn)行溯街,首先需要在本地?cái)?shù)據(jù)庫(kù)創(chuàng)建schema(此處為activiti-demo)。
然后運(yùn)行以下代碼洋丐,創(chuàng)建activiti引擎需要的25張表(acitivti提供了創(chuàng)建這些表需要的sql,也可以手動(dòng)創(chuàng)建)
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("root");
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println("processEngine"+processEngine);
部署一個(gè)工作流程
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@Test
public void startDeployment(){
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.addClasspathResource("diagrams/VariableUsersDemo.bpmn")
.addClasspathResource("diagrams/VariableUsersDemo.png")
.deploy();
System.out.println("Deploy deploy ID: " + deployment.getId());
}
png文件可以不添加呈昔,只是用作用戶(hù)查看流程。
開(kāi)始一個(gè)流程實(shí)例
public void startProcessInstance(){
String deployKey = "variableProcess";
Map<String,Object> variables = new HashMap<>();
variables.put("user","jianke");
variables.put("manager","caohao");
variables.put("boss","zhangqi");
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(deployKey, variables);
String processInstanceID = processInstance.getId();
System.out.println("流程實(shí)例ID: " + processInstanceID);
}
variables保存一些該流程需要的變量友绝,此處用來(lái)保存了一些人員信息堤尾,即何人發(fā)起,需要何人進(jìn)行審批迁客。
user,manager,boss這些字段是在流程圖中設(shè)置的郭宝。
給該實(shí)例附加請(qǐng)假信息
TaskService service = processEngine.getTaskService();
List<Task> list = service.createTaskQuery().processInstanceId(processInstanceID).taskCandidateUser("jianke")
.list();
for(Task task:list){
System.out.println("Task ID : " + task.getId() + " " + task.getName());
service.claim(task.getId(),"jianke"); //確定請(qǐng)假任務(wù)
Leave leave = new Leave();
leave.setName("jianke");
leave.setContent("Go to Sleep");
leave.setCreateTime(new Date());
leave.setDays(5);
service.setVariable(task.getId(), "info", leave); //添加請(qǐng)假信息
service.complete(task.getId()); //完成請(qǐng)假,提交審批
}
經(jīng)理審批
List<Task> list = service.createTaskQuery().processInstanceId(processInstanceID).taskCandidateUser("caohao")
.list(); //搜索等待主管處理的任務(wù)
for(Task task:list){
System.out.println("Task ID : " + task.getId() + " " + task.getName());
service.claim(task.getId(), "caohao"); //主管接受任務(wù)
Leave leave = (Leave)service.getVariable(task.getId(),"info");
Map<String,Object> object = new HashMap<>();
object.put("days", leave.getDays());
service.complete(task.getId(), object); //主管審批掷漱,并附帶請(qǐng)假天數(shù)信息粘室,交給引擎處理是否需要總經(jīng)理審批
System.out.println("complete!");
}
在BPMN中添加是否總經(jīng)理審批的判斷:
總經(jīng)理審批
//操作流程同經(jīng)理審批
TaskService service = processEngine.getTaskService();
List<Task> list = service.createTaskQuery().processInstanceId(processInstanceID).taskCandidateUser("zhangqi")
.list();
for(Task task:list){
System.out.println("Task ID : " + task.getId() + " " + task.getName());
service.claim(task.getId(), "zhangqi");
service.complete(task.getId());
System.out.println("complete!");
}
請(qǐng)假流程完成通知
public class endListener implements ExecutionListener {
@Override
public void notify(DelegateExecution delegateTask){
//在此處進(jìn)行請(qǐng)假完成后的操作,比較通知請(qǐng)假人切威,記錄檔案等
System.out.println("Task End!");
}
}
給結(jié)束節(jié)點(diǎn)添加通知的方法育特,在BPMN圖中添加:
附上原碼地址,大家一起學(xué)習(xí)探討:
https://github.com/qixiaojian/activiti-demo.git