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",    "[email protected]", "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>





           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43747119/article/details/86061635