此功能以Activiti5.22为基础版本进行设计实现。其他版本仅做参考。

第一、需开启用户任务会签功能

1、会签串行(用户任务结点以三条横线标识)

2、会签并行(用户任务结点以三条竖线标识)

第二、启动时设置

    private Map<String, Object> checkAndParseStartVar(Process process, Map<String, ProcessVarDTO> processVar) {Assert.isTrue (!CollectionUtils.isEmpty(processVar), "流程变量信息为空");Map<String, Object> map = new HashMap<>(processVar.size() + 4);List<UserTask> userTasks = process.getFlowElements().stream().filter(flowElement -> flowElement instanceof UserTask).map(flowElement -> (UserTask)flowElement).collect(Collectors.toList());for (Entry<String, ProcessVarDTO> entry : processVar.entrySet()) {ProcessVarDTO dto = entry.getValue();Assert.notNull (dto , "键值["+ entry.getKey() + "]对应的值为空");boolean isMultiInstance = userTasks.stream().filter(userTask -> Objects.nonNull(userTask.getLoopCharacteristics())).map(UserTask::getLoopCharacteristics).anyMatch(multiInstanceLoopCharacteristics -> {String key = multiInstanceLoopCharacteristics.getInputDataItem();key = key.replace("${", Symbol.EMPTY).replace("}", Symbol.EMPTY).trim();return key.equals(entry.getKey());});if (dto.getLongVal() != null) {map.put(entry.getKey(), dto.getLongVal());} else if (dto.getDoubleVal() != null) {map.put(entry.getKey(), dto.getDoubleVal());} else if (!CollectionUtils.isEmpty(dto.getCandidate())) {String candidate = dto.getCandidate().toString();candidate = candidate.substring(1, candidate.length() - 1).replaceAll("\\D+", ",");map.put(entry.getKey(), isMultiInstance ? Lists.newArrayList(dto.getCandidate()) : candidate);} else if (dto.getStringVal() != null) {map.put(entry.getKey(), isMultiInstance ? Lists.newArrayList(dto.getStringVal().split(Symbol.COMMA)) : dto.getStringVal().trim());} else {Assert.isTrue(false, "未获取到键[" + entry.getKey() + "]对应的值");}}return map;}

第三、会签任务一票否决(主要针对并行任务)

