Processo de Compra Corporativa

O exemplo PurchaseProcess mostra como criar um processo de compra baseado em Solicitação de Propostas (RFP) muito básico com a seleção automática de melhores propostas. Ele combina Parallel, ParallelForEach<T>e uma ForEach<T> atividade personalizada para criar um fluxo de trabalho que representa o processo.

Este exemplo contém um aplicativo cliente ASP.NET que permite interagir com o processo como participantes diferentes (como o solicitante original ou um fornecedor específico).

Demonstra

  • Atividades personalizadas.

  • Composição das atividades.

  • Marcadores.

  • Persistência.

  • Persistência esquematizada.

  • Traçado.

  • Rastreamento.

  • Hospedagem WF em diferentes clientes (ASP.NET aplicações Web e aplicações WinForms).

Descrição do processo

Este exemplo mostra uma implementação de um programa Windows Workflow Foundation (WF) para reunir propostas de fornecedores para uma empresa genérica.

  1. Um funcionário da Empresa X cria uma Solicitação de Proposta (RFP).

    1. Os tipos de funcionários no título e na descrição da RFP.

    2. O funcionário seleciona os fornecedores que deseja convidar para enviar propostas.

  2. O trabalhador apresenta a proposta.

    1. Uma instância do fluxo de trabalho é criada.

    2. O fluxo de trabalho está aguardando que todos os fornecedores enviem suas propostas.

  3. Depois de todas as propostas serem recebidas, o fluxo de trabalho itera todas as propostas recebidas e seleciona a melhor.

    1. Cada fornecedor tem uma reputação (este exemplo armazena a lista de reputação em VendorRepository.cs).

    2. O valor total da proposta é determinado por (O valor digitado pelo fornecedor) * (A reputação registrada do fornecedor) / 100.

  4. O requerente original pode ver todas as propostas apresentadas. A melhor proposta é apresentada numa secção especial do relatório.

Definição do Processo

A lógica central do exemplo usa uma ParallelForEach<T> atividade que aguarda as ofertas de cada fornecedor (usando uma atividade personalizada que cria um marcador) e registra a proposta do fornecedor como uma RFP (usando uma InvokeMethod atividade).

A amostra então itera todas as propostas recebidas armazenadas no RfpRepository, calculando o valor ajustado (usando uma Assign atividade e System.Activities.Expressions atividades), e se o valor ajustado for melhor do que a melhor oferta anterior, atribui o novo valor como a melhor oferta (uso If e Assign atividades).

Projetos neste exemplo

Este exemplo contém os seguintes projetos.

Project Description
Comum Os objetos de entidade usados no processo (Request for Proposal, Vendor e Vendor Proposal).
WfDefinição A definição do processo (como um programa WF) e host (PurchaseProcessHost) usado por aplicativos cliente para criar e usar instâncias do fluxo de trabalho do processo de compra.
WebClient Um aplicativo cliente ASP.NET que permite que os usuários criem e participem de instâncias do processo de compra. Ele usa um host criado sob medida para interagir com o mecanismo de fluxo de trabalho.
WinFormsClient Um aplicativo cliente do Windows Forms que permite que os usuários criem e participem de instâncias do processo de compra. Ele usa um host criado sob medida para interagir com o mecanismo de fluxo de trabalho.

WfDefinição

A tabela a seguir contém uma descrição dos arquivos mais importantes no projeto WfDefinition.

Ficheiro Description
IPurchaseProcessHost.cs Interface para o host do fluxo de trabalho.
PurchaseProcessHost.cs Implementação de um host para o fluxo de trabalho. O host abstrai os detalhes do tempo de execução do fluxo de trabalho e é usado em todos os aplicativos cliente para carregar, executar e interagir com PurchaseProcess instâncias de fluxo de trabalho.
PurchaseProcessWorkflow.cs Uma atividade que contém a definição do fluxo de trabalho Processo de Compra (deriva de Activity).

Atividades que derivam da funcionalidade de Activity composição montando atividades personalizadas existentes e atividades da biblioteca de atividades do .NET Framework 4.6.1. Montar essas atividades é a maneira mais básica de criar funcionalidades personalizadas.
WaitForVendorProposal.cs Essa atividade personalizada deriva e NativeActivity cria um marcador nomeado que deve ser retomado posteriormente por um fornecedor ao enviar a proposta.

Atividades que derivam de NativeActivity, como aquelas que derivam de CodeActivity, criam funcionalidade imperativa substituindo Execute, mas também têm acesso a todas as funcionalidades do tempo de execução do fluxo de trabalho através do ActivityContext que é passado para o Execute método. Esse contexto tem suporte para agendar e cancelar atividades filhas, configurar zonas sem persistência (blocos de execução durante os quais o tempo de execução não persiste os dados do fluxo de trabalho, como em transações atômicas) e Bookmark objetos (identificadores para retomar fluxos de trabalho pausados).
TrackingParticipant.cs A TrackingParticipant que recebe todos os eventos de rastreamento e os salva em um arquivo de texto.

