【七】流程设计

一、连线

1、流程图

(1)指定流程的key

(2)提交申请节点

(3)部门经理审批节点

(4)部门经理审批节点连线

(5)总经理审批节点

2、流程

(1)部署、启动

(2)查询

(3)办理任务

(4)办理任务并使用流程变量指定流程走向

二、排他网关

1、流程图

(1)指定流程图的key

(2)设置排他网关默认出口

(3)设置条件

2、部署、启动

3、查询

4、办理任务

5、说明

三、并行网关

1、流程图

2、代码

3、说明


一、连线

使用流程变量去控制流程的走向

1、流程图

(1)指定流程的key

(2)提交申请节点

(3)部门经理审批节点

(4)部门经理审批节点连线

(5)总经理审批节点

2、流程

(1)部署、启动

/**
 * 部署流程使用zip
 */
@Test
public void deployProcess() {
	// 得到流程部署的service
	RepositoryService repositoryService = this.processEngine.getRepositoryService();
	InputStream inputStream=this.getClass().getResourceAsStream("SequenceFlowBPMN.zip");
	ZipInputStream zipInputStream=new ZipInputStream(inputStream);
	Deployment deploy = repositoryService.createDeployment().name("报销流程")
			.addZipInputStream(zipInputStream).deploy();
	System.out.println("部署成功:流程部署ID:" + deploy.getId());
}

/**
 * 启动流程
 */
@Test
public void startProcess() {
	RuntimeService runtimeService = this.processEngine.getRuntimeService();
	String processDefinitionKey = "SequenceFlowBPMN";
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
	System.out.println("流程启动成功:" + processInstance.getId() + "   " + processInstance.getProcessDefinitionId() + "  "
			+ processInstance.getProcessInstanceId());

}

(2)查询

/**
 * 查询我的个人任务act_ru_task
 */
@Test
public void queryMyTask() {
	TaskService taskService = this.processEngine.getTaskService();
	String assignee = "李四";
	List<Task> list = taskService.createTaskQuery()
			// 条件
			.taskAssignee(assignee)// 根据任务办理人查询任务
			// 排序
			.orderByTaskCreateTime().desc()
			// 结果集
			.list();

	if (null != list && list.size() > 0) {
		for (Task task : list) {
			System.out.println("任务ID:" + task.getId());
			System.out.println("任务办理人:" + task.getAssignee());
			System.out.println("执行实例ID:" + task.getExecutionId());
			System.out.println("任务名称:" + task.getName());
			System.out.println("流程定义ID:" + task.getProcessDefinitionId());
			System.out.println("流程实例ID:" + task.getProcessInstanceId());
			System.out.println("任务创建时间:" + task.getCreateTime());
			System.out.println("####################");
		}
	}
}

(3)办理任务

/**
 * 办理任务
 */
@Test
public void completeTask() {
	TaskService taskService = this.processEngine.getTaskService();
	String taskId = "15003";
	// 根据任务ID去完成任务
	taskService.complete(taskId);
	// 根据任务ID去完成任务并指定流程变量
//		taskService.complete(taskId, variables);
	System.out.println("任务完成");
}

(4)办理任务并使用流程变量指定流程走向

@Test
public void completeTask2() {
	TaskService taskService = this.processEngine.getTaskService();
	String taskId = "12502";
	Map<String, Object> variables=new HashMap<>();
	variables.put("outcome", "重要");
	// 根据任务ID去完成任务并指定流程变量
	taskService.complete(taskId, variables);
	System.out.println("任务完成");
}

二、排他网关

1、流程图

(1)指定流程图的key

(2)设置排他网关默认出口

(3)设置条件

2、部署、启动

/**
 * 部署流程使用zip
 */
@Test
public void deployProcess() {
	// 得到流程部署的service
	RepositoryService repositoryService = this.processEngine.getRepositoryService();
	InputStream inputStream=this.getClass().getResourceAsStream("ExclusiveGateWay.zip");
	ZipInputStream zipInputStream=new ZipInputStream(inputStream);
	Deployment deploy = repositoryService.createDeployment().name("报销流程")
			.addZipInputStream(zipInputStream).deploy();
	System.out.println("部署成功:流程部署ID:" + deploy.getId());
}

/**
 * 启动流程
 */
@Test
public void startProcess() {
	RuntimeService runtimeService = this.processEngine.getRuntimeService();
	String processDefinitionKey = "myProcess";
	ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
	System.out.println("流程启动成功:" + processInstance.getId() + "   " + processInstance.getProcessDefinitionId() + "  "
			+ processInstance.getProcessInstanceId());

}

