Activit工作流基础知识

一、画图方式

1.1、eclipse插件

1)Help - Install New Software…
2)点击【Add】, 输入地址
Name: Activiti BPMN 2.0 designer
Location: http://activiti.org/designer/update/
3)回到Install界面,点击【select All】,然后下一步
4)点击复选框,在Detail部分记得选中 “Contact all updates sites…” , 因为它会检查所有当前安装所需要的插件并可以被Eclipse下载
5)检查安装
安装完毕后,点击新建工程new - other… 打开面板,如下这说明ok
在这里插入图片描述

1.2、idea插件

1)Settings… - Plugins
2)搜索 actiBPM,安装后重启
3)说明:这个插件非官方,而且很久没有维护更新了,有些bug,不太好用

1.3、activiti画图war包

官方提供了activiti-app.war部署方式的画图包,官网地址

二、表说明

2.1、简介

Acitiviti表的命名都是以ACT_开头的,中间一个两个字符表示表的类别,整体与API服务对应,以前是23张表,现在28张表

2.2、命名规则

参考Activit数据库表结构说明
1)ACT_GE_ xxx:表示 general 全局通用数据及设置,各种情况都使用的数据
2)ACT_HI_ xxx:表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务等
3)ACT_ID_ xxx: 表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组等
4)ACT_RE_ xxx:表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)
5)ACT_RU_ xxx: 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录,保证了这些运行时的表小且快

2.3、主要表详情说明

1)通用数据表
ACT_GE_BYTEARRAY:二进制数据表,存储通用的流程定义和流程资源
ACT_GE_PROPERTY:系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
2)流程历史记录
ACT_HI_ACTINST:历史节点表
ACT_HI_ATTACHMENT:历史附件表
ACT_HI_COMMENT:历史意见表
ACT_HI_DETAIL:历史详情表,提供历史变量的查询
ACT_HI_IDENTITYLINK:历史流程人员表
ACT_HI_PROCINST:历史流程实例表
ACT_HI_TASKINST:历史任务实例表
ACT_HI_VARINST:历史变量表
3)用户用户组表
ACT_ID_GROUP:用户组信息表
ACT_ID_INFO:用户扩展信息表
ACT_ID_MEMBERSHIP:用户与用户组对应信息表
ACT_ID_USER:用户信息表
4)流程定义表
ACT_RE_DEPLOYMENT:部署信息表
ACT_RE_MODEL:流程设计模型部署表
ACT_RE_PROCDEF:流程定义数据表
5)运行实例表
ACT_RU_EVENT_SUBSCR:运行时事件 throwEvent、catchEvent 时间监听信息表
ACT_RU_EXECUTION:运行时流程执行实例
ACT_RU_IDENTITYLINK:运行时流程人员表,主要存储任务节点与参与者的相关信息
ACT_RU_JOB:运行时定时任务数据表
ACT_RU_TASK:运行时任务节点表
ACT_RU_VARIABLE:运行时流程变量数据表
6)其它表
ACT_EVT_LOG:事件日志
ACT_PROCDEF_INFO:流程定义的动态变更信息

三、表初始化

3.1、方式一(代码实现)

pom依赖

		<dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>6.0.0</version>
        </dependency>

application.properties配置

# 配置数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti-demo?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.activiti.database-schema-update=true
spring.activiti.check-process-definitions=false

启动类

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
...
初始代码
	@Test
    public void initTables() {
    
    

        // 创建流程引擎的配置
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration
                .createStandaloneProcessEngineConfiguration();
        cfg.setJdbcDriver("com.mysql.jdbc.Driver");
        cfg.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/activiti-demo");
        cfg.setJdbcUsername("root");
        cfg.setJdbcPassword("root");
        /**
         * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE  如果数据库里面没有activit的表,也不会创建
         * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP 创建表,使用完之后删除
         * ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE  如果数据库里面没有表,就创建
         *
         * dorp-create 代表如果数据库里面有表,那么先删除再创建
         *
         */
        //配置表的初始化的方式
        cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

        //得到流程引擎
        ProcessEngine engine = cfg.buildProcessEngine();
        System.out.println(engine);
    }

在这里插入图片描述

3.2、方式二

创建activiti.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	
   <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
   		<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
   		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti-demo"></property>
   		<property name="jdbcUsername" value="root"></property>
   		<property name="jdbcPassword" value="root"></property>
		<!--    		
		flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。
		true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。
		create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。
		drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。 -->
   		<property name="databaseSchemaUpdate" value="drop-create"></property>
   </bean>
</beans>
	@Test
	public void intiTables() {
    
    
		ProcessEngineConfiguration cfg= ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("/activiti.cfg.xmls");
		// 得到流程引擎
		ProcessEngine engine = cfg.buildProcessEngine();
		System.out.println(engine );

	}

3.3、方式三(读取默认配置文件)

	@Test
	public void intiTables() {
    
    
		//必须创建activiti.cfg.xml  并配置好数据库的信息
		ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
		System.out.println(engine);
	}

四、主要知识点

4.1、API介绍

