day66_activiti_4

Activiti 第四天 组任务 网关课程安排:组任务: Candidate-user 候选人 Candidate-group 候选组(重点)网关(重点): ExclusiveGateway 排他网关 parallelGateway 并行网关 InclusiveGateway 包含网关综合案例(重点)1 复习采购流程监控查询(常用,重点) 当前流程
摘要由CSDN通过智能技术生成

Activiti 第四天 组任务 网关

课程安排:

组任务:
    Candidate-user 候选人
    Candidate-group 候选组(重点)

网关(重点):
    ExclusiveGateway 排他网关
    parallelGateway 并行网关
    InclusiveGateway 包含网关

综合案例(重点)

1 复习

采购流程监控查询(常用,重点)
当前流程实例查询,查询系统中当前正在运行所有流程,查看流程当前运行的状态
结束的流程信息,主要应用于对历史业务数据进行统计分析:
实现方法(掌握):

    分工明确,业务系统记录了业务数据,统计来源于业务系统。
    可能会需要acitiviti将流程的运行信息通过监听器写入业务系统中。
    监听器:
        TaskListener
        ExecutionListener

历史任务查询:
根据流程实例id查询该流程执行过的所有任务
根据用户id(通常是当前用户)查询该 用户所执行过的任务

流程变量:

流程变量类型包括 :
    简单类型:string double…
序列化类型:自定义的pojo,需要实现serializable接口。
流程变量作用域:
    Global全局变量:activiti中常用,作用域最大,是整个流程实例,当流程实例结束,global变量无效。
Local局部变量:作用域可以是一个任务Task、或一个执行分支Execution,当这个任务结束,local变量无效。

可以通过historyService查询历史流程变量。

注意:流程变量是activiti用于控制流程设置的变量,不建议流程变量中存储业务数据。

流程变量使用:(重点)
通过UEL表达式来使用流程变量控制流程的执行。

通过在连线上设置condition条件,条件使用UEL表达式,表达式中使用流程变量。

注意:

如果UEL表达式中流程变量不存在会跑出异常。
如果UEL表达式中流程变量存在,没有符合的条件,流程会执行结束。(排他网关可以避免)

全局变量设置:

    常用:
1》流程启动时设置流程变量,流程变量可以任何结点使用。
runtimeService.startProcessInstanceByKey(processDefinitionKey,variables)

2》任务完成时设置流程变量,在任务的后续结点可以使用该流程变量。
 taskService.complete(tasked, variables)

3》通过当前流程实例 的id设置流程变量
runtimeService.setVariables(processInstanceId, variables)
 通过:runtimeService.getVariables()方法获取全局变量
processInstanceId:必须是当前正在运行的流程实例id

4》通过当前待办任务的id设置流程变量。
taskService.setVariables(taskId, variables)
通过: taskService.getVariables()方法获取全局变量
taskId:必须是当前待办任务(未完成任务)的id

2 Candidate-user候选人

2.1 什么是候选人

采用固定分配方法给任务指定负责人,如果任务负责人出现变更,需要修改流程定义,就可以采用候选人分配方式,先给任务分配多个候选人,候选人通过拾取组任务进行个人任务办理。
这里写图片描述

给任务分配候选人,如果分配多个候选人中间使用半角逗号分隔。

2.2 什么是组任务

多个候选人有资格完成该 任务,这个任务叫做组任务。
组任务具备条件:
任务没有设置assignee任务负责人
任务具有候选人

2.3 候选人办理任务过程

第一步:给任务设置候选人(多个, 中间使用半角逗号分隔)
候选人是无法办理任务
第二步:候选人查询组任务
使用taskService查询,指定candidate候选人。
第三步:候选人拾取(claim)组任务
候选人拾取组任务后,该 候选人变为任务的负责人,该任务变为个人任务
如果候选人拾取组任务后,不想办理该 任务,可以将个人任务归还,该个人任务变为组任务

第四步:查询待办个人任务

第五步:办理任务