Os participantes do controle são adicionados à instância do fluxo de trabalho como Extensões.
XmlWorkflowInstanceStore.cs Um personalizado InstanceStore que salva aplicativos de fluxo de trabalho em arquivos XML.
XmlPersistenceParticipant.cs Um costume PersistenceParticipant que salva uma instância de solicitação de proposta em um arquivo XML.
AsyncResult.cs / CompletedAsyncResult.cs Classes auxiliares para implementar o padrão assíncrono nos componentes de persistência.

Comum

A tabela a seguir contém uma descrição das classes mais importantes no projeto Common.

Classe Description
Fornecedor Um fornecedor que envia propostas em uma Solicitação de Propostas.
RequestForProposal Uma solicitação de propostas (RFP) é um convite para que os fornecedores enviem propostas sobre uma mercadoria ou serviço específico.
VendorProposal Uma proposta apresentada por um fornecedor a uma RFP concreta.
VendorRepository O repositório de fornecedores. Essa implementação contém uma coleção na memória de instâncias de Vendor e métodos para expor essas instâncias.
RfpRepository O repositório de Pedidos de Propostas. Esta implementação contém usos Linq to XML para consultar o arquivo XML de Solicitações de Proposta geradas pela persistência esquematizada.
IOHelper Essa classe lida com todos os problemas relacionados a E/S (pastas, caminhos e assim por diante).

Cliente Web

A tabela a seguir contém uma descrição das páginas da Web mais importantes no projeto Web Client.

Ficheiro Description
CreateRfp.aspx Cria e submete um novo Pedido de Propostas.
Default.aspx Mostra todos os Pedidos de Propostas ativos e concluídos.
GetVendorProposal.aspx Obtém uma proposta de um fornecedor em uma solicitação de propostas concreta. Esta página é usada apenas por fornecedores.
ShowRfp.aspx Mostrar todas as informações sobre um Pedido de Propostas (propostas recebidas, datas, valores e outras informações). Esta página é usada apenas pelo criador do Pedido de Proposta.

Cliente WinForms

A tabela a seguir contém uma descrição dos formulários mais importantes no projeto Win Forms.

Formulário Description
NewRfp Cria e submete um novo Pedido de Propostas.
MostrarPropostas Mostrar todos os Pedidos de Propostas ativos e concluídos. Nota: Talvez seja necessário clicar no botão Atualizar na interface do usuário para ver as alterações nessa tela depois de criar ou modificar uma Solicitação de Proposta.
EnviarProposta Obtenha uma proposta de um fornecedor em um Pedido de Propostas concreto. Esta janela é usada apenas por fornecedores.
ViewRfp Mostrar todas as informações sobre um Pedido de Propostas (propostas recebidas, datas, valores e outras informações). Esta janela é utilizada apenas pelo criador do Pedido de Propostas.

Arquivos de persistência

A tabela a seguir mostra que os arquivos gerados pelo provedor de persistência (XmlPersistenceProvider) estão localizados no caminho da pasta temporária do sistema atual (usando GetTempPath). O arquivo de rastreamento é criado no caminho de execução atual.

Nome de Ficheiro Description Caminho
rfps.xml O ficheiro XML com todos os Pedidos de Propostas ativos e concluídos. GetTempPath
[ID da instância] Este arquivo contém todas as informações sobre uma instância de fluxo de trabalho.

Esse arquivo é gerado pela implementação de persistência esquematizada (PersistenceParticipant em XmlPersistenceProvider).
GetTempPath
[instanceId].tracking Um arquivo de texto com todos os eventos que ocorreram dentro de uma instância concreta.

Este ficheiro é gerado por TrackingParticipant.
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt O arquivo de rastreamento gerado pelo fluxo de trabalho com base nos parâmetros de configuração nos arquivos App.config ou Web.config. Caminho de execução atual

Para usar este exemplo

  1. Usando o Visual Studio, abra o arquivo de solução PurchaseProcess.sln.

  2. Para executar o projeto Web Client, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto Web Client . Selecione Definir como projeto de inicialização.

  3. Para executar o projeto WinForms Client, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto WinForms Client . Selecione Definir como projeto de inicialização.

  4. Para criar a solução, pressione CTRL+SHIFT+B.

  5. Para executar a solução, pressione CTRL+F5.

Opções do Web Client

  • Criar uma nova RFP: cria uma nova RFP (Request for Proposals) e inicia um fluxo de trabalho do Processo de Compra.

  • Atualizar: atualiza a lista de RFPs Ativas e Concluídas na janela principal.

  • Exibir: mostra o conteúdo de uma RFP existente. Os fornecedores podem enviar suas propostas (se convidados ou se a RFP não estiver concluída).

  • Ver como: O usuário pode acessar a RFP usando identidades diferentes, selecionando o participante desejado na caixa de combinação Exibir como na grade de RFPs ativas.

Opções de cliente WinForms

  • Criar RFP: cria uma nova RFP (Solicitação de Propostas) e inicia um fluxo de trabalho do Processo de Compra.

  • Atualizar: atualiza a lista de RFPs Ativas e Concluídas na janela principal.

  • Exibir RFP: mostra o conteúdo de uma RFP existente. Os fornecedores podem enviar suas propostas (se convidados ou se a RFP não estiver concluída)

  • Conectar como: O usuário pode acessar a RFP usando identidades diferentes, selecionando o participante desejado na caixa de combinação Exibir como na grade de RFPs ativas.