3、查询

/**
 * 查询我的个人任务act_ru_task
 */
@Test
public void queryMyTask() {
	TaskService taskService = this.processEngine.getTaskService();
//		String assignee = "张三";
//		String assignee = "部门经理";
	String assignee = "总经理";
	List<Task> list = taskService.createTaskQuery()
			// 条件
			.taskAssignee(assignee)// 根据任务办理人查询任务
			// 排序
			.orderByTaskCreateTime().desc()
			// 结果集
			.list();

	if (null != list && list.size() > 0) {
		for (Task task : list) {
			System.out.println("任务ID:" + task.getId());
			System.out.println("任务办理人:" + task.getAssignee());
			System.out.println("执行实例ID:" + task.getExecutionId());
			System.out.println("任务名称:" + task.getName());
			System.out.println("流程定义ID:" + task.getProcessDefinitionId());
			System.out.println("流程实例ID:" + task.getProcessInstanceId());
			System.out.println("任务创建时间:" + task.getCreateTime());
			System.out.println("####################");
		}
	}
}

4、办理任务

/**
 * 办理任务
 */
@Test
public void completeTask() {
	TaskService taskService = this.processEngine.getTaskService();
	String taskId = "22504";
	// 根据任务ID去完成任务
	taskService.complete(taskId);
	// 根据任务ID去完成任务并指定流程变量
//		taskService.complete(taskId, variables);
	System.out.println("任务完成");
}
/**
 * 办理任务并使用流程变量指定流程走向
 */
@Test
public void completeTask2() {
	TaskService taskService = this.processEngine.getTaskService();
	String taskId = "20004";
	Map<String, Object> variables=new HashMap<>();
	variables.put("money", 1200);
	// 根据任务ID去完成任务并指定流程变量
	taskService.complete(taskId, variables);
	System.out.println("任务完成");
}

5、说明

1)一个排他网关对应一个以上的顺序流

2)由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。

3)决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。

4)如果没有任何一个出口符合条件,则抛出异常

5)使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。

三、并行网关

1、流程图

2、代码

package com.activiti.a_init;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/**
 * 并行网关
 * if else if  else if  else
 */
public class TestParallelGateWay {

    private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**
     * 部署流程使用zip
     */
    @Test
    public void deployProcess() {
        // 得到流程部署的service
        RepositoryService repositoryService = this.processEngine.getRepositoryService();
        InputStream inputStream = this.getClass().getResourceAsStream("ParallelGateWay.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        Deployment deploy = repositoryService.createDeployment().name("tao宝流程")
                .addZipInputStream(zipInputStream).deploy();
        System.out.println("部署成功:流程部署ID:" + deploy.getId());
    }

    /**
     * 启动流程
     */
    @Test
    public void startProcess() {
        RuntimeService runtimeService = this.processEngine.getRuntimeService();
        String processDefinitionKey = "myProcess";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
        System.out.println("流程启动成功:" + processInstance.getId() + "   " + processInstance.getProcessDefinitionId() + "  "
                + processInstance.getProcessInstanceId());

    }

    /**
     * 查询我的个人任务act_ru_task
     */
    @Test
    public void queryMyTask() {
        TaskService taskService = this.processEngine.getTaskService();
//		String assignee = "张三";
        String assignee = "商家";
//		String assignee = "买家";
        List<Task> list = taskService.createTaskQuery()
                // 条件
                .taskAssignee(assignee)// 根据任务办理人查询任务
                // 排序
                .orderByTaskCreateTime().desc()
                // 结果集
                .list();

        if (null != list && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务办理人:" + task.getAssignee());
                System.out.println("执行实例ID:" + task.getExecutionId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("任务创建时间:" + task.getCreateTime());
                System.out.println("####################");
            }
        }
    }

    /**
     * 办理任务
     */
    @Test
    public void completeTask() {
        TaskService taskService = this.processEngine.getTaskService();
        String taskId = "10002";
        // 根据任务ID去完成任务
        taskService.complete(taskId);
        // 根据任务ID去完成任务并指定流程变量
        System.out.println("任务完成");
    }
}

3、说明

1)一个流程中流程实例只有1个,执行对象有多个

2)并行网关的功能是基于进入和外出的顺序流的

分支(fork):

并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

汇聚(join):

所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

3)并行网关的进入和外出都是使用相同节点标识

4)如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

5)并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

6)并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目不一定相等)。如图中标示是合法的:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值