一.基本流程實現
流程測試我這用的是swagger,也可以用postman進行流程的運行,
(1)先來了解什麼是並行網關 圖標爲+
並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進入和外出順序流的:
fork 分支:
並行後的所有外出順序流,爲每個順序流都創建一個併發分支。
join 匯聚:
所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以後, 流程就會通過匯聚網關。
注意:
如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時, 網關會先匯聚所有進入的順序流,然後再切分成多個並行分支。
(2)什麼是排他網關 圖標爲 -
排他網關是用來控制流程的流向.
並行與其他網關的主要區別:
並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。
流程圖對應一個流程id和多個任務.每個任務對應每個人來操作.
1.普通流程,先用idea插件畫BPMN流程圖.這個插件畫相對eclipse插件,或者activiti-app相對噁心點,不好畫.如果不習慣這個插件,也可以用其他軟件畫好,複製過來.
2.發起流程,此流程很簡單,先是主管審覈,主管審完然後人事審覈,流程結束,接下來開始操作
上一節config初始化配置拿到的流程相關接口注入.
啓動流程
/**
* 啓動流程
* @param perid
* @param tempName
* @param map
* @return
*/
@Override
public ProcessInstance getTask(String perid, String tempName, Map<String, Object> map){
identityService.setAuthenticatedUserId(perid);
// 開始流程 map內容set對應的審覈用戶
ProcessInstance pi = runtimeService.startProcessInstanceByKey(tempName, map);
// 查詢當前任務
return pi;
}
map裏面對應的key可以set用戶,也可以在流程圖寫死,一般是根據業務來進行set對應的用戶(assignee屬性配置)
perid 發起流程的用戶
tempName 此流程的名稱
3.流程啓動然後到主管,用主管查詢待審覈的流程
@Override
public List<ActivitiTask> myApproval(String userName) {
List<Task> taskList = taskService.createTaskQuery().taskAssignee(userName)
.orderByTaskCreateTime().desc().list();
// 多此一舉 taskList中包含了以下內容(用戶的任務中包含了所在用戶組的任務)
// Group group = identityService.createGroupQuery().groupMember(userName).singleResult();
// List<Task> list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();
// taskList.addAll(list);
List<ActivitiTask> activitiTaskList = new ArrayList<>();
for (Task task : taskList) {
ActivitiTask activitiTask = new ActivitiTask();
activitiTask.setId(task.getId());
activitiTask.setName(task.getName());
activitiTask.setCreateTime(task.getCreateTime());
String instanceId = task.getProcessInstanceId();
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
Activiti activiti = getActiviti(instance);
activitiTask.setActiviti(activiti);
activitiTask.setProcessInstanceId(instanceId);
activitiTaskList.add(activitiTask);
}
return activitiTaskList;
4,查詢到待審覈的任務,根據任務id和當前用戶進行審覈
審覈操作(審覈操作可能會牽扯到是否同意,原因等字段,可以自定義進行傳參)
@Override
public Boolean passApproval(String userName, ActivitiTask activitiTask) {
String taskId = activitiTask.getId();
Map<String, Object> vars = new HashMap<>();
vars.put("result", activitiTask.getActiviti().getResult());
vars.put("auditor", activitiTask.getActiviti().getAuditor());
vars.put("auditTime", new Date());
vars.put("ifPass", activitiTask.getActiviti().getIfPass());
//taskService.claim(taskId, userName);
taskService.setAssignee(taskId, userName);
taskService.complete(taskId, vars);
return true;
}
5,審覈成功之後進入人事審覈,人事審覈同樣上述操作,審覈完成,流程結束.
6.想要查看當前流程進度,查看流程圖(根據流程的id獲取流程圖)
/**
* 生成流程圖片
*
* @param processDefinitionId
* @param outputStream
* @return
*/
@Override
public void tracePhoto(String processDefinitionId, OutputStream outputStream) {
ActUtils.getFlowImgByInstanceId(processDefinitionId, outputStream);
}
以上基本流程代碼已經可以實現流程的步驟,
二 .排他網關的流程實現
排他網關在業務流程中可能有兩種或者多種選擇,選擇不同結果會進入的下一步流程就會不同,所以在他的後面用表達式進行區分,在實現審覈的時候根據你審覈的參數他會進入不同的審覈狀態
用戶申報流程,申報成功結轉到審覈,審覈有兩種情況,在condition屬性下配置表達式,同意流程結束,不同意,退回重新申報,接下來開始操作
1.此方法操作跟上面接口一直,在審覈的時候,你只需要給參數ifPass進行寫入數據,同意爲1,不同意爲0,,如果沒有滿足的值會拋出異常,流程審覈會根據你的條件退回去還是結束.
後面還有對應的多人順序或者並列審覈,持續學習,持續更新.