Springboot專案中使用activiti7.0版本
阿新 • • 發佈:2020-12-12
1.0、為什麼使用工作流框架
日常的開發中,我們會遇見一些比較噁心的審批流程。又或者是面對不同的業務場景,流程使用的場景不固定。又或者審批的流程不確定,比如一些政府單位,響應國家政策新增一個什麼崗位,我們的流程審批必須經過此崗位。
這裡就體現出將工作流和實際的業務進行業務分離的必要性,所以引入BPM框架是很有必要必要的。
1.1、介紹activiti
官網地址,直接去官網看吧,可能有點卡(國外的網站可能有點卡)
2.0、Sringboot專案中整合activiti
2.1、pom中加入依賴
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
2.2、yml中加入配置
spring:
activiti:
database-schema-update: true
db-history-used: true
check-process-definitions: false
history-level: audit
這裡加入的目的是為了,在專案啟動的時候,activiti框架會自動檢查此專案的後臺資料庫,建立工作流框架的後臺表
2.3、資料庫表
如上圖所示,act開頭的表都是activiti所需要的後臺表
2.4、介面實現
這裡簡單介紹一下,activiti7.0的官方資料比較少,畢竟是新版本,可以借鑑一下6.X、5.X的版本看看。
2.4.1 部署流程
/**
* 部署流程定義 類路徑下(classPath)
*/
@Test
public void deploy() {
// 獲取部署物件
Deployment deployment = repositoryService.createDeployment().name("員工請假流程222" ).addClasspathResource("processes/MyProcess.bpmn").addClasspathResource("processes/MyProcess.png").deploy();
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName());
}
/**
* 部署流程定義 zip
*/
public void deployByZip(MultipartFile file) {
InputStream in = null;
try {
in = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
ZipInputStream zipInputStream = new ZipInputStream(in);
repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
}
@Test
public void deployByZip() {
InputStream in = this.getClass().getClassLoader().getResourceAsStream("MyProcess.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deploy = repositoryService.createDeployment().name("zip格式部署流程定義").addZipInputStream(zipInputStream).deploy();
System.out.println("部署id為:" + deploy.getId() + ",部署名稱為:" + deploy.getName());
}
2.4.2 啟動流程例項
/**
* 啟動流程例項並設定流程變數
*/
@Test
public void startProcessTest() {
String userId = "wangwu";
//設定認證使用者的id
identityService.setAuthenticatedUserId(userId);
Map<String, Object> variables = new HashMap<>();
variables.put("applyUser", "luxuebing");
variables.put("PM", "PM");
variables.put("President", "President");
variables.put("VP", "VP");
variables.put("days", 5);
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myProcess", "66666", variables);
System.out.println("流程例項id:>>>" + instance.getId());
}
2.4.3 查詢
/**
* 查詢我要辦理的任務
*/
@Test
public void getMyTask() {
String assignee = "President";
List<Task> list = taskService.createTaskQuery().taskAssignee(assignee).list();
for (Task task : list) {
System.out.println(task.toString() + "當前任務的辦理人為:>>>" + taskService.getVariable(task.getId(), "President"));
}
}
/**
* 辦理任務並且加上批註
*/
@Test
public void completeTask() {
String taskId = "10005";
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
String message = "總裁同意";
//給當前任務新增批註資訊
taskService.addComment(taskId, processInstanceId, message);
Map<String, Object> variables = new HashMap<>();
variables.put("msg", "agree");
taskService.complete(taskId, variables);
}
/**
* 根據當前任務id檢視當前流程圖所處的活動節點資訊
*/
@Test
public void findCoordinate() {
//String taskId = "13";
Task result = taskService.createTaskQuery().taskAssignee("President").singleResult();
//通過任務id獲取任務物件
Task task = taskService.createTaskQuery().taskId(result.getId()).singleResult();
//通過任務id獲取流程定義id
String processDefinitionId = task.getProcessDefinitionId();
//通過流程定義id獲取流程定義的實體物件(對應的是.bpmn檔案中的資料)
ProcessDefinitionEntity entity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
//通過任務id獲取流程例項id
String processInstanceId = task.getProcessInstanceId();
//通過流程例項id獲取當前活動對應的流程例項物件
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//獲取當前的活動id
String activityId = instance.getActivityId();
//獲取當前活動物件
ActivityImpl activity = entity.findActivity(activityId);
System.out.println("x座標為:" + activity.getX() + "-----y座標為:" + activity.getY() + "-----高度為:" + activity.getHeight() + "-----寬度為:" + activity.getWidth());
}
/**
* 根據流程例項id檢視當前流程例項是否結束
*/
@Test
public void findProcessState() {
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId("5008").singleResult();
if(Objects.isNull(instance)) {
System.out.println("當前的流程例項已經結束。。。。");
}
HistoricProcessInstance singleResult = historyService.createHistoricProcessInstanceQuery().processInstanceId("5008").singleResult();
System.out.println("歷史流程例項id為:" + singleResult.getId() + "----開始時間為:" + singleResult.getStartTime() + "-----------結束時間為:" + singleResult.getEndTime());
}
/**
* 根據使用者id查詢該使用者發起的流程
*
* @return
*/
@Test
public void getHistoricProcessInstance() {
String userId = "lisi";
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().startedBy(userId).list();
for (HistoricProcessInstance historicProcessInstance : list) {
System.out.println(historicProcessInstance.toString());
}
}
/**
* 查詢指定使用者發起的流程(流程歷史 使用者發起)
* historyService.createHistoricProcessInstanceQuery()
* .finished()//finished--> 完成的流程; unfinish ---> 還在執行中的流程
* .startedBy(name).orderByProcessInstanceStartTime().desc()
* .listPage(firstResult, maxResults);
*/
@Test
public void findStartByMe() {
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().finished().startedBy("范冰冰").list();
System.out.println(list);
}
/**
* 查詢指定使用者參與的流程資訊 (流程歷史 使用者參與 )
* List hpis = historyService
* .createHistoricProcessInstanceQuery().involvedUser(name)
* .orderByProcessInstanceStartTime().desc().listPage(firstResult, maxResults);
*/
/**
* 查詢指定流程的任務流轉路徑 (流程歷史 任務 流轉 路經)
* historyService.createHistoricTaskInstanceQuery()
* .processInstanceId(processInstanceId)
* .orderByHistoricTaskInstanceEndTime().asc().list();
*
*/
/**
* 查詢我審批過的流程例項
*/
@Test
public void finishedByUser() {
String assignee = "范冰冰";
List<HistoricProcessInstance> list2 = new ArrayList<>();
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().taskAssignee(assignee).list();
for (HistoricTaskInstance historicTaskInstance : list) {
String processInstanceId = historicTaskInstance.getProcessInstanceId();
list2.add(historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult());
}
for (HistoricProcessInstance historicProcessInstance : list2) {
System.out.println(historicProcessInstance);
}
}
/**
* 檢視當前流程圖的所在節點(單線流程,一個執行物件的時候)
*/
public void getCurrentView() {
ActivityImpl activity = null;
String processDefinitionId = "";//流程定義id
String processInstanceId = "";//流程例項id
ExecutionEntity entity = (ExecutionEntity) runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();
String activityId = entity.getActivityId();
ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId);
List<ActivityImpl> activities = definitionEntity.getActivities();
for (ActivityImpl activityImpl : activities) {
if (activityId.equals(activityImpl.getId())) {
activity = activityImpl;
break;
}
}
System.out.println(activity);
}
/*@Test
public void startTest() {
String id = "4";
LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
//獲取請假單實體的類名
// String key = leaveBill.getClass().getSimpleName();
//更新請假單狀態從0變成1 表示稽核中
leaveBill.setState(LeaveBillConstant.AUDIT_ING);
leaveBillDao.updateLeaveBill(leaveBill);
Map<String, Object> variables = Maps.newHashMap();
//從session中取出當前登入人,設定為提交申請任務的辦理人
identityService.setAuthenticatedUserId("范冰冰");
variables.put("applyUser", "范冰冰");
//設定請假天數
Integer days = leaveBill.getDays();
variables.put("days", days);
//將啟動的流程例項關聯業務
String businessKey = id;
runtimeService.startProcessInstanceByKey("myProcess", businessKey, variables);
}*/
/**
* 查詢我的待辦任務列表
*/
@Test
public void taskTest() {
List<Task> list = taskService.createTaskQuery().taskAssignee("范冰冰").list();
String json = FastJsonUtils.serializeToJSON(list);
System.out.println(json);
}
/**
* 根據請假單id獲取歷史審批意見
*/
@Test
public void findCommentListByLeaveId() {
String id = "3";
HistoricProcessInstance hpi = historyService
.createHistoricProcessInstanceQuery()
.processInstanceBusinessKey(id)
.singleResult();
String processInstanceId = hpi.getId();
List<Comment> comments = taskService.getProcessInstanceComments(processInstanceId);
System.out.println(comments);
}
````
3.0、結束
程式碼模組每一個專案的設計思路不一樣,大家選擇性借鑑,如果大家是需要用到工作流框架,還是需要大家花點時間多研究一下,如何設計流程模板、如何部署路程模板、以及一些工作流中的流程變數如何設定以及獲取等等。
一個人走的快,一群人走的遠。