若依ruoyi-nbcio如何做一个仿钉钉流程设计器的思考

news2024/11/19 13:17:27

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

看到有些流程图采用仿钉钉的流程设计,比如下面界面:

这种方式虽然简单,但可能符合中国人的习惯,使用简单直观,所以也有一定的市场。

如何结合现有的bpmn-process-designer流程设计器进行兼容是需要考虑的问题。

现有流程设计器采用标准的bpmn规范,生成xml文件。

而一般仿钉钉的流程图是生成相应的json,所以需要进行流程图转换,以便兼容。

基本思路;

1、仿钉钉做的流程图,也可以跟bpmn-process-designer流程设计器类似,可以查看flowable的json格式或xml格式,这个就需要进行转换。

2、主要通过flowable的相关类与方法,把json格式转换成xml格式,同时这个xml文件可以导入到bpmn-process-designer流程设计器进行查看与验证,这样后面的流程逻辑都不需要修改。

3、可以主要通过BpmnModel,SequenceFlow,Process,StartEvent,EndEvent,FlowableListener,BpmnAutoLayout,BpmnXMLConverter等flowable类或方法来实现从json转换成xml文件。

4、前端参考网上一些开源项目,但form表单还是采用现有的formdesigner,同时也是考虑支持节点的表单支持

5、也要考虑自定义业务表单的支持

6、先支持简单的并行,条件等流程节点的支持,后续再支持复杂的流程设计。

下面附上一个标注的flowable的xml流程文件

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:flowable="http://flowable.org/bpmn" id="diagram_Process_1697782918307" targetNamespace="http://flowable.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
  <bpmn2:process id="Process_1697782918307" name="业务流程_自定义会签测试" isExecutable="true">
    <bpmn2:startEvent id="Event_1le7yzx" flowable:formKey="key_3">
      <bpmn2:outgoing>Flow_0ipnqyb</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:userTask id="Activity_03gis3u" flowable:dataType="INITIATOR" flowable:assignee="${initiator}" flowable:text="流程发起人">
      <bpmn2:incoming>Flow_0ipnqyb</bpmn2:incoming>
      <bpmn2:outgoing>Flow_1uc1pby</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="Flow_0ipnqyb" sourceRef="Event_1le7yzx" targetRef="Activity_03gis3u" />
    <bpmn2:userTask id="Activity_1facibr" flowable:dataType="MANAGER" flowable:assignee="${DepManagerHandler.getUser(execution)}" flowable:text="部门经理">
      <bpmn2:incoming>Flow_1uc1pby</bpmn2:incoming>
      <bpmn2:outgoing>Flow_1x49ob5</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="Flow_1uc1pby" sourceRef="Activity_03gis3u" targetRef="Activity_1facibr" />
    <bpmn2:userTask id="Activity_0nepxhg" flowable:dataType="USERS" flowable:assignee="${assignee}" flowable:candidateUsers="ry,zhangsan" flowable:text="若依,张三">
      <bpmn2:incoming>Flow_1x49ob5</bpmn2:incoming>
      <bpmn2:outgoing>Flow_170xl0t</bpmn2:outgoing>
      <bpmn2:multiInstanceLoopCharacteristics flowable:collection="${multiInstanceHandler.getUserNames(execution)}" flowable:elementVariable="assignee">
        <bpmn2:completionCondition xsi:type="bpmn2:tFormalExpression">${nrOfCompletedInstances/nrOfInstances&gt;=1}</bpmn2:completionCondition>
      </bpmn2:multiInstanceLoopCharacteristics>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="Flow_1x49ob5" sourceRef="Activity_1facibr" targetRef="Activity_0nepxhg" />
    <bpmn2:endEvent id="Event_1py9opv">
      <bpmn2:incoming>Flow_170xl0t</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="Flow_170xl0t" sourceRef="Activity_0nepxhg" targetRef="Event_1py9opv" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1697782918307">
      <bpmndi:BPMNEdge id="Flow_170xl0t_di" bpmnElement="Flow_170xl0t">
        <di:waypoint x="760" y="240" />
        <di:waypoint x="822" y="240" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1x49ob5_di" bpmnElement="Flow_1x49ob5">
        <di:waypoint x="600" y="240" />
        <di:waypoint x="660" y="240" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1uc1pby_di" bpmnElement="Flow_1uc1pby">
        <di:waypoint x="440" y="240" />
        <di:waypoint x="500" y="240" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0ipnqyb_di" bpmnElement="Flow_0ipnqyb">
        <di:waypoint x="288" y="240" />
        <di:waypoint x="340" y="240" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Event_1le7yzx_di" bpmnElement="Event_1le7yzx">
        <dc:Bounds x="252" y="222" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_03gis3u_di" bpmnElement="Activity_03gis3u">
        <dc:Bounds x="340" y="200" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1facibr_di" bpmnElement="Activity_1facibr">
        <dc:Bounds x="500" y="200" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0nepxhg_di" bpmnElement="Activity_0nepxhg">
        <dc:Bounds x="660" y="200" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1py9opv_di" bpmnElement="Event_1py9opv">
        <dc:Bounds x="822" y="222" width="36" height="36" />
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

