Pular para conteúdo

Fluxo de Dados e Pre-loading

📋 Visão Geral

O Motor de Pricing utiliza uma estratégia de pré-carregamento paralelo de dados após o login. Isso garante que todas as páginas da aplicação carreguem rapidamente, pois os dados já estão em memória no navegador.


🔄 Mecanismo de Data Stores

A aplicação utiliza dcc.Store do Dash para armazenar dados na sessão do navegador. São 30+ stores definidos no app.py:

Stores de Controle

Store ID Tipo Finalidade
store-token session Token de autenticação do usuário
store-request-id local ID da última requisição processada
store-request-id-reference-price session ID de referência de preço
store-data-loading-status memory Status do pré-carregamento

Stores de Dados — Arquitetura de Preços

Store ID Tabela BigQuery Conteúdo
store-data-parametrization parametrization Parametrizações de data
store-data-cost cost Custos dos produtos
store-data-reference-price reference_price Preço de referência ⚠️
store-data-gross-margin gross_margin Margem bruta
store-data-products products Cadastro de produtos
store-data-packaging packaging Perfis de embalagem
store-data-regionalization regionalization Perfis regionais
store-data-current-price-list current_price_list Lista de preços vigente

Stores de Dados — Variáveis

Store ID Tabela BigQuery Conteúdo
store-data-product-strategy product_strategy Estratégia de produtos
store-data-product-strategy-architecture product_strategy_architecture Arquitetura de produtos
store-data-regionalization-strategy regionalization_strategy Estratégia regional
store-data-rotated-market rotated_market Mercado rotacionado
store-data-vs-sales-suggestion vs_sales_suggestion VS Sugestão de vendas
store-data-caps-vs-last-price-list caps_vs_last_price_list CAPS vs última lista
store-data-min-margin min_margin Margem mínima
store-data-base-index base_index Índice base

Stores de Dados — Painel de Qualidade

Store ID Tabela BigQuery Conteúdo
store-data-painel-qualidade-alertas painel_qualidade_alertas Alertas de qualidade
store-data-cc-posicionamento-produtos cc_posicionamento_produtos Posicionamento de produtos
store-data-price-decomposition price_decomposition Decomposição do preço

⚡ Pre-loading Paralelo

O módulo callbacks/preload_data.py pré-carrega 18 tabelas imediatamente após o login:

sequenceDiagram
    participant U as Usuário
    participant App as Dash App
    participant Pool as ThreadPoolExecutor (8 workers)
    participant BQ as BigQuery

    U->>App: Login bem-sucedido
    App->>App: store-token atualizado
    App->>Pool: Iniciar preload_all_data()

    par Paralelo (8 threads)
        Pool->>BQ: fetch parametrization
        Pool->>BQ: fetch cost
        Pool->>BQ: fetch gross_margin
        Pool->>BQ: fetch products
        Pool->>BQ: fetch packaging
        Pool->>BQ: fetch regionalization
        Pool->>BQ: fetch current_price_list
        Pool->>BQ: fetch product_strategy
    end

    BQ-->>Pool: Dados retornados
    Pool-->>App: 18 tabelas carregadas
    App->>App: loading_status = "completed"
    App-->>U: Aplicação pronta para uso

Configuração

Parâmetro Valor
Workers paralelos 8 (ThreadPoolExecutor)
Total de tabelas 18
Trigger Input("store-token", "data")
Controle prevent_initial_call=True

Status de Carregamento

O store store-data-loading-status é atualizado com:

{
  "status": "completed",
  "timestamp": "2026-03-05 10:00:00",
  "tables_loaded": 18,
  "total_tables": 18,
  "user": "usuario@lavoro.com.br"
}

⚠️ Exceção: reference_price

A tabela reference_price NÃO é pré-carregada. Ela é buscada apenas após o usuário processar dados na Arquitetura de Preços, pois depende do request_id gerado durante o processamento.


🔄 Fluxo das Páginas

Cada página da aplicação segue o mesmo padrão de consumo de dados:

graph TD
    A[Callback de renderização] --> B{Dados no Store?}
    B -->|Sim| C[Usar dados pré-carregados]
    B -->|Não| D[Buscar via API - fallback]
    C --> E[Renderizar página]
    D --> E

    style C fill:#27ae60,color:#fff
    style D fill:#e67e22,color:#fff
  1. O callback da página verifica se os dados existem no store (pré-carregados)
  2. Se existem → usa diretamente (rápido)
  3. Se não existem → faz fallback para fetch_data() (mais lento)
  4. Filtros subsequentes utilizam os dados já em cache, sem novas chamadas à API

💾 Logout / Limpeza

Quando o token é limpo (logout), todos os stores são resetados para None:

if not token_data:
    return tuple([None] * len(TABLES_TO_PRELOAD) + [{"status": "cleared"}])

Última atualização: Março 2026 | Versão 1.0