ModelDefinition
ModelDefinition define as opções de criação para um modelo de fluxo, usadas para criar uma instância de modelo através do método FlowEngine.createModelAsync(). Ele inclui a configuração básica do modelo, propriedades, submodelos e outras informações.
Definição de Tipo
interface CreateModelOptions {
uid?: string;
use: RegisteredModelClassName | ModelConstructor;
props?: IModelComponentProps;
flowRegistry?: Record<string, Omit<FlowDefinitionOptions, 'key'>>;
stepParams?: StepParams;
subModels?: Record<string, CreateSubModelOptions[]>;
parentId?: string;
subKey?: string;
subType?: 'array' | 'single';
sortIndex?: number;
flowRegistry?: Record<string, Omit<FlowDefinitionOptions, 'key'>>;
}
Uso
const engine = new FlowEngine();
// Cria uma instância de modelo
const model = await engine.createModelAsync({
uid: 'unique-model-id',
use: 'MyModel',
props: {
title: 'My Model',
description: 'A sample model'
},
stepParams: {
step1: { param1: 'value1' }
},
subModels: {
childModels: [
{
use: 'ChildModel',
props: { name: 'Child 1' }
}
]
}
});
Descrição das Propriedades
uid
Tipo: string
Obrigatório: Não
Descrição: O identificador único para a instância do modelo.
Se não for fornecido, o sistema irá gerar automaticamente um UID único.
Exemplo:
uid: 'model-123'
uid: 'user-profile-model'
uid: 'data-processing-instance'
use
Tipo: RegisteredModelClassName | ModelConstructor
Obrigatório: Sim
Descrição: A classe de modelo a ser usada.
Pode ser uma string com o nome de uma classe de modelo registrada, ou o construtor da classe de modelo.
Exemplo:
// Usa referência de string
use: 'MyModel'
// Usa construtor
use: MyModel
// Usa referência dinâmica
const ModelClass = await engine.getModelClassAsync('MyModel');
use: ModelClass
props
Tipo: IModelComponentProps
Obrigatório: Não
Descrição: A configuração de propriedades para o modelo.
O objeto de propriedades passado para o construtor do modelo.
Exemplo:
props: {
title: 'My Model',
description: 'A sample model instance',
config: {
theme: 'dark',
language: 'zh-CN'
},
metadata: {
version: '1.0.0',
author: 'Developer'
}
}
stepParams
Tipo: StepParams
Obrigatório: Não
Descrição: Configuração de parâmetros de passo.
Define parâmetros para cada passo no fluxo de trabalho.
Exemplo:
stepParams: {
loadData: {
url: 'https://api.example.com/data',
method: 'GET',
timeout: 5000
},
processData: {
processor: 'advanced',
options: {
format: 'json',
encoding: 'utf8'
}
},
saveData: {
destination: 'database',
table: 'processed_data'
}
}
subModels
Tipo: Record<string, CreateSubModelOptions[]>
Obrigatório: Não
Descrição: Configuração de submodelos.
Define os submodelos do modelo, suportando tanto submodelos em array quanto submodelos únicos.
Exemplo:
subModels: {
// Submodelo do tipo array
childModels: [
{
use: 'ChildModel1',
props: { name: 'Child 1', type: 'primary' }
},
{
use: 'ChildModel2',
props: { name: 'Child 2', type: 'secondary' }
}
],
// Submodelo único
singleChild: {
use: 'SingleChildModel',
props: { name: 'Single Child' }
}
}
parentId
Tipo: string
Obrigatório: Não
Descrição: O UID do modelo pai.
Usado para estabelecer uma relação pai-filho entre os modelos.
Exemplo:
parentId: 'parent-model-123'
parentId: 'master-instance'
subKey
Tipo: string
Obrigatório: Não
Descrição: O nome da chave do submodelo no modelo pai.
Usado para identificar a posição do submodelo dentro do modelo pai.
Exemplo:
subKey: 'childModels'
subKey: 'subComponents'
subKey: 'nestedItems'
subType
Tipo: 'array' | 'single'
Obrigatório: Não
Descrição: O tipo do submodelo.
'array': Um submodelo do tipo array, que pode conter múltiplas instâncias.
'single': Um submodelo único, que pode conter apenas uma instância.
Exemplo:
subType: 'array' // Tipo array
subType: 'single' // Tipo único
sortIndex
Tipo: number
Obrigatório: Não
Descrição: Índice de ordenação.
Usado para controlar a ordem de exibição do modelo em uma lista.
Exemplo:
sortIndex: 0 // No topo
sortIndex: 10 // Posição intermediária
sortIndex: 100 // Mais para trás
flowRegistry
Tipo: Record<string, Omit<FlowDefinitionOptions, 'key'>>
Obrigatório: Não
Descrição: Registro de fluxo de trabalho.
Registra definições específicas de fluxo de trabalho para a instância do modelo.
Exemplo:
flowRegistry: {
'customFlow': {
title: 'Custom Flow',
manual: false,
steps: {
step1: {
use: 'customAction',
title: 'Custom Step'
}
}
},
'anotherFlow': {
title: 'Another Flow',
on: 'click',
steps: {
step1: {
handler: async (ctx, params) => {
// Lógica de processamento personalizada
}
}
}
}
}
Exemplo Completo
class DataProcessingModel extends FlowModel {}
// Registra a classe de modelo
engine.registerModelLoaders({
DataProcessingModel: {
// Importação dinâmica: o módulo do modelo só é carregado quando este modelo é realmente necessário pela primeira vez
loader: () => import('./DataProcessingModel'),
},
});
// Cria uma instância de modelo
const model = await engine.createModelAsync({
uid: 'data-processing-001',
use: 'DataProcessingModel',
props: {
title: 'Data Processing Instance',
description: 'Processes user data with advanced algorithms',
config: {
algorithm: 'neural-network',
batchSize: 100,
learningRate: 0.01
},
metadata: {
version: '2.1.0',
author: 'Data Team',
createdAt: new Date().toISOString()
}
},
stepParams: {
loadData: {
source: 'database',
query: 'SELECT * FROM users WHERE active = true',
limit: 1000
},
preprocess: {
normalize: true,
removeOutliers: true,
encoding: 'utf8'
},
process: {
algorithm: 'neural-network',
layers: [64, 32, 16],
epochs: 100,
batchSize: 32
},
saveResults: {
destination: 'results_table',
format: 'json',
compress: true
}
},
subModels: {
dataSources: [
{
use: 'DatabaseSource',
props: {
name: 'Primary DB',
connection: 'mysql://localhost:3306/db1'
}
},
{
use: 'APISource',
props: {
name: 'External API',
url: 'https://api.external.com/data'
}
}
],
processors: [
{
use: 'DataProcessor',
props: {
name: 'Main Processor',
type: 'neural-network'
}
}
],
outputHandler: {
use: 'OutputHandler',
props: {
name: 'Results Handler',
format: 'json'
}
}
},
flowRegistry: {
'dataProcessingFlow': {
title: 'Fluxo de Processamento de Dados',
manual: false,
sort: 0,
steps: {
load: {
use: 'loadDataAction',
title: 'Carregar Dados',
sort: 0
},
process: {
use: 'processDataAction',
title: 'Processar Dados',
sort: 1
},
save: {
use: 'saveDataAction',
title: 'Salvar Resultados',
sort: 2
}
}
},
'errorHandlingFlow': {
title: 'Fluxo de Tratamento de Erros',
manual: true,
on: 'error',
steps: {
log: {
use: 'logErrorAction',
title: 'Registrar Erro'
},
notify: {
use: 'notifyErrorAction',
title: 'Notificar Administrador'
}
}
}
}
});
// Usa o modelo
model.applyFlow('dataProcessingFlow');