Activiti学习(二)

您所在的位置:网站首页 xml的概念 Activiti学习(二)

Activiti学习(二)

2023-04-06 01:01| 来源: 网络整理| 查看: 265

阿旭在凝视你

本文主要展示在上一篇的基础上,构建的一个activiti demo,效果图如下:

效果图配置文件pom.xml(dependencies部分) org.testng testng 6.8.8 test org.springframework spring-test org.springframework.boot spring-boot-starter-thymeleaf net.sourceforge.nekohtml nekohtml 1.9.22 org.mybatis mybatis 3.5.5 org.mybatis mybatis-spring 1.3.0 org.springframework.boot spring-boot-starter-web org.springframework spring-jdbc org.springframework spring-context com.alibaba fastjson 1.2.80 org.apache.tomcat tomcat-jdbc 8.5.23 mysql mysql-connector-java 8.0.27 org.projectlombok lombok 1.18.22 org.activiti activiti-spring-boot-starter-basic 6.0.0 org.activiti activiti-engine 6.0.0 org.activiti activiti-spring 6.0.0 application.properties

此demo笔者使用的properties格式,yaml亦可

# web端口号 server.port=8089 # activiti配置 # 检查流程定义 spring.activiti.check-process-definitions=true # 启动时是否检查并更新数据库表字段 spring.activiti.database-schema-update=true # thymeleaf配置 # 是否使用缓存 spring.thymeleaf.cache=false # 跳过thymeleaf语法验证 spring.thymeleaf.mode=LEGACYHTML5 # jabc配置 # 用户名 spring.datasource.username= # 密码 spring.datasource.password= # mysql连接地址 spring.datasource.url=jdbc:mysql://mybatis_activiti?characterEncoding=UTF8&useSSL=false # jdbc驱动类 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driveractiviti.xml

笔者使用的是xml配置,在启动类中显示声明读取此配置类(@ImportResource("classpath:activiti.xml"))

总结

使用pom文件声明下载并管理jar包(主要是activiti那几个)

使用application.properties配置数据库连接(用于activiti组件连库建表)

使用activiti.xml声明java对象(使用spring配置规则在配置文件里直接完成new对象)

和activiti相关的配置文件仅以上三个,其余略过

后台

单Controller,对外提供“/activiti/xxx”的url,demo全用的GET方法(毕竟GET容易调)

接口简介