//流程部署定义  act_ge_bytearray, act_re_deployment, act_re_model, act_re_procdef
    @Autowired
    private RepositoryService repositoryService;
    //流程运行 act_ru_event_subscr, act_ru_execution, act_ru_identitylink, act_ru_job, act_ru_task, act_ru_variable
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    //历史记录 act_hi_actinst, act_hi_attachment, act_hi_comment, act_hi_detail, act_hi_identitylink, act_hi_procinst, act_hi_taskinst, act_hi_varinst
    @Autowired
    private HistoryService historyService;
    ///页面表单
    @Autowired
    private FormService formService;
    //用户管理 act_id_group, act_id_info, act_id_membership, act_id_user
    @Autowired
    private IdentityService identityService;
    //管理器
    @Autowired
    private ManagementService managementService;

4.2、demo

1)新建demo01.bpmn文件
在这里插入图片描述
2)绘制流程图
定义流程模板ID和名称
在这里插入图片描述

任务处理人设置
在这里插入图片描述
判断条件设置
在这里插入图片描述

注:判断条件也常用【排他网关】实现
在这里插入图片描述
涉及变量:
${userId} 任务处理人
${days <= 3} 项目经理审批即可
${days > 3} 需要总经理审批

//部署定义流程(文件名改为demo01.bpmn20.xml)
    @Test
    public void deployProcess() {
    
    
        Deployment deploy = repositoryService.createDeployment().name("请教流程")
                .addClasspathResource("bpmn/demo01.bpmn20.xml")
                .deploy();
        System.out.println("流程部署ID : " + deploy.getId());
    }

    //启动流程
    @Test
    public void startProcess() {
    
    
        String businessKey = "BZ2021010510001"; //业务关联ID标识
        String proKey = "demo01_id_10001";
        Map<String, Object> vars = new HashMap<>();//流程变量设置
        vars.put("userId", "张三");//指定任务处理人

        runtimeService.startProcessInstanceByKey(proKey, businessKey, vars);
        System.out.println("启动流程成功");
    }

    //查询任务
    @Test
    public void queryTask() {
    
    
        List<Task> tasks = taskService.createTaskQuery()
                .taskAssignee("张三")  //查询条件指定
                .orderByTaskCreateTime().desc()  //排序方式
                .list();//结果集
        if (!CollectionUtils.isEmpty(tasks)) {
    
    
            for (Task task : tasks) {
    
    
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务办理人:" + task.getAssignee());
                System.out.println("执行实例ID:" + task.getExecutionId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("任务创建时间:" + task.getCreateTime());
                System.out.println("-----------------------------");
            }
        }
    }

    //办理任务
    @Test
    public void completeTask() {
    
    
        String taskId = "5002";
        Map<String, Object> vars = new HashMap<>();//流程变量设置
        vars.put("userId", "王五");//指定任务处理人
        vars.put("days", 4);//设置请假天数

        taskService.complete(taskId, vars);
        System.out.println("任务完成");
    }

    //删除部署定义流程
    @Test
    public void deleteProcessDef() {
    
    
        String deploymentId = "1";
        //根据流程部署id删除流程定义 如果当前id的流程正在执行,那么会报错
        //repositoryService.deleteDeployment(deploymentId);
        //根据流程部署id删除删除流程定义 如果当前id的流程正在执行,会把正在执行的流程数据删除 act_ru_*和act_hi_*表里面的数据
        repositoryService.deleteDeployment(deploymentId, true);
//		repositoryService.deleteDeploymentCascade(deploymentId);==repositoryService.deleteDeployment(deploymentId, true);
        System.out.println("删除成功");
    }
#RepositoryService
SELECT * FROM `act_ge_bytearray`; #二进制文件表
SELECT * FROM `act_re_deployment`;#流程部署表
SELECT * FROM `act_re_procdef`;#流程定义
SELECT * FROM `act_ge_property`;#工作流的ID算法和版本信息表

#RuntimeService   TaskService
SELECT * FROM `act_ru_execution`;#流程启动一次只要没有执行完,就会有一条数据
SELECT * FROM `act_ru_task`;#可能有多条数据
SELECT * FROM `act_ru_variable`;#记录流程运行时的流程变量
SELECT * FROM `act_ru_identitylink`;#存放流程办理人的信息

#HistroyService
SELECT * FROM `act_hi_procinst`;#历史流程实例
SELECT * FROM `act_hi_taskinst`;#历史任务实例
SELECT * FROM `act_hi_actinst`;#历史活动节点表
SELECT * FROM `act_hi_varinst`;#历史流程变量表
SELECT * FROM `act_hi_identitylink`;##历史办理人表
SELECT * FROM `act_hi_comment`;#批注表
SELECT * FROM `act_hi_attachment`;#附件表

#IdentityService
SELECT * FROM `act_id_group` #角色
SELECT * FROM `act_id_membership`#用户和角色之间的关系
SELECT * FROM `act_id_info`#用户的详细信息
SELECT * FROM `act_id_user`#用户表

4.3、actiBPM中文乱码问题

1)乱码效果
在这里插入图片描述
2)在idea\IntelliJ IDEA 2019.1.3\bin\idea64.exe.vmoptions文件中,追加编码设置

-Dfile.encoding=UTF-8

3)重启idea

猜你喜欢

转载自blog.csdn.net/shaixinxin/article/details/112078705