第六步:流程结束

2.4 Candidate-user办理任务api

候选人查询组任务
使用taskService指定candidateUser候选人查询组任务。




//任务查询对象 
        TaskQuery taskQuery = taskService.createTaskQuery();

        //候选人
        String candidateUser = "zhangsan";

        taskQuery.taskCandidateUser(candidateUser);

        //流程定义key
        String processDefinitionKey = "purchasingflow";

        taskQuery.processDefinitionKey(processDefinitionKey);

        List<Task> list = taskQuery.list();

注意:查询组任务,必须指定 candidateUser候选人,查询该 候选人有资格办理的组任务。

拾取组任务
通过taskService,指定任务id和候选人拾取任务:

TaskService taskService = processEngine.getTaskService();

        //组任务id
        String taskId = "5604";
        //任务候选人,claim拾取后该 候选人变为任务负责人
        String userId = "zhangsan";
        //任务拾取
        taskService.claim(taskId, userId);

注意:如果拾取人不是该任务的候选人也可以拾取成功,在拾取之前需要校验,该 候选人是否有资格拾取该 任务.

// 组任务id
        String taskId = "6004";
        // 任务候选人,claim拾取后该 候选人变为任务负责人
        String candidateUser = "zhangsan4";

        //根据候选人和组任务id查询,如果有记录说明该 候选人有资格拾取该 任务
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskCandidateUser(candidateUser).singleResult();

        if(task!=null){
            // 任务拾取
            taskService.claim(taskId, candidateUser);

            System.out.println("任务拾取成功");
        }

组任务归还

// 归还组任务,由个人任务变为组任务,还可以进行任务交接
    @Test
    public void setAssignee() {
        // 查询任务使用TaskService
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "6004";
        // 任务负责人
        String userId = "zhangsan2";

        //校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();

        if(task!=null){
            //如果设置为null,归还组任务,该 任务没有负责人
            taskService.setAssignee(taskId, null);
        }


    }

任务交接

任务负责人也可以将任务交给其它候选人办理该任务

代码如下:

@Test
    public void setAssigneeToCandidateUser() {
        // 查询任务使用TaskService
        TaskService taskService = processEngine.getTaskService();
        // 当前待办任务
        String taskId = "6004";
        // 任务负责人
        String userId = "zhangsan2";

        // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();

        if (task != null) {
            // 将此任务交给其它候选人办理该 任务
            String candidateuser = "zhangsan";
            // 根据候选人和组任务id查询,如果有记录说明该 候选人有资格拾取该 任务
            Task task2 = taskService.createTaskQuery().taskId(taskId)
                    .taskCandidateUser(candidateuser).singleResult();
            if (task2 != null) {
                // 才可以交接
                taskService.setAssignee(taskId, candidateuser);
            }

        }
    }

查询个人任务
参考个人任务章节
办理个人任务
参考个人任务章节

数据表跟踪

如果任务设置候选人,当前任务表中assignee(任务负责人)是空。
SELECT * FROM act_ru_task #当前任务表

