Partilhar via


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.

  • Rastreamento.

  • Rastreamento.

  • Execução de WF em diferentes clientes (aplicações Web ASP.NET 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. O funcionário digita o título e a 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 percorre todas as propostas recebidas armazenadas no RfpRepository, calculando o valor ajustado (usando atividades de Assign e de System.Activities.Expressions), e se o valor ajustado for melhor do que a melhor oferta anterior, atribui o novo valor como a melhor oferta (usando atividades de If e de Assign).

Projetos neste exemplo

Este exemplo contém os seguintes projetos.

Projeto Descrição
Comum Os objetos de entidade usados no processo (Pedido de Proposta, Fornecedor e Proposta do Fornecedor).
WfDefinição A definição do processo (como um programa WF) e do host (PurchaseProcessHost) utilizado por aplicações cliente para criar e utilizar 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 Descrição
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 do Processo de Compra (deriva de Activity).

Atividades que derivam de Activity compõem a funcionalidade ao reunir 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 Esta atividade personalizada deriva de NativeActivity e 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 runtime não persiste os dados do fluxo de trabalho, como em transações atómicas) e Bookmark objetos (referências 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 de rastreamento são adicionados à instância do fluxo de trabalho como extensões.
XmlWorkflowInstanceStore.cs Um InstanceStore personalizado que guarda aplicações de fluxo de trabalho em arquivos XML.
XmlPersistenceParticipant.cs Um PersistenceParticipant personalizado que salva um pedido de proposta num ficheiro 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 Descrição
Fornecedor Um fornecedor que envia propostas em uma Solicitação de Propostas.
Pedido de Proposta Uma solicitação de propostas (RFP) é um convite para que os fornecedores enviem propostas sobre uma mercadoria ou serviço específico.
Proposta do Fornecedor 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 utiliza Linq to XML para efetuar consultas ao ficheiro XML de Solicitações de Propostas geradas pela persistência esquematizada.
IOHelper Essa classe lida com todos os problemas relacionados a Entrada/Saída (pastas, caminhos, entre outros).

Cliente Web

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

Ficheiro Descrição
CreateRfp.aspx Cria e submete um novo Pedido de Propostas.
Default.aspx Mostra todos os Pedidos de Propostas ativos e concluídos.
ObterPropostaFornecedor.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 Descrição
NewRfp Cria e submete um novo Pedido de Propostas.
MostrarPropostas Mostrar todos os Pedidos de Propostas ativos e concluídos. Observação: 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 do arquivo Descrição 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].rastreio 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 utilizador pode aceder à RFP usando identidades diferentes, selecionando o participante desejado na caixa de seleção Ver como na grelha 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 utilizador pode aceder à RFP usando identidades diferentes, selecionando o participante desejado na caixa de seleção Exibir como na grelha de RFPs ativas.