一 部署设计器

1. 将flowable-idm.war, flowable-modeler.war放到tomcat的webapps目录下,然后启动tomcat

2. 在浏览器中访问http://localhost:8080/flowable-modeler,用户名/密码:admin/test 登陆,设计流程后,保存并导出文件。

flowable 学习(二) 排他网关-LMLPHP

二 代码

1 创建流程引擎,并且部署一个流程定义

@Before
public void Before() {
	ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
			.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true")
			.setJdbcUsername("xxxx")
			.setJdbcPassword("xxxx")
			.setJdbcDriver("com.mysql.cj.jdbc.Driver")
			.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

	processEngine = cfg.buildProcessEngine();
}


@Test
public void Test01(){
	// 获取Flowable服务
	RepositoryService repositoryService = processEngine.getRepositoryService();

	// 部署流程定义
	Deployment deployment = repositoryService.createDeployment().addClasspathResource("qing_jia_liu_cheng.bpmn20.xml").deploy();

	//查找部署流程定义
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
	System.out.println(processDefinition.getName() + "  " + processDefinition.getDeploymentId() + "   " + processDefinition.getId());
}

2 一个完整的流程

@Test
public void test02() {
	String processDefinitionId = "qing_jia:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();

	//请假天数    <=5 由 twoUser 审批
	int days = 2;
	//审批通过  则调用CallExternalSystemDelegate 否则 调用 SendRejectionMail
	boolean approved = false;

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "张大大");
	variables.put("days", days);

	//启动流程  流程在第一个节点  候选组为managers
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	//查询managers下的任务
	List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
	System.out.println("managers有" + tasks.size() + " 个任务:");

	//设置条件  并结束第一个任务   进入网关
	variables = new HashMap<>();
	variables.put("oneUser", "李大大");
	variables.put("twoUser", "王大大");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----managers 结束了任务-----");

	queryTask();

	if(days <= 5) {
		System.out.println("-----任务到了王大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("王大大").list();
	} else {
		System.out.println("-----任务到了李大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("李大大").list();
	}

	variables = new HashMap<>();
	variables.put("approved", approved);
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----王大大/李大大 结束了任务-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("张大大").list();

	System.out.println("-----张大大 结束了任务-----");
	taskService.complete(tasks.get(0).getId());

	queryTask();
}

private void queryTask() {
	TaskService taskService = processEngine.getTaskService();

	System.out.println("---------------------------");
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("张大大").list();
	System.out.println("张大大有" + tasks.size() + " 个任务:");

	tasks = taskService.createTaskQuery().taskAssignee("李大大").list();
	System.out.println("李大大有" + tasks.size() + " 个任务:");

	tasks = taskService.createTaskQuery().taskAssignee("王大大").list();
	System.out.println("王大大有" + tasks.size() + " 个任务:");
	System.out.println("---------------------------");
}

完整流程的执行结果:

processInstanceId = 7501
managers有1 个任务:
-----managers 结束了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有1 个任务:
---------------------------
-----任务到了王大大-----
SendRejectionMail start
oneUser == 李大大
approved == false
days == 2
user == 张大大
twoUser == 王大大
sid-0417597E-9B0F-4013-8F61-5139D73EF0D3      7504   []   null
SendRejectionMail start
-----王大大/李大大 结束了任务-----
---------------------------
张大大有1 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
-----张大大 结束了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------

3 驳回并且再次提交

@Test
public void Test04(){
	String processDefinitionId = "qing_jia:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();
	HistoryService historyService = processEngine.getHistoryService();

	int days = 2;
	boolean approved = true;

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "张大大");
	variables.put("days", days);

	//启动流程  流程在第一个节点  候选组为managers
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	//查询managers下的任务
	List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
	System.out.println("managers有" + tasks.size() + " 个任务:");

	//结束第一个任务   进入网关 判断参数 approved  true:外部请假系统 然后到下一个用户节点   false:发送拒绝邮件
	variables = new HashMap<>();
	variables.put("oneUser", "李大大");
	variables.put("twoUser", "王大大");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----managers 结束了任务-----");
	queryTask2();

	if(days <= 5) {
		System.out.println("-----任务到了王大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("王大大").list();
	} else {
		System.out.println("-----任务到了李大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("李大大").list();
	}

	variables = new HashMap<>();
	variables.put("approved", approved);
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----王大大/李大大 结束了任务-----");

	queryTask2();

	System.out.println("-----张大大 驳回了任务-----");
	tasks = taskService.createTaskQuery().taskAssignee("张大大").list();

	String processInstanceId = tasks.get(0).getProcessInstanceId();
	List<String> activeActivityIds = runtimeService.getActiveActivityIds(tasks.get(0).getExecutionId());
	String currentActivityId = activeActivityIds.get(0);

	String targetActivityId = getLastActivityId(historyService, processInstanceId, currentActivityId);

	//张大大回退了 流程
	runtimeService.createChangeActivityStateBuilder()
			.processInstanceId(processInstanceId)
			.moveActivityIdTo(currentActivityId, targetActivityId)
			.changeState();

	queryTask2();

	if(days <= 5) {
		System.out.println("-----任务再次到了王大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("王大大").list();
	} else {
		System.out.println("-----任务再次到了李大大-----");
		tasks = taskService.createTaskQuery().taskAssignee("李大大").list();
	}

	System.out.println("-----王大大/李大大 驳回了任务-----");
	processInstanceId = tasks.get(0).getProcessInstanceId();
	activeActivityIds = runtimeService.getActiveActivityIds(tasks.get(0).getExecutionId());
	currentActivityId = activeActivityIds.get(0);

	targetActivityId = getLastActivityId(historyService, processInstanceId, currentActivityId);
	//王大大/李大大 回退了 流程
	runtimeService.createChangeActivityStateBuilder()
			.processInstanceId(processInstanceId)
			.moveActivityIdTo(currentActivityId, targetActivityId)
			.changeState();

	queryTask2();

	//查询managers下的任务
	tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
	System.out.println("再次查询 managers 有" + tasks.size() + " 个任务:");

	//设置条件  并结束第一个任务   进入网关
	variables = new HashMap<>();
	days = 9;
	variables.put("days", days);
	variables.put("oneUser", "李大大2");
	variables.put("twoUser", "王大大2");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----managers 结束了任务 并且修改审批人-----");

	queryTask2();

	if(days <= 5) {
		System.out.println("-----任务到了王大大2-----");
		tasks = taskService.createTaskQuery().taskAssignee("王大大2").list();
	} else {
		System.out.println("-----任务到了李大大2-----");
		tasks = taskService.createTaskQuery().taskAssignee("李大大2").list();
	}

	variables = new HashMap<>();
	variables.put("approved", !approved);
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----王大大2/李大大2 结束了任务-----");

	queryTask2();

	tasks = taskService.createTaskQuery().taskAssignee("张大大").list();

	System.out.println("-----张大大 结束了任务-----");
	taskService.complete(tasks.get(0).getId());

	queryTask2();

}

private String getLastActivityId(HistoryService historyService, String processInstanceId, String currentActivityId) {

	List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
			.processInstanceId(processInstanceId)
			.finished()
			.activityType("userTask")
			.orderByHistoricActivityInstanceStartTime().desc()
			.list();


	String lastActivityId = null;
	//找到上一个流程的 activityId
	for (int i=0; i<list.size(); i++) {
		HistoricActivityInstance activityInstance = list.get(i);
		if(activityInstance.getActivityId().equals(currentActivityId)) {
			lastActivityId = list.get(++i).getActivityId();
			break;
		}
	}

	if(lastActivityId == null) {
		lastActivityId = list.get(0).getActivityId();
	}

	return lastActivityId;
}

private void queryTask2() {
	TaskService taskService = processEngine.getTaskService();
	queryTask();
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("张大大2").list();
	System.out.println("张大大2有" + tasks.size() + " 个任务:");

	tasks = taskService.createTaskQuery().taskAssignee("李大大2").list();
	System.out.println("李大大2有" + tasks.size() + " 个任务:");

	tasks = taskService.createTaskQuery().taskAssignee("王大大2").list();
	System.out.println("王大大2有" + tasks.size() + " 个任务:");

	System.out.println("---------------------------");
}

完整流程的执行结果:

processInstanceId = 10001
managers有1 个任务:
-----managers 结束了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有1 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
-----任务到了王大大-----
CallExternalSystemDelegate start
oneUser == 李大大
approved == true
days == 2
user == 张大大
twoUser == 王大大
sid-F69D3DA0-D2EC-4594-A6F3-2F6CBD4D76B4      10004   []   null
CallExternalSystemDelegate end
-----王大大/李大大 结束了任务-----
---------------------------
张大大有1 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
-----张大大 驳回了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有1 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
-----任务再次到了王大大-----
-----王大大/李大大 驳回了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
再次查询 managers 有1 个任务:
-----managers 结束了任务 并且修改审批人-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
张大大2有0 个任务:
李大大2有1 个任务:
王大大2有0 个任务:
---------------------------
-----任务到了李大大2-----
SendRejectionMail start
oneUser == 李大大2
approved == false
days == 9
user == 张大大
twoUser == 王大大2
sid-0417597E-9B0F-4013-8F61-5139D73EF0D3      10028   []   null
SendRejectionMail start
-----王大大2/李大大2 结束了任务-----
---------------------------
张大大有1 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
-----张大大 结束了任务-----
---------------------------
张大大有0 个任务:
李大大有0 个任务:
王大大有0 个任务:
---------------------------
张大大2有0 个任务:
李大大2有0 个任务:
王大大2有0 个任务:
---------------------------
10-30 19:01