Activiti学习记录及查找下一个usertask任务 指定候选人 组 等

Activiti学习记录及查找下一个usertask任务 指定候选人 组 等

Activiti官方主页:

下载:(http://www.activiti.org/download.html)

用户指南:
(我们通过用户指南来学习Activiti)

在线API文档:

源码解析

Activiti的基础编程框架
在这里插入图片描述

引擎

ProcessEngine对象,Activiti 工作流引擎。这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。

所有的操作都是从获取引擎开始的,所以一般会把引擎作为全局变量

ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();

数据库表
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。

ACT_RE_*: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。

ACT_RU_*: 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_ID_*: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。

ACT_HI_*: 'HI’表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。

ACT_GE_*: 通用数据,用于不同场景下,如存放资源文件。

5项Service

不同的Service类对应不同的功能。

比如TaskService,是activiti的任务服务类。可以从这个类中获取任务的信息。

而HistoryService,则是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。

7项基本操作

设计流程图(各种组件,如连线、用户任务、网关)

流程定义增删改查

流程变量增删改查

启动流程定义

任务增删改查

完成任务

历史信息查询

了解23张表
这里有数据库表字段的详细说明

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。

  1.   ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
    
  2.   ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
    
  3.   ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
    
  4.   ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例,变量,任务等等。
    
  5.   ACT_GE_*: 通用数据, 用于不同场景下。
    

资源库流程规则表
1) act_re_deployment 部署信息表

2) act_re_model 流程设计模型部署表

3) act_re_procdef 流程定义数据表

运行时数据库表
  1) act_ru_execution 运行时流程执行实例表

2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息

3) act_ru_task 运行时任务节点表

4) act_ru_variable 运行时流程变量数据表

历史数据库表
  1) act_hi_actinst 历史节点表

2) act_hi_attachment 历史附件表

3) act_hi_comment 历史意见表

4) act_hi_identitylink 历史流程人员表

5) act_hi_detail 历史详情表,提供历史变量的查询

6) act_hi_procinst 历史流程实例表

7) act_hi_taskinst 历史任务实例表

8) act_hi_varinst 历史变量表

组织机构表
  1) act_id_group 用户组信息表

2) act_id_info 用户扩展信息表

3) act_id_membership 用户与用户组对应信息表

4) act_id_user 用户信息表

这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足

通用数据表
  1) act_ge_bytearray 二进制数据表

2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

PVM:Process Virtal Machine,流程虚拟机API暴露了流程虚拟机的POJO核心,流程虚拟机API描述了一个工作流流程必备的组件,这些组件包括:

PvmProcessDefinition(ACT_RE_PROCDEF):流程的定义,形象点说就是用户画的那个图。静态含义。

PvmProcessInstance:流程实例,用户发起的某个PvmProcessDefinition的一个实例,动态含义。

PvmActivity(ACT_RE_PROCDEF):流程中的一个节点

PvmTransition:衔接各个节点之间的路径,形象点说就是图中各个节点之间的连接线。

PvmEvent:流程执行过程中触发的事件

使用Activiti 获取当前节点的下一节点任务处理人

https://www.jianshu.com/p/5df0bef0dede

getActivities-ScopeImpl-ActivityImpl(activities)-processDefinition

ActivityImpl-ProcessDefinitionImpl-PvmProcessDefinition -getInitialActivityStack-ProcessDefinitionEntity(ACT_RE_PROCDEF) -getActivityList -repositoryService-RepositoryServiceImpl actAssigneeMapper?

PvmActivity-ActivityImpl

ProcessEngineConfigurationImpl
ProcessDeployer-deployProcess-ProcessEngineImpl-

addProcessImage -ProcessInstanceDetailPanel - RepositoryServiceImpl - createDeployment
ProcessDefinitionImageStreamResourceBuilder - AdminCompletedInstancesPanel - RepositoryServiceImpl

DeploymentBuilderImpl

DeployCmd

DeploymentBuilderImpl

private TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService() ;

private RuntimeService runtimeService = ProcessEngines.getDefaultProcessEngine().getRuntimeService();

private RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();

--------------------------------------------部署对象和流程定义相关的表---------------------------------------------

–部署对象信息表
SELECT T.*, T.ROWID FROM ACT_RE_DEPLOYMENT T;

–流程定义表
–ID_ 由KEY_ + VERSION_ + 随机生成是数组成
SELECT T.*, T.ROWID FROM ACT_RE_PROCDEF T where t.category_=‘1’ order by t.version_ asc;

–资源文件表
SELECT T.*, T.ROWID FROM ACT_GE_BYTEARRAY T;

–主键生成策略表
SELECT T.*, T.ROWID FROM ACT_GE_PROPERTY T;

------------------------------------------流程实例、执行对象、任务------------------------------------------------

