精华内容
下载资源
问答
  • Activiti实现流程自由跳转 import org.activiti.engine.ProcessEngine; import org.activiti.engine.TaskService; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activ....

    Activiti实现流程自由跳转

    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.impl.RepositoryServiceImpl;
    import org.activiti.engine.impl.RuntimeServiceImpl;
    import org.activiti.engine.impl.interceptor.Command;
    import org.activiti.engine.impl.interceptor.CommandContext;
    import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
    import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
    import org.activiti.engine.impl.persistence.entity.TaskEntity;
    import org.activiti.engine.impl.pvm.process.ActivityImpl;
    
    /**
     * Created by Administrator on 2016/11/11.
     */
    public class TaskFlowControlService {
        ProcessEngine _processEngine;
        private String _processId;
    
        public TaskFlowControlService(ProcessEngine processEngine, String processId)
        {
            this._processEngine = processEngine;
            this._processId = processId;
        }
    
        /**
         *  跳转至指定活动节点
         * @param targetTaskDefinitionKey
         */
        public void jump(String targetTaskDefinitionKey){
            TaskEntity currentTask = (TaskEntity)_processEngine.getTaskService()
                    .createTaskQuery()
                    .processInstanceId(_processId).singleResult();
            jump(currentTask,targetTaskDefinitionKey);
        }
    
        /**
         * @param currentTaskEntity 当前任务节点
         * @param targetTaskDefinitionKey  目标任务节点(在模型定义里面的节点名称)
         */
        private void jump(final TaskEntity currentTaskEntity, String targetTaskDefinitionKey){
            final ActivityImpl activity = getActivity(_processEngine,
                    currentTaskEntity.getProcessDefinitionId(),targetTaskDefinitionKey);
            final ExecutionEntity execution = (ExecutionEntity)_processEngine.getRuntimeService()
                    .createExecutionQuery().executionId(currentTaskEntity.getExecutionId()).singleResult();
            final TaskService taskService = _processEngine.getTaskService();
            ((RuntimeServiceImpl)_processEngine.getRuntimeService()).getCommandExecutor()
                    .execute(new Command<java.lang.Void>() {
                        public Void execute(CommandContext commandContext) {
    
                            //创建新任务
                            execution.setActivity(activity);
                            execution.executeActivity(activity);
    
                            //删除当前的任务
                            //不能删除当前正在执行的任务,所以要先清除掉关联
                            currentTaskEntity.setExecutionId(null);
                            taskService.saveTask(currentTaskEntity);
                            taskService.deleteTask(currentTaskEntity.getId(),true);
                            return null;
                        }
                    });
        }
    
        private ActivityImpl getActivity(ProcessEngine processEngine, String processDefId, String activityId)
        {
            ProcessDefinitionEntity pde = getProcessDefinition(processEngine, processDefId);
            return pde.findActivity(activityId);
        }
    
        private ProcessDefinitionEntity getProcessDefinition(ProcessEngine processEngine, String processDefId)
        {
            return (ProcessDefinitionEntity) ((RepositoryServiceImpl) processEngine.getRepositoryService())
                    .getDeployedProcessDefinition(processDefId);
        }
    }

     

    posted @ 2016-11-11 15:12 wavemelody 阅读( ...) 评论( ...) 编辑 收藏
    展开全文
  • 本文设计并实现了使用Activiti和MongoDB的后勤自由流程信息系统,以自由灵活流程管理为目标,以关系型数据库辅助非关系型数据库为设计理念,给出了自由流程框架、关键接口和重要代码逻辑,以及两类数据库协同的设计...
  • 人欲善其事,必先利其器。这里安装activiti的在线流程设计器的安装。  jbpm4的开发成员tom离开了jboss后,加入afresco公司,并且才有...流程代办在线流程设计器流程嵌入式部署流程独立部署动流程节点自由流程支持

      人欲善其事,必先利其器。这里安装activiti的在线流程设计器的安装。

         jbpm4的开发成员tom离开了jboss后,加入afresco公司,并且才有activiti5的项目,这开源项目继承了jbpm4的所有优点,同时将其发扬光大,相对jbpm4,activiti5改进了储多我们国内开发人员关心的问题,如:
    流程代办在线流程设计器流程嵌入式部署流程独立部署动流程节点自由流程支持了bpmn2的标准支持规则引擎
         activiti 5 底层上的api跟jbpm4的api相似程序也达60%以上,特别是service提供的接口,都是在jbpm4上提供扩展,大大方便了jbpm4的开发人员,这也是tom的先明之处,毕竟jbpm原来打的品牌效应不可否认的,把原来的jbpm4积累的人气再次带至activiti5上,这也将是该项目能够断续前进的重要保障。 
         尽管activiti5目前发展趋势前途光明,但其也有不足的地方,其前端的的表现总是存在不足,如在线流程设计器,目前
      eclipse插件生成的bpmn20.xml文件则不行,而官方提供的activiti-modler设计器,扩展及实现均面临困难,并且对浏览 器的要求让它在国内的项目实施总会面临技术难度。


    在上述安装过程中,已经完成了部分相应的配置,例如lib文件等。这时,可以在Eclipse中导入C:\mash_activiti-5.6\workspace目
    录下的examples工程,学习这里实例。 
    这里注意,如果需要支持可视化流程设计,需要Eclipse的版本为Eclipse Classic Helios(用户手册说明,目前Eclipse3.6.2
    上验证过,其他版本无法安装对应的插件)。 
    安装插件过程如下: 
    1、Eclipse中Help -> Install New Software 
    2、Add Repository: 
    Name: Activiti BPMN 2.0 designer 
    Location: http://activiti.org/designer/update/ 
    然后等待安装完成即可。 
    3.安装完毕
         导入{activiti_home}\workspace目录(C:\mash_activiti-5.6\workspace)下的项目,即可编译学习。
      
    activiti源代码下载svn(包含源代码和设计器代码):
              https://svn.codehaus.org/activiti

     

    下一阶段将讲解activit开发应用


    展开全文
  • 用过activiti的同学都知道,activiti对于跳转,撤回,重置这些操作并没有很好的支持, 本人苦苦研究多日,终于写出了一个万能的Command. copy前必看: 1.代码中有涉及的枚举类,这里没有贴出,自行脑补 2.代码中有很详细的...

    用过activiti的同学都知道,activiti对于跳转,撤回,重置这些操作并没有很好的支持,
    本人苦苦研究多日,终于写出了一个万能的Command.

    copy前必看:
    1.代码中有涉及的枚举类,这里没有贴出,自行脑补
    2.代码中有很详细的注释,这里不再赘述实现方法
    3.逻辑大概为:
    1)进行跳转,撤回,重置时,需要先查询出流程中要跳转到的目标节点后的所有节点list->toDealTaskDefIdList
    2)处理进行中的任务,修改进行中的任务的相关表数据(变量表:act_ru_variable,执行表:act_ru_execution)
    3)处理已完成的任务,修改已完成的任务的相关表数据(变量表:act_ru_variable,执行表:act_ru_execution,历史动作表:act_hi_actinst)
    4)设置要跳转到的节点的执行人,变量等,然后交给activiti引擎流转

    话不多说,直接上代码:

    public class Jump2FrontTargetFlowNodeCommand implements Command<Void> {
    
        //流程实例Id
        private final String processInstanceId;
        //要跳转到的目标节点们后面所有的节点
        private List<String> toDealTaskDefIdList;
        //跳转的原因,动作,比如本步骤撤销,审核拒绝,撤回到上面某一步
        private String action;
        //要跳转到的目标节点列表
        private List<String> targetFlowNodeIdList;
        private Map assigneeMap;
        //目标节点的类型,如果是会签这种多个执行人的节点为"multi",如果是正常的单个执行人的节点为"single"
        private String targetFlowNodeType;
        //bpmnModel
        private BpmnModel bpmnModel;
        private RuntimeService runtimeService;
    
        /**
         * 保存撤回节点的变量map
         */
        private Map<String, List<VariableInstanceEntity>> varMap = new ConcurrentHashMap<>();
    
        public Jump2FrontTargetFlowNodeCommand(String processInstanceId, List<String> toDealTaskDefIdList,
                                               List<String> targetFlowNodeIdList, Map assigneeMap,
                                               String targetFlowNodeType,
                                               BpmnModel bpmnModel, String action,
                                               RuntimeService runtimeService) {
            this.processInstanceId = processInstanceId;
            this.bpmnModel = bpmnModel;
            this.action = action;
            this.toDealTaskDefIdList = toDealTaskDefIdList;
            this.targetFlowNodeIdList = targetFlowNodeIdList;
            this.assigneeMap = assigneeMap;
            this.targetFlowNodeType = targetFlowNodeType;
            this.runtimeService = runtimeService;
    
        }
    
        @Override
        public Void execute(CommandContext commandContext) {
            ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
            // 处理进行中的任务
            handleDoingTask(commandContext);
            // 处理已经完成的任务
            handleCompletedTask(commandContext);
            targetFlowNodeIdList.forEach(targetId -> {
                UserTask userTask = (UserTask) bpmnModel.getFlowElement(targetId);
                // 创建子执行流,开启任务
                ExecutionEntity processExecution = executionEntityManager.findById(processInstanceId);
                ExecutionEntity childExecution = executionEntityManager.createChildExecution(processExecution);
                childExecution.setCurrentFlowElement(userTask);
    
                // 设置执行变量
                VariableInstanceEntityManager variableManager = commandContext.getVariableInstanceEntityManager();
                List<VariableInstanceEntity> variableInstanceEntities = varMap.get(userTask.getId());
                if (CollectionUtil.isNotEmpty(variableInstanceEntities)) {
                    variableInstanceEntities.forEach(var -> {
                        var.setExecution(childExecution);
                        variableManager.insert(var);
                    });
                }
                //设置执行人
                targetFlowNodeIdList.forEach(stepId ->{
                    if(assigneeMap.get(stepId) != null){
                        String assigneeStr = assigneeMap.get(stepId).toString();
                        //设置执行人,如果是多人的,参数应该传list
                        if(CommonEnum.NODE_ASSIGNEE_MULTI.getValue().equals(targetFlowNodeType)){
                            List<String> assigneeList = CommonUtil.strToList(assigneeStr);
                            childExecution.setVariable(stepId, assigneeList);
                        }else if(CommonEnum.NODE_ASSIGNEE_SINGLE.getValue().equals(targetFlowNodeType)){
                            childExecution.setVariable(stepId, assigneeStr);
                        }
                    }
                });
                commandContext.getExecutionEntityManager().insert(childExecution);
                // 交给activiti流转
                commandContext.getAgenda().planContinueProcessOperation(childExecution);
            });
            return null;
        }
    
        private void handleCompletedTask(CommandContext commandContext) {
            HistoricTaskInstanceEntityManager historicTaskManager = commandContext.getHistoricTaskInstanceEntityManager();
            VariableInstanceEntityManager variableInstanceEntityManager = commandContext.getVariableInstanceEntityManager();
            ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
            List<String> deleteExecutionIdList = new ArrayList<>();
            for (String str : toDealTaskDefIdList) {
                HistoricActivityInstanceQueryImpl query =
                        new HistoricActivityInstanceQueryImpl().activityId(str).processInstanceId(processInstanceId);
                List<HistoricActivityInstance> activityInstances =
                        commandContext.getHistoricActivityInstanceEntityManager().findHistoricActivityInstancesByQueryCriteria(query, new Page(0, Integer.MAX_VALUE));
                for (HistoricActivityInstance activity : activityInstances) {
                    HistoricActivityInstanceEntity activityEntity = (HistoricActivityInstanceEntity) activity;
                    //删除act_ru_execution表
                    ExecutionEntity executionEntity = executionEntityManager.findById(activity.getExecutionId());
                    //删除父Execution时,好像会自动删除他的子Execution,这里如果不加判断,到了删除子Execution时,就会报乐观锁异常,所以,
                    //每删除一个Execution,找出他的子Execution,这些子Execution不在进行删除
                    if(executionEntity!=null&&(deleteExecutionIdList.size()==0||!deleteExecutionIdList.contains(executionEntity.getId()))){
                        //因为外键约束,首先要删除variable表中的execution相关数据
                        List<VariableInstanceEntity> variableInstances =
                                variableInstanceEntityManager.findVariableInstancesByExecutionId(executionEntity.getId());
                        varMap.put(executionEntity.getActivityId(), variableInstances);
                        variableInstances.forEach(variableInstanceEntityManager::delete);
                        executionEntityManager.delete(executionEntity);
                        List<ExecutionEntity> childExecutions =
                                executionEntityManager.findChildExecutionsByParentExecutionId(executionEntity.getId());
                        deleteExecutionIdList.addAll(childExecutions.stream().map(ExecutionEntity::getId).collect(Collectors.toList()));
                    }
                    //删除act_hi_actinst表
                    activityEntity.setDeleted(true);
                    activityEntity.setDeleteReason(action);
                    commandContext.getHistoricActivityInstanceEntityManager().update(activityEntity);
                    historicTaskManager.delete(activity.getTaskId());
                }
            }
        }
    
        private void handleDoingTask(CommandContext commandContext) {
            ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
            HistoricTaskInstanceEntityManager historicTaskManager = commandContext.getHistoricTaskInstanceEntityManager();
            VariableInstanceEntityManager variableManager = commandContext.getVariableInstanceEntityManager();
            for (String str : toDealTaskDefIdList) {
                List<Execution> executionEntities = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).activityId(str).list();
                for (Execution parentExecution : executionEntities) {
                    //关闭未完成的任务执行流
                    List<ExecutionEntity> childExecutions =
                            executionEntityManager.findChildExecutionsByParentExecutionId(parentExecution.getId());
                    for (ExecutionEntity childExecution : childExecutions) {
                        //因为外键约束,首先要删除variable表中的execution相关数据
                        List<VariableInstanceEntity> variableInstances =
                                variableManager.findVariableInstancesByExecutionId(childExecution.getId());
                        varMap.put(parentExecution.getActivityId(), variableInstances);
                        variableInstances.forEach(variableManager::delete);
                        executionEntityManager.deleteExecutionAndRelatedData(childExecution, action, false);
                        // 删除历史实例
                        HistoricTaskInstanceQueryImpl query = new HistoricTaskInstanceQueryImpl().executionId(childExecution.getId()).processInstanceId(processInstanceId);
                        List<HistoricTaskInstance> historicTaskInstancesByQueryCriteria =
                                historicTaskManager.findHistoricTaskInstancesByQueryCriteria(query);
                        if (CollectionUtil.isNotEmpty(historicTaskInstancesByQueryCriteria)) {
                            for (HistoricTaskInstance historicTaskInstancesByQueryCriterion :
                                    historicTaskInstancesByQueryCriteria) {
                                commandContext.getHistoricTaskInstanceEntityManager().delete(historicTaskInstancesByQueryCriterion.getId());
                            }
                        }
                    }
                    //父执行流关闭
                    List<VariableInstanceEntity> variableInstances =
                            variableManager.findVariableInstancesByExecutionId(parentExecution.getId());
                    varMap.put(parentExecution.getActivityId(), variableInstances);
                    variableInstances.forEach(variableManager::delete);
                    ExecutionEntity parentExecution1 = (ExecutionEntity) parentExecution;
                    executionEntityManager.deleteExecutionAndRelatedData(parentExecution1, action, false);
                }
            }
        }
    }
    

    什么?还不知道怎样用Command类,不要慌,这就告诉你:

    managementService.executeCommand(new Jump2FrontTargetFlowNodeCommand("这里补充所需参数即可");
    

    写在最后:
    activiti对流程的回退确实没有很好的支持,但是如果对它了解的够深,你就会发现,它是提供了很多工具类和接口来帮助我们实现的,各位看官在实际开发当中,可以对本文的代码多加理解,然后结合自己实际需求,对代码查漏补缺,便可实现万恶的流程回退!

    展开全文
  • 在工作中,难免会遇到需要开发基于流程管理的系统,例如一些OA/审批系统、工厂管理、ERP等等,新手入门工作流是有一定难度的,但假如你遇到今天这篇文章,那么,你幸运了。 这个开源脚手架目前Start已经1.4k+,并且...

    本文转自:JAVA葵花宝典

    源码地址:https://gitee.com/agile-bpm/agile-bpm-basic

    前言

    在工作中,难免会遇到需要开发基于流程管理的系统,例如一些OA/审批系统、工厂管理、ERP等等,新手入门工作流是有一定难度的,但假如你遇到今天这篇文章,那么,你幸运了。

    这个开源脚手架目前Start已经1.4k+,并且近段时间开源作者还在更新迭代特性,致力于更方便使用,不优秀不推荐给你们,看到那个能闪瞎眼的GVP没有,盘它!GVP 是码云综合评定出的优秀开源项目的展示平台。加入 GVP 的开源项目有诸多条件需要满足。可见非常之优秀

    AgileBPM 敏捷流程管理开发平台

    AgileBPM 专注于解决企业工作流实施难的问题

    AgileBPM 是完全模块化的项目集合

    AgileBPM 致力于构建灵活的、可选择的软件生态圈,您可以依赖自身需要的模块来构建 BPM 企业应用。 当然我们也希望更多有志之士与我们一起共同打造 【基于统一底层、约定、规范的 更多可共享应用】的圈圈

    AgileBPM 已经经历了多次大版本迭代,前端从angular 1 到 目前的 iview 版本, 后端也从传统的 spring web工程模式 到 springboot1.x 再到 springboot2.x 直至目前微服务版本。系统架构成熟高效稳健,极具商业价值,目前有一下模块

    后端模块

    • 流程模块

    • 业务表单模块

    • 组织架构模块(目前有两款实现)

    • 独立的鉴权模块

    • 系统管理模块

    前端工程

    • angular版本的管理前端(历史原因所致)

    • vue版本的表单

    • vux ui 移动端

    • iview ui 的pc端门户前端

    AgileBPM 特点

    AgileBPM 是一个快速开发平台,可以通过代码生成器生成统一规范的界面通用的前后端。

    除此之外 AgileBPM 拥有超快的流程实施方案,天下武功唯快不破,两小时即可实施复杂业务流,(而普通基于 Activiti 的流程实施者至少要两周才能完成)

    AgileBPM 流程解决方案

    我们通过【业务对象】、【表单】、【流程引擎】共同协作来解决业务流实施难的痛点

    业务对象用来承载、持久化业务数据;表单则是业务数据的展示层;流程则用来驱动业务数据流转,三者协作完成流程实施

    业务对象

    业务对象由实体(表)配置而成,支持 任意数据结构 (一对多,一对一,多对多的关联关系),可以 跨库 来组织业务对象(并支持分布式事务)。而且难以置信的支持 N层

    任意的数据结构可以与任意形式的 json,javabean 进行无缝转换`

    业务表单

    表单完美的支撑了业务对象的展示,并支持 丰富的前端组件 和 字段级权限控制 ,最重要的是 支持自由扩展 ,就像写原生vue组件一样任性

    表单除了支持常见表单控件外,还支持布局设计、函数计算、日期计算、动态级联下拉框、动态查询、自定义对话框等高级控件,可能您对这些插件还不了解、但是他让我们在高级表单交互的应用中减少了很多的编码

    流程引擎

    目前基于 Activiti 5.22 no history 模式,高效、解耦、强大、灵活 !

    AgileBPM 极其注重开放封闭原则,在整合 Activiti 中一切功能皆插件,任何功能的扩展,均以插件的形式

    支持 在线设计流程,多版本管理,消息插件,多种人员策略配置的节点人员,节点功能按钮配置,节点自由跳转,驳回,会签,pc/移动端 节点表单,表单权限,节点groovy事件扩展脚本,外部子流程,自定义标题等流程功能

    其他说明

    鄙人是一个深沉内敛的程序员,不善于使用夸张辞藻,但是我相信AgileBPM是一个越用越好用,时不时境遇小惊喜的开发平台

    AgileBPM 项目模块总览脑图

    http://naotu.baidu.com/file/08a8388689b651e4848ed07845bb5c76?token=5ec9a04eaf5b83bf

    文档

    官方文档,性能报告,实施文档,版本更新等信息详见 http://www.agilebpm.cn

    开源项目地址

    码云 https://gitee.com/organizations/agile-bpm/projects

    截图

    表单布局

    表单设计

    表单源码

    流程表单界面

    流程全局配置

    流程节点配置

    了解更多请移步演示环境

    门户平台

    http://test1.agilebpm.cn/agilebpm-eip-ui

    流程开发设计平台

    http://test1.agilebpm.cn/index.html

    展开全文
  • package com.zdc.test; import java.util.List; import org.activiti.engine.HistoryService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines;...import org.activiti.engin
  • 企业应用,审批流程,表单,流程管理,SAAS
  • 注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定。 1、流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: identityService....
  • 前言在工作中,难免会遇到需要开发基于流程管理的系统,例如一些OA/审批系统、工厂管理、ERP等等,新手入门工作流是有一定难度的,但假如你遇到今天这篇文章,那么,你幸运了。...
  • 尤其针对流程引擎,业务越来越精通,面对大众推荐自家一款产品,欢迎合作。 面向合作伙伴以及有IT运维团队中大型企业提供新一代的企业级的数据IT一体化的业务管理平台工具,它基于流行的JAVA开源技术上构建,扩展...
  • package com.mf.component.workflow.activiti.cmd; import java.util.Map; import org.activiti.engine.ActivitiException; import org.activiti.engine.impl.RepositoryServiceImpl;...import org.activiti.engin
  • 基于activiti 流程快速开发平台   技术顾问:诸葛 手机:13928762576 邮箱:314134724@qq.com 【BPMX3系统原图】BPMX3在线试用地址:电信:http://office.jee-soft.cn:10080/bpm3/login.jsp网通:...
  • 流程属性:添加了流程分类属性(下拉联动控件)、是否自由流程选项、流程描述; 用户节点属性:添加了办理对象(部门,岗位,受理人,候选用户,角色)、办理权限(对应着表单顶部可操作的按钮菜单)、全局表单...
  • 流程引擎activiti

    2021-01-07 10:30:25
    1、Activiti简介
  • 最近对Activiti做了一些深入的研究,对Activiti流程机制有了些理解,对动态调整流程也有了一些实践方法。 现在好好总结一下,一来是对这段时间自己辛苦探索的一个记录,二来也是为后来者指指路~~~ 如下内容准备...
  • Activiti将推动业界的创新,因为BPM技术可以广泛而自由地被应用。通过实现这些想法以及开源社区的努力,也让Activiti成为事实上的BPM和BPMN标准执行。”   “这是一个对Spring开发人员和Java社区总体的发展...
  • Activiti自动部署流程文件

    千次阅读 2019-09-12 03:57:54
    Activiti工作流提供AutoDeployment,在项目启动时进行自动部署指定的xml工作流文件,实现方式有两种如下: activiti xml文件中进行配置 <bean id="processEngineConfiguration" class="org....
  • 流程引擎的API和服务 引擎API是与Activiti打交道的最常用方式。 我们从ProcessEngine开始, 创建它的很多种方法都已经在 配置章节中有所涉及。 从ProcessEngine中,你可以获得很多囊括工作流/BPM方法的服务。 ...
  • activiti 6.0自由跳转

    2019-06-12 09:49:04
    Task task = taskService.createTaskQuery() // 创建任务查询 .processInstanceId(自己的ProcessInstanceId) // 根据流程实例id查询 .singleResult(); //获取流程定义 ...
  • 在已有流程模型的的基础上,每个流程实例当前任务可以任意驳回/撤回或者向后续节点任意跳转而无需在相关的两个节点之间显示地画跳转路径(也就是所谓的“中国式”自由流),通过在Activiti流程组件T
  • 最近对Activiti做了一些深入的研究,对Activiti流程机制有了些理解,对动态调整流程也有了一些实践方法。 现在好好总结一下,一来是对这段时间自己辛苦探索的一个记录,二来也是为后来者指指路~~~ 如下内容准备...
  • Activiti如何实现流程的回退

    千次阅读 2018-07-24 12:09:13
    Activiti如何实现流程的回退 博客分类: Activiti Java SaaS 1.概述 编辑 流程回退一直以来是个老旧的难题,也一直没有好的解决方法,本文就来详述流程回退的解决办法。首先我们来分析一下不同的流程审批情况,...
  • Activiti中国式流程开源项目

    千次阅读 2018-07-04 12:52:33
    https://github.com/bluejoe2008/openwebflow彻底满足“中国特色”,并提供了安全的(同时也是优雅的)催办、代办、加签(包括前加签/后加签)、自由跳转(包括前进/后)、分裂节点等功能;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795
精华内容 318
关键字:

activiti自由流程