流程定义和流程实例
- 流程定义 : 流程图,,ProcessDefinition
- 流程实例: 我们启动的每一个具体的流程,就是一个流程实例,ProcessInstance
流程部署
放在resource/processes
下面的流程图会被自动部署
跟流程部署相关的三个表:
ACT_RE_PROCDEF
: 流程定义ACT_RE_DEPLOYMENT
: 流程部署ACT_GE_BYTEARRAY
: 部署完了,会在这个表里面存,流程定义的xml和图片,会存ACT_RE_DEPLOYMENT
的id
更新流程信息,如果流程的id没变,,version会+1,,, 如果流程的id变了,会新开
流程图中的targetNamespace
表示流程的分类:
流程定义api
跟流程实例流程部署的表,就是RE_
开头的表ACT_RE_DEPLOYMENT
ACT_RE_MODEL
ACT_RE_PROCDEF
都是通过RepositoryService
操作
流程默认是会自动注入的,,如果需要手动注入,需要配置:
# true: 表示去检查,,false:表示不检查,表示不会自动部署流程
flowable.check-process-definitions=false
flowable.process-definition-location-prefix=classpath:/processes/
# 指定流程定义xml文件后缀,,默认的后缀 是 **.bpmn20.xml,**.bpmn
flowable.process-definition-location-suffixes=**.bpmn20.xml,**.bpmn
@RestController
public class ProcessDeployController {
@Autowired
RepositoryService repositoryService;
@PostMapping("/deploy")
public RespBean deployProcess(MultipartFile file) throws IOException {
Deployment deploy = repositoryService
// 开始部署构建
.createDeployment()
.name("测试工作流")
// 部署表的分类
.category("流程分类")
.key("部署的key")
// 设置文件的输入流,, 通过这个输入流自动读取xml文件
.addInputStream(file.getOriginalFilename(), file.getInputStream())
// 完成部署
.deploy();
return RespBean.ok("部署成功",deploy.getId());
}
}
查询流程信息:
// 查询流程定义
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().latestVersion().list();
repositoryService.createProcessDefinitionQuery().processDefinitionKey("submit_an_expense_account")
.orderByProcessDefinitionVersion().desc().list();
// 使用sql查找
List<ProcessDefinition> list1 = repositoryService.createNativeProcessDefinitionQuery()
.sql("SELECT * FROM act_re_procdef WHERE key_ = #{key} order by version_ desc")
.parameter("key", "submit_an_expense_account")
.list();
// 查询部署表
repositoryService.createDeploymentQuery().deploymentCategory("流程分类").list();
// 删除部署,,删除之后ACT_GE_BYTEARRAY ,,和流程定义表,和部署表,都会被清空
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for (Deployment deployment : list) {
repositoryService.deleteDeployment(deployment.getId());
}
流程实例api
- 流程实例 : ProcessInstance :根据
流程定义
启动一个流程,,这个启动后的流程就是流程实例 - 执行实例: Execution : 是流程实例在运行时的
具体执行路径
,除开开始和结束节点- 在顺序流程中,流程实例和执行实例通常一一对应
- 在并行网关或者子流程中,一个流程实例可能对应多个执行实例
ACT_RU_TASK
: 当前所有待处理的用户任务(user task)
- ID_ 任务唯一标识
- NAME_ 任务名称(如“提交审批”、“经理审核”)
- ASSIGNEE_ 任务处理人(用户ID)
- PROC_INST_ID_ 关联的流程实例ID
- EXECUTION_ID_ 关联的执行实例ID
- TASK_DEF_KEY_ 任务定义Key(BPMN中定义的id,如userTask_approve)
- CREATE_TIME_ 任务创建时间
- DUE_DATE_ 任务截止时间
ACT_RU_EXECUTION
: 存储当前所有活跃的执行实例(Execution),表示流程实例的运行路径(如主流程,子流程,并行分支等):
- ID_ 执行实例唯一标识
- PROC_INST_ID_ 关联的流程实例ID
- PARENT_ID_ 父执行实例ID(用于子流程或并行分支)
- ACT_ID_ 当前活动节点ID(BPMN中的节点id)
- IS_ACTIVE_ 是否活跃(1=活跃,0=非活跃)
- IS_SCOPE_ 是否作用域(用于区分主流程和子流程)
ACT_RU_ACTINST
: 流程活动的执行情况,,存储所有正在运行或已完成的节点活动实例:
- ID_ 活动实例唯一标识
PROC_INST_ID_ 关联的流程实例ID
EXECUTION_ID_ 关联的执行实例ID
ACT_ID_ 节点ID(BPMN中的节点id)
ACT_NAME_ 节点名称(如“提交申请”、“审批通过”)
ACT_TYPE_ 节点类型(如userTask、exclusiveGateway、startEvent)
START_TIME_ 节点进入时间
END_TIME_ 节点退出时间(未完成时为null)
//发起一个流程:
// 设置流程发起人
Authentication.setAuthenticatedUserId("ww");
String processDefinitionKey = "leave";
// 流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId()+processInstance.getName());
// 查看这个人有哪些任务
List<Task> list = taskService.createTaskQuery().taskAssignee("ww").list();
for (Task task : list) {
System.out.println(task.getId()+task.getName());
// 完成任务
taskService.complete(task.getId());
}
// 查看当前正在运行的流程实例
// 流程实例只会有一个,,,
// 流程执行结束会为null
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId("xxx").singleResult();
/**
* 查看活动节点,,本质上查看 act_ru_execution
* 查看当前流程执行到哪一步了
*/
// 查询执行实例
List<Execution> executions = runtimeService.createExecutionQuery().list();
for (Execution execution : executions) {
List<String> activeActivityIds = runtimeService.getActiveActivityIds(execution.getId());
for (String activeActivityId : activeActivityIds) {
System.out.println("activeActivityId = " + activeActivityId);
}
}
// 删除流程实例
runtimeService.deleteProcessInstance("id","reason");
// 挂起的流程定义,,,是无法开启流程实例
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition processDefinition : list) {
// 挂起
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
// 激活
repositoryService.activateProcessDefinitionById(processDefinition.getId());
}
// 挂起的流程实例
// 对于一个挂起的流程实例,我们是无法执行相应的 task
// 流程实例的挂起,最终也会挂起流程定义
/**
* param01: 流程定义的id
* param02: 是否挂起这个流程定义所对应的流程实例
* parmas03: 挂起的时间 ,, null表示立即挂起,,也可以给一个具体的时间,表示到期之后才会挂起
*/
repositoryService.suspendProcessDefinitionById("definition id",true,null);
// 激活流程实例
repositoryService.activateProcessDefinitionById("definition id",true,null);
}