后续根据上面的思路实现前后端代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 中的 Pexpect

我们将通过示例介绍Python中的Pexpect。 Python 中的 Pexpect Python 是一种非常流行的语言&#xff0c;用于数据科学和机器学习。 它是一种非常强大的语言&#xff0c;因为 Python 具有可用于不同目的的内置库。 在这篇文章中&#xff0c;我们将研究Python中的pexpect。 Pex…

找不到msvcr90.dll无法继续执行代码怎么解决

msvcr90.dll是Microsoft Visual C 2008 SP1可再发行程序包中的一个动态链接库文件。它包含了用于支持C编程语言的类和函数。动态链接库是一种可重用的代码模块&#xff0c;它可以在多个应用程序之间共享&#xff0c;从而减少代码量并提高开发效率。那么遇到msvcr90.dll丢失怎么…

【计算机网络】从输入URL到页面都显示经历了什么??

文字总结 ① DNS 解析&#xff1a;当用户输入一个网址并按下回车键的时候&#xff0c;浏览器获得一个域名&#xff0c;而在实际通信过程中&#xff0c;我们需要的是一个 IP 地址&#xff0c;因此我们需要先把域名转换成相应 IP 地址。浏览器会首先从缓存中找是否存在域名&…

【继承之extends关键字和super关键字】

文章目录 继承是什么&#xff1f;为什么要继承&#xff1f;怎么继承&#xff1f;继承的语法 关键字extends 子类中访问父类的成员变量1.子类和父类的成员变量不同名2.子类和父类成员变量同名 子类中访问父类的成员方法1. .子类和父类的成员方法名字不同2..子类和父类的成员方法…

JUC并发编程之Synchronized锁优化

目录 1. Java对象头 2. Synchronized锁优化 2.1 偏向锁 2.2 轻量级锁 2.3 重量级锁 2.4 各种锁对比 1. Java对象头 HotSpot虚拟机中&#xff0c;对象在内存中存储的布局可以分为三块区域&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance D…

数据结构 C语言 2.1 线性表抽象数据类型 2.2 小议顺序表

一、线性表抽象数据类型 线性表的定义 定义&#xff1a;零个或多个数据元素的有限序列 线性表的特点&#xff1a; 1.它是一个序列 数据元素之间是有序的 数据元素之间是一对一的关系 2.有限性 线性表的数据元素个数是有限的 注意&#xff1a;零个数据元素的有限序列又…

NewStarCTF2023week4-依旧是空白(snow隐写)

打开附件的空白图片&#xff0c;CRC报错&#xff0c;很可能是高度被修改 爆出图片正确的宽度和高度并修复 打开看到密码 password: s00_b4by_f0r_y0u 另一个文件是空白的txt文档&#xff0c;大致看了一下像是不可见字符&#xff0c;尝试 white_space&#xff0c;发现不是&…

Uservue 中 keep-alive 组件的作用

目录 前言 用法 代码 理解 keep-alive 是 Vue.js 中一个内置的组件&#xff0c;它能够将不活动的组件实例保存在内存中&#xff0c;防止其被销毁&#xff0c;以便在后续需要时能够快速重新渲染。这个功能在一些需要频繁切换但不希望每次都重新渲染的场景中非常有用&#xf…

详解预处理(2)

