UNPKG

jbxl-workflow

Version:

流程图

302 lines (299 loc) 13.6 kB
import {generateRandomId} from "@dang_8899/xl-ui"; import {deepClone} from "@/utils/common"; // 节点参数基类 /** * @class NodeParamItem 节点参数基类,主要用来生成参数 * @param paramTypeVal {string} 参数类型值 * @param paramTypeList {Array<string>} 参数值列表 * @param paramsValueList 参数值列表 * @param paramVal {any} 选择 引用还是输入,并不是当前选中的真实的参数值,目前是根据 * @param desc {string} 参数描述 * @param required {boolean} 是否必填 * @param canDel {boolean} 是否可以删除 * @param tableHeaderTitle {string} 表头标题 * @param type {string} 是input还是select或者是其他 * @param isDefault {boolean} 是否为固定的参数,如果是固定的参数,则在编辑时不允许修改 // * @param inputTypeVal {string}输入类型值 * @param name {string} 参数名 * @param paramType {string} 参数类型 * @param paramTypeList {Array<string>} 参数类型列表 ['String', 'Integer', 'Boolean', 'Number'], ['Array] * @param value {any} 输入参数真实的参数值 * @param referenceValue {any} 引用参数所引用的参数名 * @param referenceFrom {any} 引用参数所引用的参数来源,1 - 输入参数,2 - 输出参数 * @param valueType {any} 引用参数所引用的参数类型 * */ class NodeParamItem { // 其中paramsTypeVal和paramTypeList配套使用 // paramVal和paramValueList配套使用 constructor({name, paramType, paramTypeList, paramTypeVal, paramValList, paramVal, required, canDel, tableHeaderTitle, isFileParam, disabled, type, showRequired, description, id, isDefault, showDesc, showTableHeaderTitle, defaultValue, children, referenceFrom, valueType, value, result}) { this.type = type this.name = name this.paramTypeList = paramTypeList this.paramType = paramType this.paramTypeVal = paramTypeVal this.paramValList = paramValList this.result = result this.paramVal = paramVal || 2 // this.inputTypeVal = inputTypeVal this.disabled = disabled this.required = required this.canDel = canDel this.tableHeaderTitle = tableHeaderTitle this.isFileParam = isFileParam this.showRequired = showRequired this.description = description this.id = id || generateRandomId() this.isDefault = isDefault this.showDesc = showDesc this.showTableHeaderTitle = showTableHeaderTitle this.defaultValue = defaultValue this.children = children this.referenceFrom = referenceFrom || 0 this.valueType = valueType || '' this.value = value } } /** * @class StartNodeParamItem 开始节点参数类,继承自NodeParamItem,主要用于开始节点参数的生成,参数与@class NodeParamItem 类似,但是有一些特殊的参数 * */ class StartNodeParamItem extends NodeParamItem { constructor({name, paramType, paramTypeList, paramTypeVal, required, canDel, tableHeaderTitle, isFileParam, disabled, type, showRequired, description, id, isDefault, showDesc}) {super({name, paramType, paramTypeList, paramTypeVal, required, canDel, tableHeaderTitle, isFileParam, disabled, type, showRequired, description, id, isDefault, showDesc}); } } // 输入参数类,这是一个list /** * @class BasicInputParamsList 输入参数类,这是一个list,主要用于开始节点参数的生成,参数与@class NodeParamItem 类似,但是有一些特殊的参数 * @param showInputParamType {boolean}; 是否显示参数类型 * @param showInputParamVal {boolean}; 是否显示参数值 * @param showDesc {boolean}; 是否显示描述 * @param referenceList {Array}; 引用列表,用于下拉选择 * @param inputParamTypeList {Array}; 输入参数类型列表 * @param fileParamTypeList {Array}; 文件输入参数类型列表 * @param paramValList {Array}; 输入参数值列表 * @param list {Array}; 参数列表 * @param shape {string}; 形状(组件) * @param create {function}; 创建方法,用于初始化参数列表 * @param defaultParam {any}; 默认参数,用于添加的默认参数 * @param init {function}; 初始化方法,用于初始化参数列表 * */ class BasicInputParamsList { // key: string; 键 // value: any; 值 // type: string; 类型,类型通常有引用、输入,引入指的是上一个节点的输出,输入指的是用户手动输入 // paramsType: string; 参数类型,值通常有string、number、boolean、integer(目前只存在于开始节点) /** * showInputParamType: boolean; 是否显示参数类型 * showInputParamVal: boolean; 是否显示参数值 * showDesc: boolean; 是否显示描述 * referenceList: Array; 引用列表,用于下拉选择,当选择引用时,当前 * */ constructor() { // 参数类型options this.inputParamTypeList = [ {value: 'String', label: 'String'}, {value: 'Integer', label: 'Integer'}, {value: 'Boolean', label: 'Boolean'}, {value: 'Number', label: 'Number'} ] // 文件输入类型options this.fileParamTypeList = [{value:'Array', label: 'Array'}] // 文件参数类型列表 // 输入参数值options this.paramValList = [ {value: 2, label: '引用'}, {value: 1, label: '输入'} ] // 引用列表,用于下拉选择 this.referenceList = [] this.list = [] this.nameFormItemWidth = 150 // 表单项宽度 this.defaultParam = null // 默认输入参数 this.showTableHeaderTitle = false // 是否显示表头标题 } setList (list) { this.list = list } getList () { // return deepClone(Object.setPrototypeOf(this.list, null)) if (this.list?.length) { return this.list.map(item => { if (item) { Object.setPrototypeOf(item, null) return deepClone(item) } }) } } add (item) { console.log('add') this.list.push(item || deepClone({...deepClone(this.defaultParam), id: generateRandomId(), name: '', value: '', referenceValue: '', tableHeaderTitle: ''})) } /** * @param showInputParamType {boolean}; 是否显示参数类型 * @param showInputParamVal {boolean}; 是否显示参数值 * @param showDesc {boolean}; 是否显示描述 * @param paramsItem {object}; 参数项 * @param showTableHeaderTitle {boolean}; 是否显示表头标题 * @param nameFormItemWidth {number}; 表单项宽度 * @param paramsDataList {Array<NodeParamItem>} 传入的list * */ init ({showInputParamType, showInputParamVal, showDesc, paramsItem, showTableHeaderTitle, nameFormItemWidth, paramsDataList} = {}) { this.showInputParamType = showInputParamType this.showInputParamVal = showInputParamVal this.showDesc = showDesc this.nameFormItemWidth = nameFormItemWidth this.showTableHeaderTitle = showTableHeaderTitle // const {name, paramTypeList, paramTypeVal, required, canDel, isFileParam, disabled, type, showRequired, description, isDefault, paramVal, tableHeaderTitle} = paramsItem || {} // console.log('paramsItem', paramsItem) this.defaultParam = deepClone({...paramsItem, showInputParamType, showInputParamVal, showDesc, showTableHeaderTitle, nameFormItemWidth, id: generateRandomId()}) if (paramsDataList?.length) { const list = paramsDataList.map(item => { return { ...item, id: item.id || generateRandomId(), // 有 id 的话是数据回显, 没有 id 的话是复制节点 value: item.paramVal === 1 || item.id ? item.value : '' // 复制节点的时候如果参数类型为引用, 则清空新节点的 value 字段 } }) this.list.push(...list) // 直接展开数组添加到 list 中 } else { this.list.push(this.defaultParam) } } } // 开始节点参数类 是一个list class StartNodeParamsList extends BasicInputParamsList { constructor() { super() this.inputDesc = '用户输入的提示词' this.fileDesc = '用户上传的文件(当前仅支持图片格式)' this.sessionSliceDesc = '会话切片,集团企微会话存档切片内容' this.showAddBtn = true // 是否显示添加按钮 this.inputParam = null this.fileParam = null this.sessionSliceParam = null } // 初始生成参数 init ({showInputParamType, showInputParamVal, showDesc, showRequired, paramsDataList} = {}) { /** * 生成两个固定参数 * */ this.showInputParamType = showInputParamType this.showInputParamVal = showInputParamVal console.log('start node paramsDataList', paramsDataList) this.inputParam = new StartNodeParamItem({ name: 'input', paramTypeList: this.inputParamTypeList, paramTypeVal: this.inputParamTypeList[0].value, // 输入类型的值 isFileParam: false, // 是否为文件参数 description: this.inputDesc, required: true, type: 'input', canDel: false, // 是否可以删除 disabled: true, // 禁用 isDefault: true, showDesc, showRequired, showInputParamType, showInputParamVal, id: 'inputParam', result: '' }) this.fileParam = new StartNodeParamItem({ name: 'file', paramTypeList: this.fileParamTypeList, paramTypeVal: this.fileParamTypeList[0].value, // 输入类型的值 isFileParam: true, // 是否为文件参数 description: this.fileDesc, required: false, disabled: true, // 禁用 canDel: false, // 是否可以删除 type: 'input', isDefault: true, showDesc, showRequired, showInputParamType, showInputParamVal, id: 'fileParam', result: '' }) this.sessionSliceParam = new StartNodeParamItem({ name: 'Session_Slice', paramTypeList: this.inputParamTypeList, paramTypeVal: this.inputParamTypeList[0].value, // 输入类型的值 isFileParam: false, // 是否为文件参数 description: this.sessionSliceDesc, required: true, type: 'input', canDel: false, // 是否可以删除 disabled: true, // 禁用 isDefault: true, showDesc: true, showRequired: false, showInputParamType: true, showInputParamVal: false, id: 'sessionSliceParam', result: '' }) this.list = [this.inputParam, this.fileParam, ...paramsDataList || []] console.log('this.list', this.list) } // 添加参数 add (item) { // 添加一个输入参数 const obj = new StartNodeParamItem(item || { name: '', paramTypeList: this.inputParamTypeList, paramTypeVal: this.inputParamTypeList[0].value, isFileParam: false, // 是否为文件参数 description: '', required: false, type: 'input', showDesc: true, showRequired: true, canDel: true, // 是否可以删除 disabled: false, // 禁用 isDefault: false, id: generateRandomId() }) this.list.push(new StartNodeParamItem(obj)) } // 删除参数 del (index) { this.list.splice(index, 1) } } // 插件节点输入参数类 是一个 list class PluginNodeInputParamsList extends BasicInputParamsList { constructor({ showInputParamType = true, showInputParamVal = true } = {}) { super() this.showInputParamType = showInputParamType this.showInputParamVal = showInputParamVal this.showTipIcon = true // 是否显示参数描述的提示图标 this.nameFormItemWidth = 100 // 参数名称表单项的宽度 this.valueFormItemWidth = 138 // 参数值表单项的宽度 this.nameFormItemDisabled = true // 是否禁用参数名称表单项 this.typeFormItemDisabled = true // 是否禁用参数类型表单项 } } class ParameterNodeInputParamsList extends BasicInputParamsList { constructor({ showInputParamVal = true, paramsDataList = [] } = {}) { super() this.showInputParamVal = showInputParamVal this.nameFormItemDisabled = true // 是否禁用参数名称表单项 this.valueTypeFormItemDisabled = true // 是否禁用参数值类型表单项 this.init(paramsDataList) } init(paramsDataList) { this.list = [ new NodeParamItem({ id: paramsDataList[0]?.id || generateRandomId(), name: 'input', // 参数名称 paramVal: 2, // 参数值 referenceFrom: paramsDataList[0]?.referenceFrom }) ] } } export { ParameterNodeInputParamsList, PluginNodeInputParamsList, StartNodeParamsList, BasicInputParamsList, NodeParamItem, StartNodeParamItem }