Activiti入门教程八(玩转Task任务API)

 

     经过几年的学习,现在才感觉,了解源码是多么的重要,甚至如今火热的培训班的老师也是这样过来的吧!一点一点的分析源码,再加上一点一点的思考和总结,才能够对知识了解的那么深刻吧!原来学习就是如此的简单。

     废话不多说了,本篇博客,来详解一下Activiti中有关Task任务的API。


     任务的增删改

     在Activiti中有关任务对象的增删改与之前讲解的用户或者用户组的增删改,都是一样的,看一下用到的方法

  Task newTask();

  Task newTask(String taskId);

  void saveTask(Task task);

  void deleteTask(String taskId);

  void deleteTasks(Collection<String> taskIds);

  void deleteTask(String taskId, boolean cascade);

  void deleteTasks(Collection<String> taskIds, boolean cascade);

  void deleteTask(String taskId, String deleteReason);

  void deleteTasks(Collection<String> taskIds, String deleteReason);


 

     基本上TaskService接口中关于任务的增删改的就这么多,英文差不多的就可以看懂上面方法是什么意思了,就不多解释了,直接来一个Demo尝一下鲜吧


<span style="font-family:Comic Sans MS;font-size:18px;">public class DeleteTask {

	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		//获取任务服务组件
		TaskService taskService = engine.getTaskService();
		// 保存若干个Task
		for (int i = 1; i < 10; i++) {
			saveTask(taskService, String.valueOf(i));
		}	
		// 删除task(不包括历史数据和子任务)
		taskService.deleteTask("1");
		// 删除task(包括历史数据和子任务)
		taskService.deleteTask("2", true);
		// 删除多个task(不包括历史数据和子任务)
		List<String> ids = new ArrayList<String>();
		ids.add("3");
		ids.add("4");
		taskService.deleteTasks(ids);
		//删除多个task(包括历史数据和子任务)
		ids = new ArrayList<String>();
		ids.add("5");
		ids.add("6");
		taskService.deleteTasks(ids, true);
		// 再删除ID为3的task,此时3的历史数据也会被删除(如果有的话)
		taskService.deleteTask("3", true);
	}
	
	//保存一个task
	static void saveTask(TaskService taskService, String id) {
		Task task1 = taskService.newTask(id);
		taskService.saveTask(task1);
	}

}
</span>



     任务权限的设置 

     经过上面那些方法一折腾,任务总算是创建出来了,那么任务最终还是人来做的哈,如何来分配任务呢?看一下又有什么好玩的方法


//根据任务ID和用户ID,然后绑定到一块

void addCandidateUser(String taskId, String userId);

//把任务ID和用户组绑定到一块

 void addCandidateGroup(String taskId, String groupId);

//不仅绑定到一块,并设置绑定的类型

 void addUserIdentityLink(String taskId, String userId, String identityLinkType);

 

 void addGroupIdentityLink(String taskId, String groupId, String identityLinkType);

//删除操作

 void deleteCandidateUser(String taskId, String userId);

 void deleteCandidateGroup(String taskId, String groupId);

 void deleteUserIdentityLink(String taskId, String userId, String identityLinkType);

 void deleteGroupIdentityLink(String taskId, String groupId, String identityLinkType);

//根据任务id和用户id设置任务受理人

void setAssignee(String taskId, String userId);

//根据用户id和任务id设置任务持有人

 void setOwner(String taskId, String userId);


 

     上面就是TaskService中有关任务分配的所有方法,看一眼,有木有感觉很简单呢?确实是这样,在分享一个demo来尝尝鲜吧!


