flowable 6.4.2 - 流程定义动态化的支持(DynamicBpmnService)

1、injectParallelUserTask --- 给《任务实例》加入《子任务》
2、injectParallelEmbeddedSubProcess --- 给《任务实例》加入《子流程》
3、injectUserTaskInProcessInstance --- 给《流程实例》加入《子任务》
4、injectEmbeddedSubProcessInProcessInstance --- 给《流程实例》加入《子流程》

.


// injectParallelUserTask --- 给《任务实例》加入《子任务》
{
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
    Task task = taskService.createTaskQuery().singleResult();

    DynamicUserTaskBuilder taskBuilder = new DynamicUserTaskBuilder();
    taskBuilder.id("custom_task")
            .name("My injected task")
            .assignee("kermit");
    /**
     * <pre>
     *     1、创建新的 DeploymentEntity,并插入到 ACT_RE_DEPLOYMENT 表
     *     2、《注入节点》到 BpmnModel 对象中的 process 的节点 --- updateBpmnProcess,【子流程+并行网关】
     *          1、查找 UserTask 任务,且只支持 UserTask !!!
     *          2、创建子流程 SubProcess
     *          3、处理关系
     *              1、userTask的前置节点  ---> subProcess
     *              2、subProcess ---> userTask的后置节点
     *              3、处理subProcess内的关系
     *                  1、创建 StartEvent
     *                  2、StartEvent ---> 《fork》并行网关ParallelGateway
     *                  3、创建 EndEvent
     *                  4、《fork》ParallelGateway ---> userTask
     *                  5、《fork》ParallelGateway ---> newUserTask
     *                  6、userTask ---> 《join》并行网关 ParallelGateway
     *                  7、newUserTask ---> 《join》并行网关 ParallelGateway
     *                  8、《join》并行网关 ParallelGateway ---> EndEvent
     *     3、保存新的 bpmnModel 到 ACT_GE_BYTEARRAY 表
     *     4、部署
     *          保存新的 《定义数据》 到 ACT_RE_PROCDEF 表
     *     5、修改数据、触发执行
     *          1、修改已执行数据的 PROC_DEF_ID_ --- 要改动很多数据
     *          2、触发流程到《新的dom元素节点》 --- updateExecutions 子类实现
     *              。。。
     * </pre>
     * @see org.flowable.engine.impl.cmd.InjectParallelUserTaskCmd#execute(org.flowable.common.engine.impl.interceptor.CommandContext)
     */
    dynamicBpmnService.injectParallelUserTask(task.getId(), taskBuilder); // 给《任务实例》加入《子任务》
}

// injectParallelEmbeddedSubProcess --- 给《任务实例》加入《子流程》
{
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
    Task task = taskService.createTaskQuery().singleResult();

    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
            .processDefinitionKey("oneTaskV2")
            .singleResult();

    /**
     * <pre>
     *     1、创建新的 DeploymentEntity,并插入到 ACT_RE_DEPLOYMENT 表
     *     2、《注入节点》到 BpmnModel 对象中的 process 的节点 --- updateBpmnProcess
     *          1、查找 UserTask 任务,且只支持 UserTask !!!
     *          2、创建子流程parentSubProcess
     *          3、读取流程定义,创建子流程 subProcess
     *          4、处理关系
     *              1、userTask前置节点 ---> parentSubProcess
     *              2、parentSubProcess ---> userTask后置节点
     *              3、在 parentSubProcess 处理关系
     *                  1、StartEvent ---> 《fork》并行网关ParallelGateway
     *                  2、《fork》并行网关ParallelGateway ---> userTask
     *                  3、《fork》并行网关ParallelGateway ---> subProcess
     *                  4、userTask ---> 《join》并行网关ParallelGateway
     *                  5、subProcess ---> 《join》并行网关ParallelGateway
     *                  6、《join》并行网关ParallelGateway ---> endEvent
     *     3、保存新的 bpmnModel 到 ACT_GE_BYTEARRAY 表
     *     4、部署
     *          保存新的 《定义数据》 到 ACT_RE_PROCDEF 表
     *     5、修改数据、触发执行
     *          1、修改已执行数据的 PROC_DEF_ID_ --- 要改动很多数据
     *          2、触发流程到《新的dom元素节点》 --- updateExecutions 子类实现
     *              。。。
     * </pre>
     * @see org.flowable.engine.impl.cmd.InjectParallelEmbeddedSubProcessCmd#execute(org.flowable.common.engine.impl.interceptor.CommandContext)
     */
    DynamicEmbeddedSubProcessBuilder subProcessBuilder = new DynamicEmbeddedSubProcessBuilder()
            .id("customSubprocess")
            .processDefinitionId(processDefinition.getId()); // 流程定义
    dynamicBpmnService.injectParallelEmbeddedSubProcess(task.getId(), subProcessBuilder); // !!! 给《任务实例》加入《子流程》
}

