Flowable串行流程移动活动
  ZKWq2izDxIhQ 2023年12月08日 20 0


在Activiti6和Activiti7中跳转节点都要自己实现,Flowable增加了这个功能。

一:串行流程移动活动

1.1 简介

串行流程是指简单的一条线的流程,流程中如果包含会签排它网关也算串行流程。

节点移动有三种方式:

  • 向前移动foreward。
  • 向后移动back。
  • 直接跳转到最后一个结束节点end。

串行流程节点移动有三个API,每个API都可以前进后退结束节点。

// 方式一
ChangeActivityStateBuilder moveActivityIdTo(String currentActivityId, String newActivityId);

// 方式二:只是目标节点是个List而已
ChangeActivityStateBuilder moveSingleActivityIdToActivityIds(String currentActivityId, List<String> newActivityIds);

// 方式三:通过指定执行id
ChangeActivityStateBuilder moveExecutionToActivityId(String executionId, String activityId);

1.2 示例

Flowable串行流程移动活动_启动流程

1.3 启动流程

@Test
void delopyProcess() {
    Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("processes/myProcess.bpmn20.xml")
            .name("串行流程")
            .deploy();
    System.out.println(deploy.getId());
}

@Test
void startProcess() {
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");

    Task task = taskService.createTaskQuery()
            .processInstanceId(processInstance.getId())
            .singleResult();
    taskService.setAssignee(task.getId(), "huihui");
    taskService.complete(task.getId());
}

Flowable串行流程移动活动_3d_02

1.4 方式一

// 前进:group -> hr
runtimeService.createChangeActivityStateBuilder()
       .processInstanceId(processInstanceId)
       .moveActivityIdTo("group", "hr")
       .changeState();
insert into ACT_HI_TASKINST
insert into ACT_HI_ACTINST
// hr节点
insert into ACT_RU_EXECUTION
insert into ACT_RU_ACTINST
// 插入ACT_RU_TASK 人事审批节点
insert into ACT_RU_TASK

// 更新ACT_HI_ACTINST group节点的审批完成时间
update ACT_HI_ACTINST SET REV_ = ?, PROC_DEF_ID_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ? where ID_ = ? and REV_ = ?

// 更新ACT_HI_ACTINST group节点的审批完成时间,注意会更新删除原因字段
update ACT_HI_TASKINST SET REV_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, LAST_UPDATED_TIME_ = ? where ID_ = ? and REV_ = ?

Flowable串行流程移动活动_3d_03

update ACT_RU_ACTINST SET REV_ = ?, PROC_DEF_ID_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ? where ID_ = ? and REV_ = ?

update ACT_RU_EXECUTION SET REV_ = ?, IS_ACTIVE_ = ? where ID_ = ? and REV_ = ?
delete from ACT_RU_TASK where EXECUTION_ID_ = ?

delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?

Flowable串行流程移动活动_启动流程_04


在Activiti6和Activiti7中都没有ACT_RU_ACTINST表,两张表结构一样,只是ACT_RU_ACTINST表中的数据会在流程结束时删除。

Flowable串行流程移动活动_3d_05

1.5 方式二

// 后退: manage <- hr
runtimeService.createChangeActivityStateBuilder()
       .processInstanceId(processInstanceId)
       .moveSingleActivityIdToActivityIds("hr", Arrays.asList("manage"))
       .changeState();

1.6 方式三

// 狠一点:直接结束流程
runtimeService.createChangeActivityStateBuilder()
       .processInstanceId(processInstanceId)
       .moveExecutionToActivityId(task.getExecutionId(), "end")
       .changeState();

二:并行流程移动活动

2.1 示例一

Flowable串行流程移动活动_启动流程_06

部署流程 -> 启动流程实例 -> 完成UserTask21,当前审批处在UserTask211和UserTask22,然后从这两个节点退回到第一个节点apply。

Flowable串行流程移动活动_Test_07

// 移动多个活动到单个活动
runtimeService.createChangeActivityStateBuilder()
  .processInstanceId("ff464d15-8355-11ee-8fdf-0a0a3d6982e3")
  .moveActivityIdsToSingleActivityId(Arrays.asList("UserTask211", "UserTask22"), "apply")
  .changeState();

Flowable串行流程移动活动_3d_08


Flowable串行流程移动活动_Test_09

2.2 示例2

从UserTask3回到并行网关的内部UserTask211和UserTask22。

Flowable串行流程移动活动_3d_10

// 移动单个节点到网关内的多个节点
runtimeService.createChangeActivityStateBuilder()
  .processInstanceId("1740dab2-835c-11ee-829f-0a0a3d6982e3")
  .moveSingleActivityIdToActivityIds("UserTask3", Arrays.asList("UserTask211", "UserTask22"))
  .changeState();

Flowable串行流程移动活动_3d_11

三:子流程

Flowable串行流程移动活动_启动流程_12

Flowable串行流程移动活动_Test_13

// 从子流程内部退回到外部
runtimeService.createChangeActivityStateBuilder()
        .processInstanceId("f1588dbf-8362-11ee-b360-0a0a3d6982e3")
        .moveActivityIdTo("UserTask2", "UserTask1")
        .changeState();

Flowable串行流程移动活动_3d_14

// 从外部流程退回到子流程内部
runtimeService.createChangeActivityStateBuilder()
        .processInstanceId("f1588dbf-8362-11ee-b360-0a0a3d6982e3")
        .moveActivityIdTo("UserTask3", "UserTask2")
        .changeState();


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

ZKWq2izDxIhQ