–正在执行的执行对象表
– 执行ID_ 56 流程实例ID_ 56 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 正在运行的任务定义ID 【可变】 USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6
SELECT T.*, T.ROWID FROM ACT_RU_EXECUTION T;

–流程实例历史表 开始信息
–历史流程定义ID_ 56 流程S实例ID_ 56 业务KEY_10000001 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 开始任务节点ID STARTEVENT52B3145F-C133-7B3D-F50F-E6D48BA60EAE
SELECT T.*, T.ROWID FROM ACT_HI_PROCINST T;

–正在执行的任务对象表
–任务ID_ 68 执行ID_ 56 流程实例ID_ 56 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6
SELECT T.*, T.ROWID FROM ACT_RU_TASK T;

–历史任务流程实例信息
–历史任务ID_ 68 流程实例ID_ 56 执行实例ID_ 56 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6 表单KEY_ /PAGES/HOLIDAY/HOLIDAYMANAGE/HOLIDAYFORMHANDLE.JSP
–历史任务ID_ 74 流程实例ID_ 56 执行实例ID_ 56 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 任务节点ID USERTASK04A84BE1-1133-7B3D-F511-1D0B7BB0A668 表单KEY_ /PAGES/HOLIDAY/HOLIDAYMANAGE/HOLIDAYFORMVIEW.JSP
SELECT T.*, T.ROWID FROM ACT_HI_TASKINST T;

–所有活动节点历史任务表
–历史任务ID_58 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID 56 流程执行ID_ 56 任务节点ID_ STARTEVENT52B3145F-C133-7B3D-F50F-E6D48BA60EAE
–历史任务ID_67 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID 56 流程执行ID_ 56 任务节点ID_ USERTASKE736BEF8-4133-7B3D-F510-7B2DE7BEA8C6 任务ID_ 68
–历史任务ID_73 流程定义ID_ 3701622B-4133-7B3D-F50F-E14B4F21E847:1:55 流程实例ID 56 流程执行ID_ 56 任务节点ID_ USERTASK04A84BE1-1133-7B3D-F511-1D0B7BB0A668 任务ID_ 74
SELECT T.*, T.ROWID FROM ACT_HI_ACTINST T;

----------------------------------------流程变量信息--------------------------------------------------
–正在执行的流程变量信息
SELECT T.*, T.ROWID FROM ACT_RU_VARIABLE T;

–历史流程变量信息 存放历史表单重要信息
–流程实例ID_ 56 执行实例ID_ 56 任务ID_
SELECT T.*, T.ROWID FROM ACT_HI_VARINST T;

-------------------------------------------历史意见信息-----------------------------------------------

–历史审批意见表
–任务ID_ 68 流程定义ID_ 56
SELECT T.*, T.ROWID FROM ACT_HI_COMMENT T;

-----------------------------------------节点参与者信息-------------------------------------------------
–任务办理人表(个人任务、组任务)
SELECT T.*, T.ROWID FROM ACT_RU_IDENTITYLINK T;

–历史任务办理人表(个人任务、组任务)
SELECT T.*, T.ROWID FROM ACT_HI_IDENTITYLINK T;

–临时对象
SELECT T.*, T.ROWID FROM EA_IST.IST_APPR_BUSI_DATA T

获取下一个用户任务

/** 
 * 获取下一个用户任务信息  
 * @param String taskId     任务Id信息  
 * @return  下一个用户任务用户组信息  
 * @throws Exception 
 */  
public TaskDefinition getNextTaskInfo(String processInstanceId) throws Exception {  

    ProcessDefinitionEntity processDefinitionEntity = null;  

    String id = null;  

    TaskDefinition task = null;  

    //获取流程实例Id信息   
    //String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();  

    //获取流程发布Id信息   
    String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId();  

    processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)  
            .getDeployedProcessDefinition(definitionId);  

    ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();  

    //当前流程节点Id信息   
    String activitiId = execution.getActivityId();    

    //获取流程所有节点信息   
    List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();   

    //遍历所有节点信息   
    for(ActivityImpl activityImpl : activitiList){      
        id = activityImpl.getId();     
        if (activitiId.equals(id)) {
            //获取下一个节点信息   
            task = nextTaskDefinition(activityImpl, activityImpl.getId(), null, processInstanceId); 
            break;
        }
    }  
    return task;  
}  

/**  
 * 下一个任务节点信息,  
 *  
 * 如果下一个节点为用户任务则直接返回,  
 *  
 * 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值,  
 * 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务
 * @param ActivityImpl activityImpl     流程节点信息  
 * @param String activityId             当前流程节点Id信息  
 * @param String elString               排他网关顺序流线段判断条件
 * @param String processInstanceId      流程实例Id信息  
 * @return  
 */    
