public class Approve implements JavaDelegate {    @Override    public void execute(DelegateExecution execution) {        System.out.println("申请通过:"+execution.getVariables());    }}我们自定义类实现 JavaDelegate 接口即可,然后我们在 execute 方法中做自己想要做的事情即可,execution 中有这个流程中的所有变量。我们可以在这里发邮件(公众号江南一点雨后台回复 666 有发邮件教程)、发短信等等。Reject 的定义方式也是类似的。这些自定义类写好之后,将来配置到流程图中即可(可查看上文的流程图)。
最后再来看看前端提交方法就简单了(页面源码上文已经列出):
approveOrReject(taskId, approve,name) {    let _this = this;    axios.post('/handler', {taskId: taskId, approve: approve,name:name})        .then(function (response) {            _this.initTasks();        })        .catch(function (error) {            console.log(error);        });}这就一个普通的 Ajax 请求,批准的话第二个参数就为 true,拒绝的话第二个参数就为 false。
7. 结果查询
最后,每个用户都可以查看自己曾经的申请记录。本来这个登录之后就可以展示了,但是因为我们没有登录,所以这里也是需要手动输入查询的用户,然后根据用户名查询这个用户的历史记录,我们先来看查询接口:
@GetMapping("/search")public RespBean searchResult(String name) {    return askForLeaveService.searchResult(name);}参数就是要查询的用户名。具体的查询流程如下:
public RespBean searchResult(String name) {    List historyInfos = new ArrayList<>();    List historicProcessInstances = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(name).finished().orderByProcessInstanceEndTime().desc().list();    for (HistoricProcessInstance historicProcessInstance : historicProcessInstances) {        HistoryInfo historyInfo = new HistoryInfo();        Date startTime = historicProcessInstance.getStartTime();        Date endTime = historicProcessInstance.getEndTime();        List historicVariableInstances = historyService.createHistoricVariableInstanceQuery()                .processInstanceId(historicProcessInstance.getId())                .list();        for (HistoricVariableInstance historicVariableInstance : historicVariableInstances) {            String variableName = historicVariableInstance.getVariableName();            Object value = historicVariableInstance.getValue();            if ("reason".equals(variableName)) {                historyInfo.setReason((String) value);            } else if ("days".equals(variableName)) {                historyInfo.setDays(Integer.parseInt(value.toString()));            } else if ("approved".equals(variableName)) {                historyInfo.setStatus((Boolean) value);            } else if ("name".equals(variableName)) {                historyInfo.setName((String) value);            }        }        historyInfo.setStartTime(startTime);        historyInfo.setEndTime(endTime);        historyInfos.add(historyInfo);    }    return RespBean.ok("ok", historyInfos);}   - 我们当时在开启流程的时候,传入了一个参数 key,这里就是再次通过这个 key,也就是用户名去查询历史流程,查询的时候还加上了 finished 方法,这个表示要查询的流程必须是执行完毕的流程,对于没有执行完毕的流程,这里不查询,查完之后,按照流程最后的处理时间进行排序。
 - 遍历第一步的查询结果,从 HistoricProcessInstance 中提取出每一个流程的详细信息,并存入到集合中,并最终返回。
 
