springboot+vue 审批工作流集成flowable(springboot实现工作流)

仿钉钉审批流程图在线绘制、业务申请、审批、流转、委托、催办,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;
    }

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值