activiti的用户表和其它表没有外键关系,方便进行扩展。activiti的用户表提供了简单的信息,和其它框架整合的时候,可以使用自己定义的表。
IdentityService identityService = processEngine.getIdentityService();
GroupQuery groupQuery = identityService.createGroupQuery();
List datas = groupQuery.list();
其他类似查询方法
groupQuery.listPage(1, 2);//分页返回查询结果;偏移量,每页几条
groupQuery.count();//结果总数
groupQuery.groupName("超级管理员").list();//根据name查询
groupQuery.groupNameLike("%超级A%").list();//根据name模糊查询
groupQuery.groupType("typeA").list();//根据type查询
groupQuery.groupId("1").singleResult();//根据id查询,查询结果唯一
groupQuery.orderByGroupId().asc().list();//结果升序
groupQuery.orderByGroupName().desc().list();//结果降序
User user = identityService.newUser("10001");
user.setEmail("zhangsan@xx.com");
user.setFirstName("zhang");
user.setLastName("san");
user.setPassword("admin");
identityService.saveUser(user);//保存用户
identityService.deleteUser("10001");//删除用户
验证用户密码,参数用户id和密码
boolean flag = identityService.checkPassword("10001", "123456");
//设置用户info信息
identityService.setUserInfo("用户id", "INFO表KEY", "INFO表VALUE");
//查询相关信息.
identityService.getUserInfo("INFO表USER_ID", "INFO表KEY");
identityService.createMembership("用户ID", "组ID");//给用户添加分组
identityService.deleteMembership("用户ID", "组ID");//删除用户和组关系
查询某用户的分组
List datas = identityService.createGroupQuery().groupMember("userId").list();
查询某组下的用户
List datas = identityService.createUserQuery().memberOfGroup("groupId").list();
除了使用Assignee保存任务操作者,每个任务节点可以保存一些简单的信息。表单能保存的数据较少,可以自己创建表保存数据。
操作表单:
ProcessDefinition definition = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("leave_mybatis").latestVersion().singleResult();
FormService formService = processEngine.getFormService();
TaskService taskService = processEngine.getTaskService();
RuntimeService runtimeService = processEngine.getRuntimeService();
Map param1 = new HashMap<>();
param1.put("userName", "user1");
模拟当前请假条的id,保证task能查出唯一的任务。当然也可以查出一个task list批量处理
String businessKey = System.currentTimeMillis() + "";
//启动任务
ProcessInstance processInstance = formService.submitStartFormData(definition.getId(), businessKey, param1);
//查询任务
Task task = taskService.createTaskQuery().taskAssignee("user1").processDefinitionKey("leave_mybatis").processInstanceBusinessKey(businessKey).singleResult();
查询任务中的表单信息
TaskFormData formData = formService.getTaskFormData(task.getId());
for (FormProperty property : formData.getFormProperties()) {System.out.println(property.getName() + "=" + property.getType());
}
Map variable = new HashMap<>();
variable.put("reason", "有事");
variable.put("startDate", "2018-01-01");
variable.put("adminName", "admin1");
//提交表单(完成当前节点的任务)
formService.submitTaskFormData(task.getId(), variable);
查询出下一节点的任务
Task task2 = taskService.createTaskQuery().taskAssignee("admin1").processDefinitionKey("leave_mybatis").processInstanceBusinessKey(businessKey).singleResult();
//查询出任务中的参数
Map variables = runtimeService.getVariables(processInstance.getId());
for (String key : variables.keySet()) {System.out.println(key + "=" + variables.get(key));
}
//完成任务
Map variable2 = new HashMap<>();
variable2.put("advise", "true");
formService.submitTaskFormData(task2.getId(), variable2);
外置表单可以自定义一个代码片段,如html片段,另存为leave_apply.form:
Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service.createDeployment() // 创建一个部署对象.name("1801请假流程-外置表单") // 设置对应流程的名称.addClasspathResource("leave7.bpmn").addClasspathResource("leave_apply.form").deploy(); // 完成部署Map param1 = new HashMap<>();
param1.put("userName", "user1");
模拟当前请假条的id,保证task能查出唯一的任务。当然也可以查出一个task list批量处理
String businessKey = System.currentTimeMillis() + "";
//启动任务
ProcessInstance processInstance = formService.submitStartFormData(definition.getId(), businessKey, param1);
//查询任务
Task task = taskService.createTaskQuery().taskAssignee("user1").processDefinitionKey("myProcess_1").processInstanceBusinessKey(businessKey).singleResult();
//查询出html片段,可以显示在页面上
Object renderedStartForm = formService.getRenderedTaskForm(task.getId());
System.out.println(renderedStartForm);
网关类似于程序中的if判断,当满足某一条件时,任务进入下一个指定的节点。 网关有:排他网关、并行网关、包含网关、基于事件网关。
排他网关只会选择一条顺序流执行。 就是说,虽然多个顺序流的条件结果为true,
那么XML中的第一个顺序流(也只有这一条)会被选中,并用来继续运行流程。
如果没有选中任何顺序流,会抛出一个异常。排他网关类似于if-elseif
ProcessDefinition definition = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("loan_gateway").latestVersion().singleResult();
Map param1 = new HashMap<>();
param1.put("amount", "5500");
//模拟当前借款单的id,保证task能查出唯一的任务。当然也可以查出一个task list批量处理
String businessKey = System.currentTimeMillis() + "";
//启动任务
ProcessInstance processInstance =runtimeService.startProcessInstanceByKey("loan_gateway", businessKey, param1);
//查询任务
Task task = taskService.createTaskQuery().processDefinitionKey("loan_gateway").processInstanceBusinessKey(businessKey).singleResult();
taskService.complete(task.getId());
网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。
并行网关的功能是基于进入和外出的顺序流的: ’
• 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
• 汇聚:所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。
这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 与其他网关的主要区别是,并行网关不会解析条件。
即使顺序流中定义了条件,也会被忽略。
包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。
但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。 包含网关的功能是基于进入和外出顺序流的:
• 分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
• 汇聚: 所有并行分支到达包含网关,会进入等待章台, 直到每个包含流程token的进入顺序流的分支都到达。
这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
注意,如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时含有分支和汇聚功能。 这时,网关会先汇聚所有拥有流程token的进入顺序流,
再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。