private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString, String processInstanceId){   

    PvmActivity ac = null;

    Object s = null;

    // 如果遍历节点为用户任务并且节点不是当前节点信息
    if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {
        // 获取该节点下一个节点信息
        TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())
                .getTaskDefinition();
        return taskDefinition;
    } else if("exclusiveGateway".equals(activityImpl.getProperty("type"))){// 当前节点为exclusiveGateway
        List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
        //outTransitionsTemp = ac.getOutgoingTransitions();

        // 如果网关路线判断条件为空信息
    //  if (StringUtils.isEmpty(elString)) {
            // 获取流程启动时设置的网关判断条件信息
            elString = getGatewayCondition(activityImpl.getId(), processInstanceId);

// }

        // 如果排他网关只有一条线路信息
        
        if (outTransitions.size() == 1) {
            return nextTaskDefinition((ActivityImpl) outTransitions.get(0).getDestination(), activityId,
                    elString, processInstanceId);
        } else if (outTransitions.size() > 1) { // 如果排他网关有多条线路信息
            for (PvmTransition tr1 : outTransitions) {
                s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息
                // 判断el表达式是否成立
                if (isCondition(activityImpl.getId(), StringUtils.trim(s.toString()), elString)) {
                    return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,
                            processInstanceId);
                }

            }
        }
    }else {
        // 获取节点所有流向线路信息
        List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
        List<PvmTransition> outTransitionsTemp = null;
        for (PvmTransition tr : outTransitions) {
            ac = tr.getDestination(); // 获取线路的终点节点
            // 如果流向线路为排他网关
            if ("exclusiveGateway".equals(ac.getProperty("type"))) {
                outTransitionsTemp = ac.getOutgoingTransitions();

                // 如果网关路线判断条件为空信息
                if (StringUtils.isEmpty(elString)) {
                    // 获取流程启动时设置的网关判断条件信息
                    elString = getGatewayCondition(ac.getId(), processInstanceId);
                }

                // 如果排他网关只有一条线路信息
                if (outTransitionsTemp.size() == 1) {
                    return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,
                            elString, processInstanceId);
                } else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息
                    for (PvmTransition tr1 : outTransitionsTemp) {
                        s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息
                        // 判断el表达式是否成立
                        if (isCondition(ac.getId(), StringUtils.trim(s.toString()), elString)) {
                            return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,
                                    processInstanceId);
                        }
                    }
                }
            } else if ("userTask".equals(ac.getProperty("type"))) {
                return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition();
            } else {
            }
        }
        return null;
    }
    return null;
}  

/** 
 * 查询流程启动时设置排他网关判断条件信息  
 * @param String gatewayId          排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息  
 * @param String processInstanceId  流程实例Id信息  
 * @return 
 */  
public String getGatewayCondition(String gatewayId, String processInstanceId) {  
    Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();
    Object object= runtimeService.getVariable(execution.getId(), gatewayId);
    return object==null? "":object.toString();  
}  

/** 
 * 根据key和value判断el表达式是否通过信息  
 * @param String key    el表达式key信息  
 * @param String el     el表达式信息  
 * @param String value  el表达式传入值信息  
 * @return 
 */  
public boolean isCondition(String key, String el, String value) {  
    ExpressionFactory factory = new ExpressionFactoryImpl();    
    SimpleContext context = new SimpleContext();    
    context.setVariable(key, factory.createValueExpression(value, String.class));    
    ValueExpression e = factory.createValueExpression(context, el, boolean.class);    
    return (Boolean) e.getValue(context);  //特别注意在这个位置需要设置gateWay的Id值–这个Id值与gatway流出的flow的el表达式的key要对应(不然程序在执行中会出错)
} 
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti中,候选人是用于指定具有某个任务的执行权限的一用户的标识符。任务可以分配给一个或多个候选人,并且只有属于该的用户才能执行该任务。这样可以实现任务的协作和分配。 要创建一个候选人,可以在流程定义文件(BPMN文件)中使用`<candidate-groups>`元素来指定。例如: ```xml <userTask id="task1" name="Task 1" activiti:assignee="${assignee}"> <extensionElements> <activiti:candidateGroups> <activiti:candidateGroup>group1</activiti:candidateGroup> <activiti:candidateGroup>group2</activiti:candidateGroup> </activiti:candidateGroups> </extensionElements> </userTask> ``` 上述示例中,`task1`任务会被分配给`group1`和`group2`这两个候选人。只有属于这两个的用户才能执行该任务。 在运行时,可以使用Activiti的API来查询候选人候选人信息,并将任务分配给具体的候选人。例如,可以使用以下代码将任务分配给具体的用户: ```java TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskCandidateGroup("group1").singleResult(); taskService.setAssignee(task.getId(), "user1"); ``` 上述代码中,首先通过`taskCandidateGroup`方法查询属于`group1`候选人任务,然后使用`setAssignee`方法将任务分配给具体的用户`user1`。 希望以上信息对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值