文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Springboot整合工作流引擎Activiti之网关路由

2024-12-02 13:07

关注

环境:Springboot2.3.12.RELEASE + Activiti7.1.0.M6

本篇主要演示复杂的审批流程的应用:排他网关路由的使用(Exclusive Gateway)

流程设计


审批说明:当员工请假天数小于等于3天时,部门经理审批,当部门经理同意flag==1流程结束,不同意flag==0流程返回到"员工请假"节点;当请假天数大于3天时,先由部门经理审批,再由总经理审批,当总经理同意flag==1流程结束,不同意flag==0流程返回到"员工请假"节点。

  1. "1.0" encoding="UTF-8"?> 
  2. "http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.xg.com"
  3.   "holiday3" name="holiday3" isExecutable="true"
  4.     "startevent1" name="Start"
  5.     "usertask1" name="员工请假" activiti:assignee="${userId}"
  6.     "exclusivegateway1" name="Exclusive Gateway"
  7.     "flow1" sourceRef="startevent1" targetRef="usertask1"
  8.     "flow2" sourceRef="usertask1" targetRef="exclusivegateway1"
  9.     "usertask2" name="部门经理审批" activiti:assignee="${d_mgr}"
  10.     "flow3" name="${days <=3}" sourceRef="exclusivegateway1" targetRef="usertask2"
  11.       "tFormalExpression"> 
  12.      
  13.     "usertask3" name="部门经理审批" activiti:assignee="${d_mgr}"
  14.     "usertask4" name="总经理审批" activiti:assignee="${g_mgr}"
  15.     "flow4" name="${days > 3}" sourceRef="exclusivegateway1" targetRef="usertask3"
  16.       "tFormalExpression"> 3}]]> 
  17.      
  18.     "flow5" sourceRef="usertask3" targetRef="usertask4"
  19.     "endevent1" name="End"
  20.     "flow6" name="${flag==1}" sourceRef="usertask2" targetRef="endevent1"
  21.       "tFormalExpression"> 
  22.      
  23.     "flow7" name="${flag==1}" sourceRef="usertask4" targetRef="endevent1"
  24.       "tFormalExpression"> 
  25.      
  26.     "flow8" name="${flag==0}" sourceRef="usertask2" targetRef="usertask1"
  27.       "tFormalExpression"> 
  28.      
  29.     "flow9" name="${flag==0}" sourceRef="usertask4" targetRef="usertask1"
  30.       "tFormalExpression"> 
  31.      
  32.    
  33.   "BPMNDiagram_holiday3"
  34.     "holiday3" id="BPMNPlane_holiday3"
  35.       "startevent1" id="BPMNShape_startevent1"
  36.         "35.0" width="35.0" x="470.0" y="40.0"
  37.        
  38.       "usertask1" id="BPMNShape_usertask1"
  39.         "55.0" width="105.0" x="435.0" y="120.0"
  40.        
  41.       "exclusivegateway1" id="BPMNShape_exclusivegateway1"
  42.         "40.0" width="40.0" x="467.0" y="260.0"
  43.        
  44.       "usertask2" id="BPMNShape_usertask2"
  45.         "55.0" width="105.0" x="220.0" y="253.0"
  46.        
  47.       "usertask3" id="BPMNShape_usertask3"
  48.         "55.0" width="105.0" x="640.0" y="253.0"
  49.        
  50.       "usertask4" id="BPMNShape_usertask4"
  51.         "55.0" width="105.0" x="880.0" y="253.0"
  52.        
  53.       "endevent1" id="BPMNShape_endevent1"
  54.         "35.0" width="35.0" x="470.0" y="430.0"
  55.        
  56.       "flow1" id="BPMNEdge_flow1"
  57.         "487.0" y="75.0"
  58.         "487.0" y="120.0"
  59.        
  60.       "flow2" id="BPMNEdge_flow2"
  61.         "487.0" y="175.0"
  62.         "487.0" y="260.0"
  63.        
  64.       "flow3" id="BPMNEdge_flow3"
  65.         "467.0" y="280.0"
  66.         "325.0" y="280.0"
  67.          
  68.           "14.0" width="100.0" x="361.0" y="280.0"
  69.          
  70.        
  71.       "flow4" id="BPMNEdge_flow4"
  72.         "507.0" y="280.0"
  73.         "640.0" y="280.0"
  74.          
  75.           "14.0" width="100.0" x="538.0" y="280.0"
  76.          
  77.        
  78.       "flow5" id="BPMNEdge_flow5"
  79.         "745.0" y="280.0"
  80.         "880.0" y="280.0"
  81.        
  82.       "flow6" id="BPMNEdge_flow6"
  83.         "272.0" y="308.0"
  84.         "272.0" y="447.0"
  85.         "470.0" y="447.0"
  86.          
  87.           "14.0" width="100.0" x="300.0" y="429.0"
  88.          
  89.        
  90.       "flow7" id="BPMNEdge_flow7"
  91.         "932.0" y="308.0"
  92.         "932.0" y="447.0"
  93.         "505.0" y="447.0"
  94.          
  95.           "14.0" width="100.0" x="800.0" y="429.0"
  96.          
  97.        
  98.       "flow8" id="BPMNEdge_flow8"
  99.         "272.0" y="253.0"
  100.         "272.0" y="147.0"
  101.         "435.0" y="147.0"
  102.          
  103.           "14.0" width="100.0" x="290.0" y="151.0"
  104.          
  105.        
  106.       "flow9" id="BPMNEdge_flow9"
  107.         "932.0" y="253.0"
  108.         "932.0" y="147.0"
  109.         "540.0" y="147.0"
  110.          
  111.           "14.0" width="100.0" x="790.0" y="151.0"
  112.          
  113.        
  114.      
  115.    
  116.  