<span style="font-family:Comic Sans MS;font-size:18px;">public class SetOwner {

	public static void main(String[] args) {
		// 获取流程引擎实例
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 获取身份服务组件
		IdentityService identityService = engine.getIdentityService();
		// 新建用户
		User user = creatUser(identityService, "user1", "张三", "last",
				"abc@163.com", "123");
		// 获取任务服务组件
		TaskService taskService = engine.getTaskService();
		// 保存一个Task
		Task task1 = taskService.newTask("task1 ");
		task1.setName("申请任务");
		taskService.saveTask(task1);
		// 设置任务持有人
		taskService.setOwner(task1.getId(), user.getId());
		System.out
				.println("用户张三持有任务数量:"
						+ taskService.createTaskQuery().taskOwner(user.getId())
								.count());
	}

	// 创建用户方法
	static User creatUser(IdentityService identityService, String id,
			String first, String last, String email, String passwd) {
		// 使用newUser方法创建User实例
		User user = identityService.newUser(id);
		// 设置用户的各个属性
		user.setFirstName(first);
		user.setLastName(last);
		user.setEmail(email);
		user.setPassword(passwd);
		// 使用saveUser方法保存用户
		identityService.saveUser(user);
		return identityService.createUserQuery().userId(id).singleResult();
	}
}
</span>


     任务参数

   在任务分配或者传递过程中,避免不了需要一些参数的传递,比如我们请假的时候,有请假人和请假天数吧!在Activiti中,参数类型分为流程参数和任务参数。老规矩,看一下用到的方法吧!


 void setVariable(String taskId, String variableName, Object value);

 void setVariables(String taskId, Map<String, ? extends Object> variables);

 void setVariableLocal(String taskId, String variableName, Object value);

 void setVariablesLocal(String taskId, Map<String, ? extends Object> variables);

 Object getVariable(String taskId, String variableName);

 boolean hasVariable(String taskId, String variableName);

 Object getVariableLocal(String taskId, String variableName);

 boolean hasVariableLocal(String taskId, String variableName);

 Map<String, Object> getVariables(String taskId);

 Map<String, Object> getVariablesLocal(String taskId);

 Map<String, Object> getVariables(String taskId, Collection<String> variableNames);

 Map<String, Object> getVariablesLocal(String taskId, Collection<String> variableNames);

 void removeVariable(String taskId, String variableName);

 void removeVariableLocal(String taskId, String variableName);

 void removeVariables(String taskId, Collection<String> variableNames);

 void removeVariablesLocal(String taskId, Collection<String> variableNames);


     哇塞,满满的全是正能量哈,这么多,Activiti封装的太贴心了,在这里需要补充一点知识。在Activiti中设置的参数是有作用域概念的,上面方法中没有带Local的,代表的是全局的作用域,带Local的表明的是当前任务的作用域。

     下面就通过实战来了解一下吧


<span style="font-family:Comic Sans MS;font-size:18px;">public class LocalVariable {

	public static void main(String[] args) {
		// 获取流程引擎实例
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 获取任务服务组件
		TaskService taskService = engine.getTaskService();
		// 获取运行服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 流程存储服务组件
		RepositoryService repositoryService = engine.getRepositoryService();
		// 部署流程描述文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/vacation.bpmn").deploy();
		// 查找流程定义
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		// 启动流程
		ProcessInstance pi = runtimeService
				.startProcessInstanceById(pd.getId());
		// 分别调用setVariable和setVariableLocal方法
		Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
				.singleResult();
		taskService.setVariable(task.getId(), "days", 10);
		taskService.setVariableLocal(task.getId(), "target", "欧洲");
		// 获取参数
		Object data1 = taskService.getVariable(task.getId(), "days");
		System.out.println("获取休假天数:" + data1);
		Object data2 = taskService.getVariable(task.getId(), "target");
		System.out.println("获取目的地: " + data2);
		// 获取参数
		Object data3 = taskService.getVariableLocal(task.getId(), "days");
		System.out.println("使用getVariableLocal方法获取天数:" + data3);
	}

}
</span>


     区别就不再多说看,运行下上面例子,结果自然而知


     任务附件管理

     在一些流程中,有时候也会附带一些附件,在Activiti中也为我们封装好了上传附件的API


 Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String  attachmentName, String attachmentDescription, InputStream content);

 Attachment createAttachment(String attachmentType, String taskId, String processInstanceId, String  attachmentName, String attachmentDescription, String url);

 void saveAttachment(Attachment attachment);

 Attachment getAttachment(String attachmentId);

 InputStream getAttachmentContent(String attachmentId);

 List<Attachment> getTaskAttachments(String taskId);

 List<Attachment> getProcessInstanceAttachments(String processInstanceId);

 void deleteAttachment(String attachmentId);


     上面的方法中,基本上就是围绕附件的一些添加删除和查询的方法,都老一套了,没什么新鲜的了,按照老规矩,给个例子锻炼一下吧


