业之峰装饰官网浙江seo关键词
- 流程定义 : 流程图,,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 {@AutowiredRepositoryService 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());}// 查看当前正在运行的流程实例// 流程实例只会有一个,,,// 流程执行结束会为nullProcessInstance 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);}