SpringBoot集成activiti工作流(模拟请假流程)

链接:https://pan.baidu.com/s/10BT_Zertm1WBBrlrdE-QWQ 
提取码:zsq6

学习视频地址见腾讯课堂 :   【Activiti】工作流从入门到精通【雷哥】-学习视频教程-腾讯课堂

其他代码都是最原始的测试activiti 的api代码,整合springboot的所有代码见下图.

1.pom文件

        <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter-basic</artifactId><version>5.22.0</version></dependency>

2.配置文件

#===server 端口号配置===
server.port=8090
#数据源配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root# 使用druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#驱动com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#连接池初始化数量
spring.datasource.druid.initial-size=5
#最小空闲连接数
spring.datasource.druid.min-idle=10
#最大连接数
spring.datasource.druid.max-active=2000
#获取连接等待超时时间
spring.datasource.druid.max-wait=60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
spring.datasource.druid.time-between-eviction-runs-millis=60000# Activiti配置
## 自动构建Activiti数据库表,设置value="true",启动时检测,无表创建,有表跳过;设置value="drop-create"
## 每次启动时建新表(Springboot1.x中生效,Springboot2.x中已经不生效,因此关闭)
#spring.activiti.database-schema-update=true
## Activiti自动部署验证设置,:true-开启(默认)、false-关闭
spring.activiti.check-process-definitions=false
## 设置true后将代替那些老的Job executor
spring.activiti.async-executor-enabled=false
## Activiti定时扫描任务,默认:true(开启),不使用的话建议关掉,需要和spring.activiti.async-executor-enabled=false配合使用,否则不起作用
spring.activiti.job-executor-activate=false
#spring.activiti.process-definition-location-prefix=classpath:/processes/
#spring.activiti.process-definition-location-suffixes=**.bpmn#===mybatis 配置===
# 注意:一定要对应mapper映射xml文件的所在路径
mybatis.mapper-locations=classpath*:mapper/*.xml
# Mybatis SQL语句控制台打印
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启驼峰命名  譬如数据库create_time 自动映射pojo属性createTime
mybatis.configuration.map-underscore-to-camel-case=true

3.启动类排除掉权限SecurityAutoConfiguration类,不然启动失败.报找不着这个类的问题

@SpringBootApplication(exclude = org.activiti.spring.boot.SecurityAutoConfiguration.class)
public class ActivitiDemoApplication {public static void main(String[] args) {SpringApplication.run(ActivitiDemoApplication.class, args);}}

4.启动成功便已经创建好了activiti的表

5.画流程图

其他连线依次设置即可

设置办理人,使用监听器监听设置办理人,新建TaskListenerImpl 类实现 TaskListener

public class TaskListenerImpl implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {//====流程模拟====//1.得到当前用户String name="小王";//2.取出领导idString id="5";//3.查询领导信息String leader="小李";//4.设置办理人delegateTask.setAssignee(leader);}
}

画好流程图压缩成zip包待使用,Controller 接口

@RestController("/workFlow")
@Api(tags = "测试activiti",description = "LeaveBillConttroller")
public class LeaveBillConttroller {@Autowiredprivate LeaveBillService leaveBillService;@ApiOperation("查询流程部署")@GetMapping(value = "/queryProcessDeploy")public List<ActDeployment> queryProcessDeploy(WorkFlowVo workFlowVo){return leaveBillService.queryProcessDeploy(workFlowVo);}@ApiOperation("查询流程定义")@GetMapping(value = "/queryAllProcessDefinition")public  List<ActProcessDefinition> queryAllProcessDefinition(WorkFlowVo workFlowVo){return leaveBillService.queryAllProcessDefinition(workFlowVo);}@ApiOperation("添加流程部署")@PostMapping(value = "/addWorkFlow")public Map<String ,Object> addWorkFlow(MultipartFile file ,WorkFlowVo workFlowVo) throws IOException {leaveBillService.addWorkFlow(file.getInputStream(),workFlowVo.getDeploymentName());return null;}@ApiOperation("删除流程部署")@PostMapping(value = "/deleteWorkFlow")public Map<String ,Object> deleteWorkFlow(WorkFlowVo workFlowVo) throws IOException {leaveBillService.deleteWorkFlow(workFlowVo.getDeploymentId());return null;}@ApiOperation("流程部署id查看流程图")@PostMapping(value = "/viewProcessImage")public void viewProcessImage(WorkFlowVo workFlowVo, HttpServletResponse response) throws IOException {leaveBillService.viewProcessImage(workFlowVo.getDeploymentId(),response);}@ApiOperation("提交申请,启动流程")@PostMapping(value = "/startProcess")public void startProcess(WorkFlowVo workFlowVo) throws IOException {leaveBillService.startProcess(workFlowVo);}@ApiOperation("查询当前登录人的待办任务")@GetMapping(value = "/loadCurrentUserTask")public List<ActTask> loadCurrentUserTask(WorkFlowVo workFlowVo) throws IOException {return leaveBillService.loadCurrentUserTask(workFlowVo);}@ApiOperation("根据任务id查询业务id和连线")@GetMapping(value = "/toDoTask")public Map<String ,Object> toDoTask(WorkFlowVo workFlowVo) throws IOException {Leavebill leavebill=leaveBillService.toDoTask(workFlowVo.getTaskId());List<String> outComeName=leaveBillService.queryOutComes(workFlowVo.getTaskId());Map map=new HashMap();map.put("leavebill",leavebill);map.put("outComeName",outComeName);return null;}@ApiOperation("根据任务id查询批注信息")@GetMapping(value = "/loadAllCommentByTaskId")public List<ActComment> loadAllCommentByTaskId(WorkFlowVo workFlowVo) throws IOException {return leaveBillService.loadAllCommentByTaskId(workFlowVo.getTaskId());}@ApiOperation("完成任务")@GetMapping(value = "/doTask")public Map<String ,Object> doTask(WorkFlowVo workFlowVo, HttpServletRequest request) throws IOException {return leaveBillService.completeTask(workFlowVo);}
}

实现类的方法

@Service
public class LeaveBillService {@Autowiredprivate TaskService taskService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate RepositoryService repositoryService;//查询流程部署public List<ActDeployment>queryProcessDeploy(WorkFlowVo workFlowVo){if(workFlowVo.getDeploymentName()==null){workFlowVo.setDeploymentName("");}String name=workFlowVo.getDeploymentName();long count = repositoryService.createDeploymentQuery().deploymentNameLike("%"+name+"%").count();List<Deployment> deployments = repositoryService.createDeploymentQuery().deploymentNameLike("%"+name+"%").listPage(0, 10);List<ActDeployment> actDeployments=new ArrayList<>();for (Deployment deployment :deployments){ActDeployment actDeployment=new ActDeployment();BeanUtils.copyProperties(deployment,actDeployment);actDeployments.add(actDeployment);}return actDeployments;}//查询流程定义public  List<ActProcessDefinition> queryAllProcessDefinition(WorkFlowVo workFlowVo){if(workFlowVo.getDeploymentName()==null){workFlowVo.setDeploymentName("");}String name=workFlowVo.getDeploymentName();List<Deployment> deployments =repositoryService.createDeploymentQuery().deploymentNameLike("%"+name+"%").list();Set<String> deploymentIds=new HashSet<>();for (Deployment deployment :deployments){deploymentIds.add(deployment.getId());}List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().deploymentIds(deploymentIds).list();List<ActProcessDefinition> actProcessDefinitions=new ArrayList<>();for (ProcessDefinition definition :list){ActProcessDefinition actProcessDefinition=new ActProcessDefinition();BeanUtils.copyProperties(definition,actProcessDefinition);actProcessDefinitions.add(actProcessDefinition);}return actProcessDefinitions;}//添加流程部署@Transactionalpublic void addWorkFlow(InputStream inputStream, String deployMentName) throws IOException {//流程部署 ,获取流程部署对象ZipInputStream zipInputStream = new ZipInputStream(inputStream);Deployment deploy = repositoryService.createDeployment().name(deployMentName).addZipInputStream(zipInputStream).deploy();inputStream.close();zipInputStream.close();System.err.println("流程部署完成");}//删除流程部署@Transactionalpublic void deleteWorkFlow(String deploymentId) {//根据流程部署id删除,如果当前id的流程正在执行,那么会报错repositoryService.deleteDeployment(deploymentId);//根据流程部署id删除,删除流程定义,如果当前id流程正在执行,那么会把正在执行的流程数据删除 act_ru_*和act_hi_*表里的数据//repositoryService.deleteDeployment(deploymentId,true);System.err.println("删除流程部署完成");}//流程部署id查看流程图public void viewProcessImage(String deploymentId, HttpServletResponse response) throws IOException {//根据部署id查询流程定义对象ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();//从流程定义里面得到图片的名称String resourceName = definition.getDiagramResourceName();//使用部署id和图片名称去查询图片流InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);//写出图片File file = new File("C://abc.jpeg");FileOutputStream fos = new FileOutputStream(file);byte[] b = new byte[1024];int length;while ((length = inputStream.read(b)) != -1) {fos.write(b, 0, length);}inputStream.close();}/*** 提交申请,启动流程**/@Transactionalpublic void startProcess(WorkFlowVo workFlowVo) {//模拟入库提交请假申请,返回请假idInteger leavebillId = workFlowVo.getId();//找到流程的keyString processDefinitionKey = Leavebill.class.getSimpleName();String businessKey=processDefinitionKey+":"+leavebillId;Map<String,Object> variables=new HashMap<>();//请假人variables.put("username",workFlowVo.getUsername());runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey,variables);System.err.println("提交申请,启动流程成功");//todo 修改请假状态}/*** 查询当前登录人的待办任务*/public List<ActTask> loadCurrentUserTask(WorkFlowVo workFlowVo) {String username = workFlowVo.getUsername(); //当前登录用户long count=taskService.createTaskQuery().taskAssignee(username).count();List<Task> taskList =taskService.createTaskQuery().taskAssignee(username).listPage(0, 10);List<ActTask> actTaskList=new ArrayList<>();for (Task task :taskList){ActTask actTask=new ActTask();BeanUtils.copyProperties(task,actTask);actTaskList.add(actTask);}return actTaskList;}//根据任务id查询业务信息public Leavebill toDoTask(String taskId) {//根据任务id查询任务实例Task task = taskService.createTaskQuery().taskId(taskId).singleResult();//任务实例中取出流程实例idString processInstanceId = task.getProcessInstanceId();//根据流程实例id查询流程实例ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();//取出business_key ,拆分获取业务id,并查询业务信息String businessKey = processInstance.getBusinessKey();String id = businessKey.split(":")[1];Leavebill leavebill=new Leavebill();leavebill.setId(Integer.valueOf(id));return leavebill;}//根据任务id查询连线信息public List<String> queryOutComes(String taskId) {List<String> names=new ArrayList<>();//1.根据任务id查询任务实例Task task = taskService.createTaskQuery().taskId(taskId).singleResult();//2.取出流程定义idString processDefinitionId = task.getProcessDefinitionId();//3.取出流程实例idString processInstanceId = task.getProcessInstanceId();//4.根据流程实例id查询流程实例ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();//5.根据流程定义id查询流程定义的xml信息ProcessDefinitionEntity processDefinition =(ProcessDefinitionEntity)repositoryService.getProcessDefinition(processDefinitionId);//6.从流程实例对象取出当前活动节点idString activityId = processInstance.getActivityId();//7.根据活动节点id取出xml和当前活动节点相关数据ActivityImpl activityImpl = processDefinition.findActivity(activityId);//8.从activityImpl中取出连线对象List<PvmTransition> incomingTransitions = activityImpl.getIncomingTransitions(); //进入的线List<PvmTransition> transitions = activityImpl.getOutgoingTransitions(); //出去的线if(!CollectionUtils.isEmpty(transitions)){for (PvmTransition trans : transitions) {String name = trans.getProperty("name").toString();names.add(name);}}return names;}/*** 根据任务id查询批注信息*/public List<ActComment> loadAllCommentByTaskId(String taskId) {Task task = taskService.createTaskQuery().taskId(taskId).singleResult();String processInstanceId = task.getProcessInstanceId();List<Comment> commentList =taskService.getProcessInstanceComments(processInstanceId);List<ActComment> actCommentList=new ArrayList<>();for (Comment comment :commentList){ActComment actComment=new ActComment();BeanUtils.copyProperties(comment,actComment);actCommentList.add(actComment);}return actCommentList;}/*** 完成任务*/@Transactionalpublic Map<String, Object> completeTask(WorkFlowVo workFlowVo) {String taskId = workFlowVo.getTaskId(); //任务idString outCome = workFlowVo.getOutCome(); //连接名称Integer id = workFlowVo.getId(); //请假单idString comment = workFlowVo.getComment(); //批注信息String username = workFlowVo.getUsername(); //用户名//根据任务id查询任务实例Task task = taskService.createTaskQuery().taskId(taskId).singleResult();//从任务中取出流程实例idString processInstanceId = task.getProcessInstanceId();//设置批注人名 因为批注人使用线程局部变量设置,故批注人必须这样设置Authentication.setAuthenticatedUserId(username);//添加批注信息taskService.addComment(taskId,processInstanceId,comment);//完成任务Map<String,Object> variables=new HashMap<>();variables.put("coutcome",outCome);taskService.complete(taskId,variables);//判断任务是否结束ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if(processInstance==null){Leavebill leavebill=new Leavebill();leavebill.setId(id);if(outCome.equals("放弃")){leavebill.setState(3); //放弃}else {leavebill.setState(2); //审批完成}//todo 模拟修改数据库请假单状态}return null;}}

其中,返回的activiti5.22返回的实体是会报错的,所以要把它返回的实体参数再封装一层成自己的返回

SpringBoot集成activiti工作流相关推荐

