springboot+vue 审批工作流集成flowable(springboot实现工作流)
目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,这次推荐的是在一个基础开发平台系统基础功能(用户管理,部门管理…)上整合了flowable工作流,你可以直接用来开发ERP,OA,CRM等企业级应用,不用再担心如何再去花大量的时间集成工作流进来,目前表单支持自定义拖拽,具体功能下面我们来探索吧。...
·
仿钉钉审批流程图在线绘制、业务申请、审批、流转、委托、催办,springboot集成工作流基础框架
前言
目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,这次推荐的是在一个基础开发平台系统基础功能(用户管理,部门管理…)上整合了flowable工作流,你可以直接用来开发ERP,OA,CRM等企业级应用,不用再担心如何再去花大量的时间集成工作流进来,目前表单支持自定义拖拽,具体功能下面我们来探索吧。
一、项目形式
springboot+vue+flowable 集成了仿钉钉拖拽设计流程编辑器,快速开发平台,可插拔工作流服务。
二、项目介绍
本项目拥有用户管理,部门管理,岗位管理,系统监管,IM聊天,自定义问卷调查,网络拓扑图设计,业务审批等功能。功能太强大,只能大致介绍,所见即所得,体验一下吧。
项目预览
预览地址:http://demo.duojuhe.com
本次我们主要来了解项目中的工作流部分模块
三、工作流
/**
* 查询可退回的节点
* @param taskId
* @return
*/
private List<QueryWorkFlowToBackNodeRes> getWorkFlowToBackNodeRes(String taskId){
// 初始化返回结果列表
List<QueryWorkFlowToBackNodeRes> result = new ArrayList<>();
if (StringUtils.isBlank(taskId)){
return result;
}
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null){
return result;
}
// 任务定义key 等于 当前任务节点id
String taskDefinitionKey = task.getTaskDefinitionKey();
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
Process mainProcess = bpmnModel.getMainProcess();
// 当前节点
FlowNode currentFlowElement = (FlowNode) mainProcess.getFlowElement(taskDefinitionKey, true);
// 查询历史节点实例
List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(task.getProcessInstanceId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc().list();
List<String> activityIdList = activityInstanceList.stream()
.filter(activityInstance ->
BpmnXMLConstants.ELEMENT_TASK_USER.equals(activityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(activityInstance.getActivityType()))
.map(HistoricActivityInstance::getActivityId)
.filter(activityId -> !taskDefinitionKey.equals(activityId))
.distinct()
.collect(Collectors.toList());
for (String activityId : activityIdList) {
// 回退到主流程的节点
FlowNode toBackFlowElement = (FlowNode) mainProcess.getFlowElement(activityId, true);
// 判断 【工具类判断是否可以从源节点 到 目标节点】
Set<String> set = new HashSet<>();
if (toBackFlowElement != null && ExecutionGraphUtil.isReachable(mainProcess,toBackFlowElement,currentFlowElement, set)) {
QueryWorkFlowToBackNodeRes workFlowNodeDTO = new QueryWorkFlowToBackNodeRes();
workFlowNodeDTO.setTaskNodeId(activityId);
workFlowNodeDTO.setTaskNodeName(toBackFlowElement.getName());
result.add(workFlowNodeDTO);
}
}
return result;
}
更多推荐
已为社区贡献1条内容
所有评论(0)