对于审批完成的处理也要对这种特殊情况做处理,目前暂时不支持子流程

taskService.setAssignee(taskVo.getTaskId(), loginUser.getUsername());
            // 获取下一节点数据
            FlowNextDto nextFlowNode = flowTaskService.getNextFlowNode(task.getId(), taskVo.getValues());
            
             String definitionld = runtimeService.createProcessInstanceQuery().processInstanceId(taskVo.getInstanceId()).singleResult().getProcessDefinitionId();        //获取bpm(模型)对象
            BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionld);
            //传节点定义key获取当前节点
            FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
            if(Objects.nonNull(nextFlowNode)) {
                
                if(flowNode instanceof UserTask ){//当前节点是用户任务
                    UserTask userTask = (UserTask) flowNode;
                    MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
                    if (Objects.nonNull(multiInstance)) {//当前节点是会签节点
                        if(nextFlowNode.getType().equals(ProcessConstants.PROCESS_MULTI_INSTANCE)) {//若下个节点也是会签节点
                            taskService.complete(taskVo.getTaskId());
                        }
                        else if(Objects.nonNull(taskVo.getValues()) && (taskVo.getValues().containsKey("approval"))) {//不是会签而且有approval
                            //complete方法来流传任务到下一个节点。其中第二个参数variables为下一个节点需要的参数Map,主要指流程设置的一些变量信息
                            taskService.complete(taskVo.getTaskId(), taskVo.getValues(),true);
                            Task nexttask = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).active().singleResult();
                            String assignee = taskVo.getValues().get("approval").toString();    
                            taskService.setAssignee(nexttask.getId(), assignee);
                        }
                        else {
                            taskService.complete(taskVo.getTaskId());
                        }
                    }
                    else if(Objects.nonNull(taskVo.getValues())) {//当前节点不是会签节点,而且有变量值
                        if(nextFlowNode.getType().equals(ProcessConstants.PROCESS_MULTI_INSTANCE)) {//若下个节点也是会签节点
                            if(Objects.nonNull(nextFlowNode.getUserList())) {//有下个节点有用户
                                Map<String, Object> approvalmap = new HashMap<>();
                                List<String> sysuserlist = nextFlowNode.getUserList().stream().map(obj-> (String) obj.getUsername()).collect(Collectors.toList());
                                approvalmap.put("approval", sysuserlist);
                                taskService.complete(taskVo.getTaskId(), approvalmap);
                                if(!nextFlowNode.isBisSequential()){//对并发会签进行assignee单独赋值
                                  List<Task> nexttasklist = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).active().list();
                                  int i=0;
                                  for (Task nexttask : nexttasklist) {
                                       String assignee = sysuserlist.get(i).toString();    
                                       taskService.setAssignee(nexttask.getId(), assignee);
                                       i++;
                                  }
                                 
                                }
                                
                            }
                            else {//有下个节点无用户
                                taskService.complete(taskVo.getTaskId(),taskVo.getValues());
                               }
                        }
                        else {//下个节点也不是会签而且有approval
                             taskService.complete(taskVo.getTaskId(), taskVo.getValues(),true);
                              Task nexttask = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).active().singleResult();
                              if(taskVo.getValues().containsKey("approval")) {//前端传回的审批人变量值
                                 String assignee = taskVo.getValues().get("approval").toString();    
                                 taskService.setAssignee(nexttask.getId(), assignee);
                              }
                        }
                     }
                     else {//无传值情况
                           taskService.complete(taskVo.getTaskId());
                         }
                     }
               }
            else { //下一个节点是空
                taskService.complete(taskVo.getTaskId());
            }

