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.
Um funcionário da Empresa X cria uma Solicitação de Proposta (RFP).
Os tipos de funcionários no título e na descrição da RFP.
O funcionário seleciona os fornecedores que deseja convidar para enviar propostas.
O trabalhador apresenta a proposta.
Uma instância do fluxo de trabalho é criada.
O fluxo de trabalho está aguardando que todos os fornecedores enviem suas propostas.
Depois de todas as propostas serem recebidas, o fluxo de trabalho itera todas as propostas recebidas e seleciona a melhor.
Cada fornecedor tem uma reputação (este exemplo armazena a lista de reputação em VendorRepository.cs).
O valor total da proposta é determinado por (O valor digitado pelo fornecedor) * (A reputação registrada do fornecedor) / 100.
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
Usando o Visual Studio, abra o arquivo de solução PurchaseProcess.sln.
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.
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.
Para criar a solução, pressione CTRL+SHIFT+B.
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.