activity或者flowable会签任务的事例

需求

一个任务节点需要多个人审批签字,其中都同意进入到下一个节点,如果有一个不同意就回到上一个节点或者直接结束(我这里是回到上一个节点)

流程图

activity或者flowable会签任务的事例_第1张图片

流程图详情

activity或者flowable会签任务的事例_第2张图片

任务1参数配置

activity或者flowable会签任务的事例_第3张图片

会签任务参数配置

activity或者flowable会签任务的事例_第4张图片
activity或者flowable会签任务的事例_第5张图片
参数解释:
sequential:代表是否按顺序;
collection:会签任务的办理人,是一个list列表,在流程变量中用List做为参数,我这里是设置为assigneeList;
element variable:属于collection里面的元素,相当于元素的别名 在办理人那里设置值我这里取名叫assignee(在下图中设置下面的一个图中设置办理人就是${assignee}设置的);
completion condition:是指该节点任务完成的条件即进入到下一个节点的条件;nrOfInstances和nrOfCompletedInstances都是流程变量里面的值;nrOfInstances是代表有多少个对象,即上面collection里面有多少个元素就有多少个对象;nrOfCompletedInstances是指完成了任务的对象,比如collection里面有三个元素,小明属于一个,小明完成了会签任务那么nrOfCompletedInstances就会加1,nrOfActiveInstances指的就是还没有完成会签任务对象的个数,这三个参数存在的关系nrOfInstances=nrOfCompletedInstances+nrOfActiveInstances;这些参数在到达会签任务时在表act_ru_variable中会出现
Assignee:办理人,取的collection中的元素
我这里的任务逻辑就是在启动流程实例时设置一个参数signCount,起始值为0,办理人完成会签任务的时候如果同意该值加1,不同意不做处理;最后如果signCount的值大于等于3就进入下一个节点,小于3就返回上一个节点具体见图
activity或者flowable会签任务的事例_第6张图片activity或者flowable会签任务的事例_第7张图片

代码

	// 流程定义部署
	@Test
	public void definion() {
		Deployment deploy = repositoryService.createDeployment().addClasspathResource("HQProcess.bpmn")
				.addClasspathResource("HQProcess.png").name("会签流程测试4").deploy();
		System.out.println("部署key==" + deploy.getKey());
		System.out.println("部署Name==" + deploy.getName());
		System.out.println("部署Id==" + deploy.getId());
	}
	// 启动流程实例
	@Test
	public void startIncetence() {
		HashMap map = new HashMap<>();
		map.put("task1", "施工项目部");

		ArrayList list = new ArrayList<>();
		list.add("王明4");
		list.add("小李4");
		list.add("红红4");
		// 必须是List
		map.put("assigneeList", list);
		map.put("signCount", 0);
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HQProcess4", map);
		System.out.println("流程实例id==" + processInstance.getId());
		System.out.println("流程实例Name==" + processInstance.getName());
		System.out.println("流程实例开始时间==" + processInstance.getStartTime());
	}
	/** 查询当前人的个人任务 */
	@Test
	public void findMyPersonalTask() {
		String assignee = "施工项目部";
		List list = taskService// 与正在执行的任务管理相关的Service
				.createTaskQuery()// 创建任务查询对象
				/** 查询条件(where部分) */
				.taskAssignee(assignee)// 指定个人任务查询,指定办理人
//						.taskCandidateUser(candidateUser)//组任务的办理人查询
//						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//						.processInstanceId(processInstanceId)//使用流程实例ID查询
//						.executionId(executionId)//使用执行对象ID查询
				/** 排序 */
				.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
				/** 返回结果集 */
//						.singleResult()//返回惟一结果集
//						.count()//返回结果集的数量
//						.listPage(firstResult, maxResults);//分页查询
				.list();// 返回列表
		if (list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务ID:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务的创建时间:" + task.getCreateTime());
				System.out.println("任务的办理人:" + task.getAssignee());
				System.out.println("流程实例ID:" + task.getProcessInstanceId());
				System.out.println("执行对象ID:" + task.getExecutionId());
				System.out.println("流程定义ID:" + task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}
	// 个人完成任务
	@Test
	public void completeMyPersonalTask() {
		// 任务ID
		String taskId = "任务id";
		taskService.complete(taskId);// 与正在执行的任务管理相关的Service
		System.out.println("完成任务:任务ID:" + taskId);
	}

进入到会签任务节点

	/** 查询当前人的个人任务 */
	@Test
	public void findMyPersonalTask2() {
		String assignee = "小李4";
		List list = taskService// 与正在执行的任务管理相关的Service
				.createTaskQuery()// 创建任务查询对象
				/** 查询条件(where部分) */
				.taskAssignee(assignee)// 指定个人任务查询,指定办理人
//						.taskCandidateUser(candidateUser)//组任务的办理人查询
//						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//						.processInstanceId(processInstanceId)//使用流程实例ID查询
//						.executionId(executionId)//使用执行对象ID查询
				/** 排序 */
				.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
				/** 返回结果集 */
//						.singleResult()//返回惟一结果集
//						.count()//返回结果集的数量
//						.listPage(firstResult, maxResults);//分页查询
				.list();// 返回列表
		if (list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务ID:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务的创建时间:" + task.getCreateTime());
				System.out.println("任务的办理人:" + task.getAssignee());
				System.out.println("流程实例ID:" + task.getProcessInstanceId());
				System.out.println("执行对象ID:" + task.getExecutionId());
				System.out.println("流程定义ID:" + task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}

再根据id办理任务如果同意代码为

	// 个人完成任务
	@Test
	public void completeMyPersonalTask3() {
		// 任务ID
		String taskId = "任务id";
		List taskResultList = taskService.createTaskQuery().taskId(taskId).list();
		//当前executionId
		System.out.println(taskResultList);
		//当前executionId
		String currentExecutionId = taskResultList.get(0).getExecutionId();
		//当前签署总数
		String currentSignCount = StringUtils
				.defaultString(runtimeService.getVariable(currentExecutionId, "signCount").toString(), "0");
		//签署数+1
		runtimeService.setVariable(currentExecutionId, "signCount", Integer.parseInt(currentSignCount) + 1);
		//完成
		taskService.complete(taskId);
	}

不同意

	// 个人完成任务
	@Test
	public void completeMyPersonalTask() {
		// 任务ID
		String taskId = "任务id";
		taskService.complete(taskId);// 与正在执行的任务管理相关的Service
		System.out.println("完成任务:任务ID:" + taskId);
	}

List中的其他会签人办理完成之后就会进入到下一个排他网关节点,这时候会根据signCount的值进行判断走哪里

你可能感兴趣的:(activity)