说在前面

最终会做一个开源项目,实现一些中国式审批流程功能以及讲解。点击直达

感兴趣的朋友点赞收藏

上文提到如何部署【发布】一个流程定义,本篇将使用部署成功的流程定义来完成一条简单的流程实例

ResultReturn是自定义的返回值类,有需要的可以私信我获取,返回值改一下,这部分代码与本文无关就不贴出来了

对Springboot统一返回数据格式不清楚的同学可参考本篇Springboot统一返回数据格式

修改流程定义

还是在Camunda Modeler中对发起人节点的任务代理人这里设置变量

springboot集成钉钉oa springboot集成camunda_camunda

在经理审批节点也设置一个任务代理人变量

springboot集成钉钉oa springboot集成camunda_ide_02

完成后拿到xml内容去项目中替换之前的one.bpmn文件

那么bpmn文件更新后是需要重新部署的【也是我在上一篇博文中不设置参数的原因,为了说明这一步】

注意:如果bpmn文件中的这个id没有改变,则重新部署流程定义后,流程引擎会认为是版本迭代,并取最新版本来发起流程实例

这个id也就是下文中的processDefinitionKey

springboot集成钉钉oa springboot集成camunda_数据格式_03

开启流程实例的代码

首先创建一个流程实例服务接口

public interface ProcessInstanceService {

public ResultReturn startProcessInstanceByKey(String processDefinitionKey, String businessKey);
}

其实现类:【这里可以看出在开启流程实例时已经对两个参数进行赋值了】

@Service("processInstanceService")
public class ProcessInstanceServiceImpl implements ProcessInstanceService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private IdentityService identityService;

@Override
public ResultReturn startProcessInstanceByKey(String processDefinitionKey, String businessKey,String initiator) {
Map<String,Object> map = new HashMap<>();
map.put("userOne","userOne");
map.put("userTwo","userTwo");
//设置流程发起人
identityService.setAuthenticatedUserId("initiator");
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,map);
}
}

流程实例接口类

@RestController
@RequestMapping("/processInstance")
public class ProcessInstanceController {

@Autowired
ProcessInstanceService processInstanceService;

@PostMapping("/startProcess")
public ResultReturn startProcess(String processDefinitionKey,String businessKey,String initiator){
return processInstanceService.startProcessInstanceByKey(processDefinitionKey,businessKey,initiator);
}
}

然后启动项目,重新部署流程定义

springboot集成钉钉oa springboot集成camunda_camunda_04

然后发起流程:

springboot集成钉钉oa springboot集成camunda_工作流_05

然后使用上篇提到的camunda view查看 有我们开启流程时设置的业务ID、流程定义版本号、当前节点的任务处理人

springboot集成钉钉oa springboot集成camunda_工作流_06

其实完成任务和处理人没关系,处理人的设置是用来查询待办,能看见才有机会完成。

查询待办的代码

所以接下来写个查询待办服务。首先创建一个任务服务接口

public interface ProcessTaskService {

public ResultReturn queryMyToDo(String userId);

}

其实现类

@Service
public class ProcessTaskServiceImpl implements ProcessTaskService {

@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private HistoryService historyService;
 @Override
public ResultReturn queryMyToDo(String userId) {
try {
List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).list();
return ResultReturnUtil.success(tasks);
}catch(Exception e){
e.printStackTrace();
throw new ProcessException(ResponseEnums.QUERY_TASK_MY_TO_DO_FAIL.getMsg());
}
} 
}

controller

@RestController
@RequestMapping("/processTask")
public class ProcessTaskController {
@Autowired
ProcessTaskService processTaskService;
 @GetMapping("/queryMyToDo")
public ResultReturn queryMyToDo(String userId){
return processTaskService.queryMyToDo(userId);
} 
}

请求后

springboot集成钉钉oa springboot集成camunda_数据格式_07

此时也就可以控制谁可以看见哪些任务,有了待办就需要去完成,再来写一个完成任务的接口

审批通过代码 

还是在ProcessTaskService 中来写,很简单哈,传一个任务ID即可。

@Override
public ResultReturn taskPass(String taskId) {
taskService.complete(taskId);
return ResultReturnUtil.success("审批通过");
}
@PostMapping("/taskPass")
public ResultReturn taskPass(String taskId){
return processTaskService.taskPass(taskId);
}

在刚刚查询待办的返回数据中就可以获取到TaskId

springboot集成钉钉oa springboot集成camunda_ide_08

拿到这个值就可以测试一下审批通过是否可以使用

springboot集成钉钉oa springboot集成camunda_数据格式_09

此时再去看一下,camunda view,说明确实审批通过了

springboot集成钉钉oa springboot集成camunda_camunda_10

同样的步骤完成【经理审批】节点,也就结束了本条简单的流程。

下篇预告

下一篇决定直接对Camunda常用的接口封装后代码展示,方便各位直接获取相关代码