简单流程引擎实现

本文介绍了如何在Vue3项目中使用GoJS库进行数据可视化,包括数据结构的划分、DOM操作的最佳实践、生命周期管理以及与SQLServer的集成。作者分享了在实际应用中的踩坑经验,核心代码展示了节点顺序处理和图形事件监听的实现。
摘要由CSDN通过智能技术生成

技术栈

vue3+gojs+primevue+lodash+c#+sql server

效果展示

参考文档

初学者笔记

官网demo

实现思路

  1. 运用官方demo,将gojs的数据结构转换为需要的数据库记录
  2. 实际数据分为两部分:存储gojs节点、节点关系数据;实际业务数据。gojs数据负责存储流程顺序、流程节点。至于业务数据,则需要与节点关联。

踩坑简述

  1. 官方demo是将gojs对于dom节点的操作放onMounted生命周期中,实际在vue3中放在一个init函数,然后在nextTick中调用会比较好,否则会导致找不到绑定gojs的dom
  2. 不要用vue3的ref绑定dom语法,虽然一样可以实现gojs的demo,但是与官方demo相差较大,对于gojs小白不友好
  3. gojs创建好流程、节点后,注意通过Diagram.model.linkDataArray处理出节点顺序,否则对数据库中存储的两部分数据,会对应不上
  4. gojs模型的存储,通过Diagram.model.toJson();和go.Model.fromJson(此处为前json序列化后结果)进行模型→string→模型的过程,数据库中存储string
  5. 本身gojs处理逻辑一般般,重点在于对数据的处理,以下为我接口数据结构,可以适当参考,红色部分存储流程本身数据,flowDiagramModel存储gojs模型转换的string;蓝色部分为节点信息,seq记录节点顺序,用于与gojs节点对应;绿色部分为节点绑定提交人/提交部门信息,sendType控制审批者的权限(审批/抄送)
  6. 对于gojs节点与右下角信息对应,我是通过一张map维护,初始时,将接口数据转换为map;保存时,将map转为接口所需数据
  7. 后端处理数据结构稍微麻烦一点
  8. 对于gojs的点击图形以及删除图形,代码如下
    myDiagram.addDiagramListener("ObjectSingleClicked", (e) => {
            currentNode.value = myDiagram.selection.first().data.key;
            setCurrentNodeData(currentNode.value);
            console.log("currentDialogId-->", myDiagram.selection.first().data.key);
        });
    myDiagram.addDiagramListener("SelectionDeleting", (e) => {
            currentNode.value = myDiagram.selection.first().data.key;
            removeCurrentNodeData(currentNode.value);
            console.log("currentDialogId-->", myDiagram.selection.first().data.key);
        });

核心代码

// 将linkDataArray梳理出先后顺序数组
const sortLDA = (data) => {
    return _.chain(data)
        .filter({ from: -1 })
        .map("from")
        .concat(_.chain(data).map("to").sortedUniq().value())
        .value();
};

//通过这个,获取gojs中每个图形的key
myDiagram.selection.first().data.key

总结

因为所有的代码与业务强关联,且实际实现功能也很一般,故只做参考,如需完成代码留言即可,看到回复。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BPMN流程引擎实现自定义流程逻辑的原理是通过对流程引擎的扩展来实现的。一般来说,流程引擎提供了一些API或者接口,供开发者进行扩展。开发者可以通过实现这些API或接口来定义自己的流程逻辑,从而满足特定的业务需求。 下面是一个简单的例子,以Activiti为例,介绍如何通过实现Activiti提供的API来实现自定义流程逻辑。 Activiti提供了一些扩展点,例如ExecutionListener、TaskListener、JavaDelegate等,开发者可以实现这些扩展点来定义自己的流程逻辑。 以ExecutionListener为例,可以通过实现ExecutionListener接口来添加自定义的执行逻辑。在实现ExecutionListener接口时,需要重写以下方法: 1. start(DelegateExecution execution): 流程开始时执行的逻辑; 2. end(DelegateExecution execution): 流程结束时执行的逻辑; 3. take(DelegateExecution execution): 流程节点流转时执行的逻辑。 例如,如果需要在流程开始时,将流程实例的一些变量设置为默认值,可以实现ExecutionListener接口,并在start方法中设置相应的变量。 另外,Activiti还提供了一些其他的扩展点,例如TaskListener,可以通过实现TaskListener接口来添加自定义的任务执行逻辑。JavaDelegate可以用于执行自定义的Java代码。 总之,通过实现流程引擎提供的API或接口,开发者可以定义自己的流程逻辑,并将其集成到BPMN流程引擎中,从而实现自定义的流程控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值