activiti实战

数据库

  • 1、act_ge_ 通用数据表,ge是general的缩写
  • 2、act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
  • 3、act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
  • 4、act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
  • 5、act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据

接口

activiti实战_第1张图片

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
  • RepositoryService:提供一系列管理流程部署和流程定义的API。
  • RuntimeService:在流程运行时对流程实例进行管理与控制。
  • TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
  • IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
  • ManagementService:提供对流程引擎进行管理和维护的服务。
  • HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
  • FormService:表单服务。

web流程设计工具

1.将Activiti提供的流程设计器应用activiti-app.war部署到Tomcat的webapps目录。
2.创建新的MySql数据库。修改activiti-app\WEB-INF\classes\META-INF\activiti-app目录下的db.properties配置文件改成使用MySql数据库(默认使用H2内存数据库,创建的模型重启后会丢失)。
3.开浏览器输入http://localhost:8080/activiti-explorer,使用用户kermit,密码kermit登录
activiti实战_第2张图片
activiti实战_第3张图片
activiti实战_第4张图片

设计一个请假流程

流程创建,并部署
activiti实战_第5张图片
activiti实战_第6张图片
流程信息如下:
activiti实战_第7张图片
发起申请,分别 是1天 和4天
activiti实战_第8张图片
把系统用户转换成activiti用户

	User user=identityService.newUser(*sysUser.getLoginName()*);
				user.setLastName(*sysUser.getUserName()*);
				user.setFirstName*(sysUser.getUserName()*);
				user.setEmail(*sysUser.getEmail()*);
				identityService.saveUser(user);

activiti实战_第9张图片创建群组(和请假流程的群组对应)

	Group  group = identityService.newGroup(*idGroup.getId()*);
		group.setName(*idGroup.getName()*);
		group.setType(*idGroup.getType()*);
		identityService.saveGroup(group);

activiti实战_第10张图片
用户群组绑定
activiti实战_第11张图片
查看任务

	//查出当前登录用户所在的用户组
		List groups = identityService.createGroupQuery()
				.groupMember(String.valueOf(getLoginName())).list();
		List groupNames = groups.stream()
				.map(group -> group.getId()).collect(Collectors.toList());
		  if (groups == null){
			return null;
		  }
//查询用户组的待审批请假流程列表
		List tasks = taskService.createTaskQuery()
				//指定任务
				//.processDefinitionKey(ActConstant.ProcessInstance_QingJia)
				.taskCandidateGroupIn(groupNames)
				.listPage(pageDomain.getPageNum() - 1, pageDomain.getPageSize());
  //获取下个节点 信息
		ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(newOaTask.getProcessInstanceId()).singleResult();
		if(pi==null){
			log.info("insertLeaveApply 流程 {} 结束" ,id);
		}else{
			Task nextTask = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
			log.info("insertLeaveApply 流程 {} 进行中 ,下个任务 {}",id,nextTask.getId());
		}

activiti实战_第12张图片

(经理审核)-经理角色用户登录【这个任务ID是第一条审批时候的,和上面的不一样,请忽略】

//查询当前审批节点
        Task task = taskService.createTaskQuery().taskId(id).singleResult();
        if (ActConstant.ProcessResult_PASS.equals(auditResult)){  
           //通过
            //设置流程参数
            Map args = new HashMap<>();
            args.put("auditId", task.getId());
            //设置审批任务的执行人
            taskService.claim(task.getId(), getLoginName());
            //完成审批任务
            taskService.complete(task.getId(), args);
        }else{
          //  不通过
            runtimeService.deleteProcessInstance(task.getProcessInstanceId(), task.getId());
        }

activiti实战_第13张图片

之后可以看到 流程流转…
activiti实战_第14张图片
(总监审核)-总监角色用户登录
activiti实战_第15张图片
流程都流转到hr
activiti实战_第16张图片
hr登录查看任务
activiti实战_第17张图片
审核一个
activiti实战_第18张图片

集成springboot

package com.platform.config;

import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * 工作流相关配置   @author liuli
 * 7大接口
 * RepositoryService:提供一系列管理流程部署和流程定义的API。
 * RuntimeService:在流程运行时对流程实例进行管理与控制。
 * TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
 * IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
 * ManagementService:提供对流程引擎进行管理和维护的服务。
 * HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
 * FormService:表单服务。
 *
 * 1、act_ge_ 通用数据表,ge是general的缩写
 * 2、act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
 * 3、act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
 * 4、act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
 * 5、act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据
 */
@Configuration
public class ActivitiConfig
{
    @Bean
    public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager)
    {
        SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(dataSource);
        /**
         * false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
         * true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
         * create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
         * drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
         */
        processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        processEngineConfiguration.setDatabaseType("mysql");
        processEngineConfiguration.setTransactionManager(transactionManager);
        // 流程图字体
        processEngineConfiguration.setActivityFontName("宋体");
        processEngineConfiguration.setAnnotationFontName("宋体");
        processEngineConfiguration.setLabelFontName("宋体");
        /**
         * 保存历史数据级别设置为full最高级别,便于历史数据的追溯
         * none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
         * activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
         * audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
         * full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
         */
        //使用系统业务自定义的
        processEngineConfiguration.setHistoryLevel(HistoryLevel.NONE);
        // 用户验证表改成使用视图
        processEngineConfiguration.setDbIdentityUsed(false);

        return processEngineConfiguration;
    }

    @Bean
    public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration)
    {
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean
                .setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
        return processEngineFactoryBean;
    }

    // 八大接口
    @Bean
    public RepositoryService repositoryService(ProcessEngine processEngine)
    {
        return processEngine.getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService(ProcessEngine processEngine)
    {
        return processEngine.getRuntimeService();
    }

    @Bean
    public TaskService taskService(ProcessEngine processEngine)
    {
        return processEngine.getTaskService();
    }

    @Bean
    public HistoryService historyService(ProcessEngine processEngine)
    {
        return processEngine.getHistoryService();
    }

    @Bean
    public FormService formService(ProcessEngine processEngine)
    {
        return processEngine.getFormService();
    }

    @Bean
    public IdentityService identityService(ProcessEngine processEngine)
    {
        return processEngine.getIdentityService();
    }

    @Bean
    public ManagementService managementService(ProcessEngine processEngine)
    {
        return processEngine.getManagementService();
    }

    @Bean
    public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine)
    {
        return processEngine.getDynamicBpmnService();
    }
}

时间和篇幅问题这里值提供了一个大致的思路和关键的业务代码,如有不懂可联系我 一起探讨

参考资料:
http://www.mossle.com/docs/activiti/index.html#activitiExplorer
https://juejin.im/post/5a4064365188252b145b4560
https://www.jianshu.com/p/701056e672a4

你可能感兴趣的:(工作流)