/*** 会签结点任务一票否决* @param task        当前任务* @param variables   参数* @param isPass      审批结果(true通过,false驳回)*/private void executeCompleteTask(Task task, Map<String, Object> variables, boolean isPass){// 获取流程实例对象HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();// 获取流程定义对象,主要用于判断流程任务结点是否为会签结点Process process = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()).getProcessById(historicProcessInstance.getProcessDefinitionKey());if(isPass) { // 审批通过,将后续会签结点中人员转换为集合process.getFlowElements().stream().filter(flowElement -> flowElement instanceof UserTask)   // 过滤用户任务结点.map(flowElement -> (UserTask) flowElement)// 转换为用户任务.filter(userTask -> Objects.nonNull(userTask.getLoopCharacteristics()))// 是否为支持会签功能.map(UserTask::getLoopCharacteristics)// 获取会签配置信息.map(MultiInstanceLoopCharacteristics::getInputDataItem) // 获取会签配置信息中的人员参数.forEach(key -> {String varName = Constant.isVar(key) ? Constant.getVarKey(key) : key;if (!variables.containsKey(varName)) {return;}// 将参数值更新为集合variables.put(varName, Collections.singletonList(variables.get(varName)));});}// 获取当前任务结点Optional<UserTask> userTask = process.getFlowElements().stream().filter(flowElement -> task.getTaskDefinitionKey().equals(flowElement.getId())).map(flowElement -> (UserTask)flowElement).findAny();boolean isMultiTask = userTask.isPresent() // 存在&& Objects.nonNull(userTask.get().getLoopCharacteristics()); // 为会签结点List<PvmTransition> tempPvmTransitions = Lists.newArrayList();TransitionImpl newTransition = null;ActivityImpl endActivity = null;ActivityImpl currentActivity = null;if(!isPass           // 拒绝&& isMultiTask // 会签结点) {// 获取结束结点Optional<FlowElement> optional = process.getFlowElements().stream().filter(flowElement -> flowElement instanceof EndEvent).findFirst();if(!optional.isPresent()){return;}// 获取已部署流程定义对象ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(task.getProcessDefinitionId());// 获取已部署流程定义中的结束对象endActivity = processDefinitionEntity.findActivity(optional.get().getId());// 获取已部署流程定义中的当前任务对象currentActivity = processDefinitionEntity.findActivity(task.getTaskDefinitionKey());// 临时存放当前流出List<PvmTransition> currentActivityPvmTransitions = currentActivity.getOutgoingTransitions();tempPvmTransitions.addAll(currentActivityPvmTransitions);// 清空当前任务结点上的流出currentActivityPvmTransitions.clear();// 新增当前任务结点流出至结束结点newTransition = currentActivity.createOutgoingTransition();newTransition.setDestination(endActivity);// 设置会签任务结点完成条件taskService.setVariable(task.getId(), "nrOfInstances", userTask.get().getLoopCharacteristics().isSequential() ? 0 : 1);}// 执行任务审批taskService.complete(task.getId(), variables);if(isPass    // 通过|| !isMultiTask // 非会签结点){return;}// 还原任务结点流出设置// 先清空当前任务结点临时流出(流出至结束结点)endActivity.getIncomingTransitions().remove(newTransition);currentActivity.getOutgoingTransitions().clear();// 再设置原来的流出currentActivity.getOutgoingTransitions().addAll(tempPvmTransitions);}

第四步、调整界面

以上步骤即可实现会签一票否决。

总结:会签任务一票否决相关推荐

  1. 流程图的会签、或签、转审、加签、一票否决实现

    参考了流程图的会签.或签.转审.加签这篇博客,针对这篇博客做一些补充,记录一下. 1.加签 加签的代码如下: /*** @Description: 加签* @param taskId 任务id* @p ...

  2. flowable的多人会签和一票否决

    首先直接上案例! 项目结构: 接下来代码: Duorenhuiqian.bpmn20.xml: <?xml version="1.0" encoding="UTF- ...

  3. 26 工作流会签开发一票通过,一票否决,多数同意通过

    ​ 案例说明,本案例描述的场景是多人会签,包括一票通过.一票否决和多人同意通过.我们接下来将整个案例在一个实例中做展示和描述,绘制的流程图如下,此用例有四个人工节点,除第一个发起申请是单人任务,其他都 ...

  4. P3项目轶事之一票否决的新员工培训

    P3项目轶事之一票否决的新员工培训 做过SAP咨询行业乙方的都知道,进入客户现场的外部顾问都只是客户的供应商,不是客户的正式员工的,不可能享受客户正式员工一样的待遇的. 加入P3项目后我发现,客户的杭 ...

  5. 中国一票否决Arm被购案的六个理由

    关注.星标公众号,不错过精彩内容 转自:与非网 这一周半导体圈子的热闻当属 NVIDIA(英伟达)和 Arm 的收购确认.最终 NVIDIA 和软银集团公司(SBG)达成协议,NVIDIA 将以 40 ...

  6. UC伯克利教授马毅投稿ICML,4个评审一致接收却遭AC一票否决

    鱼羊 丰色 发自 凹非寺 量子位 报道 | 公众号 QbitAI 4位评审一致接收,按理说这篇顶会论文就没跑了. 可就在这两天,UC伯克利的马毅教授却遇上了一件"奇事": 课题组投 ...

  7. 新手选车系列之(八): 选车购车谨慎采取“一票否决制”

    转载自董涛新浪博客 http://blog.sina.com.cn/s/blog_41636c450100c5e0.html 很多车友在面对数十个品牌上百款车型的选择时,起先很茫然,后来在安全.动力. ...

  8. activiti7 会签并行多实例任务实现,一票否决,会签后添加网关判断

    1.功能需求 会签实现多个人同时审批,任意一个人不同意时,会签任务结束,不同意走八戒审批,同意走悟空审批,最后流程结束.流程图如下: 绘制流程图:动态设置审批人,完成条件${(pass == 'no' ...

  9. 大学物理规范作业25稳恒磁场_山东一地出台规定:严禁家长代批作业,违反规定将被一票否决...

    不得让家长或变相由家长打印作业.不得要求家长代批阅作业.综合实践类作业不得由家长或者他人代替完成--近日,潍坊市教育局高新分局出台<潍坊高新区学生作业规范"十要十不"> ...

最新文章

  1. IT公司100题-27-跳台阶问题
  2. 商人过河 java_商人过河问题(二)java实现
  3. 学习 PixiJS — 交互工具
  4. 21行代码AC_HDU 5935 Car【贪心, 精度】
  5. JQuery框架2.位置属性|筛选方法|事件
  6. .Net性能调优-垃圾回收!!!最全垃圾回收来了
  7. 信息学奥赛一本通 1063:最大跨度值 | OpenJudge NOI 1.5 06:整数序列的元素最大跨度值
  8. C#控件的闪烁问题解决方法总结
  9. 使用注册表删除没用的DLL文件
  10. 最新蓝屏代码0x0000006b完美解决方案,附文件
  11. 空手套白狼-我的互联网草根创业亲身经历
  12. 天才小毒妃 第952章 龙非夜挖的坑
  13. 共话新基建,墨天轮数据库大咖讲坛第一期圆满成功!(附第二批中奖名单)...
  14. 什么是绿色工厂,怎么进行绿色工厂认证
  15. Jetpack Compose中的手势操作
  16. WebView加载网页空白问题
  17. 查看RocketMQ的broker启动部分源码分析总结
  18. WSL安装桌面环境xfce4
  19. 关于 身体 不适的 English
  20. 2017深圳国际移动医疗健康产业博览会会刊(参展商名录)

热门文章

  1. 什么是REST ? 什么是RESTful?
  2. 江苏大学计算机专业江苏排名,江苏大学专业排名情况
  3. 斯坦福大学3D点云模型下载
  4. 主管发话:一周搞不定用友U8 ERP跨业务数据分析,明天就可以“毕业”了
  5. ajax请求 session过期跳转首页的两种处理方式
  6. 记录一下HALCON基于可变形,利用CAD画dxf模板进行模板匹配(三)
  7. Web端 Html5 直接播放 .ts 视频
  8. osgEarth显示地球影像
  9. 利用Appscan对REST Web service进行安全扫描
  10. B轮融资22亿元 巨头纷纷站台,何小鹏感慨:互联网利润真高! | 聚焦