/// <summary> /// /// </summary> /// <param name="file"></param> /// <param name="campaignSeuDesejo"></param> /// <returns></returns> public async Task <int> ProcessBulkCopyAsync(Arquivo file, CampanhaFase campaignSeuDesejo) { await DropTempTableAsync(); int result; using (var dataTable = new DataTable()) { await CreateTempTableAsync(dataTable); _logger.LogInformation("Read file and send records."); result = await ProcessFileAsync(file, dataTable); } _logger.LogInformation("Merge User Status."); await _usuarioStatusFaseRepository.FixUserStatusAsync(campaignSeuDesejo.CampanhaId); await DropTempTableAsync(); return(result); }
/// <summary> /// /// </summary> /// <param name="usersStatus"></param> /// <param name="file"></param> /// <param name="campaign"></param> /// <param name="campanhaFaseAtual"></param> /// <param name="file500CpfList"></param> /// <returns></returns> private async Task ProcessUserStatus(IEnumerable <UsuarioStatusArquivo> usersStatus, Arquivo file, CampanhaFase campanhaFaseAtual, IDictionary <string, CampanhaFaseUsuarioAcesso> file500Dict) { foreach (var item in usersStatus.Where(x => x.Valido)) { try { var usuario = await _usuarioRepository.GetByCampaignAndDocumentAsync(campanhaFaseAtual.CampanhaId, item.Cpf); if (usuario == null) { _logger.LogError($"Usuário não encontrado para campanha: CPF: [{item.Cpf}] - Campanha: [{campanhaFaseAtual.CampanhaId}]"); continue; } item.UsuarioId = usuario.UsuarioId; var usuarioStatus = _mapper.Map <UsuarioStatusFase>(item); usuarioStatus.ArquivoId = file.Id; if (campanhaFaseAtual.IsCurrentPeriod(item.Periodo)) { usuarioStatus.CampanhaFaseId = campanhaFaseAtual.CampanhaFaseId; } else { var campanhaFasePeriodo = await _campanhaFaseRepository.GetByPeriodAsync(item.Periodo); if (campanhaFasePeriodo == null) { _logger.LogError($"Período não encontrado: {item.Periodo:yyyy/MM} - item: {JsonConvert.SerializeObject(item)}"); continue; } usuarioStatus.CampanhaFaseId = campanhaFasePeriodo.CampanhaFaseId; } var lastUserStatus = await _usuarioStatusFaseRepository.GetByCampaignFaseIdAndUserIdActiveAsync(usuarioStatus.CampanhaFaseId, usuarioStatus.UsuarioId); if (lastUserStatus != null) { lastUserStatus.Ativo = false; await _usuarioStatusFaseRepository.UpdateAsync(lastUserStatus); } usuarioStatus.Ativo = true; usuarioStatus = await _usuarioStatusFaseRepository.InsertAsync(usuarioStatus); if (!campanhaFaseAtual.IsFase1()) { continue; } var exist = await _campanhaFaseUsuarioAcessoRepository.ExistAsync(campanhaFaseAtual.CampanhaFaseId, usuarioStatus.UsuarioId); if (exist) { continue; } var campaignUserFase = new CampanhaFaseUsuarioAcesso { UsuarioId = usuarioStatus.UsuarioId, CampanhaFaseId = campanhaFaseAtual.CampanhaFaseId, Bonificado = true }; //campaignUserFase = await _campanhaFaseUsuarioAcessoRepository.InsertAsync(campaignUserFase); file500Dict.Add(usuario.Documento, campaignUserFase); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } } }
/// <summary> /// /// </summary> /// <param name="usersStatus"></param> /// <param name="file"></param> /// <param name="campaign"></param> /// <param name="campaignSeuDesejo"></param> /// <returns></returns> public async Task ProcessAsync(IEnumerable <UsuarioStatusArquivo> usersStatus, Arquivo file, CampanhaFase campaignSeuDesejo) { var file500Dict = new Dictionary <string, CampanhaFaseUsuarioAcesso>(); await ProcessUserStatus(usersStatus, file, campaignSeuDesejo, file500Dict); /* * if (file500Dict.Any()) * { * var valid = await _bonusService.BonusFaseAccess(file500Dict.Keys); * if (valid) * { * _logger.LogInformation($"File 500 generated with success."); * } * else * { * foreach (var usuarioAcesso in file500Dict) * { * file500Dict[usuarioAcesso.Key].Bonificado = false; * await _campanhaFaseUsuarioAcessoRepository.UpdateAsync(file500Dict[usuarioAcesso.Key]); * } * * _logger.LogInformation($"Error on generate file 500."); * } * } * */ }
/// <summary> /// /// </summary> /// <param name="users"></param> /// <param name="file"></param> /// <param name="campaign"></param> /// <param name="campanhaFaseAtual"></param> /// <returns></returns> public async Task ProcessAsync(IEnumerable <UsuarioArquivo> users, Arquivo file, CampanhaFase campanhaFaseAtual) { foreach (var item in users.Where(x => x.Valido)) { var usuario = await _usuarioRepository.GetByCampaignAndDocumentAsync(campanhaFaseAtual.CampanhaId, item.Documento); if (usuario != null) { _logger.LogError($"Usuário já existe ou já cadastrado para campanha: CPF: [{item.Documento}] - Campanha: [{campanhaFaseAtual.CampanhaId}]"); continue; } if (!campanhaFaseAtual.IsFase1()) { continue; } usuario = _mapper.Map <Usuario>(item); usuario.CampanhaId = campanhaFaseAtual.CampanhaId; usuario = await _usuarioRepository.InsertAsync(usuario); foreach (var complemento in item.UsuarioComplemento) { var usuarioComplemento = _mapper.Map <UsuarioComplemento>(complemento); usuarioComplemento.UsuarioId = usuario.UsuarioId; usuarioComplemento = await _usuarioComplementoRepository.InsertAsync(usuarioComplemento); } } }
private async Task <int> ProcessFileAsync(Arquivo file, DataTable dataTable, CampanhaFase campanhaFase) { var elapsed = new Stopwatch(); elapsed.Start(); var iLine = 0; var batchsize = 0; var rows = 0; const char delimiter = ';'; var columns = new Dictionary <string, int>(); using (var bk = new SqlBulkCopy(_connectionStrings.DotzApp) { DestinationTableName = "BB_TEMP_USUARIO_CADASTRO", BulkCopyTimeout = 0, BatchSize = 100000 }) using (var stream = new StreamReader(file.Nome)) { while (!stream.EndOfStream) { var line = stream.ReadLine(); //var columnsTable = dataTable.Columns; if (string.IsNullOrWhiteSpace(line)) { continue; } var values = line.Split(delimiter); /* * if (columns.Count == 0) * { * for (var i = 0; i < values.Length; i++) * { * var value = values[i]; * if (!columns.ContainsKey(value)) * { * columns.Add(value, i); * } * } * continue; * } * * var item = new UsuarioArquivo(); * * * foreach (var column in columns) * { * if (values.Length <= column.Value) * continue; * * var value = values[column.Value]; * * if (value == null) * continue; * * line = item.Set(column.Key, value, line); * } * * if (!item.Valido) * { * _logger.LogError($"Item inválido: {JsonConvert.SerializeObject(item, Formatting.Indented)}"); * continue; * } */ // Com validação direta iLine++; if (iLine == 1) { continue; } var item = new UsuarioArquivo(); item.Read(values); if (!item.Valido) { _logger.LogError($"Item inválido: {JsonConvert.SerializeObject(item, Formatting.Indented)}"); continue; } var usuario = _mapper.Map <Usuario>(item); usuario.CampanhaId = campanhaFase.CampanhaId; var dr = dataTable.NewRow(); dr["CPR_USUARIO_ID"] = usuario.UsuarioId; dr["CPR_CAMPANHA_ID"] = usuario.CampanhaId; dr["USR_USUARIO_ID"] = (object)usuario.UsrUsuarioId ?? DBNull.Value; dr["DT_OPT_IN"] = DateTime.Now; dr["NIVEL"] = DBNull.Value; dr["NIVEL_COMPARTILHADO"] = DBNull.Value; dr["APELIDO"] = DBNull.Value; dr["NOME"] = usuario.Nome; dr["DT_NASCIMENTO"] = usuario.DataNascimento; dr["DOCUMENTO"] = usuario.Documento; dr["EMAIL"] = DBNull.Value; dr["DESC_LOGRADOURO"] = (object)usuario.Logradouro ?? DBNull.Value; dr["NUMERO_LOGRADOURO"] = (object)usuario.NumeroLogradouro ?? DBNull.Value; dr["USR_ESTADO_UF"] = (object)usuario.Estado ?? DBNull.Value; dr["NUMERO_CEP"] = (object)usuario.Cep ?? DBNull.Value; dr["NOME_CIDADE"] = (object)usuario.Cidade ?? DBNull.Value; dr["NOME_BAIRRO"] = (object)usuario.Bairro ?? DBNull.Value; dr["DESC_COMPLEMENTO"] = (object)usuario.Complemento ?? DBNull.Value; dr["INFORMACOES_ADICIONAIS"] = (object)usuario.InformacoesAdicionais ?? DBNull.Value; dr["NUMERO_DDD1"] = (object)usuario.DddResidencial ?? DBNull.Value; dr["NUMERO_TELEFONE1"] = (object)usuario.TelefoneResidencial ?? DBNull.Value; dr["NUMERO_DDD2"] = (object)usuario.DddCelular ?? DBNull.Value; dr["NUMERO_TELEFONE2"] = (object)usuario.TelefoneCelular ?? DBNull.Value; dr["NUMERO_DDD3"] = (object)usuario.DddComercial ?? DBNull.Value; dr["NUMERO_TELEFONE3"] = (object)usuario.TelefoneComercial ?? DBNull.Value; dr["INDICADOR_SEXO"] = usuario.Sexo; dr["DT_ULTIMA_ATUALIZACAO"] = DateTime.Now; dr["OBSERVACAO"] = DBNull.Value; dr["CPR_USUARIO_ORIGEM_ID"] = DBNull.Value; dr["CARTEIRA"] = (object)usuario.Carteira ?? DBNull.Value; dr["DT_OPT_OUT"] = DateTime.Now; foreach (var complemento in item.UsuarioComplemento) { dr[complemento.Nome] = (object)complemento.Valor ?? DBNull.Value; } batchsize += 1; rows += 1; dataTable.Rows.Add(dr); if (batchsize != 100000) { continue; } await bk.WriteToServerAsync(dataTable); dataTable.Rows.Clear(); batchsize = 0; } bk.WriteToServer(dataTable); dataTable.Rows.Clear(); } elapsed.Stop(); _logger.LogInformation($"{rows} records imported in {elapsed.Elapsed:hh\\:mm\\:ss} seconds."); return(rows); }
public async Task ProcessAsync(IEnumerable <ProdutoArquivo> produtosArquivo, Arquivo file, CampanhaFase campanhaFaseAtual) { foreach (var item in produtosArquivo.Where(x => x.Valido)) { try { var produto = await _produtoRepository.FindAsync(item.ProdutoId); if (produto == null) { _logger.LogError($"Produto não encontrado: {item.ProdutoId}"); continue; } if (!string.IsNullOrEmpty(item.Voltagem)) { var volt = await _produtoRepository.IsVoltAsync(item.ProdutoId); if (!volt) { _logger.LogError($"Produto elétrico inválido. {item.ProdutoId}"); continue; } } var campanhaProdutoFase = _mapper.Map <CampanhaProdutoFase>(item); campanhaProdutoFase.ArquivoId = file.Id; if (campanhaFaseAtual.IsCurrentPeriod(item.Periodo)) { campanhaProdutoFase.CampanhaFaseId = campanhaFaseAtual.CampanhaFaseId; } else { var camapnhaFasePeriodo = await _campanhaFaseRepository.GetByPeriodAsync(item.Periodo); if (camapnhaFasePeriodo == null) { _logger.LogError($"Período informado não encontrado: {item.Periodo:yyyy/MM} - item: {JsonConvert.SerializeObject(item)}"); continue; } campanhaProdutoFase.CampanhaFaseId = camapnhaFasePeriodo.CampanhaFaseId; } var campanhaProduto = await _campanhaProdutoRepository.FindByCampaignAndProductIdAsync(campanhaFaseAtual.CampanhaId, item.ProdutoId); if (campanhaProduto == null) { campanhaProduto = new CampanhaProduto { CampanhaId = campanhaFaseAtual.CampanhaId, ProdutoId = item.ProdutoId, LojaId = item.LojaId, MecanicaId = item.Pid, PremioPadrao = false }; campanhaProduto = await _campanhaProdutoRepository.InsertAsync(campanhaProduto); } else { if (campanhaProduto.MadeChanges(item)) { await _campanhaProdutoRepository.UpdateAsync(campanhaProduto); } } campanhaProdutoFase.CampanhaProdutoId = campanhaProduto.CampanhaProdutoId; var checkExist = await _campanhaProdutoFaseRepository.FindByKeysAsync(campanhaProduto.CampanhaProdutoId, campanhaProdutoFase.CampanhaFaseId, campanhaProdutoFase.FaixaMeta, campanhaProdutoFase.Carteira, campanhaProdutoFase.Catalogo); if (checkExist != null) { checkExist.SetValue(campanhaProdutoFase); await _campanhaProdutoFaseRepository.UpdateAsync(checkExist); _logger.LogInformation("Produto atualizado com sucesso."); } else { campanhaProdutoFase = await _campanhaProdutoFaseRepository.InsertAsync(campanhaProdutoFase); _logger.LogInformation("Produto inserido com sucesso."); } } catch (Exception ex) { _logger.LogError(ex, ex.Message); _logger.LogError(JsonConvert.SerializeObject(item, Formatting.Indented)); } } }