// injectUserTaskInProcessInstance --- 给《流程实例》加入《子任务》
{
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");

    DynamicUserTaskBuilder taskBuilder = new DynamicUserTaskBuilder();
    taskBuilder.id("custom_task")
            .name("My injected task")
            .assignee("kermit");
    /**
     * 《添加用户任务》
     * <pre>
     *     1、创建新的 DeploymentEntity,并插入到 ACT_RE_DEPLOYMENT 表
     *     2、《注入节点》到 BpmnModel 对象中的 process 的节点 --- updateBpmnProcess,只能修改 initialStartEvent 的指向
     *          1、查找StartEvent!!!
     *          2、创建 EndEvent
     *          3、创建并行网关ParallelGateway
     *          4、并行网关ParallelGateway ---> userTask
     *          5、userTask ---> EndEvent
     *          6、StartEvent ---> 并行网关ParallelGateway
     *     3、保存新的 bpmnModel 到 ACT_GE_BYTEARRAY 表
     *     4、部署
     *          保存新的 《定义数据》 到 ACT_RE_PROCDEF 表
     *     5、修改数据、触发执行
     *          1、修改已执行数据的 PROC_DEF_ID_ --- 要改动很多数据
     *          2、触发流程到《新的dom元素节点》 --- updateExecutions 子类实现
     *              。。。
     * </pre>
     * @see org.flowable.engine.impl.cmd.InjectUserTaskInProcessInstanceCmd#execute(org.flowable.common.engine.impl.interceptor.CommandContext)
     */
    dynamicBpmnService.injectUserTaskInProcessInstance(processInstance.getId(), taskBuilder); // 给《流程实例》加入《子任务》
}

// injectEmbeddedSubProcessInProcessInstance --- 给《流程实例》加入《子流程》
{
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess01");
    List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).orderByTaskName().asc().list();

    Task taskB = tasks.get(1);
    ProcessDefinition subProcessDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("testProcess02").singleResult();

    /**
     * <pre>
     *     1、创建新的 DeploymentEntity,并插入到 ACT_RE_DEPLOYMENT 表
     *     2、《注入节点》到 BpmnModel 对象中的 process 的节点 --- updateBpmnProcess,
     *          1、查找 StartEvent!!!
     *          2、创建并行网关ParallelGateway
     *          3、获取流程定义,创建子流程SubProcess
     *          4、处理关系
     *              1、并行网关parallelGateway ---> 子流程SubProcess
     *              2、创建EndEvent,子流程SubProcess ---> EndEvent
     *              3、StartEvent ---> 并行网关parallelGateway
     *     3、保存新的 bpmnModel 到 ACT_GE_BYTEARRAY 表
     *     4、部署
     *          保存新的 《定义数据》 到 ACT_RE_PROCDEF 表
     *     5、修改数据、触发执行
     *          1、修改已执行数据的 PROC_DEF_ID_ --- 要改动很多数据
     *          2、触发流程到《新的dom元素节点》 --- updateExecutions 子类实现
     *              。。。
     * </pre>
     * @see org.flowable.engine.impl.cmd.InjectEmbeddedSubProcessInProcessInstanceCmd#execute(org.flowable.common.engine.impl.interceptor.CommandContext)
     */
    dynamicBpmnService.injectEmbeddedSubProcessInProcessInstance(
            processInstance.getId(),  // 给《流程实例》加入《子流程》
            new DynamicEmbeddedSubProcessBuilder()
                    .id("injectedSubProcess")
                    .processDefinitionId(subProcessDefinition.getId()) // 子流程的定义id
    );
}

.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值