![这里写图片描述](https://img-blog.csdn.net/20170417162639292?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1NETl9BRg==/font/5a6L5L2T/fontsize/400/fill/I0JBQ
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 activiti-explorer 和 mysql 的集成示例工程使用过程图解: 1. 下载并解压 activiti-explorer.war 文件,将其放入 Tomcat 服务器的 webapps 目录下。 2. 创建一个名为 activiti 的数据库,并将以下 SQL 语句执行: ``` CREATE TABLE `ACT_RE_DEPLOYMENT` ( `ID_` varchar(64) NOT NULL, `NAME_` varchar(255) DEFAULT NULL, `DEPLOY_TIME_` datetime DEFAULT NULL, PRIMARY KEY (`ID_`) ); CREATE TABLE `ACT_RE_PROCDEF` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `KEY_` varchar(255) DEFAULT NULL, `VERSION_` int(11) DEFAULT NULL, `DEPLOYMENT_ID_` varchar(64) DEFAULT NULL, `RESOURCE_NAME_` varchar(4000) DEFAULT NULL, `DGRM_RESOURCE_NAME_` varchar(4000) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `HAS_START_FORM_KEY_` tinyint(4) DEFAULT NULL, `HAS_GRAPHICAL_NOTATION_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_PROCDEF_DEPLOYMENT` (`DEPLOYMENT_ID_`), CONSTRAINT `ACT_FK_PROCDEF_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_GE_BYTEARRAY` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `BYTES_` longblob, `DEPLOYMENT_ID_` varchar(64) DEFAULT NULL, `GENERATED_` tinyint(4) DEFAULT NULL, PRIMARY KEY (`ID_`), KEY `ACT_IDX_BYTEARRAY_DEPLOYMENT` (`DEPLOYMENT_ID_`), CONSTRAINT `ACT_FK_BYTEARR_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `ACT_RE_DEPLOYMENT` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_ACTINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `EXECUTION_ID_` varchar(64) DEFAULT NULL, `ACT_ID_` varchar(255) DEFAULT NULL, `TASK_ID_` varchar(64) DEFAULT NULL, `CALL_PROC_INST_ID_` varchar(64) DEFAULT NULL, `ACT_NAME_` varchar(255) DEFAULT NULL, `ACT_TYPE_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_ACT_INST_PROC_INST` (`PROC_INST_ID_`), KEY `ACT_IDX_HI_ACT_INST_EXECUTION` (`EXECUTION_ID_`), KEY `ACT_IDX_HI_ACT_INST_TASK` (`TASK_ID_`), CONSTRAINT `ACT_FK_HI_ACTINST_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_HI_PROCINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_ACTINST_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_HI_ACTINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_PROCINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `BUSINESS_KEY_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `START_USER_ID_` varchar(255) DEFAULT NULL, `END_ACT_ID_` varchar(255) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `SUPER_PROCESS_INSTANCE_ID_` varchar(64) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_PRO_INST_BUSKEY` (`BUSINESS_KEY_`), KEY `ACT_IDX_HI_PROC_INST_START` (`START_TIME_`), KEY `ACT_IDX_HI_PROC_INST_END` (`END_TIME_`), KEY `ACT_IDX_HI_PROC_INST_SUPER` (`SUPER_PROCESS_INSTANCE_ID_`), CONSTRAINT `ACT_FK_HI_PROCINST_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_HI_TASKINST` ( `ID_` varchar(64) NOT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `TASK_DEF_KEY_` varchar(255) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `EXECUTION_ID_` varchar(64) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `PARENT_TASK_ID_` varchar(64) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `OWNER_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `START_TIME_` datetime DEFAULT NULL, `CLAIM_TIME_` datetime DEFAULT NULL, `END_TIME_` datetime DEFAULT NULL, `DURATION_` bigint(20) DEFAULT NULL, `DELETE_REASON_` varchar(4000) DEFAULT NULL, `PRIORITY_` int(11) DEFAULT NULL, `DUE_DATE_` datetime DEFAULT NULL, `FORM_KEY_` varchar(255) DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_HI_TASK_INST_PROC_DEF` (`PROC_DEF_ID_`), KEY `ACT_IDX_HI_TASK_INST_PROC_INST` (`PROC_INST_ID_`), KEY `ACT_IDX_HI_TASK_INST_EXEC` (`EXECUTION_ID_`), KEY `ACT_IDX_HI_TASK_INST_DELETE` (`DELETE_REASON_`), KEY `ACT_IDX_HI_TASK_INST_END` (`END_TIME_`), KEY `ACT_IDX_HI_TASK_INST_NAME` (`NAME_`), KEY `ACT_IDX_HI_TASK_INST_PRIORITY` (`PRIORITY_`), CONSTRAINT `ACT_FK_HI_TASKINST_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_HI_PROCINST` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_TASKINST_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_HI_TASKINST_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `ACT_RE_PROCDEF` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_RU_EXECUTION` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `BUSINESS_KEY_` varchar(255) DEFAULT NULL, `PROC_DEF_ID_` varchar(64) DEFAULT NULL, `ACT_ID_` varchar(255) DEFAULT NULL, `IS_ACTIVE_` tinyint(4) DEFAULT NULL, `IS_CONCURRENT_` tinyint(4) DEFAULT NULL, `IS_SCOPE_` tinyint(4) DEFAULT NULL, `IS_EVENT_SCOPE_` tinyint(4) DEFAULT NULL, `PARENT_ID_` varchar(64) DEFAULT NULL, `SUPER_EXEC_` varchar(64) DEFAULT NULL, `PROC_INST_ID_` varchar(64) DEFAULT NULL, `ROOT_PROC_INST_ID_` varchar(64) DEFAULT NULL, `REV_PARENT_TASK_` varchar(64) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `LOCK_TIME_` datetime DEFAULT NULL, `IS_COUNT_ENABLED_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `CACHED_ENT_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_EXEC_BUSKEY` (`BUSINESS_KEY_`), KEY `ACT_IDX_EXEC_PROCINST` (`PROC_INST_ID_`), KEY `ACT_IDX_EXEC_SUPER` (`SUPER_EXEC_`), KEY `ACT_IDX_EXEC_ROOT_PROC` (`ROOT_PROC_INST_ID_`), KEY `ACT_IDX_EXEC_ACT` (`ACT_ID_`), KEY `ACT_IDX_EXEC_PARENT` (`PARENT_ID_`), CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_RU_TASK` ( `ID_` varchar(64) NOT NULL, `REV_` int(11) DEFAULT NULL, `NAME_` varchar(255) DEFAULT NULL, `PARENT_TASK_ID_` varchar(64) DEFAULT NULL, `DESCRIPTION_` varchar(4000) DEFAULT NULL, `TASK_DEF_KEY_` varchar(255) DEFAULT NULL, `OWNER_` varchar(255) DEFAULT NULL, `ASSIGNEE_` varchar(255) DEFAULT NULL, `DELEGATION_` varchar(64) DEFAULT NULL, `PRIORITY_` int(11) DEFAULT NULL, `CREATE_TIME_` datetime DEFAULT NULL, `DUE_DATE_` datetime DEFAULT NULL, `CATEGORY_` varchar(255) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) DEFAULT '', PRIMARY KEY (`ID_`), KEY `ACT_IDX_TASK_PROCINST` (`PROC_INST_ID_`), KEY `ACT_IDX_TASK_EXEC` (`EXECUTION_ID_`), KEY `ACT_IDX_TASK_NAME` (`NAME_`), KEY `ACT_IDX_TASK_ASSIGNEE` (`ASSIGNEE_`), KEY `ACT_IDX_TASK_CREATE_TIME` (`CREATE_TIME_`), KEY `ACT_IDX_TASK_OWNER` (`OWNER_`), CONSTRAINT `ACT_FK_TASK_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_TASK_PARENT` FOREIGN KEY (`PARENT_TASK_ID_`) REFERENCES `ACT_RU_TASK` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE ); CREATE TABLE `ACT_GE_PROPERTY` ( `NAME_` varchar(64) NOT NULL, `VALUE_` varchar(300) DEFAULT NULL, `REV_` int(11) DEFAULT NULL, PRIMARY KEY (`NAME_`) ); ``` 3. 修改 activiti-explorer.war 文件下 WEB-INF/classes 目录下的 db.properties 文件,将其中的数据库配置改为: ``` db=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/activiti?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true jdbc.username=root jdbc.password=root ``` 其中,jdbc.url 中的数据库名应改为自己创建的数据库名称,jdbc.username 和 jdbc.password 应改为自己的数据库用户名和密码。 4. 启动 Tomcat 服务器,访问 http://localhost:8080/activiti-explorer 即可使用 activiti-explorer 示例工程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值