public Resultado <Digital, Falha> Executar(IdentificarSocioPorDigitalComando comando)
        {
            var tempoIdentificacao = new Stopwatch();

            tempoIdentificacao.Start();

            if (_identificadoresDeDigital == null)
            {
                _identificadoresDeDigital = new ConcurrentBag <ServicoIdentificacaoDigital>();
            }
            if (_identificadoresDeDigital.Count == 0)
            {
                if (_configuracoesBiometriaRepositorio.Recuperar(comando.Estacao) is var configuracaoBiometria && configuracaoBiometria.EhFalha)
                {
                    return(configuracaoBiometria.Falha);
                }

                if (_fabricaMotorBuscaBiometrica.CriarMotorDeBuscaBiometrica(configuracaoBiometria.Sucesso.ParceiroSdkDigital) is var motorBusca && motorBusca.EhFalha)
                {
                    return(motorBusca.Falha);
                }

                if (_digitaisRepositorio.RecuperarNumeroTotalDigitais() is var quantidadeDigitais && quantidadeDigitais.EhFalha)
                {
                    return(quantidadeDigitais.Falha);
                }

                var digitaisPorPagina = (quantidadeDigitais.Sucesso / configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital) + configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital;
                for (int pagina = 1; pagina <= configuracaoBiometria.Sucesso.QuantidadeThreadsIdentificacaoDigital; pagina++)
                {
                    if (_digitaisRepositorio.RecuperarPagina(pagina, digitaisPorPagina) is var digitais && digitais.EhFalha)
                    {
                        return(digitais.Falha);
                    }
                    if (digitais.Sucesso.Count() > 0)
                    {
                        _identificadoresDeDigital.Add(new ServicoIdentificacaoDigital(motorBusca.Sucesso, digitais.Sucesso));
                    }
                }
            }

            var digital = Digital.NovaNaoEncontrada();

            Parallel.ForEach(_identificadoresDeDigital, async(identificadorDigital, estadoLoop) =>
            {
                var resultado = await identificadorDigital.IdentificarAsync(comando.Template);
                if (resultado.EhSucesso)
                {
                    digital = resultado.Sucesso;
                    estadoLoop.Break();
                }
            });
            tempoIdentificacao.Stop();
            return(digital.Id == 0
                    ? Resultado <Digital, Falha> .NovaFalha(Falha.Nova(404, "Digitão não encontrada"))
                    : Resultado <Digital, Falha> .NovoSucesso(digital));
        }
Beispiel #2
0
        public void Nao_Posso_Identificar_Digital_No_Banco_Quando_Informo_Template_Inexistente()
        {
            var digitais    = _digitaisDataAccessTestes.CarregarDigitaisParaIdentificacao();
            var digitalLida = _digitaisDataAccessTestes.CarregarDigitalNaoEncontrada();

            var resultado = Resultado <Digital, Falha> .NovoSucesso(digitalLida);

            var tempo = new Stopwatch();

            tempo.Start();
            foreach (var digital in digitais)
            {
                resultado = _sdk.IdentificarDigital(digitalLida.TemplateIso, digital);
                if (resultado.EhSucesso)
                {
                    Assert.Fail($"Digital não deveria ser localizada, mas foi dado match com {resultado.Sucesso.Matricula}");
                }
            }
            tempo.Stop();
            Assert.IsTrue(tempo.Elapsed.TotalSeconds < 5);
            Assert.IsTrue(resultado.EhFalha);
            Assert.IsTrue(resultado.Falha.Codigo == 404);
        }