diff --git a/service-oa/pom.xml b/service-oa/pom.xml index 9f66b76..d2d541d 100644 --- a/service-oa/pom.xml +++ b/service-oa/pom.xml @@ -44,6 +44,19 @@ velocity-engine-core 2.0 + + + + org.activiti + activiti-spring-boot-starter + 7.1.0.M6 + + + mybatis + org.mybatis + + + @@ -70,6 +83,7 @@ **/*.yml **/*.properties **/*.xml + **/*.png false diff --git a/service-oa/src/main/resources/application-dev.yml b/service-oa/src/main/resources/application-dev.yml index dc183dd..ce4adfd 100644 --- a/service-oa/src/main/resources/application-dev.yml +++ b/service-oa/src/main/resources/application-dev.yml @@ -10,9 +10,9 @@ spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true - username: root - password: root + url: jdbc:mysql://43.143.164.194:3306/guigu-oa?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true + username: admin + password: admin jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 @@ -28,3 +28,18 @@ spring: max-wait: -1 #最大阻塞等待时间(负数表示没限制) max-idle: 5 #最大空闲 min-idle: 0 #最小空闲 + activiti: + # false:默认,数据库表不变,但是如果版本不对或者缺失表会抛出异常(生产使用) + # true:表不存在,自动创建(开发使用) + # create_drop: 启动时创建,关闭时删除表(测试使用) + # drop_create: 启动时删除表,在创建表 (不需要手动关闭引擎) + database-schema-update: true + #监测历史表是否存在,activities7默认不开启历史表 + db-history-used: true + #none:不保存任何历史数据,流程中这是最高效的 + #activity:只保存流程实例和流程行为 + #audit:除了activity,还保存全部的流程任务以及其属性,audit为history默认值 + #full:除了audit、还保存其他全部流程相关的细节数据,包括一些流程参数 + history-level: full + #校验流程文件,默认校验resources下的process 文件夹的流程文件 + check-process-definitions: true diff --git a/service-oa/src/main/resources/process/qingjia.bpmn20.xml b/service-oa/src/main/resources/process/qingjia.bpmn20.xml new file mode 100644 index 0000000..64ca3e2 --- /dev/null +++ b/service-oa/src/main/resources/process/qingjia.bpmn20.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service-oa/src/main/resources/process/qingjia.png b/service-oa/src/main/resources/process/qingjia.png new file mode 100644 index 0000000..b9a7557 Binary files /dev/null and b/service-oa/src/main/resources/process/qingjia.png differ diff --git a/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java new file mode 100644 index 0000000..bf6e25b --- /dev/null +++ b/service-oa/src/test/java/com/atguigu/auth/activti/ProcessTest.java @@ -0,0 +1,195 @@ +package com.atguigu.auth.activti; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.repository.Deployment; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * ClassName: ProcessTest + * Package: com.atguigu.auth.activti + * + * @author yovinchen + * @Create 2023/6/11 20:03 + */ + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ProcessTest { + + @Autowired + private RepositoryService repositoryService; + + + @Autowired + private RuntimeService runtimeService; + + + @Autowired + private TaskService taskService; + + + @Autowired + private HistoryService historyService; + + /** + * 单个流程挂起 + */ + @Test + public void SingleSuspendProcessInstance() { + String processInstanceId = "8bdff984-ab53-11ed-9b17-f8e43b734677"; + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + //获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的 + boolean suspended = processInstance.isSuspended(); + if (suspended) { + runtimeService.activateProcessInstanceById(processInstanceId); + System.out.println("流程实例:" + processInstanceId + "激活"); + } else { + runtimeService.suspendProcessInstanceById(processInstanceId); + System.out.println("流程实例:" + processInstanceId + "挂起"); + } + } + + /** + * 全部流程实例挂起 + */ + @Test + public void suspendProcessInstance() { + ProcessDefinition qingjia = repositoryService.createProcessDefinitionQuery().processDefinitionKey("qingjia").singleResult(); + // 获取到当前流程定义是否为暂停状态 suspended方法为true是暂停的,suspended方法为false是运行的 + boolean suspended = qingjia.isSuspended(); + if (suspended) { + // 暂定,那就可以激活 + // 参数1:流程定义的id 参数2:是否激活 参数3:时间点 + repositoryService.activateProcessDefinitionById(qingjia.getId(), true, null); + System.out.println("流程定义:" + qingjia.getId() + "激活"); + } else { + repositoryService.suspendProcessDefinitionById(qingjia.getId(), true, null); + System.out.println("流程定义:" + qingjia.getId() + "挂起"); + } + } + + /** + * 启动流程实例,添加businessKey + */ + @Test + public void startUpProcessAddBusinessKey() { + String businessKey = "1"; + // 启动流程实例,指定业务标识businessKey,也就是请假申请单id + ProcessInstance processInstance = runtimeService. + startProcessInstanceByKey("qingjia", businessKey); + // 输出 + System.out.println("业务id:" + processInstance.getBusinessKey()); + } + + /** + * 删除流程定义 + */ + public void deleteDeployment() { + //部署id + String deploymentId = "5b997a98-0868-11ee-9ba7-6294623ad4e1"; + //删除流程定义,如果该流程定义已有流程实例启动则删除时出错 + repositoryService.deleteDeployment(deploymentId); + //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式 + repositoryService.deleteDeployment(deploymentId, true); + } + + /** + * 查询流程定义 + */ + @Test + public void findProcessDefinitionList() { + List definitionList = repositoryService.createProcessDefinitionQuery() + .orderByProcessDefinitionVersion() + .desc() + .list(); + //输出流程定义信息 + for (ProcessDefinition processDefinition : definitionList) { + System.out.println("流程定义 id=" + processDefinition.getId()); + System.out.println("流程定义 name=" + processDefinition.getName()); + System.out.println("流程定义 key=" + processDefinition.getKey()); + System.out.println("流程定义 Version=" + processDefinition.getVersion()); + System.out.println("流程部署ID =" + processDefinition.getDeploymentId()); + } + } + + /** + * 查询已处理历史任务 + */ + @Test + public void findProcessedTaskList() { + //张三已处理过的历史任务 + List list = historyService.createHistoricTaskInstanceQuery().taskAssignee("zhangsan").finished().list(); + for (HistoricTaskInstance historicTaskInstance : list) { + System.out.println("流程实例id:" + historicTaskInstance.getProcessInstanceId()); + System.out.println("任务id:" + historicTaskInstance.getId()); + System.out.println("任务负责人:" + historicTaskInstance.getAssignee()); + System.out.println("任务名称:" + historicTaskInstance.getName()); + } + } + + /** + * 完成任务 + */ + @Test + public void completTask() { + Task task = taskService.createTaskQuery().taskAssignee("zhangsan") //要查询的负责人 + .singleResult();//返回一条 + + //完成任务,参数:任务id + taskService.complete(task.getId()); + } + + /** + * 查询当前个人待执行的任务 zhangsan + */ + @Test + public void findPendingTaskList() { + //任务负责人 + String assignee = "zhangsan"; + List list = taskService.createTaskQuery().taskAssignee(assignee)//只查询该任务负责人的任务 + .list(); + for (Task task : list) { + System.out.println("流程实例id:" + task.getProcessInstanceId()); + System.out.println("任务id:" + task.getId()); + System.out.println("任务负责人:" + task.getAssignee()); + System.out.println("任务名称:" + task.getName()); + } + } + + /** + * 启动流程实例 + */ + @Test + public void startUpProcess() { + //创建流程实例,我们需要知道流程定义的key + ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia"); + //输出实例的相关信息 + System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); + System.out.println("流程实例id:" + processInstance.getId()); + System.out.println("当前活动Id:" + processInstance.getActivityId()); + } + + /** + * 单个文件部署 + */ + @Test + public void deployProcess() { + // 流程部署 + Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/qingjia.bpmn20.xml").addClasspathResource("process/qingjia.png").name("请假申请流程").deploy(); + System.out.println(deploy.getId()); + System.out.println(deploy.getName()); + } +}