rh-vue3-snakerflow-designer
Version:
情怀!N年前使用的工作流引擎,虽然原作者已经不再维护,但是还是有那么一波人还在使用。个人看来其核心功能尚好,麻雀虽少,五脏俱全,是用来学习工作流引擎的好项目。但其流程设计器所用的技术栈可能就跟不上时代了(2016年前的开源项目)。为了让大伙或自己用得更舒心,或者也为了让更多人认识或重新认识这个工作流引擎。本人就花些许时间,使用现阶段前端主流的技术栈重新开发此款流程设计器。如大家在使用的过程中如有啥问题,欢迎留言或进群交流!
89 lines (87 loc) • 2.69 kB
text/typescript
import Custom from './custom'
import Decision from './decision'
import End from './end'
import Fork from './fork'
import Join from './join'
import Start from './start'
import Task from './task'
import Transtion from './transition'
import SubProcess from './subProcess'
import { logicFlowJsonToSnakerXml, snakerXml2LogicFlowJson } from './tool'
/**
* snakerflow组件注册
*/
class SnakerFlowElement {
static pluginName = 'snakerFlowElement';
constructor (data:any) {
data.lf.register(Custom)
data.lf.register(Decision)
data.lf.register(End)
data.lf.register(Fork)
data.lf.register(Join)
data.lf.register(Start)
data.lf.register(Task)
data.lf.register(Transtion)
data.lf.register(SubProcess)
}
}
/**
* snakerflow给你LogicFlow数据转换器
*/
class SnakerFlowAdapter {
static pluginName = 'snakerFlowAdapter';
constructor ({ lf } : { lf: any }) {
lf.adapterIn = (userData: any) => {
if (typeof userData === 'string') {
userData = snakerXml2LogicFlowJson(userData)
}
userData = userData.json ? userData.json : userData
// 对入参数据进行简单处理
if (userData.nodes) {
userData.nodes.forEach((node: any) => {
if (typeof node.properties.field === 'object') {
node.properties.field = JSON.stringify(node.properties.field)
}
})
}
// 将流程扩展属性绑定给lf图模型对象
lf.graphModel.name = userData.name
lf.graphModel.displayName = userData.displayName
lf.graphModel.expireTime = userData.expireTime
lf.graphModel.instanceUrl = userData.instanceUrl
lf.graphModel.instanceNoClass = userData.instanceNoClass
return userData
}
lf.adapterOut = (logicFlowData: any) => {
const graphData = {
name: lf.graphModel.name,
displayName: lf.graphModel.displayName,
expireTime: lf.graphModel.expireTime,
instanceUrl: lf.graphModel.instanceUrl,
instanceNoClass: lf.graphModel.instanceNoClass,
...logicFlowData
}
Object.keys(graphData).forEach((key: string) => {
// 删除undefined的值
if (graphData[key] === undefined) {
delete graphData[key]
}
})
// 处理一下field数据-stringjson==>obj
graphData.nodes.forEach((node: any) => {
if (node.type === 'snaker:task' && node.properties.field) {
node.properties.field = JSON.parse(node.properties.field)
}
})
const xml = logicFlowJsonToSnakerXml(graphData)
return {
json: graphData,
xml
}
}
}
}
export {
SnakerFlowElement,
SnakerFlowAdapter
}