Activiti7工作流引擎:进阶篇(十三) 拒绝(直接结束)

知识传送门 》》》》》》》》》》》》》》》》》》》

也不知道张世豪厉害,还是李华强厉害 ?

驳回或者拒绝就是某个审批人不同意你的申请,此时流程就直接结束了。我们可以增加分支条件或者排它网关来完成驳回功能。此方法适用于节点较少的情况。

1. bpmn文件

同意:${result==1}
Activiti7工作流引擎:进阶篇(十三) 拒绝(直接结束)_第1张图片
驳回:${result==1}
有一个正常结束事件,有一个异常结束事件。

Activiti7工作流引擎:进阶篇(十三) 拒绝(直接结束)_第2张图片

2. test

@Test
public void testStart() {
	// 部署
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    processEngine.getRepositoryService()
            .createDeployment()
            .addClasspathResource("bpmn/reject.bpmn")
            .name("请假流程")
            .deploy();
	
	// 启动
    Authentication.setAuthenticatedUserId("zs");
    String businessKey = "1";
    Map<String, Object> variables = new HashMap<>();
    variables.put("creator", "zhangsan");
    variables.put("pm", "lisi");
    variables.put("hr", "wangwu");
    processEngine.getRuntimeService().startProcessInstanceByKey("reject", businessKey, variables);
	
	// 第一个节点完成
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService
            .createTaskQuery()
            .processDefinitionKey("reject")
            .taskAssignee("zhangsan")
            .singleResult();

    String currentUserId = "zs";
    Authentication.setAuthenticatedUserId(currentUserId);
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("userId", currentUserId);
    jsonObject.put("comment", "同意");
    taskService.addComment(task.getId(), task.getProcessInstanceId(), JSONObject.toJSONString(jsonObject));
	// 设置局部变量,因变量是局部的所以每个连线对应的变量可以重名
    taskService.setVariable(task.getId(), "result", 1);
    taskService.complete(task.getId());
}




@Test
public void testRejectTask() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    Task task = taskService
            .createTaskQuery()
            .processDefinitionKey("reject")
            .taskAssignee("lisi")
            .singleResult();
	
    Authentication.setAuthenticatedUserId("lisi");
    // 异常结束
    taskService.setVariable(task.getId(), "result", 0);
    taskService.complete(task.getId());
}

Activiti7工作流引擎:进阶篇(十三) 拒绝(直接结束)_第3张图片

Activiti7工作流引擎:进阶篇(十三) 拒绝(直接结束)_第4张图片

在这里插入图片描述

3. 查询某个实例的任务状态

查询某个流程实例的最新状态可以通过endActivityId是否有值,然后将正常的EndEvent改为审批成功,异常的EndEvent改为审批失败等辅助完成。
个人觉得自己在业务表中维护一个状态字段比较方便点,而且还可以自定义状态。

@Test
public void testQueryTaskStatus() {
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService().createHistoricProcessInstanceQuery()
            .processInstanceId("4")
            .singleResult();
    String endActivityId = historicProcessInstance.getEndActivityId();
    String taskStatus = null;
    if (endActivityId != null) {
        HistoricActivityInstance historicActivityInstance = processEngine.getHistoryService().createHistoricActivityInstanceQuery()
                .activityId(endActivityId)
                .singleResult();
        // 审批成功、审批失败
        taskStatus = historicActivityInstance.getActivityName();
    } else {
        HistoricTaskInstance historicTaskInstance = processEngine.getHistoryService().createHistoricTaskInstanceQuery()
                .processInstanceId("4")
                .orderByHistoricTaskInstanceEndTime()
                .desc()
                .list()
                .get(0);
        // 正在审批的节点
        taskStatus = historicTaskInstance.getName();
    }

    System.out.println(taskStatus);
}

如果节点较多,每个节点都增加一个排它网关,感觉整个流程的.bpmn文件内容很多,我们当驳回的时候可以直接操作act_ru删除相关数据和act_hi表中完善end_time等。

知识传送门 》》》》》》》》》》》》》》》》》》》

你可能感兴趣的:(工作流)