flowable实现自定义代码方式生成流程model

本文详细介绍了如何使用BPMN模型创建流程,包括创建流程模型、设置流程信息、添加流程节点、创建流转关系,并进行流程校验和部署。涉及开始节点、结束节点、普通任务节点和会签任务节点的创建,以及节点流转顺序的绘制。

一、步骤:

1.创建 BpmnModel

2.为BpmnModel设置Process

3.创建FlowElement

3.为Process添加FlowElement

4.校验BpmModel,部署

二、代码实现:

public void test(String activity){
        Deployment deploy=null;
        try {

            BpmnModel bpmnModel=new BpmnModel();
            //设置流程信息
            //此信息都可以通过前期自定义数据,使用时再查询
            Process process=new Process();
            process.setId("test_model_3");
            process.setName("测试流程图三");
            //添加流程节点信息---start
            String startId="startEvent_id_1";
            String startName="开始_1";
            String endId="endEvent_id_1";
            String endName="结束_1";
            //创建数组存储所有流程节点信息
            List<FlowElement> elementList=new ArrayList<>();
            //创建开始节点
            FlowElement startFlowElement=createStartFlowElement(startId,startName);
            FlowElement endFlowElement=createEndFlowElement(endId,endName);
            elementList.add(startFlowElement);
            elementList.add(endFlowElement);

            //查询普通任务节点信息
            elementList.addAll(findUserTaskElements());

            //把节点放入process
            elementList.stream().forEach(item -> process.addFlowElement(item));

            //查询各个节点的关系信息,并添加进流程
            List<FlowElementPojo> flowElementPojoList =createCirculationSequence();
            for (FlowElementPojo flowElementPojo:flowElementPojoList){
                SequenceFlow sequenceFlow=createSequeneFlow(flowElementPojo.getId(),"流转",flowElementPojo.getResourceFlowElementId(),
                        flowElementPojo.getTargetFlowElementId(),"${a==\"f\"}");
                process.addFlowElement(sequenceFlow);
            }

            bpmnModel.addProcess(process);

            //校验bpmModel
            ProcessValidator processValidator=new ProcessValidatorFactory().createDefaultProcessValidator();
            List<ValidationError> validationErrorList=processValidator.validate(bpmnModel);
            if (validationErrorList.size()>0){
                throw new RuntimeException("流程有误,请检查后重试");
            }

            String fileName="model_"+activity+"bpmn20.xml";

            //生成自动布局
            new BpmnAutoLayout(bpmnModel).execute();
            deploy =repositoryService.createDeployment().addBpmnModel(fileName,bpmnModel)
                    .tenantId("intelligentAsset")
                    .deploy();
        }catch (Exception e){


        }finally {

        }

    }

 创建开始节点:

    /**
     * 创建开始节点信息
     * @return
     */
    public FlowElement createStartFlowElement(String id,String name){
        StartEvent startEvent=new StartEvent();
        startEvent.setId(id);
        startEvent.setName(name);
        return startEvent;
    }

创建结束节点:

    /**
     * 创建结束节点信息
     * @param id
     * @param name
     * @return
     */
    public FlowElement createEndFlowElement(String id,String name){
        EndEvent endEvent=new EndEvent();
        endEvent.setId(id);
        endEvent.setName(name);
        return endEvent;
    }

创建普通任务节点:

    /**
     * 创建普通任务节点信息
     * @param id
     * @param name
     * @param assignee
     * @return
     */
    public FlowElement createCommonUserTask(String id,String name,String assignee){
        UserTask userTask=new UserTask();
        userTask.setId(id);
        userTask.setName(name);
        userTask.setAssignee(assignee);
        return userTask;
    }

创建会签任务节点信息:

 /**
     * 创建会签节点信息
     * @param id
     * @param name
     * @return
     */
    public FlowElement createMultiUserTask(String id,String name){
        UserTask userTask=new UserTask();
        userTask.setId(id);
        userTask.setName(name);
        //分配用户
        userTask.setAssignee("${assignee}");
        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics=new MultiInstanceLoopCharacteristics();
//        multiInstanceLoopCharacteristics.setCollectionString("${collectionList}");
        //完成条件,默认所有人都完成
        multiInstanceLoopCharacteristics.setCompletionCondition("${completionCondition}");
        //元素变量多实例,一般和设置的assignee变量是对应的
        multiInstanceLoopCharacteristics.setElementVariable("assignee");
        //集合多实例,用于接收集合数据的表达式
        multiInstanceLoopCharacteristics.setInputDataItem("${itemList}");
        userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
        return userTask;


    }

创建/查询各个节点的流转关系信息:

/**
     * 查询各节点关联流转信息,即流转线
     *FlowElementPojo 是自定义类
     */
    public List<FlowElementPojo> createCirculationSequence(){


        List<FlowElementPojo> list=new ArrayList<>();
        FlowElementPojo flowElementPojo_start=new FlowElementPojo();
        flowElementPojo_start.setId("sequence_id_1");
        flowElementPojo_start.setTargetFlowElementId("userTask_0");
        flowElementPojo_start.setResourceFlowElementId("startEvent_id_1");
        flowElementPojo_start.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_0=new FlowElementPojo();
        flowElementPojo_user_0.setId("sequence_id_2");
        flowElementPojo_user_0.setTargetFlowElementId("userTask_1");
        flowElementPojo_user_0.setResourceFlowElementId("userTask_0");
        flowElementPojo_user_0.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_1=new FlowElementPojo();
        flowElementPojo_user_1.setId("sequence_id_3");
        flowElementPojo_user_1.setTargetFlowElementId("userTask_2");
        flowElementPojo_user_1.setResourceFlowElementId("userTask_1");
        flowElementPojo_user_1.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_2=new FlowElementPojo();
        flowElementPojo_user_2.setId("sequence_id_4");
        flowElementPojo_user_2.setTargetFlowElementId("endEvent_id_1");
        flowElementPojo_user_2.setResourceFlowElementId("userTask_2");
        flowElementPojo_user_2.setFlowElementType("sequence");

        list.add(flowElementPojo_start);
        list.add(flowElementPojo_user_0);
        list.add(flowElementPojo_user_1);
        list.add(flowElementPojo_user_2);

        return list;

    }
/**
     * 绘制节点流转顺序
     * @param id
     * @param name
     * @param targetId
     * @param sourceId
     * @param conditionExpression
     * @return
     */
    public SequenceFlow createSequeneFlow(String id,String name,String sourceId,String targetId,String conditionExpression){
        SequenceFlow sequenceFlow=new SequenceFlow();
        sequenceFlow.setId(id);
        sequenceFlow.setName(name);
        if (ObjectUtils.isNotEmpty(targetId)){
            sequenceFlow.setTargetRef(targetId);
        }
        if (ObjectUtils.isNotEmpty(sourceId)){
            sequenceFlow.setSourceRef(sourceId);
        }
        if (ObjectUtils.isNotEmpty(conditionExpression)){
            sequenceFlow.setConditionExpression(conditionExpression);
        }
        return sequenceFlow;
    }

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值