url参数简介/activiti/getProcessDefineList无获取当前系统中所有流程定义/activiti/getProcessListkey(流程定义的key,在编写bpmn文件时定义)根据流程定义key值查询对应流程实例/activiti/getTaskListprocessInstanceId(流程实例ID)根据流程实例ID查询对应任务列表(待执行的,不含历史)/activiti/getProcessDetailprocessDefineId(流程定义ID)processInstanceId(流程实例ID)根据流程定义ID查询所有节点根据流程实例ID查询任务历史(含执行完和执行中的任务)/activiti/startProcesskey(流程定义的key,在编写bpmn文件时定义)根据流程定义key值启动一个流程实例/activiti/completeTaskid(任务ID)根据任务ID直接完成一个任务@Controller @RequestMapping("activiti") @Slf4j public class ActivitiController { @Autowired private RepositoryService repositoryService; @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private HistoryService historyService; @ResponseBody @RequestMapping("getProcessDefineList") public ResponseDTO getProcessDefineList() { // 使用repositoryService查询所有流程定义 List list = repositoryService.createProcessDefinitionQuery().list(); // 转换为页面显示数据 List defineDTOList = list.stream() .map(d -> ProcessDefineDTO.builder() .id(d.getId()) .name(d.getName()) .key(d.getKey()) .deploymentId(d.getDeploymentId()) .build()) .collect(Collectors.toList()); return ResponseDTO.builder() .data(defineDTOList) .build(); } @ResponseBody @RequestMapping("getProcessList") public ResponseDTO getProcessList(@RequestParam(value = "key", defaultValue = "") String key) { // 使用runtimeService查询某一流程定义key值下的所有流程实例 // 并转换为页面显示数据 List dtoList = runtimeService.createProcessInstanceQuery() .processDefinitionKey(key) .list() .stream() .map(p -> ProcessDTO.builder() .id(p.getId()) .deploymentId(p.getDeploymentId()) .description(p.getDescription()) .name(p.getName()) .processDefinitionId(p.getProcessDefinitionId()) .startTime(p.getStartTime()) .build()) .collect(Collectors.toList()); return ResponseDTO.builder() .data(dtoList) .build(); } @ResponseBody @RequestMapping("getTaskList") public ResponseDTO getTaskList(@RequestParam(value = "processInstanceId", defaultValue = "") String processInstanceId) { // 使用taskService查询某一流程实例id值下的所有待执行任务 // 并转换为页面显示数据 List dtoList = taskService.createTaskQuery() .processInstanceId(processInstanceId) .list() .stream() .map(p -> TaskDTO.builder() .id(p.getId()) .description(p.getDescription()) .name(p.getName()) .processDefinitionId(p.getProcessDefinitionId()) .assignee(p.getAssignee()) .createTime(p.getCreateTime()) .build()) .collect(Collectors.toList()); return ResponseDTO.builder() .data(dtoList) .build(); } @ResponseBody @RequestMapping("getProcessDetail") public ResponseDTO getProcessDetail(@RequestParam(value = "processInstanceId", defaultValue = "") String processInstanceId, @RequestParam(value = "processDefineId", defaultValue = "") String processDefineId) { // 使用repositoryService查询某一流程定义key值的BPMN模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefineId); // 获取该模型中的第一个流程(测试文件中只有一个流程) Process process = bpmnModel.getProcesses().get(0); // 遍历模型里的节点 List dtoList = process.getFlowElements().stream() // 过滤出“任务”类型的节点 .filter(f -> f instanceof org.activiti.bpmn.model.Task) // 转化为页面显示数据 .map(f -> TaskDTO.builder() .id(f.getId()) .name(f.getName()) .status("未开始") .build()) .collect(Collectors.toList()); // 查询该流程实例id的所有任务历史 List hisList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .list(); // 遍历所有任务节点 for (TaskDTO taskDTO : dtoList) { for (HistoricTaskInstance his : hisList) { // 按节点名称匹配 if (his.getName().equals(taskDTO.getName())) { // 根据结束时间判定是否完成 if (his.getEndTime() == null) { taskDTO.setStatus("进行中"); } else { taskDTO.setStatus("完成"); } } } } return ResponseDTO.builder() .data(dtoList) .build(); } @ResponseBody @RequestMapping("startProcess") public ResponseDTO startProcess(@RequestParam(value = "key", defaultValue = "") String key) { // 调用runtimeService启动一个该流程定义的流程 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key); // 返回该流程 return ResponseDTO.builder() .data(ProcessDTO.builder() .id(processInstance.getId()) .name(processInstance.getName()) .end(processInstance.isEnded()) .deploymentId(processInstance.getDeploymentId()) .description(processInstance.getDescription()) .processDefinitionId(processInstance.getProcessDefinitionId()) .startTime(processInstance.getStartTime()) .build()) .build(); } @ResponseBody @RequestMapping("completeTask") public ResponseDTO completeTask(@RequestParam(value = "id", defaultValue = "") String id) { // 查询任务 Task task = taskService.createTaskQuery().taskId(id).singleResult(); // 完成任务 taskService.complete(task.getId()); // 返回任务基本信息 return ResponseDTO.builder() .data(TaskDTO.builder() .id(task.getId()) .description(task.getDescription()) .name(task.getName()) .processDefinitionId(task.getProcessDefinitionId()) .assignee(task.getAssignee()) .createTime(task.getCreateTime()) .build()) .build(); } }前端

单页面vue,全是基础的代码显示,附效果图

效果图(梅开二度)流程定义

使用/activiti/getProcessDefineList接口查询并显示所有流程定义信息

每一行最后追加行操作按钮

选中按钮:点击后刷新流程实例区域内的数据

启动流程:调用/activiti/startProcess接口启动一个流程,此demo跳过了启动参数验证

流程实例

使用/activiti/getProcessList接口查询并显示某一流程定义下的流程

每一行最后追加行操作按钮

选中流程:点击后刷新任务区域和流程进度区域数据

任务

使用/activiti/getTaskList接口查询并显示某一流程实例下的任务

每一行最后追加行操作按钮

完成任务:调用/activiti/completeTask接口完成任务,此demo跳过了启动参数的验证

最后推荐一波,有钱的老爷们可以试试这款咖啡,我喝了一年多了,每次放一杯底,加上牛奶后加热两分钟,之后就可以便眺望窗外边喝咖啡了



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3