  1. activiti 工作流_springboot+activiti+angular 集成activiti工作流实现,源码分享

    springboot+activiti+angular 这是spring boot框架集成activiti工作流实现,采用目前流行的restful api接口调用,前端使用angular js框架实现 ...

  2. # SpringBoot 整合 Activiti 工作流框架

    SpringBoot 整合 Activiti 工作流框架 Activiti 介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调 ...

  3. Springboot 集成 Activiti时启动报错!'org.activiti.spring.boot.SecurityAutoConfiguration

    Springboot 集成 Activiti时启动报错! org.springframework.beans.factory.BeanCreationException: Error creating ...

  4. SpringBoot集成Activiti Explorer

    最近又要开始弄工作流,出现bug要修改,前同事离职了两个多月了,目前也没有新招到后端java,目前一个人顶着. Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端 ...

  5. SpringBoot整合Activiti工作流

    依赖: 新建springBoot项目时勾选activiti,或者在已建立的springBoot项目添加以下依赖: <dependency><groupId>org.activi ...

  6. XBoot前后端分离开发平台springboot 2.x iview admin vue 集成activiti工作流 模型设计器 动态数据权限 权限按钮显示 s...

    宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...

  7. springBoot搭建activiti工作流

    1.新建maven项目 2.依赖 的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project ...

