基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(二)增加基本的发起人审批与多用户多实例

 因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。

1、AssigneeNode 增加approvalText

public abstract class AssigneeNode extends Node {// 审批对象private AssigneeTypeEnum assigneeType;// 表单内人员private String formUser;// 表单内角色private String formRole;// 审批人private List<String> users;// 审批人角色private List<String> roles;// 审批人名称private String approvalText;// 主管private Integer leader;// 组织主管private Integer orgLeader;// 发起人自选:true-单选,false-多选private Boolean choice;// 发起人自己private Boolean self;public abstract List<FlowElement> convert();
}

2、对于public List<FlowElement> convert() {流程转换,做如下调整

// 审批人if(this.getMulti() !=  ApprovalMultiEnum.NONE) {MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();if (this.getMulti() == ApprovalMultiEnum.SEQUENTIAL) {multiInstanceLoopCharacteristics.setSequential(true);} else if (this.getMulti() == ApprovalMultiEnum.JOINT) {multiInstanceLoopCharacteristics.setSequential(false);if (Objects.nonNull(this.getMultiPercent()) && this.getMultiPercent().compareTo(BigDecimal.ZERO) > 0) {BigDecimal percent = this.getMultiPercent().divide(new BigDecimal(100), 2, RoundingMode.DOWN);multiInstanceLoopCharacteristics.setCompletionCondition(String.format("${nrOfCompletedInstances/nrOfInstances >= %s}", percent));}} else if (this.getMulti() == ApprovalMultiEnum.SINGLE) {multiInstanceLoopCharacteristics.setSequential(false);multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances > 0}");}multiInstanceLoopCharacteristics.setElementVariable("assignee");multiInstanceLoopCharacteristics.setInputDataItem(String.format("${multiInstanceHandler.getUserName(execution)}"));userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);userTask.setAssignee("${assignee}");userTask.setCandidateUsers(this.getUsers());ExtensionAttribute extDataTypeAttribute =  new ExtensionAttribute();extDataTypeAttribute.setNamespace(ProcessConstants.NAMASPASE);extDataTypeAttribute.setName("dataType");extDataTypeAttribute.setValue("USERS");userTask.addAttribute(extDataTypeAttribute);ExtensionAttribute extTextAttribute =  new ExtensionAttribute();extTextAttribute.setNamespace(ProcessConstants.NAMASPASE);extTextAttribute.setName("text");extTextAttribute.setValue(this.getApprovalText());userTask.addAttribute(extTextAttribute);}if(this.getAssigneeType() == AssigneeTypeEnum.SELF) {userTask.setName("发起人");ExtensionAttribute extAttribute =  new ExtensionAttribute();extAttribute.setNamespace(ProcessConstants.NAMASPASE);extAttribute.setName("dataType");extAttribute.setValue("INITIATOR");userTask.addAttribute(extAttribute);userTask.setAssignee("${initiator}");}else {userTask.setAssignee(String.join(",", this.getUsers()));}  

3、对应多人审批增加none方式

export interface ApprovalNode extends AssigneeNode {// 多人审批方式multi: 'none' | 'sequential' | 'joint' | 'single'

4、对应人员审批采用jeecg的j-select-user-by-dept

<div style="width:100%"><j-select-user-by-dept v-if="activeData.nobody === 'assign'"v-model:value="activeData.nobodyUsers" :multi="true" placeholder="指定人员"@getSelectResult="handleSelectUsers"></j-select-user-by-dept></div>

同时上面的方法如下

const  handleSelectUsers = (options, userList) => {props.activeData.approvalText = options.map((user) => user.label).join(',')
}    

5、仿钉钉流程设置如下

6、生成的xml如下:

<?xml version="1.0" encoding="UTF-8"?>-<definitions targetNamespace="https://flowable.org/bpmn20" expressionLanguage="http://www.w3.org/1999/XPath" typeLanguage="http://www.w3.org/2001/XMLSchema" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">-<process isExecutable="true" name="测试" id="test"><startEvent name="发起人" id="root"/><sequenceFlow id="root-node_nfntd" targetRef="node_nfntd" sourceRef="root"/><userTask name="发起人" id="node_nfntd" flowable:dataType="INITIATOR" flowable:assignee="${initiator}"/><sequenceFlow id="node_nfntd-node_wusut" targetRef="node_wusut" sourceRef="node_nfntd"/>-<userTask name="审批人" id="node_wusut" flowable:dataType="USERS" flowable:assignee="zhangsan,admin" flowable:text="张三,管理员" flowable:candidateUsers="zhangsan,admin">-<multiInstanceLoopCharacteristics flowable:elementVariable="assignee" flowable:collection="${multiInstanceHandler.getUserName(execution)}" isSequential="false"><completionCondition>${nrOfCompletedInstances/nrOfInstances >= 1.00}</completionCondition></multiInstanceLoopCharacteristics></userTask><sequenceFlow id="node_wusut-end" targetRef="end" sourceRef="node_wusut"/><endEvent name="流程结束" id="end"/></process>-<bpmndi:BPMNDiagram id="BPMNDiagram_test">-<bpmndi:BPMNPlane id="BPMNPlane_test" bpmnElement="test">-<bpmndi:BPMNShape id="BPMNShape_node_wusut" bpmnElement="node_wusut"><omgdc:Bounds y="0.0" x="230.0" width="100.0" height="60.0"/></bpmndi:BPMNShape>-<bpmndi:BPMNShape id="BPMNShape_root" bpmnElement="root"><omgdc:Bounds y="15.0" x="0.0" width="30.0" height="30.0"/></bpmndi:BPMNShape>-<bpmndi:BPMNShape id="BPMNShape_node_nfntd" bpmnElement="node_nfntd"><omgdc:Bounds y="0.0" x="80.0" width="100.0" height="60.0"/></bpmndi:BPMNShape>-<bpmndi:BPMNShape id="BPMNShape_end" bpmnElement="end"><omgdc:Bounds y="15.0" x="380.0" width="30.0" height="30.0"/></bpmndi:BPMNShape>-<bpmndi:BPMNEdge id="BPMNEdge_node_wusut-end" bpmnElement="node_wusut-end"><omgdi:waypoint y="30.0" x="330.0"/><omgdi:waypoint y="30.0" x="342.0"/><omgdi:waypoint y="30.000000000000004" x="342.0"/><omgdi:waypoint y="30.000000000000004" x="380.0"/></bpmndi:BPMNEdge>-<bpmndi:BPMNEdge id="BPMNEdge_node_nfntd-node_wusut" bpmnElement="node_nfntd-node_wusut"><omgdi:waypoint y="30.0" x="180.0"/><omgdi:waypoint y="30.0" x="192.0"/><omgdi:waypoint y="30.000000000000007" x="192.0"/><omgdi:waypoint y="30.000000000000007" x="230.0"/></bpmndi:BPMNEdge>-<bpmndi:BPMNEdge id="BPMNEdge_root-node_nfntd" bpmnElement="root-node_nfntd"><omgdi:waypoint y="30.0" x="30.0"/><omgdi:waypoint y="30.0" x="42.0"/><omgdi:waypoint y="30.000000000000007" x="42.0"/><omgdi:waypoint y="30.000000000000007" x="80.0"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></definitions>

7、导入流程设计器图如下,满足实际的需求:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/369607.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5款文案自动生成器,快速创作高质量文案

随着科技的发展&#xff0c;市面上出现了许多文案自动生成器&#xff0c;为我们的创作过程提供了极大的便利。无论是为了社交媒体内容创作&#xff0c;还是产品的文案的宣传&#xff0c;文案自动生成器就能为我们快速且高效地生成高质量的文案。以下将为大家分享5款备受赞誉的文…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

Oracle EBS PO采购订单预审批状态处理

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 采购订单状态:预审批 采购订单流程报错如下: po.plsql.PO_DOCUMENT_ACTION_AUTH.approve:90:archive_po not successful - po.plsql.PO_DOCUMENT_ACTION_PVT.do_action:110:unexpected error in acti…

【最详细】PhotoScan(MetaShape)全流程教程

愿天下心诚士子&#xff0c;人人会PhotoScan&#xff01; 愿天下惊艳后辈&#xff0c;人人可剑开天门&#xff01; 本教程由CSDN用户CV_X.Wang撰写&#xff0c;所用数据均来自山东科技大学视觉测量研究团队&#xff0c;特此鸣谢&#xff01;盗版必究&#xff01; 一、引子 Ph…

MySQL高级-MVCC- readview介绍

文章目录 1、介绍2、ReadView中包含了四个核心字段&#xff1a;3、版本链数据的访问规则&#xff1a;4、不同的隔离级别&#xff0c;生成ReadView的时机不同&#xff1a; 1、介绍 ReadView&#xff08;读视图&#xff09;是 快照读 SQL执行时MVCC提取数据的依据&#xff0c;记录…

Vue 常用指令详细介绍

Vue 常用指令 1.Vue 常用指令介绍 内容讲解 【1】Vue 指令介绍 在vue中指令是作用在视图中的即html标签&#xff0c;可以在视图中增加一些指令来设置html标签的某些属性和文本。 指令都是以带有 v- 前缀的特殊属性。 【2】使用Vue指令 使用指令时&#xff0c;通常编写在…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏&#xff08;Memory Leak&#xff09;是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放&#xff0c;导致内存无法被重新利用时&#xff0c;就会发生内存泄漏。这种错误会导致程序占用越来越多的内存&#xff0c;最终可能导致系…

vscode 生成项目目录结构 directory-tree 实用教程

1. 安装插件 directory-tree 有中文介绍&#xff0c;极其友好&#xff01; 2. 用 vscode 打开目标项目 3. 快捷键 Ctrl Shift p&#xff0c;输入 Directory Tree 后回车 会在 README.md 文件的底部生成项目目录&#xff08;若项目中没有 README.md 文件&#xff0c;则会自动创…

恢复机制-数据库系统中的故障(事务故障、系统故障、介质故障)、一致性错误、窃取但不强制的缓冲区管理策略

一、引言 数据库管理系统DBMS的事务处理技术实现的一个主要功能部分就是恢复机制&#xff0c;恢复机制完成的功能就是对发生故障后系统中事务的更新结果进行数据恢复&#xff0c;保证事务的原子性和持久性&#xff0c;从而进一步保证数据库的一致性。 数据库系统与其他计算机系…

Pytest--安装与入门

pytest是一个能够简化成测试系统构建、方便测试规模扩展的框架&#xff0c;它让测试变得更具表现力和可读性–模版代码不再是必需的。只需要几分钟的时间&#xff0c;就可以对你的应用开始一个简单的单元测试或者复杂的功能测试。 1. 安装pytest pip install -U pytest检查版…

MaxKB开源知识库问答系统发布v1.3.0版本,新增强大的工作流引擎

2024年4月12日&#xff0c;1Panel开源项目组正式发布官方开源子项目——MaxKB开源知识库问答系统&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB开源项目发布后迅速获得了社区用户的认可&#xff0c;成功登顶GitHub Trending趋势榜主榜。 截至2024年7月4日&…

【Mathematica14.0】快速从下载安装到使用

目录 1.简介 2.下载安装 下载 安装 3.一小时掌握mathematica使用 单元模式 内置函数 符号表达式 迭代器 赋值 通配符及查找替换 函数定义 匿名函数&#xff08;拉姆达表达式&#xff09; 函数映射 函数式与运算符 函数自定义选项 图形可视化 交互式界面 数值…

【ROS2】Ubuntu 24.04 源码编译安装 Jazzy Jalisco

目录 系统要求 系统设置 设置区域启用所需的存储库安装开发工具 构建 ROS 2 获取 ROS 2 代码使用 rosdep 安装依赖项安装额外的 RMW 实现&#xff08;可选&#xff09;在工作区构建代码 设置环境 尝试一些例子 下一步 备用编译器 Clang保持最新状态 故障排除 卸载 系统要求 当前…

长沙(市场调研公司)源点 企业如何决定是否需要开展市场调研?

长沙源点调研咨询认为&#xff1a;对于一个特定问题&#xff0c;管理者在面临几种解决问题的方案时&#xff0c;不应该凭直觉草率开展应用性市场调研。事实上&#xff0c;首先需要做的决策是是否需要开展调研。在下述情况下&#xff0c;最好不要做调研&#xff1a; *缺乏资源。…

查询工资级别的个数>20的个数,并且按工贷级别降序

SELECT COUNT(*), grade_level FROM employees e JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal GROUP BY grade_level HAVING COUNT(*) > 20 ORDER BY grade_level DESC; 为什么需要GROUP BY而不是仅仅ORDER BY&#xff1f; 聚合数据&#xff1a…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…

SQLyog脚本无限试用重置脚本

文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie&#xff0c;但是网上的没看到很好使的&#xff0c;直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key&#xff0c;可能跟你的不一样&#xff0c;如果不一样&#xff0c;请替换…

Another Redis Desktop Manager工具自定义解析数据

自定义解析数据,支持多种程序终端输出 /Users/admin/go/src/baobao_all/ws_server/baobao/main_test/encipher_tool_redis/redis_tool {VALUE}/bin/bash -c "/Users/admin/Downloads/redis_tool {VALUE}"写个go程序解析数据 package mainimport ("encoding/jso…

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…

每日复盘-20240705

今日关注&#xff1a; 20240705 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…