全部开发者教程

企业级在线办公系统

目前在线审批页面技能显示审批任务记录,又能显示具体的审批详情信息,我们接下来应该把审批功能给实现一下。其实与工作流相关的操作,我们只需要调用工作流项目的Web方法即可,并不复杂。

图片描述

一、会议申请BPMN流程

因为每种工作流程都不一样,所以我们先来看看会议申请的流程是什么?等到测试的时候,我们用不同身份的帐户登陆系统,执行会议申请的审批。

图片描述

  1. 如果是总经理创建的会议申请,不需要审批,直接通过。
  2. 如果是非总经理创建的会议申请,需要由申请人的部门经理审批。
    1. 如果参会人是相同部门,部门经理审批是终审,不需要总经理审批。
    2. 如果参会人是不同部门的,部门经理审批之后,还需要总经理审批。

我们创建工作流实例的时候,向工作流项目传递了recieveNotify参数,这个URL地址是接收工作流发送过来的通知结果。所以无论会议审批通过还是没通过,工作流项目都会想recieveNotify这个URL地址发送HTTP请求,把审批结果发给我们。

二、调用工作流Web接口,执行审批

我们想要审批工作流程中的任务,只需要调用工作流项目的Web接口即可。下面的表格是我们调用Web方法需要传递的参数。

URI地址:/workflow/approvalTask
返回值:void

序号 参数 类型 说明
1 taskId String 审批任务ID
2 approval String 同意
3 code String 慕课网授权码
4 tcode String 课程授权码

三、编写业务层代码

ApprovalService.java接口中,声明抽象方法。

public interface ApprovalService {
    ……
    public void approvalTask(HashMap param);

}

ApprovalServiceImpl.java类中,实现抽象方法。

public class ApprovalServiceImpl implements ApprovalService {
    ……
    @Override
    public void approvalTask(HashMap param) {
        param.put("code", code);
        param.put("tcode", tcode);
        String url = workflow + "/workflow/approvalTask";
        HttpResponse resp = HttpRequest.post(url).header("Content-Type", "application/json")
                .body(JSONUtil.toJsonStr(param)).execute();
        if (resp.getStatus() != 200) {
            log.error(resp.body());
            throw new EmosException("调用工作流审批异常");
        }
    }
}

四、编写Web层代码

创建ApprovalTaskForm.java类,封装Ajax提交的数据。

@Data
@Schema(description = "审批任务表单")
public class ApprovalTaskForm {

    @NotBlank(message = "taskId不能为空")
    @Schema(description = "任务ID")
    private String taskId;

    @NotBlank(message = "approval不能为空")
    @Pattern(regexp = "^同意$|^不同意$", message = "approval内容不正确")
    @Schema(description = "审批意见")
    private String approval;

}

ApprovalController.java类,定义Web方法,然后调用Swagger测试一下。

public class ApprovalController {
    
    @PostMapping("/approvalTask")
    @Operation(summary = "审批任务")
    @SaCheckPermission(value = {"WORKFLOW:APPROVAL"}, mode = SaMode.OR)
    public R approvalTask(@Valid @RequestBody ApprovalTaskForm form) {
        HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
        approvalService.approvalTask(param);
        return R.ok();
    }
}

注意:会议申请工作里实例创建的时候,工作流项目会创建一个定时器,用于检测到了会议开始的时间,这个会议申请有没有审批通过。如果工作流没有审批完成,定时器会自动关闭工作流实例。所以我们之前创建的会议申请,为什么有的时候就消失了呢,就是到会议开始的时刻,这个申请还没有人审批,工作流实例就被关闭了。遇到这种问题很简单,再创建一个会议申请,把会议开始的日期尽量设置的靠后一些。