目录 #undef 命令行定义 条件编译 NO1. NO2.多个分支的条件编译 NO3.判断是否被定义 NO4.嵌套指令 文件包含 头文件被包含的方式 本地文件包含 库文件包含 嵌套文件包含 其他预处理指令 今天接着继续讲解预处理的点&#xff0c;前面已经深入学习了#define。 #unde…

基于Springboot 游戏娱乐信息平台-计算机毕设 附源码 04691

Springboot 游戏娱乐信息平台 目 录 摘要 1 绪论 1.1研究内容 1.2国内外研究慨况 1.3研究方法 1.4论文结构与章节安排 2 游戏娱乐信息平台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性…

EvilAppleJuice(邪恶苹果汁)-ESP32C3项目(iphone疯狂弹窗)

原作者作品页&#xff1a; ckcr4lyf/EvilAppleJuice-ESP32: Spam Apple Proximity Messages via an ESP32 (github.com) 代码优化一下&#xff0c;增加呼吸灯效果方便知道设备运行情况&#xff0c;我是用arduino烧录 仅作交流学习使用&#xff0c;请勿在公开场合滥用 运行效果…

黑豹程序员-Python入门-for循环

文章目录 1、for循环语法2、巩固案例&#xff1a;长安三万里你记得的三位诗人&#xff1f;实现步骤&#xff1a;第一步&#xff1a;新建一个列表&#xff0c;存储诗人姓名第二步&#xff1a;列表用[]表示&#xff0c;元素之间用逗号,分隔第三步&#xff1a;用列表[索引]的方法将…

莫名其妙el-table不显示问题

完全复制element-ui中table代码&#xff0c;发现表格仍然不显示&#xff0c;看别人都说让降低版本&#xff0c;可我不想降低啊&#xff0c;不然其他组件有可能用不了&#xff0c;后来发现可以通过配置vite.config.js alias: {: path.resolve(__dirname, src),vue: vue/dist/vue…

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…

nexus5x 刷机root

刷机 进入fastboot模式 adb reboot bootloader 或者开机 音量减 解锁bootloader fastboot oem unlock 刷入rom包 下载 Nexus 和 Pixel 设备的出厂映像 | Google Play services | Google for Developers 选一个合适的ROM包下载到电脑的某个位置&#xff0c;然后unzip解…

国家网信办发布第十三批境内区块链信息服务备案编号

2019年2月15日《区块链信息服务管理规定》&#xff08;以下简称《管理规定》&#xff09;正式实施以来&#xff0c;国家互联网信息办公室依法依规组织开展备案审核工作&#xff0c;已发布2批次共506个境内区块链信息服务名称及备案编号&#xff0c;近日正式发布第三批共224个境…

剪映怎么合并两个视频?几个步骤轻松搞定!

合并两个视频可以方便我们管理、节省存储空间、提高处理效率、满足特定要求或实现特定效果等目的。而剪映作为我们常用的视频处理软件&#xff0c;如何利用其合并两个视频呢&#xff1f;一起来看看吧&#xff5e; 方法一&#xff1a;使用剪映专业版 1、运行剪映&#xff0c;主…

关于maven项目中依赖无法下载的解决方案

场景描述 在下载selenium的依赖时&#xff0c;虽然相依的jar包已经存在&#xff0c;但是在idea中依然报红 解决方案 在jar无法正常下载时可以尝试使用——找到下载的文件夹&#xff0c;删除整个文件夹后重新通过链接下载 过程演示 C:\Users\lenovo\.m2 所有依赖的jar包都在这…

errno变量和显示错误信息

一、errno Linux很多函数发生错误&#xff0c;只会返回-1。所以&#xff0c;我们只知道函数发生了错误&#xff0c;却不知道具体发生了什么错误。 因此Linux 系统下对常见的错误做了一个编号&#xff0c;每一个编号都代表着每一种不同的错误类型。 发生错误时&#xff0c;对…

CTF-Crypto学习记录-第三天 MD5加密算法(信息摘要算法)“ “

文章目录 0x1 MD5 基本介绍0x2 MD5 加密特点0x3 MD5 加密原理步骤0x01 对明文数据进行信息填充0x02 设置初始变量0x03 加密运算过程加密运算流程图&#xff1a;四个非线性函数&#xff1a;Mj表示消息的第j个子分组&#xff08;从0到15&#xff09;&#xff0c;<<&#xf…