说在前面
最终会做一个开源项目,实现一些中国式审批流程功能以及讲解。点击直达
感兴趣的朋友点赞收藏
上文提到如何部署【发布】一个流程定义,本篇将使用部署成功的流程定义来完成一条简单的流程实例
【ResultReturn是自定义的返回值类,有需要的可以私信我获取,返回值改一下,这部分代码与本文无关就不贴出来了】
对Springboot统一返回数据格式不清楚的同学可参考本篇Springboot统一返回数据格式
修改流程定义
还是在Camunda Modeler中对发起人节点的任务代理人这里设置变量
在经理审批节点也设置一个任务代理人变量
完成后拿到xml内容去项目中替换之前的one.bpmn文件
那么bpmn文件更新后是需要重新部署的【也是我在上一篇博文中不设置参数的原因,为了说明这一步】
注意:如果bpmn文件中的这个id没有改变,则重新部署流程定义后,流程引擎会认为是版本迭代,并取最新版本来发起流程实例
这个id也就是下文中的processDefinitionKey
开启流程实例的代码
首先创建一个流程实例服务接口
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);
}
}
然后启动项目,重新部署流程定义
然后发起流程:
然后使用上篇提到的camunda view查看 有我们开启流程时设置的业务ID、流程定义版本号、当前节点的任务处理人
其实完成任务和处理人没关系,处理人的设置是用来查询待办,能看见才有机会完成。
查询待办的代码
所以接下来写个查询待办服务。首先创建一个任务服务接口
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);
}
}
请求后
此时也就可以控制谁可以看见哪些任务,有了待办就需要去完成,再来写一个完成任务的接口
审批通过代码
还是在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
拿到这个值就可以测试一下审批通过是否可以使用
此时再去看一下,camunda view,说明确实审批通过了
同样的步骤完成【经理审批】节点,也就结束了本条简单的流程。
下篇预告
下一篇决定直接对Camunda常用的接口封装后代码展示,方便各位直接获取相关代码