import { toRaw } from 'vue' const bpmnInstances = () => (window as any)?.bpmnInstances // 创建监听器实例 export function createListenerObject(options, isTask, prefix) { debugger const listenerObj = Object.create(null) listenerObj.event = options.event isTask && (listenerObj.id = options.id) // 任务监听器特有的 id 字段 switch (options.listenerType) { case 'scriptListener': listenerObj.script = createScriptObject(options, prefix) break case 'expressionListener': listenerObj.expression = options.expression break case 'delegateExpressionListener': listenerObj.delegateExpression = options.delegateExpression break default: listenerObj.class = options.class } // 注入字段 if (options.fields) { listenerObj.fields = options.fields.map((field) => { return createFieldObject(field, prefix) }) } // 任务监听器的 定时器 设置 if (isTask && options.event === 'timeout' && !!options.eventDefinitionType) { const timeDefinition = bpmnInstances().moddle.create('bpmn:FormalExpression', { body: options.eventTimeDefinitions }) const TimerEventDefinition = bpmnInstances().moddle.create('bpmn:TimerEventDefinition', { id: `TimerEventDefinition_${uuid(8)}`, [`time${options.eventDefinitionType.replace(/^\S/, (s) => s.toUpperCase())}`]: timeDefinition }) listenerObj.eventDefinitions = [TimerEventDefinition] } return bpmnInstances().moddle.create( `${prefix}:${isTask ? 'TaskListener' : 'ExecutionListener'}`, listenerObj ) } // 创建 监听器的注入字段 实例 export function createFieldObject(option, prefix) { const { name, fieldType, string, expression } = option const fieldConfig = fieldType === 'string' ? { name, string } : { name, expression } return bpmnInstances().moddle.create(`${prefix}:Field`, fieldConfig) } // 创建脚本实例 export function createScriptObject(options, prefix) { const { scriptType, scriptFormat, value, resource } = options const scriptConfig = scriptType === 'inlineScript' ? { scriptFormat, value } : { scriptFormat, resource } return bpmnInstances().moddle.create(`${prefix}:Script`, scriptConfig) } // 更新元素扩展属性 export function updateElementExtensions(element, extensionList) { const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: extensionList }) bpmnInstances().modeling.updateProperties(toRaw(element), { extensionElements: extensions }) } // 创建一个id export function uuid(length = 8, chars?) { let result = '' const charsString = chars || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' for (let i = length; i > 0; --i) { result += charsString[Math.floor(Math.random() * charsString.length)] } return result }