flowable工作流 - 全局监听设置CATEGORY_

基于开源项目KonBAI / RuoYi-Flowable-Plus使用的部分功能调整。利用全局监听器,设置act_ru_task表中的CATEGORY_(流程分类key)的值。

流程实例创建流程

(1)创建流程分类:category
(2)创建自定义表单:form
(3)设计模型流程图、部署:model、procdef、deployment

一个流程分类下可以有多个模型,是一对多的关系。

代码解析

在部署模型时,将部署id回写到模型表中

    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deployModel(String modelId) {
        // 获取流程模型
        Model model = repositoryService.getModel(modelId);
        if (ObjectUtil.isNull(model)) {
            throw new RuntimeException("流程模型不存在!");
        }
        // 获取流程图
        byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId);
        if (bpmnBytes == null) {
            throw new ServiceException("流程设计未定义!");
        }
        String bpmnXml = StringUtils.toEncodedString(bpmnBytes, StandardCharsets.UTF_8);
        BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml);
        String processName = model.getName() + ProcessConstants.SUFFIX;
        // 部署流程
        Deployment deployment = repositoryService.createDeployment()
            .name(model.getName())
            .key(model.getKey())
            .category(model.getCategory())
            .addBytes(processName, bpmnBytes)
            .deploy();
        ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery()
            .deploymentId(deployment.getId())
            .singleResult();

        // 修改流程定义的分类,便于搜索流程
        repositoryService.setProcessDefinitionCategory(procDef.getId(), model.getCategory());

		// new >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        // 保存部署id到模型表中
        model.setDeploymentId(deployment.getId());
        // --------------------------------------------------
        repositoryService.saveModel(model);
		
        // 保存部署表单
        return deployFormService.saveInternalDeployForm(deployment.getId(), bpmnModel);
    }
 }

添加全局监听,给每个任务写入category_

@Slf4j
@Component
public class GlobalEventListener implements FlowableEventListener {

    /**
     * 事件触发时,设置category_
     * @param flowableEvent
     */
    @Override
    public void onEvent(FlowableEvent flowableEvent) {
        FlowableEventType eventType = flowableEvent.getType();
        log.info(">>执行 任务全局监听 --》 GlobalEventListener eventType={}", eventType.name());

		// 在任务创建时,将category填入任务中
        if (TASK_CREATED == eventType) {
            FlowableEntityEvent entityEvent = (FlowableEntityEvent) flowableEvent;
            TaskEntity entity = (TaskEntity) entityEvent.getEntity();
            if (StrUtil.isBlank(entity.getCategory())) {
                //前提是Deployment已经设置过Category
                ProcessDefinitionEntity processDefinitionEntity = CommandContextUtil.getProcessDefinitionEntityManager().findById(entity.getProcessDefinitionId());
                DeploymentEntity deploymentEntity = CommandContextUtil.getDeploymentEntityManager().findById(processDefinitionEntity.getDeploymentId());
                //直接修改act_ru_task实体的属性
                //因为事件是同步事件,所以会包裹在整体事务中提交
                entity.setCategory(deploymentEntity.getCategory());
            }
        }
    }

    @Override
    public boolean isFailOnException() {
        return false;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false;
    }

    @Override
    public String getOnTransaction() {
        return null;
    }
}

参考资料

KonBAI / RuoYi-Flowable-Plus 基于 RuoYi-Vue-Plus 进行二次开发扩展Flowable工作流功能项目
Flowable6.4 – 设置流程分类 by 字痕随行

posted @ 2023-03-17 09:52  御坂10027  阅读(5)  评论(0)    收藏  举报  来源