Activiti 用户绑定申请审批全流程演示

@Autowired

private RuntimeService runtimeService;

@Autowired

private TaskService taskService;

@Autowired

private IdentityService identityService;

@Autowired

private RepositoryService repositoryService;

@Autowired

private ProcessEngine processEngine;

@Autowired

private HistoryService historyService;

三、项目中的用户、角色与Activiti中的用户、用户组整合


每个项目都有自己的用户、角色表,Activiti也有自己的用户、用户组表。因此项目中的用户、角色与Activiti中的用户、用户组要做整合。

//项目中每创建一个新用户,对应的要创建一个Activiti用户

//两者的userId和userName一致

User admin=identityService.newUser(“1”);

admin.setLastName(“admin”);

identityService.saveUser(admin);

//项目中每创建一个角色,对应的要创建一个Activiti用户组

Group adminGroup=identityService.newGroup(“1”);

adminGroup.setName(“admin”);

identityService.saveGroup(adminGroup);

//用户与用户组关系绑定

identityService.createMembership(“1”,“1”);

四、请假审批流程


1、请假申请和请假审批数据库表设计

表设计原则:流程数据和业务数据相分离。Activiti相关表只负责流程的跳转、走向等。流程中产生的业务表单数据、审批意见、附件等存储在开发人员定义的业务表中。流程数据和业务数据之间通过processInstanceId(流程实例ID)和业务数据主键相互关联。

为什么不使用Activiti相关表来存储表单数据和附件?

Activiti为了应用的灵活性和通用性采用了纵表的方式存储表单数据。假设一条请假申请表单数据有10个字段,那就需要10条记录存储原本横表只需要一条记录存储的数据。采用纵表的方式会有如下问题:

  • 会有大量的冗余数据并且数据量会急剧的增长

  • 查询语句复杂,查询效率低

  • 尤其不适合做后期的统计报表分析

Activiti存储附件使用Blob数据格式,文件存储在数据库里,数据库的数据文件会变得超大,不利于数据库备份和迁移。

请假申请表结构

2、填写请假申请表单,启动流程实例

//启动流程实例,字符串"vacation"是BPMN模型文件里process元素的id

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(“vacation”);

//流程实例启动后,流程会跳转到请假申请节点

Task vacationApply = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();

//设置请假申请任务的执行人

taskService.setAssignee(vacationApply.getId(), req.getUserId().toString());

//设置流程参数:请假天数和表单ID

//流程引擎会根据请假天数days>3判断流程走向

//formId是用来将流程数据和表单数据关联起来

Map<String, Object> args = new HashMap<>();

args.put(“days”, req.getDays());

args.put(“formId”, formId);

//完成请假申请任务

taskService.complete(vacationApply.getId(), args);

3、待审批列表

//查出当前登录用户所在的用户组

List groups = identityService.createGroupQuery()

.groupMember(String.valueOf(userId)).list();

List groupNames = groups.stream()

.map(group -> group.getName()).collect(Collectors.toList());

//查询用户组的待审批请假流程列表

List tasks = taskService.createTaskQuery()

.processDefinitionKey(“vacation”)

.taskCandidateGroupIn(groupNames)

.listPage(pageNum - 1, pageSize);

//根据流程实例ID查询请假申请表单数据

List processInstanceIds = tasks.stream()

.map(task -> task.getProcessInstanceId())

.collect(Collectors.toList());

List vacationApplyList =

vacationRepository.getVacationApplyList(processInstanceIds);

4、请假审批功能

//查询当前审批节点

Task vacationAudit = taskService.createTaskQuery()

.taskId(req.getTaskId()).singleResult();

if (req.getAuditResult() == 1) {//审批通过

//设置流程参数:审批ID

Map<String, Object> args = new HashMap<>();

args.put(“auditId”, auditId);

//设置审批任务的执行人

taskService.claim(vacationAudit.getId(), req.getUserId().toString());

//完成审批任务

taskService.complete(vacationAudit.getId(), args);

} else {

//审批不通过,结束流程

runtimeService.deleteProcessInstance(vacationAudit.getProcessInstanceId(), auditId);

}

5、查看流程图功能

//controller层代码

@RequestMapping(value = “/image”, method = RequestMethod.GET)

public void image(HttpServletResponse response,

@RequestParam String processInstanceId) {

try {

InputStream is = vacationService.getDiagram(processInstanceId);

if (is == null)

return;

response.setContentType(“image/png”);

BufferedImage image = ImageIO.read(is);

OutputStream out = response.getOutputStream();

ImageIO.write(image, “png”, out);

is.close();

out.close();

} catch (Exception ex) {

logger.error(“查看流程图失败”, ex);

}

}

//service层代码

@Override

public InputStream getDiagram(String processInstanceId) {

//获得流程实例

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()

.processInstanceId(processInstanceId).singleResult();

String processDefinitionId = StringUtils.EMPTY;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

img

总结

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家

在这里插入图片描述

在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

总结

这个月马上就又要过去了,还在找工作的小伙伴要做好准备了,小编整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家

[外链图片转存中…(img-DVqhxfqb-1711576502567)]

[外链图片转存中…(img-FJEL8644-1711576502568)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值