Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Defina com auxilio do PO qual micro serviço receberá a lógica para importar os dados para o sistema, verifique também se a entidade já possui alguma lógica no serviço de integrações padrões (IntegracoesStandard), caso possua pode ser utilizada. Valide também se irão utilizar a importação para muitos dados e consequentemente você deva tratar tudo em lista, ao invés de validar e importar registro á registro.

  2. Definido o micro serviço você deve criar uma entidade que irá representar a carga que está sendo feita, a mesma deve conter no mínimo todos os campos abaixo, você irá inserir para cada importação uma linha nessa entidade. Caso precise de algum parâmetro por arquivo na importação, você pode inseri-lo nessa entidade, e solicitar o preenchimento desse parâmetro junto ao arquivo, no formulário de upload.

    1. Code Block
      public class Carga : Entidade
          {        
              /// <summary>
              /// 0 - Carregado
              /// 1 - Ignorado
              /// 2 - Processado
              /// 9 - Erro
              /// </summary>
              public int Status { get; set; }
              public string NomeStatus
              {
                  get
                  {
                      switch (Status)
                      {
                          case 0:
                              return "Carregado";
                          case 1:
                              return "Ignorado";
                          case 2:
                              return "Processado";
                          case 8:
                              return "Em-processamento";
                          case 9:
                              return "Erro";
                          default:
                              return null;
                      }
                  }
              }
              public int IdOperador { get; set; }
              public DateTime? DataCarga { get; set; }
              public DateTime? DataInicioImportacao { get; set; }
              public DateTime? DataFimImportacao { get; set; }
              public string ErroValidacao { get; set; }
              public string ErroImportacao { get; set; }
              public int TotalRegistros { get; set; }
              public int TotalRegistrosProcessados { get; set; }
              public int TotalRegistrosErros { get; set; }
              public override Task Validar()
              {
                  return Task.CompletedTask;
              }
          }
  3. Além da entidade de carga, você também precisará de uma entidade que irá representar uma linha no arquivo de importação.

    1. Code Block
          public class CargaItem : Entidade
          {
              public Guid CargaEstoqueId { get; set; }
              public CargaEstoque CargaEstoque { get; set; }
              public int Linha { get; set; }
              public string ErroLinha { get; set; }
              #region Campos da entidade
              //Campos da sua entidade
              #endregion
              public override Task Validar()
              {
                  return Task.CompletedTask;
              }
          }
  4. Link para exemplo de migration Inicio.cs - Repos (azure.com)

  5. Após isso será necessário criar uma controller, implementando os métodos assim como o exemplo abaixo. CargaEstoqueController.cs - Repos (azure.com) (Link para uma classe controller de exemplo, com ela você também poderá ver os comandos e query implementados para utilizar de exemplo. É de extrema importância se atentar as regras que envolvem status, todas as cargas utilizam o mesmo padrão, e é proposital não existir exclusão de carga, pois precisamos manter o histórico do que entrou, inclusive itens processados não devem ser removidos.

    1. Code Block
              public class CargaController : BaseController
          {
              private readonly IMediator mediator;
              private readonly IServiceBus serviceBus;
      
              public CargaController(IMediator mediator, IServiceBus serviceBus)
              {
                  this.mediator = mediator;
                  this.serviceBus = serviceBus;
              }
      
              /// <summary>
              /// Método que retorna a lista de cargar.
              /// </summary>
              /// <returns></returns>
              [HttpGet]
              [EnableQuery]
              public async Task<IQueryable<QueryCargaResponse>> Get()
              {
                  return await mediator.Send(new QueryCargaRequest());
              }
      
              /// <summary>
              /// Método que retorna uma carga, com a lista das linhas importadas
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpGet]
              [EnableQuery]
              public async Task<IQueryable<QueryCargaItemResponse>> GetItem([FromQuery] QueryCargaItemRequest request)
              {
                  return await mediator.Send(request);
              }
      
              /// <summary>
              /// Método para realizar upload de arquivo
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpPost]
              public async Task<ImportarCargaResponse> UploadFile(ImportarCargaRequest request)
              {
                  return await mediator.Send(request);
              }
      
              /// <summary>
              /// Método para processar a importação
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpPost]
              public async Task<ActionResult> ProcessarImportacao([FromBody] ProcessarCargaRequest request)
              {
                  await serviceBus.ExecutarComandoNoResult("Produto", request);
                  return Ok();
              }
      
              /// <summary>
              /// Método para realizar download do template de importação
              /// </summary>
              /// <returns></returns>
              [HttpGet]
              public async Task<object> DownloadTemplate()
              {
                  byte[] fileContent = await System.IO.File.ReadAllBytesAsync("TemplateCarga.xlsx");
                  return new { File = fileContent, Tipo = "application/octet-stream", Nome = "TemplateCarga.xlsx" };
              }
      
              /// <summary>
              /// Método para salvar alterações feitas no cadastro da carga.
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpPost]
              public async Task<SalvarCargaResponse> SalvarCarga([FromBody] SalvarCargaRequest request)
              {
                  return await mediator.Send(request);
              }
      
              /// <summary>
              /// Método para salvar alteraçöes feitas em um item da carga
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpPost]
              public async Task<SalvarCargaItemResponse> SalvarCargaItem([FromBody] SalvarCargaItemRequest request)
              {
                  return await mediator.Send(request);
              }
              
              /// <summary>
              /// Método para excluir um item da carga
              /// </summary>
              /// <param name="request"></param>
              /// <returns></returns>
              [HttpDelete]
              public async Task<ExcluirCargaItemResponse> ExcluirCargaItem([FromQuery] ExcluirCargaItemRequest request)
              {
                  return await mediator.Send(request);
              }
          }
  6. Após implementar esses métodos, deverá começar a criar os formulário que serão utilizados na tela de carga. O primeiro é o formulário para realizar upload de arquivo, ele deverá conter obrigatoriamente um campo do tipo Arquivo, com nome file, extensão .xlsx, com tamanho de 50mb. Você pode incluir outros campos, que servirão de parâmetro para importação do arquivo, parâmetros esses que podem ser ou não inseridos no banco, depende de sua necessidade, esses campos devem conter o preenchimento do campo ajuda, informando seu efeito. Exemplo abaixo do upload de pessoas, o mesmo possui um campo que determina se a importação irá ou não validar o endereço. uploadCargaPessoa.json - Repos (azure.com)

    Image Removed

  7. Crie também o formulário que representará um item na linha de importação, obrigatoriamente o mesmo deve conter os campos linha e erroImportacao, URL Dados desse formulário deve contar a url de busca de um item e os botões de salvar e excluir, cada qual com sua url. CargaEstoqueItemLista.json - Repos (azure.com)

  8. Por fim crie o formulário de carga, preenchendo a url dados com a busca da entidade de carga, módulo customizado modAdmin, componente customizado CargaDadosComponent, campo ajuda conforme exemplo, todos os campos da entidade (você também pode colocar campos que não estão na entidade para servirem de parâmetro no processamento), um campo do tipo Tabela, com o nome lista, que deve ter configurado apontando para o formulário que representa um item na lista, criado na instrução anterior e mais 3 botões. CargaEstoqueLista.json - Repos (azure.com)

    1. Botão processar, com a url de processar.

    2. Botão Download Template com a url de download e o código abaixo.

      Code Block
      servicoFormularios.get(botao.url, null).subscribe(dados => {
             filesHelper.DownloadFile(dados.file, dados.nome, dados.tipo);
      });
    3. Botão Importar planilha com o código abaixo, no lugar de uploadCarga, colocar o nome do formulário que você criou para upload.

      Code Block
      servicoFormularios.exibirFormularioAuxiliar('uploadCarga');

...