網(wǎng)站建設(shè)公司如何約客戶瀏覽器下載
一.簡介
**會簽:**在一個流程中的某一個 Task 上,這個 Task 需要多個用戶審批,當(dāng)多個用戶全部審批通過,或者多個用戶中的某幾個用戶審批通過,就算通過。
例如:之前的請假流程,假設(shè)這個請假流程需要組長和經(jīng)理都審批了,才算審批通過,那么就需要設(shè)置這個 Task 是會簽節(jié)點。
**或簽:**意思就是 A 的請假流程提交給 B、C、D,但是并不需要 B/C/D 同時審批通過,只需要 B/C/D 中的任意一個審批即可,這就是或簽,注意,我這里的表述,只需要 B/C/D 任意一個審批即可,這個審批即可以是審批通過,也可以是審批拒絕,反正只要審批,這個 UserTask 就算完成了。
二.會簽流程圖
首先來畫一下這個請假流程圖,這個流程圖基本上還是和之前的一樣,截圖如下:
三.請假處理
1.前端提交請假流程
接下來看下前端如何提交請假申請,頁面如下:
對應(yīng)的 HTML 代碼如下:
<h1>提交請假申請</h1>
<table><tr><td>請輸入請假天數(shù):</td><td><el-input type="text" v-model="afl.days"/></td></tr><tr><td>請輸入請假理由:</td><td><el-input type="text" v-model="afl.reason"/></td></tr><tr><td>審批人:</td><td><el-select v-model="afl.approveUsers" style="width: 226px" placeholder="請選擇審批人" multiple><el-optionv-for="item in users":key="item.id":label="item.username":value="item.username"/></el-select></td></tr>
</table>
<el-button type="primary" @click="submit">提交請假申請</el-button>
跟之前不同的是,這里的下拉框是多選的,當(dāng)用戶提交請假申請的時候,可以選擇多個審批人,多個審批人的值將保存在 afl.approveUsers 變量中。
再來看提交請假方法,代碼如下:
submit() {let _this = this;axios.post('/ask_for_leave', this.afl).then(function (response) {if (response.data.status == 200) {//提交成功_this.$message.success(response.data.msg);_this.search();} else {//提交失敗_this.$message.error(response.data.msg);}}).catch(function (error) {console.log(error);});
},
請求的參數(shù)截圖如下:
看下這里提交的三個請求參數(shù):
- approveUsers:這是審批當(dāng)前流程的三個用戶,當(dāng)這三個用戶都審批通過后,請假流程就通過了。
- days:這是請假的天數(shù)。
- reason:這是請假理由。
2.服務(wù)端處理請假請求
服務(wù)端如何處理這個請假請求,代碼如下:
@Transactional
public RespBean askForLeave(AskForLeaveVO askForLeaveVO) {Map<String, Object> variables = new HashMap<>();askForLeaveVO.setName(SecurityContextHolder.getContext().getAuthentication().getName());variables.put("name", askForLeaveVO.getName());variables.put("days", askForLeaveVO.getDays());variables.put("reason", askForLeaveVO.getReason());variables.put("userTasks", askForLeaveVO.getApproveUsers());try {runtimeService.startProcessInstanceByKey("holidayRequest", askForLeaveVO.getName(), variables);return RespBean.ok("已提交請假申請");} catch (Exception e) {e.printStackTrace();}return RespBean.error("提交申請失敗");
}
可以看到,從前端一共傳遞過來三個參數(shù),但是執(zhí)行這個流程需要四個參數(shù),其中一個 name 表示當(dāng)前登錄的用戶名,也就是這個請假是誰發(fā)起的。另外三個參數(shù)就是前端傳來的參數(shù)。
3.服務(wù)端返回待審批數(shù)據(jù)
接下來看下服務(wù)端如何返回待審批數(shù)據(jù),代碼如下:
/***待審批列表*/
public RespBean leaveList() {String identity = SecurityContextHolder.getContext().getAuthentication().getName();//找到所有分配給你的任務(wù)List<Task> tasks = taskService.createTaskQuery().taskAssignee(identity).list();//重新組裝返回的數(shù)據(jù),為每個流程增加任務(wù) id,方便后續(xù)執(zhí)行批準(zhǔn)或者拒絕操作List<Map<String, Object>> list = new ArrayList<>();for (int i = 0; i < tasks.size(); i++) {Task task = tasks.get(i);Map<String, Object> variables = taskService.getVariables(task.getId());variables.put("id", task.getId());list.add(variables);}return RespBean.ok("加載成功", list);
}
頁面如下:
這個整體上分了兩步:
- 首先查詢出來當(dāng)前用戶所有待審批的 Task。
- 查詢出來這些 Task 上的 variables,這是一個 Map 集合,然后我們再手動加上 id 這個參數(shù)。
最后將組裝好的 list 弄成一個 JSON 返回即可。
4.服務(wù)端批準(zhǔn) OR 拒絕
服務(wù)端批準(zhǔn)或者拒絕請假流程,代碼如下:
public RespBean askForLeaveHandler(ApproveRejectVO approveRejectVO) {try {Task task = taskService.createTaskQuery().taskId(approveRejectVO.getTaskId()).singleResult();boolean approved = approveRejectVO.getApprove();Map<String, Object> variables = new HashMap<String, Object>();variables.put("approved", approved);variables.put("approveUser#" + task.getAssignee(), SecurityContextHolder.getContext().getAuthentication().getName());taskService.complete(task.getId(), variables);return RespBean.ok("操作成功");} catch (Exception e) {e.printStackTrace();}return RespBean.error("操作失敗");
}
批準(zhǔn)或者拒絕,最主要的參數(shù)就是 approved,true 表示批準(zhǔn),false 表示拒絕。
另一方面,由于現(xiàn)在是會簽,我們需要知道目前誰已經(jīng)審批了,誰還沒審批,所以這里額外多加了一個參數(shù) approveUser#XXX,表示審批這個節(jié)點的用戶名(也就是當(dāng)前登錄用戶)。
注意這個參數(shù)的 key 我沒有固定,主要是因為這個節(jié)點會有多個人審批,如果固定的話,后面審批的人會覆蓋掉前面的人,所以這個節(jié)點的 key 設(shè)置成動態(tài)的了,approveUser# 后面加上處理這個節(jié)點的用戶名。