flowable: enviar señal de un flujo a otro

Flujo que espera la señal: Flujo Plan de Aporte

  • Para este tenemos el flujo de aportes

  • Cuando los planes están en estado de verificados Unidad Superior pasan a una tarea de espera de aprobación de los planes de acciones y es aquí donde debemos enviar la señal del flujo de acciones
  • Además esta configurado así:
  • donde tiene este id
waitForApprovalAporteEstrategico
  • Luego la siguiente caja lo que hace es la aprobación de los planes e aportes
  • Este tiene una Extresion
  • Con la siguiente información
#{planAporteEstrategicoServiceImpl.actualizarEstadoDesdeFlujo(execution,"ESTADO_FORMULACION_PAE","cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPAEService",estadoFormulacionPAEServiceImpl.obtenerEstadoAprobado().getId(),"NOMBRE")}
  • Que los que hace es llamar al service (NOTA: No debe ser el Bean): planAporteEstrategicoServiceImpl
  • Y mandar a llamar a la función actualizarEstadoDesdeFlujo
  • y mandando «execution» en veces del los normal que es la entidad del bean
  • Este método actualiza lso planes de aportes con la siguiente función
/**
     * Metodo invocado desde el flujo de Plan de Aportes que actualizar el estado del plan a aprobado
     *
     * @param execution
     * @param columnName
     * @param serviceClass
     * @param nextStatus
     * @param columnaTablaEstado
     * @throws Exception
     */
    @Override
    public void actualizarEstadoDesdeFlujo(DelegateExecution execution, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstado) throws Exception {
        
        try{
            
            logger.info("Ingresa al Plan Aporte Estrategico = " + execution.getProcessInstanceBusinessKey());
            Long id = Long.valueOf(execution.getProcessInstanceBusinessKey());
            PlanAporteEstrategico planAporteEstrategico = this.find(id);
            this.actualizarEstado(planAporteEstrategico, columnName, serviceClass, nextStatus, columnaTablaEstado);

        }catch(Exception ex){
            System.out.println(ex);            
        }
    }

    Flujo Padre (quien envia señal): Flujo de Acciónes

    • El flujo esta constituido de la siguiente forma:
    • El proceso se va a dar de la siguiente forma
    • cuando le den aprobar el flujo se verirfican varias condicciones entre ellas que todos los planes de aportes esten en estado de «Verificado unidad Superior» es decir que todos los planes esten aquí
    • Si es así se llama a la siguiente caja
    • Que tiene una expression
    • Código
    #{planAccionEstrategicaBean.finalizarFlujo(planAccionEstrategicaBean.entity,"ESTADO_FORMULACION_PXE","cr.ac.una.cgi.sigesa.ppi.ppe.service.EstadoFormulacionPXEService",estadoFormulacionPXEServiceImpl.obtenerEstadoAprobado().getId(),"NOMBRE")}
    • Este metodo va a actualizar el estado del plan de accion y mandar a aprobar los planes de aportes
    /**
         * Metodo que finaliza el Plan de Acción y sus Planes de Aportes Vinculados
         *
         * @param entity
         * @param columnName
         * @param serviceClass
         * @param nextStatus
         * @param columnaTablaEstados
         * @author Gustavo Matamoros González
         * @since 02/02/24
         */
        @Override
        public void finalizarFlujo(PlanAccionEstrategica entity, String columnName, String serviceClass, Long nextStatus, String columnaTablaEstados) {
    
            // Actualizar el estado del Plan de Acción
            entity = actualizarEstado(entity, columnName, serviceClass, nextStatus, columnaTablaEstados);
    
            // Mandar a aprobar los Planes de Aporte Vinculados
            this.aprobarPlanesDeAporteEstrategico(entity);
    
        }
    • La función de aprobarPlanesDeAporteEstrategico va obtener los planes de aportes vinculados al de acción
    /**
         * Metodo que obtiene los planes de Aporte vinculados y les envia la señal para que continuen el flujo
         *
         * @param planAccionEstrategica
         * @author Gustavo Matamoros González
         * @since 02/02/24
         */
        private void aprobarPlanesDeAporteEstrategico(PlanAccionEstrategica planAccionEstrategica) {
    
                // Obtenemos la lista de acciones
                List<AccionEstrategica> listaDeAcciones;
                listaDeAcciones = planAccionEstrategica.getListaAccionesEstrategica();
    
                //Lista de Planes de Aportes Estrategicos por Aprobar
                List<PlanAporteEstrategico> listaPlanesAporteEstrategicosPorAprobar = new ArrayList();
    
                // Si existen acciones
                if (!listaDeAcciones.isEmpty()) {
                    for (AccionEstrategica accionEstrategica : listaDeAcciones) {
    
                        // Si existen Aportes Estrategicos
                        if (!accionEstrategica.getAporteEstrategicoList().isEmpty()) {
                            List<AporteEstrategico> listaDeAportes;
                            listaDeAportes = accionEstrategica.getAporteEstrategicoList();
                            for (AporteEstrategico aporteEstrategico : listaDeAportes){
    
                                // Obtener el plan de Aporte Estrategico y agregarlo a la lista
                                PlanAporteEstrategico planAporteEstrategico = aporteEstrategico.getPlanAporteEstrategico();
    
                                // Verificar si el plan ya está en la lista
                                if (!listaPlanesAporteEstrategicosPorAprobar.contains(planAporteEstrategico)) {
                                    // Si no está presente, agrégalo a la lista
                                    listaPlanesAporteEstrategicosPorAprobar.add(planAporteEstrategicoService.find(planAporteEstrategico.getId()));
                                }
                            }
                        }
                    }
    
                    //Mandar a Aprobar los Planes de Aportes Estrategicos
                    if(!listaPlanesAporteEstrategicosPorAprobar.isEmpty()){
                        for (PlanAporteEstrategico planAporteEstrategico: listaPlanesAporteEstrategicosPorAprobar){
                            // Enviar Señal
                            this.enviarSenialDesdeFlujo(planAporteEstrategico);
                        }
                    }
                }
    
    
        }
    • Y les va a enviar la señal con esta función
    /**
         * Metodo que envia la señal a los planes de aporte para que continuen el flujo
         *
         * @param planAporteEstrategico
         * @author Gustavo Matamoros González
         * @since 02/02/24
         */
        public void enviarSenialDesdeFlujo(PlanAporteEstrategico planAporteEstrategico) {
    
            //Obtener la instancia ID
            String processInstanceId = flowableService.getProcessInstanceId(planAporteEstrategico.getClass().getSimpleName(), String.valueOf(planAporteEstrategico.getId()));
            
            // Enviar la señal
            flowableService.sendSignal(processInstanceId, "waitForApprovalAporteEstrategico");
       
        }