Pular para o conteúdo principal

Serviço de Geração de Onda

O projeto Delage.WaveGeneration é um Background Service responsável pela orquestração da geração de ondas de picking no WMS.
Ele executa rotinas de processamento em lote de pedidos, aplicando estratégias configuradas dinamicamente a partir da base de dados.

aviso

Atualmente, parte da lógica de negócios ainda está concentrada nesta camada (em Services). Com a evolução da arquitetura, essa lógica será movida para a Camada de Application, deixando esta camada responsável apenas pela execução do Worker.


Estrutura de Pastas

  • Enums → constantes de status e identificadores usados no processo de geração de onda.
  • Extensions → configuração de serviços e injeção de dependências.
  • Model → definição de entidades auxiliares (ex: SequenciaOnda).
  • Repository → abstrações de persistência utilizadas pelo serviço.
  • Services → lógica de execução principal.
    • OndaService, PedidoService, LogService etc.
    • ⚠️ Parte dessa lógica será migrada para a Camada de Application.
  • Strategies
    • Implementações do padrão Strategy aplicadas ao processamento de onda.
    • Cada strategy representa uma procedure a ser executada na sequência.
    • Exemplo: DefaultOndaStrategy, FaltaTotalStrategy, LiberacaoVolumeStrategy, etc.
  • Worker.cs
    • Ponto de entrada do Background Service, que agenda e executa o processo de geração.

Modelo Sequência de Onda

A definição da sequência de execução é carregada da tabela sequencia_onda.

SequenciaOnda.cs
public class SequenciaOnda
{
public short IdDefSequenciaOnda { get; set; }
public short Sequencia { get; set; }
public string Procedure { get; set; }
}

Cada registro define:

  • IdDefSequenciaOnda → identificador da estratégia.
  • Sequencia → ordem de execução.
  • Procedure → nome da rotina associada.

Padrão Strategy aplicado

Durante a geração de onda, para cada item da sequência configurada no banco, o sistema seleciona e executa a Strategy correspondente.

Exemplo Simplificado

OndaService.cs
public async Task GerarOndaAsync(CancellationToken cancellationToken,
int codOnda, HashSet<int> pedidosSucesso, string usuario)
{
foreach (var item in _sequenciaOnda)
{
if (Enum.TryParse<eDefSituacaoGeracaoOnda>(item.Procedure.ToUpper(), out var situacaoOnda))
await AtualizaStatusProcessamentoOndaAsync(cancellationToken,
codOnda, situacaoOnda, pedidosSucesso.Count, 0, usuario);
else
await AtualizaStatusProcessamentoOndaAsync(cancellationToken,
codOnda, eDefSituacaoGeracaoOnda.GerandoOnda, pedidosSucesso.Count, 0, usuario);

var strategy = _sequenciaOndaStrategyFactory.GetStrategy(item.IdDefSequenciaOnda);
await strategy.ExecuteAsync(cancellationToken, item, codOnda, pedidosSucesso, usuario);

await _repository.AtualizaPedidosProcessadosOndaAsync(cancellationToken, codOnda, pedidosSucesso.Count, usuario);
}
}

Neste fluxo:

  1. O status do processamento é atualizado.
  2. A Strategy correta é recuperada pela SequenciaOndaStrategyFactory.
  3. A Strategy executa a procedure definida.
  4. O repositório atualiza os pedidos processados.

Benefícios da Arquitetura Atual

  • Flexibilidade → a sequência de execução é definida no banco (sequencia_onda), sem necessidade de alterar código.
  • Extensibilidade → novas estratégias podem ser adicionadas apenas criando uma nova classe que implementa ISequenciaOndaStrategy.
  • Isolamento → cada regra de execução fica encapsulada em uma Strategy específica.

Próximos Passos da Migração

  • Mover lógica de negócio atualmente em Services para a Camada de Application.
  • Deixar este projeto focado apenas em infraestrutura de execução (Worker + orchestration).
  • Integrar estratégias de onda diretamente com o Core/Domain.