const bpmnInstances = () => (window as any)?.bpmnInstances;
|
|
interface ListenerFieldOptions {
|
expression?: string;
|
fieldType: string;
|
name: string;
|
string?: string;
|
}
|
|
interface ListenerOptions {
|
class?: string;
|
delegateExpression?: string;
|
event?: string;
|
eventDefinitionType?: string;
|
eventTimeDefinitions?: string;
|
expression?: string;
|
fields?: ListenerFieldOptions[];
|
id?: string;
|
listenerType?: string;
|
resource?: string;
|
scriptFormat?: string;
|
scriptType?: string;
|
value?: string;
|
}
|
|
// 创建监听器实例
|
export function createListenerObject(
|
options: ListenerOptions,
|
isTask: boolean,
|
prefix: string,
|
) {
|
const listenerObj: Record<string, any> = Object.create(null);
|
listenerObj.event = options.event;
|
isTask && (listenerObj.id = options.id); // 任务监听器特有的 id 字段
|
switch (options.listenerType) {
|
case 'delegateExpressionListener': {
|
listenerObj.delegateExpression = options.delegateExpression;
|
break;
|
}
|
case 'expressionListener': {
|
listenerObj.expression = options.expression;
|
break;
|
}
|
case 'scriptListener': {
|
listenerObj.script = createScriptObject(options, prefix);
|
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: ListenerFieldOptions,
|
prefix: string,
|
) {
|
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: ListenerOptions, prefix: string) {
|
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: any, extensionList: any[]) {
|
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
|
values: extensionList,
|
});
|
// 直接使用原始元素对象,不需要toRaw包装
|
bpmnInstances().modeling.updateProperties(element, {
|
extensionElements: extensions,
|
});
|
}
|
|
// 创建一个id
|
export function uuid(
|
length = 8,
|
charsString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
) {
|
let result = '';
|
|
for (let i = length; i > 0; --i) {
|
result += charsString[Math.floor(Math.random() * charsString.length)];
|
}
|
return result;
|
}
|