到此流程设计完成。

Service接口

  1. @Service 
  2. public class HolidayService { 
  3.  
  4.   private static final Logger logger = LoggerFactory.getLogger(HolidayService2.class); 
  5.   @Resource 
  6.   private RuntimeService runtimeService ; 
  7.   @Resource 
  8.   private TaskService taskService ; 
  9.    
  10.   public ProcessInstance startProcessInstanceAssignVariables(String processDefinitionId, Map variables) { 
  11.     Authentication.setAuthenticatedUserId((String)variables.get("assignee")) ; 
  12.     ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); 
  13.     logger.info("流程定义ID: {}", processInstance.getProcessDefinitionId()); 
  14.     logger.info("流程实例ID: {}", processInstance.getId()); 
  15.     logger.info("BussinessKey: {}", processInstance.getBusinessKey()) ; 
  16.     return processInstance ; 
  17.     } 
  18.    
  19.   public void executionTask(Map variables, String instanceId) { 
  20.     Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult() ; 
  21.     if (task == null) { 
  22.       logger.error("任务【{}】不存在", instanceId) ; 
  23.       throw new RuntimeException("任务【" + instanceId + "】不存在") ; 
  24.     } 
  25.     // 注意这里一定要设置变量,否则流程中设置的表达式无法获取,如下图 
  26.     taskService.setVariables(task.getId(), variables); 
  27.     taskService.complete(task.getId(), variables) ; 
  28.   } 

方法的含义已经在代码中说明了。


Controller接口

  1. package com.pack.controller; 
  2.  
  3. import java.util.HashMap; 
  4. import java.util.List; 
  5. import java.util.Map; 
  6. import java.util.stream.Collectors; 
  7.  
  8. import javax.annotation.Resource; 
  9.  
  10. import org.activiti.engine.history.HistoricActivityInstance; 
  11. import org.activiti.engine.runtime.ProcessInstance; 
  12. import org.activiti.engine.task.Task; 
  13. import org.apache.commons.lang3.StringUtils; 
  14. import org.springframework.web.bind.annotation.GetMapping; 
  15. import org.springframework.web.bind.annotation.PathVariable; 
  16. import org.springframework.web.bind.annotation.RequestMapping; 
  17. import org.springframework.web.bind.annotation.RequestParam; 
  18. import org.springframework.web.bind.annotation.RestController; 
  19.  
  20. import com.pack.dto.ProcessDefinitionDTO; 
  21. import com.pack.dto.ProcessInstanceDTO; 
  22. import com.pack.dto.R; 
  23. import com.pack.task.HolidayService2; 
  24.  
  25. @RestController 
  26. @RequestMapping("/holidays2"
  27. public class HolidayController2 { 
  28.      
  29.   @Resource 
  30.   private HolidayService holidayService ; 
  31.      
  32.    
  33.   @GetMapping("/start"
  34.   public R startProcess(String userId, String processDefinitionId) { 
  35.     Map variables = new HashMap<>() ; 
  36.     variables.put("userId", userId) ; 
  37.     ProcessInstance instance = holidayService.startProcessInstanceAssignVariables(processDefinitionId, variables) ; 
  38.     ProcessInstanceDTO dto = new ProcessInstanceDTO() ; 
  39.     dto.setInstanceId(instance.getId()) ; 
  40.     return R.success(dto) ; 
  41.   } 
  42.    
  43.   @GetMapping("/apply"
  44.   public R fillApply(@RequestParam Map variables) { 
  45.     String instanceId = (String) variables.remove("instanceId") ; 
  46.     if (StringUtils.isEmpty(instanceId)) { 
  47.       return R.failure("未知任务") ; 
  48.     } 
  49.     holidayService.executionTask(variables, instanceId); 
  50.     return R.success() ;  
  51.   } 

测试

启动流程


请假人处理


d_mgr:部门经理ID

days:3 (小于3天)

部门经理处理


flag:0 (不同意,驳回到员工申请)

查看act_hi_actinst表数据:


流程又进入到了“员工申请”节点

再次重复上面的流程,当走到部门经理时,将flag=1。


到此流程结束,当请求天数大于3天的处理过程与上面基本相同。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