基于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、导入流程设计器图如下,满足实际的需求:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能制造-10】样条曲线、贝塞尔曲线、B样条

什么是样条&#xff1f; 样条是通过一组指定点集而生成平滑曲线的柔性带。 什么是B样条&#xff1f; B样条就相当于一个函数&#xff0c;这个函数在系数不同时就可以变化成各种曲线的形状。 B样条的优势&#xff1f; 保留了Bezier曲线的优势可局部修改&#xff0c;调整某一…

专题三:Spring源码中新建module

前面我们构建好了Spring源码&#xff0c;接下来肯定迫不及待来调试啦&#xff0c;来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如&#xff1a;spring-self 1.2 选择构建工具因为spring使用的是gradle&#xff0c;所以这边需要我们切换默认…

21.【C语言】顺序结构和选择结构之if

顺序结构 从上至下&#xff0c;按顺序执行代码 选择结构 1.if语句 01零分支 if (条件)表达式; 02双分支 详见第10篇 if (条件) { ... } else { ... }03多分支 使用if嵌套 if (条件1)表达式1 else if (条件2)表达式2 else if (条件3)表达式3 else if (条件4)表达式4 .…

Patch SCN使用说明---惜分飞

软件说明 该软件是惜分飞&#xff08;https://www.xifenfei.com&#xff09;开发&#xff0c;仅用来查看和修改Oracle数据库SCN(System Change Number),主要使用在数据库因为某种原因导致无法正常启动的情况下使用该工具进行解决.特别是Oracle新版本中使用隐含参数,event,orad…

jmeter-beanshell学习2-beanshell断言

继续写&#xff0c;之前写了获取变量&#xff0c;设置变量&#xff0c;今天先写个简单点的断言。 一般情况用响应断言&#xff0c;就挺好使&#xff0c;但是自动化还要生成报告&#xff0c;如果断言失败了&#xff0c;要保存结果&#xff0c;只能用beanshell处理&#xff0c;顺…

mysql在windows下的安装

一&#xff0c;软件安装 只修改开头的系统盘 二&#xff0c;环境变量配置 找到MySQL安装目录对应的bin目录复制路径粘贴过来 三&#xff0c;cmd

通过端口和进程pid查找启动文件/脚本

今天审计一个程序又让GPT给我上了一课&#xff0c;记一下笔记&#xff1a; 1、首先该程序开启了8080端口&#xff0c;使用如下命令得到pid为1817 netstat -tunlp|grep 80802、使用pid得到父进程 pstree -ps 1817输出结果如下&#xff1a; 3、看出程序是由systemd启动的&…

Windows 玩转大模型第一天:大模型本地部署,调用大模型API可直接工程化应用(全部代码和详细部署流程)

Ollama 是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计。 以下是其主要特点和功能概述&#xff1a; 1. 简化部署&#xff1a;Ollama 目标在于简化在 Docker 容器中部署大型语言模型的过程&#xff0c;使得非专业用…

信创-办公软件应用工程师认证

随着国家对信息技术自主创新的战略重视程度不断提升&#xff0c;信创产业迎来前所未有的发展机遇。未来几年内&#xff0c;信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…

【EFK】efk 8收集docker容器日志测试

前言 目前&#xff0c;efk 全家桶已经更新到版本8 了&#xff0c;本章节我们使用8版本的elk搭建日志收集系统&#xff0c;了解它的配置运行过程&#xff0c;方便以后在更复杂的环境中更好的使用。 版本默认就是8最新的&#xff0c;也可以自己指定其他8的版本 elasticsearch: …

DisFormer:提高视觉动态预测的准确性和泛化能力

最新的研究进展已经显示出目标中心的表示方法在视觉动态预测任务中可以显著提升预测精度&#xff0c;并且增加模型的可解释性。这种表示方法通过将视觉场景分解为独立的对象&#xff0c;有助于模型更好地理解和预测场景中的变化。 尽管在静态图像的解耦表示学习方面已经取得了一…

【刷题汇总--游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)】

C日常刷题积累 今日刷题汇总 - day0051、游游的you1.1、题目1.2、思路1.3、程序实现 - 蛮力法1.4、程序实现 - 贪心(优化) 2、腐烂的苹果2.1、题目2.2、思路2.3、程序实现 - bfs 3、孩子们的游戏(圆圈中最后剩下的数)3.1、题目3.2、思路3.3、程序实现 -- 环形链表3.4、程序实现…

html+js+css在线倒计时

代码在图片后面 点赞加关注 谢谢大佬照顾&#x1f61c; 图例 时间到前 时间到后 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…

分支与循环

目录 1. if语句 1&#xff09;if 2) else 3&#xff09;分支中包含多条语句 4&#xff09;if嵌套 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&& || ! 1) 逻辑取反运算符 !​编辑 2 与运算符​编辑 3) 或运算符​编辑 4) 闰年的判断 5) 短路 …

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

鸿蒙本地签名不匹配问题

连接鸿蒙手机运行项目报如下错误 这是由于本地签名和鸿蒙设备签名不匹配导致的&#xff0c;需要注释掉如下代码&#xff0c;选择file project 自动签名 勾选auto选项&#xff0c;会在build-profile.json5中生成一个签名&#xff0c;然后运行就ok了~

NXP i.MX8系列平台开发讲解 - 3.18 Linux tty子系统介绍(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. TTY 起源 2. Linux 系统中的TTY 2.1 Linux TTY 设备形式 2.2 Linux TTY framework 2.3 驱动核心相关文件…

「植物大战僵尸杂交版」保姆级攻略大全以及下载指南

植物大战僵尸杂交版自推出以来&#xff0c;以其独特的植物组合和策略玩法&#xff0c;迅速赢得了玩家们的喜爱。如果你正准备加入这场植物与僵尸的战斗&#xff0c;或者已经在战斗中寻求突破&#xff0c;那么这份保姆级的攻略大全将是你的得力助手。同时&#xff0c;我们也提供…

PLL和CDR的内部结构及其区别

比较PLL和CDR的内部结构及其区别&#xff1a; 基本结构&#xff1a; PLL&#xff08;相位锁定环&#xff09;&#xff1a; 相位检测器环路滤波器压控振荡器&#xff08;VCO&#xff09;分频器&#xff08;可选&#xff0c;用于频率合成&#xff09; CDR&#xff08;时钟数据恢复…