<span style="font-family:Comic Sans MS;font-size:18px;">public class CreateAttachment {

	public static void main(String[] args) throws Exception {
		// 获取流程引擎实例
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 获取任务服务组件
		TaskService taskService = engine.getTaskService();
		// 获取运行服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 流程存储服务组件
		RepositoryService repositoryService = engine.getRepositoryService();
		// 部署流程描述文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/vacation.bpmn").deploy();
		// 查找流程定义
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		// 启动流程
		ProcessInstance pi = runtimeService
				.startProcessInstanceById(pd.getId());
		// 查找任务
		Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
				.singleResult();
		// 设置任务附件
		taskService.createAttachment("web url", task.getId(), pi.getId(), "163.com", 
				"163 web page", "http://www.163.com");
		// 创建图片输入流
		InputStream is = new FileInputStream(new File("resource/artifact/result.png"));
		// 设置输入流为任务附件
		taskService.createAttachment("web url", task.getId(), pi.getId(), "163.com", 
				"163 web page", is);
	}

}
</span>



     任务评论

     在日常的工作流程中,有时候随着业务的进行,可能会夹杂着一些个人的流程意见。使用Activiti可以将任务或者流程的评论保存到ACT_HI_COMMENT表中,再来看一下吧!


 Comment addComment(String taskId, String processInstanceId, String message);
 Comment getComment(String commentId);
 void deleteComments(String taskId, String processInstanceId);
 void deleteComment(String commentId);
 List<Comment> getTaskComments(String taskId);



     上面就是关于评论的一些操作方法,是不是感觉So easy呢?


<span style="font-family:Comic Sans MS;font-size:18px;">public class AddComment {

	public static void main(String[] args) {
		// 获取流程引擎实例
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 获取任务服务组件
		TaskService taskService = engine.getTaskService();
		// 获取运行服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		// 流程存储服务组件
		RepositoryService repositoryService = engine.getRepositoryService();
		// 部署流程描述文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/vacation.bpmn").deploy();
		// 查找流程定义
		ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		// 启动流程
		ProcessInstance pi = runtimeService
				.startProcessInstanceById(pd.getId());
		// 查找任务
		Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
				.singleResult();
		// 添加任务评论
		taskService.addComment(task.getId(), pi.getId(), "this is comment message");
		// 查询评论
		List<Comment> comments = taskService.getTaskComments(task.getId());
		System.out.println("评论数量:" + comments.size());
	}

}</span>





  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Activiti 7 中,获取上一个任务节点的任务可以通过历史任务查询实现。可以通过以下步骤来获取上一个任务节点的任务: 1. 首先,获取当前任务的 ID。可以使用以下代码获取当前任务的 ID: ```java String currentTaskId = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult() .getId(); ``` 其中,`processInstanceId` 是当前流程实例的 ID。 2. 然后,使用当前任务 ID 查询历史任务。可以使用以下代码查询历史任务: ```java List<HistoricTaskInstance> historicTasks = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricTaskInstanceEndTime() .desc() .list(); ``` 其中,`processInstanceId` 是当前流程实例的 ID。使用 `orderByHistoricTaskInstanceEndTime().desc()` 可以按照任务结束时间倒序排列历史任务。 3. 最后,找到上一个任务节点的任务。可以遍历历史任务列表,找到上一个任务节点的任务。可以使用以下代码实现: ```java String previousTaskId = null; for (HistoricTaskInstance historicTask : historicTasks) { if (!historicTask.getId().equals(currentTaskId)) { previousTaskId = historicTask.getId(); break; } } ``` 在循环中,判断当前任务的 ID 是否与当前任务 ID 相等,如果不相等,则认为是上一个任务节点的任务。 通过上述步骤,你可以获取上一个任务节点的任务 ID(`previousTaskId`),然后可以根据需要进行进一步的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值