基于jeecgboot的支持flowable的排它网关之后的会签功能(二)相关推荐

  1. 基于jeecgboot的支持online表单审批的功能正式发布

    基于jeecgboot的flowable流程支持online表单审批线上发布一个完整的版本,利用原有online表单功能,通过选择现有online表单数据进行审批申请与操作,基本支持各自表单包括主从表 ...

  2. 基于国产龙芯 CPU 的气井工业网关研究与设计(二)

    3.1 系统硬件的总体设计 从硬件架构上,该 RTU 主要包括三大部分的设计: (1)外围电路设计:电源电路设计.RTC 电路设计和 EEPROM 电路设计. (2)RTU 本体 I/O 端口设计:A ...

  3. java毕业设计——基于JSP+sqlserver的高校智能排课系统设计与实现(毕业论文+程序源码)——高校智能排课系统

    基于JSP+sqlserver的高校智能排课系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的高校智能排课系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  4. 基于springboot的支持http接口+dubbo接口的TestNG自动化测试框架

    一.背景 由于大多数公司都是使用Java作为后端开发语言,因此为了更好的与研发的框架对接.测试,掌握一套Java的自动化测试框架也逐渐成为测试人员的必修课. 同时随着现在微服务框架的流行,自动化测试框 ...

  5. riscv运行linux,首款基于RISC-V,支持Linux的PC——HiFive Unleashed已诞生!

    对于常在开源硬件界混的小伙伴,相信对市面上的一些单板计算机都不陌生,什么树莓派.香蕉派.BeagleBone Black.Up Board等等,这些大多数都是采用ARM Coretx-A系列应用处理器 ...

  6. 巡检路线排班问题matlab,基于数学建模的巡检线路排班设计

    黄家云:基于数学建模的巡检线路排班设计 49 基于数学建模的巡检线路排班设计 黄家云 夏伟 蒋娜 张磊 (芜湖职业技术学院基础部,安徽芜湖,241003) 摘 要:巡检线路的排班设计是 2017 年全 ...

  7. 基于JEECG-BOOT制作“左树右表”交互页面

    前置知识: 1.ant-design-vue 2.vue的slot概念 需求效果: 如上界面所示. 后端不改动,基于jeecg-boot生成的代码,前端自定义,分为左右两块,典型的"左树右表 ...

  8. 基于SSM的健身房私教排课系统(含论文)

    基于SSM的健身房私教排课系统(含论文) 健身房私教排课系统能很好的为用户提供快捷的信息登记.查询.管理功能,通过网络能及时获得各项信息资料,不但减少了人力,节省物力,而且提高了管理员的工作效率.本项 ...

  9. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. float js 正则 验证_使用HTML和Vuejs进行表单验证
  2. springmvc DispatchServlet初始化九大加载策略(二)
  3. SOAWebservice系列课程(1)--The Essentials of Service Orientation
  4. 科普:CPU缓存一致性协议
  5. 身体容易缺少的微量元素
  6. SpringCloud Ribbon(一)之自定义负载均衡器ILoadBalancer
  7. java源码文件丢恢复需要多少钱,上岸蚂蚁金服!
  8. Ubuntu14.04 Apollo 3.5安装
  9. “大龄”程序员的出路
  10. hdu 1872 稳定排序
  11. 百度张亚勤当选美国艺术与科学院院士:今年当选的唯一华人科学家
  12. 佩奇扑街、外星人疯狂!Python 告诉你大年初一应该看哪部电影?
  13. python解析json传入变量_Python 使用 docopt 解析json参数文件过程讲解
  14. python基础6-控制语句
  15. SAI红绿蓝三原色叠加效果
  16. 原生android字体,不用Root,国产安卓手机如何把字体切换成安卓原生字体
  17. GoF设计模式——适配器模式(C++实现)
  18. 解决C语言运行窗口一闪而过问题
  19. linux嵌入式主要学什么软件,嵌入式软件工程师需要学什么?嵌入式Linux开发的工作内容...
  20. 降噪耳机哪个牌子好?给大家推荐几款质量比较好的降噪耳机品牌

热门文章

  1. 图像处理专业术语中英文对照
  2. Leetcode 1276:不浪费原料的汉堡制作方案(超详细的解法!!!)
  3. sfc /scannow扫描修复系统文件命令怎么用
  4. 折纸 瓦力机器人_一张纸成千种形态机器人:折纸机器人,神奇的创造
  5. 小勇机器人如何绑定_小勇机器人app
  6. 【BUG解决】 RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor)
  7. C# 字符串首字符大写
  8. 她的梦想是买一台新的计算机的英语,关于梦想的英语作文(精选11篇)
  9. 大体重程序员的减肥经历(不完整待补充)
  10. 最后谁剩下来了就返回哪个阵营 Dota2 Senate