Activity工作流(五):用户/用户组 表单
创始人
2025-05-31 06:17:14

在这里插入图片描述

activiti的用户表和其它表没有外键关系,方便进行扩展。activiti的用户表提供了简单的信息,和其它框架整合的时候,可以使用自己定义的表。

5.1 用户组

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();//结果降序

5.2 用户

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();

6. 表单

除了使用Assignee保存任务操作者,每个任务节点可以保存一些简单的信息。表单能保存的数据较少,可以自己创建表保存数据。

6.1 内置表单

在这里插入图片描述





操作表单:

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);

6.2 外置表单

外置表单可以自定义一个代码片段,如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);

7. 网关

在这里插入图片描述

网关类似于程序中的if判断,当满足某一条件时,任务进入下一个指定的节点。 网关有:排他网关、并行网关、包含网关、基于事件网关。

7.1 排他网关

排他网关只会选择一条顺序流执行。 就是说,虽然多个顺序流的条件结果为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());

7.2 并行网关

在这里插入图片描述

网关也可以表示流程中的并行情况。最简单的并行网关是 并行网关,它允许将流程 分成多条分支,也可以把多条分支 汇聚到一起。
并行网关的功能是基于进入和外出的顺序流的: ’
• 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
• 汇聚:所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。
这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 与其他网关的主要区别是,并行网关不会解析条件。
即使顺序流中定义了条件,也会被忽略。

7.3 包含网关

在这里插入图片描述

包含网关可以看做是排他网关和并行网关的结合体。 和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们。
但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样。 包含网关的功能是基于进入和外出顺序流的:
• 分支: 所有外出顺序流的条件都会被解析,结果为true的顺序流会以并行方式继续执行, 会为每个顺序流创建一个分支。
• 汇聚: 所有并行分支到达包含网关,会进入等待章台, 直到每个包含流程token的进入顺序流的分支都到达。
这是与并行网关的最大不同。换句话说,包含网关只会等待被选中执行了的进入顺序流。 在汇聚之后,流程会穿过包含网关继续执行。
注意,如果同一个包含节点拥有多个进入和外出顺序流, 它就会同时含有分支和汇聚功能。 这时,网关会先汇聚所有拥有流程token的进入顺序流,
再根据条件判断结果为true的外出顺序流,为它们生成多条并行分支。

相关内容

热门资讯

(独家解答)“相约互娱.怎么装... 您好:相约互娱这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9951342】很多玩家在这款游戏...
玩家实测“新蜜瓜二厅辅助软件”... 您好:新蜜瓜二厅这款游戏可以开挂,确实是有挂的,需要软件加微信【6383787】,很多玩家在新青鸟大...
玩家必看“乐享牛牛有没有挂吗”... 您好:乐享牛牛这款游戏可以开挂,确实是有挂的,需要软件加微信【8700483】,很多玩家在乐享牛牛这...
玩家实测“新悠悠到底是不是有透... 您好:新悠悠这款游戏可以开挂,确实是有挂的,需要软件加微信【5951795】,很多玩家在新悠悠这款游...
重大消息{新荣耀牛牛.辅助软件... 亲.新荣耀牛牛这款游戏是可以开挂的,确实是有挂的,通过添加客服【9183893】很多玩家在这款游戏中...