activiti7入门_react demo

activiti7入门_react demo项目框架描述项目基于springboot2.1.1<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.1.RELE…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

项目框架描述

项目基于springboot 2.1.1

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
    <relativePath/>
</parent>

搭建环境

一、引入Activiti所需所需包

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M1</version>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二、配置Activit

# activiti
#1.flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
spring.activiti.database-schema-update=true
#检测历史表是否存在
spring.activiti.db-history-used=true
#记录历史等级 可配置的历史级别有none, activity, audit, full
spring.activiti.history-level=full
#校验流程文件,默认校验resources下的processes文件夹里的流程文件
spring.activiti.check-process-definitions=false
security.basic.enabled=false

三、配置不使用springsecurity

@SpringBootApplication(
        exclude = { 
   
                org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
                org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class
        }
)

常用API

部署一个流程定义

@Test
public void createDeploy() { 
   
    RepositoryService repositoryService = processEngine.getRepositoryService();

    Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("processes/ddsplc.bpmn")//添加bpmn资源
// .addClasspathResource("diagram/holiday.png")
            .name("销售订单发货流程")
            .deploy();
    System.out.println("流程部署id:" + deployment.getName());
    System.out.println("流程部署名称:" + deployment.getId());
}

根据任务ID查询下一步审核信息(按钮信息,如通过,驳回)

public List<String> queryOutComeByTaskId(String taskId) { 
   
    List<String> outComeList = new ArrayList<>();
    Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
    if (task != null) { 
   
        String processDefinitionId = task.getProcessDefinitionId();
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
        Process process = bpmnModel.getProcesses().get(0);
        String taskDefinitionKey = task.getTaskDefinitionKey();
        UserTask userTask = (UserTask) process.getFlowElement(taskDefinitionKey);
        List<SequenceFlow> sequenceFlowList = userTask.getOutgoingFlows();
        for (SequenceFlow sequenceFlow : sequenceFlowList) { 
   
            String sequenceFlowName = sequenceFlow.getName();
            outComeList.add(sequenceFlowName);
        }
    }
    return outComeList;
}

开始任务

/** * processDefinitionKey 流程定义key ddsplc * businessKey 业务数据id * variables 参数 用以确定下一步的走向或者指定审核人是谁 */
runtimeService.startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);

开始并完成任务

ProcessInstance instance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
List<Task> list = (this.taskService.createTaskQuery().processInstanceId(instance.getId())).active().list();
for (Task task : list) { 
   
    taskService.complete(task.getId());
}

查询任务

List<ActFlowDto> actFlowDtos = new ArrayList<>();
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(identifier).list();
if (taskList != null && !taskList.isEmpty()) { 
   
   for (Task task : taskList) { 
   
       ActFlowDto actFlowDto = new ActFlowDto();
       String processInstanceId = task.getProcessInstanceId();
       ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
       actFlowDto.setBusinessKey(processInstance.getBusinessKey());
       actFlowDto.setAssignee(task.getAssignee());
       actFlowDto.setTaskId(task.getId());
       actFlowDtos.add(actFlowDto);
   }
} else { 
   
   log.debug(String.format("task not found. processDefinitionKey=[%s], identifier=[%s]", processDefinitionKey, identifier));
}

可能会遇到的报错信息

Bpmn文件乱码

在这里插入图片描述
打开如下文件(有的人目录是idea程序所在目录,有的是用户下面的目录)
在这里插入图片描述
添加-Dfile.encoding=UTF-8
需要注意的是idea64.exe.vmoptions 这个文件可能有多个,别改错了。
在这里插入图片描述

启动报错activiti-发现了以元素 ‘process’ 开头的无效内容

报错信息如下
在这里插入图片描述
解决方法
通过其他文本编辑器打开bpmn文件,做如下操作
在这里插入图片描述

需要登录验证

有可能集成好activiti后,启动项目访问的时候会跳转到一个登陆页
在这里插入图片描述
出现这个问题的根本原因是因为Activiti7里面强引用了SpringSecurity。所以我们要关闭这个功能。如何关闭?

security
	basic
		enabled=false

启动类新增如下代码

@SpringBootApplication(
        exclude = { 
   
                org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
                org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class
        }
)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179174.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IntentService的原理及使用

    在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Ac

    2022年4月7日
    37
  • 【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock

    【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock多线程通同步与互斥示例下面示例是一个相机处理和显示分开的两个线程:定义临界区使用单锁#define_CRITICAL_LOCK(critical_lock) CSingleLocklocker(&critical_lock); locker.Lock();CCriticalSection_critical_data2;启动线程,创建四个事件:停止线程事件、处理图

    2022年7月20日
    9
  • pytest的使用_子程序调用次数不管用

    pytest的使用_子程序调用次数不管用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月28日
    4
  • 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)「建议收藏」

    扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)「建议收藏」扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)文章目录扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)理论讲解KF和EKF模型对比雅可比矩阵计算计算实例应用实例线性模型CV模型:CA模型非线性模型CTRV模型:CTRV实例(python)smalldemo抛物线demo飞机高度demoC++实例参考文献我们上篇提到的卡尔曼滤波是用于线性系统,预测(运动)模型和观测模型是在假设高斯和线性情况下进行的。简单的卡尔曼滤波必须应用在符合高斯分布

    2022年6月16日
    40
  • vuerouter配置_route删除路由

    vuerouter配置_route删除路由介绍VueRouter是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:嵌套的路由/视图表模块化的、基于组件的路由配置路由参

    2022年7月29日
    5
  • pycharm减少缩进快捷键_pycharm的缩进

    pycharm减少缩进快捷键_pycharm的缩进整体缩进:鼠标拉选住代码块,按下tab键。反向缩进:鼠标拉选住代码块,按下tab+shift键。

    2022年8月27日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号