/// <summary> /// Obtém as políticas de aceitação de todas as propostas de um determinado CNPJ /// </summary> /// <param name="cnpj">CNPJ do parceiro</param> /// <param name="canalVenda">Canal de venda</param> /// <returns></returns> public IQueryable <PoliticaAceitacao> ObterTodos(long cnpj, short canalVenda) { var pesquisa = new PesquisaModelosDeProposta(); pesquisa.Cnpj = cnpj; pesquisa.CanalDeVenda = canalVenda; /*verificar*/ var resultadoPesquisarModelos = ServiceWcf <INegociacaoService> .UseSync(n => n.PesquisarModelosDeProposta(pesquisa)); if (resultadoPesquisarModelos.HouveErrosDuranteProcessamento) { throw new Exception(string.Join(", ", resultadoPesquisarModelos.Mensagens)); } var listaModeloProposta = resultadoPesquisarModelos.Valor; var politicas = new List <PoliticaAceitacao>(); foreach (var modeloPropostaEsb in listaModeloProposta) { PoliticaAceitacao politicaAceitacao = ObterLimitesOperacionais(modeloPropostaEsb.Codigo); if (politicaAceitacao == null) { continue; } politicas.Add(politicaAceitacao); } return(politicas.AsQueryable()); }
public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req, [DocumentDB("Venda", "ModelosNegocio", Id = "id", CreateIfNotExists = true, CollectionThroughput = 4000)] IAsyncCollector <dynamic> modelosNegocio, [DocumentDB("Venda", "ModelosNegocio", Id = "id")] DocumentClient collectionModelosNegocio, TraceWriter log) { var cnpjs = Environment.GetEnvironmentVariable("Clientes.Cnpj").Split(','); var modelosNegocioRetornados = new ConcurrentDictionary <Tuple <string, string>, List <Model.ModeloProposta> >(); var modelosPropostaRetornados = new ConcurrentBag <ModeloProposta>(); Stopwatch sw = new Stopwatch(); sw.Start(); log.Info("Buscando modelos de proposta no ESB.Produto.v2"); try { Parallel.For(0, cnpjs.Length, i => { var cnpjCanal = cnpjs[i].Split('|'); var servicoModeloProposta = new ServicoModeloProposta(); short?canalVenda; if (cnpjCanal.Length > 1) { canalVenda = short.Parse(cnpjCanal[1]); } else { canalVenda = null; } var pesquisa = new PesquisaModelosDeProposta { Cnpj = Int64.Parse(cnpjCanal[0]), CanalDeVenda = canalVenda.GetValueOrDefault(0) }; var resultadoPesquisarModelos = ServiceWcf <INegociacaoService> .UseSync(neg => neg.PesquisarModelosDeProposta(pesquisa)); if (resultadoPesquisarModelos.HouveErrosDuranteProcessamento) { throw new ApplicationException(string.Join(", ", resultadoPesquisarModelos.Mensagens)); } resultadoPesquisarModelos.Valor.ForEach(rpm => modelosPropostaRetornados.Add(rpm)); var resultado = servicoModeloProposta.ObterTodos(resultadoPesquisarModelos.Valor); modelosNegocioRetornados.TryAdd(new Tuple <string, string>(cnpjCanal[0], canalVenda?.ToString()), resultado.ToList()); }); sw.Stop(); log.Info($"Terminou de buscar os modelos de proposta no ESB.Produto.v2 em {sw.ElapsedMilliseconds}"); log.Info("Limpando coleção de modelos de negócio."); var deleteMnCollection = collectionModelosNegocio.DeleteDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri("Venda", "ModelosNegocio")); await deleteMnCollection; log.Info("Terminou de limpar os modelos de negócio."); log.Info("Salvando modelos de negócio."); var tasksInsertMn = new List <Task>(); foreach (var modeloNegocio in modelosNegocioRetornados) { Task.Run(async() => { var data = new { Cnpj = modeloNegocio.Key.Item1.Trim(), CanalVenda = modeloNegocio.Key.Item2, Modelos = modeloNegocio.Value }; var size = Encoding.UTF8.GetBytes(await Task.Factory.StartNew(() => JsonConvert.SerializeObject(data))); if (size.Length > 2000000) { decimal i = 0m; do { tasksInsertMn.Add(modelosNegocio.AddAsync(new { data.Cnpj, data.CanalVenda, Modelos = data.Modelos.GetRange((int)i * 8, (int)i * 8 + 8 > data.Modelos.Count ? data.Modelos.Count - (int)i * 8 : 8) })); i++; } while (i < ((decimal)data.Modelos.Count / 8)); } else { tasksInsertMn.Add(modelosNegocio.AddAsync(data)); }; }).Wait(); } Task.WaitAll(tasksInsertMn.ToArray()); log.Info("Terminou de salvar modelos de negócio."); } catch (AggregateException agex) { var msg = string.Empty; agex.InnerExceptions.ToList().ForEach(e => msg += $"{e.GetType().Name} \n " + e.Message); return(req.CreateErrorResponse(HttpStatusCode.InternalServerError, msg)); } catch (Exception ex) { return(req.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message)); } return(req.CreateResponse(HttpStatusCode.OK)); }