Flowable流程开发笔记

发布时间:2026/7/31 5:35:34

Flowable流程开发笔记 Flowable 流程引擎开发笔记常用表运行时表流程运行中才有数据结束后自动清理表名存什么说明ACT_RU_TASK当前待办任务ASSIGNEE_为 null 表示在候选人池有值表示已被认领ACT_RU_IDENTITYLINK任务的候选人/参与者TYPE_candidate是候选人assignee是指派人ACT_RU_VARIABLE流程变量存流程实例级别的变量数据ACT_RU_EXECUTION流程执行实例一个流程实例可能有多条执行线会签时ACT_RU_ACTINST当前活跃的活动节点当前流程走到哪个节点了历史表流程结束后数据移到这些表表名存什么说明ACT_HI_TASKINST所有任务含已完成的流程的所有审批记录都在这里ACT_HI_PROCINST所有流程实例START_USER_ID_是发起人ACT_HI_ACTINST所有活动节点历史每个节点的开始、结束时间ACT_HI_VARINST历史流程变量流程变量变更记录其他表名存什么说明ACT_RE_PROCDEF流程定义部署的 BPMN 模型ACT_RE_DEPLOYMENT部署记录每次发布流程的版本常用查询找当前待办-- 查某人的待办SELECT*FROMACT_RU_TASKWHEREASSIGNEE_loginName;-- 查候选人池里的任务SELECT*FROMACT_RU_TASKWHEREASSIGNEE_ISNULL;查候选人-- 查某个 task 的所有候选人SELECT*FROMACT_RU_IDENTITYLINKWHERETASK_ID_taskIdANDTYPE_candidate;-- 查 group 下的候选人SELECT*FROMACT_RU_IDENTITYLINKWHEREGROUP_ID_groupIdANDTYPE_candidate;查流程历史-- 查某个流程实例的所有审批记录SELECT*FROMACT_HI_TASKINSTWHEREPROC_INST_ID_流程实例IDORDERBYSTART_TIME_;-- 查某人发起的所有流程SELECT*FROMACT_HI_PROCINSTWHERESTART_USER_ID_loginName;TaskTransferServicepackagecom.oda.apps.iplm.service.impl;importcn.hutool.core.util.StrUtil;importlombok.extern.slf4j.Slf4j;importorg.flowable.engine.TaskService;importorg.flowable.task.api.Task;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;Slf4jServicepublicclassTaskTransferService{AutowiredprivateTaskServicetaskService;/** * 直接转办给新人适用于已签收/认领的任务 */Transactional(rollbackForException.class)publicvoidreassign(StringtaskId,StringnewAssignee){TasktasktaskService.createTaskQuery().taskId(taskId).singleResult();if(tasknull)thrownewRuntimeException(任务不存在taskId);taskService.setAssignee(taskId,newAssignee);taskService.addComment(taskId,task.getProcessInstanceId(),转办task.getAssignee() → newAssignee);log.info(转办 {}/{} : {} → {},taskId,task.getName(),task.getAssignee(),newAssignee);}/** * 替换候选人池移除旧人加入新人 * 适用场景任务没人认领离职的人从候选人池移除新人加进去 */Transactional(rollbackForException.class)publicvoidreplaceCandidate(StringtaskId,StringoldUser,StringnewUser){TasktasktaskService.createTaskQuery().taskId(taskId).singleResult();if(tasknull)thrownewRuntimeException(任务不存在taskId);// 如果旧人已经签收了一并转交if(StrUtil.isNotBlank(task.getAssignee())task.getAssignee().equals(oldUser)){taskService.setAssignee(taskId,newUser);}taskService.deleteCandidateUser(taskId,oldUser);taskService.addCandidateUser(taskId,newUser);taskService.addComment(taskId,task.getProcessInstanceId(),候选人变更oldUser → newUser);log.info(候选人变更 {}/{} : {} → {},taskId,task.getName(),oldUser,newUser);}/** * 通过流程实例ID转办 */Transactional(rollbackForException.class)publicvoidtransferByProcessInstance(StringprocessInstanceId,StringoldUser,StringnewUser){ListTasktaskstaskService.createTaskQuery().processInstanceId(processInstanceId).active().list();for(Tasktask:tasks){if(StrUtil.isNotBlank(task.getAssignee())task.getAssignee().equals(oldUser)){taskService.setAssignee(task.getId(),newUser);}taskService.deleteCandidateUser(task.getId(),oldUser);taskService.addCandidateUser(task.getId(),newUser);}log.info(流程 {} 转办{} → {},processInstanceId,oldUser,newUser);}}调用方式AutowiredprivateTaskTransferServicetaskTransferService;// 场景一任务已被离职的人签收直接转给新人taskTransferService.reassign(taskId,新人LoginName);// 场景二任务还在候选人池替换候选人taskTransferService.replaceCandidate(taskId,离职人LoginName,新人LoginName);// 场景三只有流程实例ID不知道taskIdtaskTransferService.transferByProcessInstance(processInstanceId,离职人LoginName,新人LoginName);几个概念概念说明taskId任务ID具体某个审批节点的IDACT_RU_TASK.ID_processInstanceId流程实例ID整条审批的IDcreateWorkflow的返回值assignee指派人任务被谁签收了不为 null 表示有人认领了candidate候选人任务可以被这些人处理谁先点谁签收claim签收/认领候选人把任务拿到自己名下之后只有他能处理签收 vs 未签收assignee 有值签收了null还没人认领

相关新闻