...
Os eventos de um processo são um conjunto de scripts carregados pela API de workflow. Tais scripts são desenvolvidos com o uso da linguagem JavaScript e chamados ao longo da execução do processo em momentos pré-determinados, como por exemplo a criação de um da solicitação do processo ou a entrada em uma nova atividade.
AQUI VAI CONTEÚDO FANTANTE
Em todos os eventos do processo é possível obter informações da API de Workflow. Cada evento possui acesso ao handle da API de workflow através da variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
A implementação dos eventos do processo é realizada pelo Studio, sendo necessário já existir um projeto Fluig no Studio com pelo menos um diagrama de processo.
Para criar um novo evento do processo, clicar com o botão direito do mouse no projeto, acessar a opção New e em seguida a opção Other. No assistente aberto, selecionar a opção "Script Evento Workflow", presente na pasta Fluig, e clicar no botão Next. Na nova tela selecionar qual o evento que será criado e relacionar ele a um processo já existente. Para finalizar, clicar no botão Finish:
Image Added
Em todos os eventos do processo é possível obter informações da API de Workflow. Cada evento possui acesso ao handle da API de workflow através da variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
Método | Especificação |
---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário
|
Método | Especificação |
---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário.
|
setCardValue("nomeCampo", "valor") | Permite definir o valor de um campo do formulário do processo, onde: - nomeCampo: nome do campo do formulário;
- valor: valor a ser definido para o campo do formulário.
|
setAutomaticDecision(numAtiv, listaColab, "obs") | Permite definir o fluxo de saída de uma atividade de forma automática, onde: - numAtiv: número da atividade destino;
- listaColab: lista (do tipo String) dos usuários que receberão a tarefa;
- obs: observação da tarefa;
|
getActiveStates() | Retorna uma lista das atividades ativas do processo. |
getActualThread(numEmpresa, numProcesso, numAtiv) | Retorna a thread da atividade que está ativa, lembrando que em caso de atividades paralelas, retorna 0, 1, 2 e assim sucessivamente. - numEmpresa: número da empresa;
- numProcesso: número da solicitação;
- numAtiv: número da atividade.
|
setDueDate(numProcesso, numThread, "userId", dataConclusao, tempoSeg) | Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde: - numProcesso: número da solicitação;
- numThread: número da thread (normalmente 0, quando não se utiliza atividades paralelas);
- userId: o usuário responsável pela tarefa;
- dataConclusao: a nova data de conclusão;
- tempoSeg: tempo que representa a nova hora de conclusão, calculado em segundos após a meia-noite.
Informações |
---|
Recomendamos a utilização deste método no evento afterTaskCreate, pois será executado logo após a criação da tarefa. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var data = new Date();
//seta o dia, mês (Janeiro é 0) e ano
data.setDate(20);
data.setMonth(10);
data.setFullYear(2010);
// Recupera o numero da solicitação
var processo = getValue("WKNumProces");
// Seta o prazo para as 14:00
hAPI.setDueDate(processo, 0, colleagueId, data, 50400);
} |
|
|
transferTask(transferUsers, "obs", int numThread) | Transfere uma tarefa de um usuário para outro(s) usuário(s). - transferUsers: lista (do tipo String) de usuários;
- obs: a observação;
- numThread: sequência da thread, em caso de atividades paralelas.
|
transferTask(transferUsers, "obs") | Transfere uma tarefa de um usuário para outro(s) usuário(s). Este método não pode ser usado em processos com atividades paralelas: - transferUsers: lista (do tipo String) de usuários;
- obs: a observação.
|
startProcess(processId, ativDest, listaColab, "obs", completarTarefa, valoresForm, modoGestor) | Inicia uma solicitação workflow, onde: - processId: código do processo;
- ativDest: atividade de destino;
- listaColab: lista (do tipo String) de usuários;
- obs: texto da observação;
- completarTarefa: indica se deve completar a tarefa (true) ou apenas salvar (false);
- valoresForm: um Mapa com os valores do formulário do processo;
- modoGestor: acesso como gestor do processo (true/false).
Retorna um mapa com informações da solicitação criada. Entre elas, o iProcess que é o número da solicitação criada. |
setColleagueReplacement(userId) | Seta um usuário substituto, onde: - userId: código do usuário substituto.
|
setTaskComments("userId", numProcesso, numThread, "obs") | Define uma observação para uma determinada tarefa do processo, onde: - userId: usuário responsável pela tarefa;
- numProcesso: número da solicitação de processo;
- numThread: é o número da thread (normalmente 0, quando não se utiliza atividades paralelas);
- obs: a observação.
|
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação. - numProcesso: número da solicitação de processo.
|
getAdvancedProperty("propriedade") | Retorna o valor da propriedade avançada de um processo. - propriedade: nome da propriedade avançada.
|
calculateDeadLineHours(data, segundos, prazo, periodId) | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em horas: - data: Data inicial (tipo Date);
- segundos: Quantidade de segundos após a meia noite;
- prazo: Prazo que será aplicado em horas (tipo int);
- periodId: Código de Expediente.
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var data = new Date();
//Calcula o prazo
var obj = hAPI.calculateDeadLineHours(data, 50000, 2, "Default");
var dt = obj[0];
var segundos = obj[1];
//Recupera o numero da solicitação
var processo = getValue("WKNumProces");
//Altera o prazo do processo
hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
} |
|
calculateDeadLineTime(data, segundos, prazo, periodId) | Calcula um prazo a partir de uma data com base no expediente e feriados cadastrados no produto passando o prazo em minutos: - data: Data inicial (tipo Date);
- segundos: Quantidade de segundos após a meia noite;
- prazo: Prazo que será aplicado em minutos (tipo int).
- periodId - Código de Expediente
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function afterTaskCreate(colleagueId) {
var data = new Date();
//Calcula o prazo
var obj = hAPI.calculateDeadLineTime(data, 50000, 120, "Default");
var dt = obj[0];
var segundos = obj[1];
//Recupera o numero da solicitação
var processo = getValue("WKNumProces");
// Altera o prazo do processo
hAPI.setDueDate(processo,0,colleagueId, dt, segundos);
} |
|
...
Nota |
---|
Importante: Não é possível capturar (hAPI.getCardValue) ou adicionar (hAPI.setCardValue) dados no formulário na inicialização do processo, sendo possível somente a partir da segunda tarefa. Para isso pode ser utilizado a seguinte lógica:lógica: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
if (sequenceId != "NUMERO_DA_ATIVIDADE_INICIAL") {
var campo = hAPI.getCardValue("campo1");
}
} |
|
Customização do Processo
Com o uso de eventos, o Fluig permite que um processo seja customizado possibilitando a execução de ações definidas pelo usuário, tais como:
- Validar o ato de completar uma atividade;
- Tomar decisões automaticamente;
- Realizar integrações com outros sistemas;
- Iniciar novas solicitações automaticamente.
Existem algumas propriedades que contém informações referentes à solicitação que podem ser utilizadas na customização do processo, são elas:
Parâmetro | Descrição |
---|
WKDef | Código do processo |
WKVersDef | Versão do processo |
WKNumProces | Número da solicitação de processo |
WKNumState | Número da atividade |
WKCompany | Número da empresa |
WKUser | Código do usuário corrente |
WKUserComment | Comentário feito pelo usuário na atividade ou no cancelamento da solicitação |
WKCompletTask | Se a tarefa foi completada (true/false) |
WKNextState | Número da próxima atividade (destino) |
WKCardId | Código do formulário do processo |
WKFormId | Código da definição de formulário do processo |
Além dessas propriedades já alimentadas pelo produto, é possível criar propriedades customizadas que podem ser utilizadas nos eventos. O produto disponibiliza a variável globalVars, que é um mapa de dados (Map<String, String>) e estará disponível em todos os eventos.
Para adicionar uma propriedade e seu valor, utilize o método globalVars.put("name", "value"), onde "name" é o nome da propriedade e "value" o seu valor. Exemplo: globalVars.put("WDAprovador","adm");
Para recuperar os valores da variável globalVars, utilize o método globalVars.get("name"), onde "name" é o nome da propriedade a ser retornado o valor. Exemplo: globalVars.get("WDAprovador");
Deck of Cards |
---|
effectDuration | 0.5 |
---|
id | samples |
---|
history | false |
---|
effectType | fade |
---|
|
Card |
---|
default | true |
---|
id | 1 |
---|
label | Exemplo 1 |
---|
| Para validar se o usuário está completando uma atividade corretamente, basta utilizar o evento beforeTaskSave e retornar alguma mensagem caso queira disparar um erro. Por exemplo, segue parte de um código de customização para um processo: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeTaskSave(colleagueId, nextSequenceId, userList) {
var ativAtual = getValue("WKNumState");
var process = parseInt(globalVars.get("process"));
var resp1 = hAPI.getCardValue("resp1_H");
var eficacia1 = hAPI.getCardValue("eficaz1");
var controle1 = hAPI.getCardValue("controle1");
var eficaz = true;
var users = new java.util.ArrayList();
if (ativAtual == 7 && nextSequenceId == 12) {
if (resp1 != "" && eficacia1 != "1" && eficacia1 != "2") {
if (verificaUsuario(users, resp1)) {
users.add(resp1);
}
}
hAPI.setAutomaticDecision(8, users, "Decisao tomada automaticamente pelo Fluig.");
} else if (ativAtual == 9 && nextSequenceId == 13) {
if (resp1 != "" && eficacia1 == "2" && controle1 == ""){
eficaz = false;
}
if (eficaz) {
var codGrupo = buscaGrupo(process, "Qualidade");
users.add("Pool:Group:" + codGrupo);
hAPI.setAutomaticDecision(6, users , "Decisao tomada automaticamente pelo Fluig.");
}
}
} |
|
Card |
---|
| Para fazer com que uma decisão seja tomada automaticamente, os seguintes procedimentos devem ser executados: - Adicionar em Propriedades Avançadas a propriedade AutomaticTasks com a lista de todas as atividades que terão decisão delegada via customização. Exemplo: AutomaticTasks=3,6,10.
- Implementar o evento beforeStateEntry e executar o método "setAutomaticDecision" da hAPI, passando como parâmetros a próxima atividade, o próximo usuário (ou lista de usuários) e uma observação.
Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function beforeStateEntry(sequenceId) {
|
if(sequenceId!= "NUMERO_DA_ATIVIDADE_INICIAL") {
var campo = hAPI.getCardValue("campo1");
}
} |
|
Customização do Processo
...
new java.util.ArrayList();
userList.add("adm");
hAPI.setAutomaticDecision(6, userList, "Decisao tomada automaticamente pelo Fluig.");
} |
Informações |
---|
As atividades com decisão automática também podem ser criadas via editor de processo. |
|
Card |
---|
| Para iniciar uma nova solicitação de um outro processo ao finalizar uma solicitação pode ser executados os seguintes procedimentos: - Cadastrar um serviço no Fluig em que a URL seja o WSDL do serviço ECMWorkflowEngineService.
- Implementar o evento afterProcessFinish utilizando o exemplo abaixo. Sendo ‘process2’ o novo processo a ser inicializado
|
|
Tratamento de Exceções
As exceções podem ser tratadas nos seguintes eventos: beforeStateEntry, beforeTaskSave e beforeCancelProcess. O tratamento de exceção no evento beforeStateEntry pode ser utilizado na inicialização de solicitações, pois ele impede que a solicitação seja iniciada. O tratamento de exceção no evento beforeTaskSave pode ser utilizado somente se a solicitação já estiver inicializada.
...
Deck of Cards |
---|
startHidden | false |
---|
effectDuration | 0.5 |
---|
id | mecatrib |
---|
history | false |
---|
effectType | fade |
---|
|
Card |
---|
default | true |
---|
id | 1 |
---|
label | 1º Passo |
---|
| Para criar um novo mecanismo de atribuição customizado, clicar com o botão direito do mouse no projeto do Fluig, acessar a opção New e então a opção Other. No assistente aberto, selecionar a opção "Mecanismo customizado Fluig" presente na pasta Fluig e clicar no botão Next: ![](/download/attachments/73082818/mecatrib-porarea-new.png?version=1&modificationDate=1377713894000&api=v2)
|
Card |
---|
| O assistente Novo Mecanismo Fluig é aberto. Informar o Código e uma descrição e clicar no botão Finish: ![](/download/attachments/73082818/mecatrib-porarea.png?version=1&modificationDate=1377700685000&api=v2)
|
Card |
---|
id | 3 |
---|
label | 3º Passo (Implementação) |
---|
| O arquivo JavaScript do mecanismo de atribuição é adicionado ao projeto na pasta mechanisms e aberto para edição. O script de customização de mecanismo de atribuição recebe como parâmetro o código do processo e o usuário corrente. Este script deve retornar uma lista dos usuários que podem assumir a tarefa. Abaixo, exemplo de implementação: Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
firstline | 1 |
---|
linenumbers | true |
---|
| function resolve(process, colleague) {
var userList = new java.util.ArrayList();
var groupId = colleague.getGroupId();
var c1 = DatasetFactory.createConstraint("cdArea", groupId, groupId, ConstraintType.MUST);
var constraints = new Array(c1);
var dataset = DatasetFactory.getDataset("dsResponsaveisArea", null, constraints, null);
for (var i = 0; i < dataset.rowsCount; i++) {
userList.add(dataset.getValue(i, "cdUsuarioResp"));
}
return userList;
} |
Informações |
---|
É possível acessar Datasets e Serviços cadastrados no Fluig na customização do mecanismo de atribuição. |
|
Card |
---|
id | 4 |
---|
label | Último Passo (Exportação) |
---|
| Por fim, o mecanismo de atribuição customizado deve ser exportado para o servidor do Fluig e ao realizar a exportação deve ser informado obrigatoriamente seu código e nome, e opcionalmente uma descrição: ![](/download/attachments/73082818/mecatrib-porarea-export.png?version=1&modificationDate=1377713369000&api=v2)
|
|
...