Histórico da Página
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 pela variável global hAPI. Os seguintes métodos estão disponíveis através da hAPI:
Informações |
---|
Veja o exemplo em nosso repositório aqui. |
Método | Especificação | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
getCardValue("nomeCampo") | Permite acessar o valor de um campo do formulário do processo, onde:
| |||||||||||||||||
setCardValue("nomeCampo", "valor") | Permite definir o valor de um campo do formulário do processo, onde:
| |||||||||||||||||
setAutomaticDecision(numAtiv, listaColab, "obs") |
Permite definir o fluxo de saída de uma atividade de forma automática, onde:
| |||||||||||||||||
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.
Exemplo de uso para esta função:
| |||||||||||||||||
setDueDate(numProcesso, numThread, "userId", dataConclusao, tempoSeg) | Permite alterar o prazo de conclusão para uma determinada atividade do processo, onde:
| |||||||||||||||||
transferTask(transferUsers, "obs", int numThread) | Transfere uma tarefa de um usuário para outro(s) usuário(s).
| |||||||||||||||||
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:
| |||||||||||||||||
startProcess(processId, ativDest, listaColab, "obs", completarTarefa, valoresForm, modoGestor) | Inicia uma solicitação workflow, onde:
Retorna um mapa com informações da solicitação criada. Entre elas, o iProcess que é o número da solicitação criada. Exemplo de inicialização de uma solicitação pelo método hAPI.startProcess enviando a atividade para um papel:
| |||||||||||||||||
setColleagueReplacement(userId) | Seta um usuário substituto, onde:
| |||||||||||||||||
setTaskComments("userId", numProcesso, numThread, "obs") | Define uma observação para uma determinada tarefa do processo, onde:
| |||||||||||||||||
getCardData(numProcesso) | Retorna um Mapa com todos os campos e valores do formulário da solicitação.
| |||||||||||||||||
getAdvancedProperty("propriedade") | Retorna o valor da propriedade avançada de um processo.
| |||||||||||||||||
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:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo:
| |||||||||||||||||
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:
Retorno: Array de Objeto, onde a primeira posição do array é a data e a segunda a hora. Exemplo:
| |||||||||||||||||
getUserTaskLink(numAtiv) | Permite buscar o link para movimentação de uma determinada atividade, e utilizá-lo para enviar um e-mail com template personalizado, por exemplo.
Retorno: link para movimentação da solicitação.
Exemplo:
| |||||||||||||||||
createAdHocTasks(workflowProcessInstanceId, sequenceId, assunto, detalhamento, listatvidadesAhoc) | Permite a criação de atividades adhoc dentro dos eventos do fluig
| |||||||||||||||||
listAttachments() | Retorna a lista de anexos do processo. DocumentDto[ ] Veja aqui os paramêtros do objeto DocumentDto e aqui os métodos para acesso as variáveis.
Exemplo:
| |||||||||||||||||
publishWorkflowAttachment(documento) | Permite publicar anexos workflow da solicitação no GED do fluig, onde:
Exemplo:
| |||||||||||||||||
attachDocument(documentId) | Permite anexar documentos do GED a solicitação workflow, onde:
Exemplo:
Veja o exemplo (document-attach) no repositório do fluig clicando aqui. | |||||||||||||||||
getAvailableStatesDetail(companyId, userId, processId, processInstanceId, threadSequence) | Retorna detalhes das atividades disponíveis para seleção. Parâmetros:
Retorno: ProcessStateDto[]. | |||||||||||||||||
getChildrenInstances(processInstanceId) | Retorna uma lista com os números das solicitações filhas, onde:
Exemplo:
| |||||||||||||||||
getParentInstance(processInstanceId) | Retorna o número da solicitação pai, onde:
Exemplo:
| |||||||||||||||||
addCardChild(tableName, cardData) | Adiciona um filho no formulário pai e filho do processo, onde:
Exemplo:
|
Nos eventos existe a possibilidade de integração com serviços de dados. Tais serviços podem ser WebServices, AppServer Progress® e Dataset.
O acesso a WebServices ou AppServer Progress® deve ser previamente configurado no cadastro de Serviços. Para mais detalhes consulte em Integração com aplicativos externos, no capítulo "Acessando WebServices a partir do fluig".
Abaixo um exemplo de como executar o WebService de Colleague para criar um usuário no fluig após executar uma tarefa:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function afterTaskComplete(colleagueId, nextSequenceId, userList) { if (nextSequenceId == 2) { //Busca o webservices de Colaborador //Servico "<url_fluig>/webdesk/ECMColleagueService?wsdl" cadastrado com o código "Colleague" var colleagueServiceProvider = ServiceManager.getServiceInstance("Colleague"); var colleagueServiceLocator = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ECMColleagueServiceService"); var colleagueService = colleagueServiceLocator.getColleagueServicePort(); //Cria o ColleagueDto – Verificar a lista de métodos na visualização do serviço var colleagueDto = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDto"); colleagueDto.setCompanyId(1); colleagueDto.setColleagueId("teste"); colleagueDto.setColleagueName("Usuario Teste"); colleagueDto.setActive(true); colleagueDto.setVolumeId("Default"); colleagueDto.setLogin("teste"); colleagueDto.setMail("[email protected]"); colleagueDto.setPasswd("teste"); colleagueDto.setAdminUser(false); colleagueDto.setEmailHtml(true); colleagueDto.setDialectId("pt_BR"); //Cria o colleagueDtoArray e adiciona var colleagueDtoArray = colleagueServiceProvider.instantiate("com.totvs.technology.ecm.foundation.ws.ColleagueDtoArray"); colleagueDtoArray.getItem().add(colleagueDto); var result = colleagueService.createColleague("adm", "adm", 1, colleagueDtoArray); log.info("Result: " + result); } } |
Abaixo um outro exemplo utilizando o WebService ECMCardService para alterar o valor do campo de um registro de formulário após a entrada em uma nova atividade:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function afterStateEntry(sequenceId){ if (sequenceId == 2) { //Servico "<url_fluig>/webdesk/ECMCardService?wsdl"cadastrado com o código "CardService" var cardServiceProvider = ServiceManager.getServiceInstance("01"); var cardServiceLocator = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws.ECMCardServiceService"); var cardService = cardServiceLocator.getCardServicePort(); var cardFieldDtoArray = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDtoArray"); var cardField = cardServiceProvider.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDto"); //Seta valor no campo com name = 'nome' cardField.setField("nome"); cardField.setValue("Valor alterado via WS dentro de um evento workflow"); var vetCardFields = new Array(); vetCardFields.push(cardField); cardFieldDtoArray.getItem().addAll(vetCardFields); //Altera o(s) campo(s) do registro de formulário. //updateCardData(tenantId, login, senha, codRegistroForm, cardFieldDtoArray); cardService.updateCardData(1, "adm", "adm", 8, cardFieldDtoArray); } } |
Os seguintes eventos são disparados pela API de Workflow:
Evento | Descrição | Parâmetros | |||||||
---|---|---|---|---|---|---|---|---|---|
afterCancelProcess | Ocorre após o cancelamento da solicitação. É recomendado não disparar exceções neste método, pois o cancelamento já foi realizado. |
| |||||||
afterProcessCreate | Ocorre logo após a criação de um novo processo. |
| |||||||
afterProcessFinish | Ocorre após finalizada a solicitação. |
| |||||||
afterReleaseVersion | Ocorre após a liberação de uma versão do processo. |
| |||||||
afterStateEntry | Ocorre após a entrada em uma nova atividade. Este evento não retorna erros para a tela naturalmente. Caso ocorra um erro durante a execução do afterStateEntry, ele será ignorado. Se o mesmo erro resultar no encerramento da transação (por exemplo, causando o timeout de transação ou uma exceção que force Rollback) a mensagem de transação interrompida será apresentada em tela ao invés do erro esperado. |
| |||||||
afterStateLeave | Ocorre após a saída de uma atividade. |
| |||||||
afterTaskComplete | Ocorre após o usuário completar uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. |
| |||||||
afterTaskCreate | Ocorre após o usuário receber uma tarefa. |
| |||||||
afterTaskSave | Ocorre após salvar as informações selecionadas pelo usuário. |
| |||||||
beforeCancelProcess | Ocorre antes do cancelamento da solicitação. |
| |||||||
beforeStateEntry | Ocorre antes da entrada em uma nova atividade. Dica Utilize este evento para realizar validações que ocasionalmente possam resultar no bloqueio da movimentação do processo. Para suspender a movimentação e exibir uma mensagem de alerta para o usuário, utilize o comando 'throw', conforme exemplo abaixo:
|
| |||||||
beforeStateLeave | Ocorre antes da saída de uma atividade. |
| |||||||
beforeTaskComplete | Ocorre antes que o usuário complete uma tarefa, porém as informações de próxima tarefa e usuários destino já foram salvas. Observação Diferente dos demais eventos do tipo before, este evento não dispara suas validações ao servidor, fazendo com que o sistema não pare a movimentação da atividade quando o mesmo lança uma exceção. |
| |||||||
beforeTaskCreate | Ocorre antes que o usuário receba uma tarefa. |
| |||||||
beforeTaskSave | Ocorre antes de salvar as informações selecionadas pelo usuário. |
| |||||||
calculateAgreement | Ocorre após o cálculo do consenso (somente para atividades conjuntas) e permite alterar os dados do consenso de uma atividade. Exemplo:
|
| |||||||
onNotify | Se refere a um evento global que ocorre após a movimentação da solicitação e antes de enviar as notificações. | Para mais detalhes consulte a página Desenvolvimento de eventos - On Notify. | |||||||
subProcessCreated | Ocorre quando um sub-processo é criado. |
| |||||||
validateAvailableStates | Ocorre após montada a lista de tarefas disponíveis para o usuário a partir da tarefa atual. Exemplo:
|
|
- Não é necessário criar todos os eventos do processo – apenas aqueles nos quais se tem interesse.
- Todos os eventos são executados de forma persistente.
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 utilizada a seguinte lógica:
Bloco de código | ||||
---|---|---|---|---|
| ||||
function beforeStateEntry(sequenceId) { if (sequenceId != "NUMERO_DA_ATIVIDADE_INICIAL") { var campo = hAPI.getCardValue("campo1"); } } |