  8. springboot集成activiti汉化

    activiti的modeler汉化. 汉化步骤: 将en.json(路径:editor-app/i18n/en.json)文件汉化,改名zh-CN.json,放在en.json同目录. 同时将汉化后 ...

  9. Spring Boot 2.x整合Websocket(基于Spring Boot 2.x 前后端分离 iview admin vue 集成activiti工作流...

    宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...

最新文章

  1. linux连接wifi账户密码忘了怎么办,wifi登录密码忘了怎么办?
  2. (C#)如何利用Graphics画出一幅图表
  3. 祝福遨游:傲游浏览器3月将入住欧盟Win7用户桌面
  4. IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)
  5. 我自己写的3D图形数学库。。。有点乱!
  6. 用MathType编辑带点星号的流程
  7. 云原生语境下,如何重新解读微服务?
  8. 常用的rpm和yum的一些命令
  9. Notepad++远程连接Linux系统
  10. ES6第一节:开发环境的搭建
  11. python生成序列_python中生成一个指定长度的列表,按1,2,3的序列生成
  12. 【Transformer】10个重要问题概览Transformer全部内容
  13. ubuntu18.04 LTS 安装英伟达驱动
  14. 实验室常见的PFA制品有哪些?这些特氟龙PFA产品你认得全吗?
  15. 复旦大学硕士盲审 计算机学院,《复旦大学论文抽检、盲审工作的通知.doc
  16. win7麦克风没声音怎么设置
  17. 风筝轮评测 风筝选购指南
  18. python代码下面有波浪线_pycharm出现波浪线有哪些原因
  19. 问下这个审核被拒怎么解决呢?——酷课堂iOS交流群问答整理(201806期)
  20. 斯坦福大学的产学研之路

热门文章

  1. 数码管动态显示Verilog实现(参考小梅哥教程)(视觉暂留)
  2. Python 最快Web框架
  3. 511遇见易语言API模块视进入许可证(EnterCriticalSection)
  4. Cydia源地址删除
  5. 无法定位程序输入点K32EnumProcessModules于动态链接库KERNEL32.dll上
  6. 求生之路2服务器ip直连,求生之路2不能联机_正版求生之路2好友直连显示该会话已不可用,无法联机...
  7. CreateMutex互斥体对象
  8. 顶尖大学官宣:院士出任校董会主席!
  9. mysql xa 事务_MySQL的XA事务问题分析
  10. 2、PHP环境搭建(推荐宝塔面板)