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,LogServiceetc.- ⚠️ 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:
- O status do processamento é atualizado.
- A Strategy correta é recuperada pela
SequenciaOndaStrategyFactory. - A Strategy executa a procedure definida.
- 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
Servicespara 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.