Processo de Contratação

O exemplo HiringProcess demonstra como implementar um processo de negócios usando atividades de mensagens e dois fluxos de trabalho hospedados como serviços de fluxo de trabalho. Esses fluxos de trabalho fazem parte da infraestrutura de TI de uma empresa fictícia chamada Contoso, Inc.

O HiringRequest processo de workflow (implementado como um Flowchart) pede autorização de vários gestores da organização. Para atingir esse objetivo, o fluxo de trabalho usa outros serviços existentes na organização (no nosso caso, um serviço de caixa de entrada e um serviço de dados organizacionais implementado como serviços simples do Windows Communication Foundation (WCF)).

O ResumeRequest fluxo de trabalho (implementado como um Sequence) publica um anúncio de emprego no site de carreiras externas da Contoso e gerencia a aquisição de currículos. Um anúncio de emprego está disponível no site externo por um período de tempo fixo (até que um tempo limite expire) ou até que um funcionário da Contoso decida removê-lo.

Este exemplo demonstra os seguintes recursos do .NET Framework 4.6.1:

  • Flowchart e Sequence fluxos de trabalho para modelagem de processos de negócios.

  • Serviços de fluxo de trabalho.

  • Atividades de mensagens.

  • Correlação baseada em conteúdo.

  • Atividades personalizadas (declarativas e baseadas em código).

  • Persistência do SQL Server fornecida pelo sistema.

  • Personalizado PersistenceParticipant.

  • Acompanhamento personalizado.

  • Rastreamento de eventos para Windows (ETW).

  • Composição das atividades.

  • Parallel atividades.

  • CancellationScope atividade.

  • Temporizadores duráveis (Delay atividade).

  • transações.

  • Mais de um fluxo de trabalho na mesma solução.

Descrição do processo

quer ter um controlo apertado do número de funcionários em cada um dos seus departamentos. Portanto, sempre que qualquer funcionário quiser iniciar um novo processo de contratação, ele precisa passar por uma aprovação do processo de solicitação de contratação antes que o recrutamento possa realmente acontecer. Esse processo é chamado de solicitação de processo de contratação (definido no projeto HiringRequestService) e consiste nas seguintes etapas:

  1. Um funcionário (o solicitante) inicia a solicitação do processo de contratação.

  2. O gestor do requerente deve aprovar o pedido:

    1. O gestor pode rejeitar o pedido.

    2. O gestor pode devolver o pedido ao requerente para obter informações adicionais:

      1. O solicitante analisa e envia a solicitação de volta ao gerente.
    3. O gestor pode aprovar.

  3. Após a aprovação do gerente do solicitante, o proprietário do departamento deve aprovar a solicitação:

    1. O proprietário do departamento pode rejeitar.

    2. O proprietário do departamento pode aprovar.

  4. Após a aprovação do proprietário do departamento, o processo requer a aprovação de 2 gerentes de RH ou do CEO:

    1. O processo pode transitar para o estado aceito ou rejeitado.

    2. Se o processo for Aceito, uma nova instância do ResumeRequest fluxo de trabalho será iniciada (ResumeRequest está vinculada a HiringRequest.csproj por meio de uma referência de serviço.)

Uma vez que os gerentes aprovam a contratação de um novo funcionário, o RH deve encontrar o candidato adequado. Esse processo é executado pelo segundo fluxo de trabalho (ResumeRequest, definido em ResumeRequestService.csproj). Este fluxo de trabalho define o processo de envio de um anúncio de emprego com uma oportunidade de carreira para o site externo de carreiras da Contoso, recebe currículos de candidatos e monitora o estado do anúncio de emprego. As posições ficam disponíveis por um período de tempo fixo (até que um tempo expire) ou até que um funcionário da Contoso decida removê-las. O ResumeRequest fluxo de trabalho consiste nas seguintes etapas:

  1. Um funcionário da Contoso digita as informações sobre a posição e a duração do tempo limite. Uma vez que o funcionário digita essas informações, a posição é publicada no site Carreiras.

  2. Uma vez publicadas as informações, os interessados podem enviar seus currículos. Quando um currículo é enviado, ele é armazenado em um registro vinculado à vaga de emprego.

  3. Os candidatos podem enviar currículos até que o tempo limite expire, ou alguém do departamento de RH da Contoso decida explicitamente remover a publicação, interrompendo o processo.

Projetos na amostra

A tabela a seguir mostra os projetos na solução de exemplo.

Project Description
ContosoHR Contém contratos de dados, objetos de negócios e classes de repositório.
HiringRequestService Contém a definição do fluxo de trabalho do Processo de Solicitação de Contratação.

Este projeto é implementado como um aplicativo de console que auto-hospeda o fluxo de trabalho (arquivo xaml) como um serviço.
ResumeRequestService Um serviço de fluxo de trabalho que coleta currículos de candidatos até que um tempo limite expire ou alguém decida que o processo deve ser interrompido.

Este projeto é implementado como um serviço de fluxo de trabalho declarativo (xamlx).
OrgService Um serviço que expõe informações organizacionais (Funcionários, Cargos, Tipos de Cargos e Departamentos). Você pode pensar neste serviço como o módulo de Organização da Empresa de um Plano de Recursos da Empresa (ERP).

Este projeto é implementado como um aplicativo de console que expõe um serviço Windows Communication Foundation (WCF).
InboxService Uma caixa de entrada que contém tarefas acionáveis para funcionários.

Este projeto é implementado como um aplicativo de console que expõe um serviço WCF.
Cliente Interno Um aplicativo Web para interagir com o processo. Os usuários podem iniciar, participar e visualizar seus fluxos de trabalho HiringProcess. Usando este aplicativo, eles também podem iniciar e monitorar processos ResumeRequest.

Este site é implementado para ser interno à intranet da Contoso. Este projeto é implementado como um site ASP.NET.
CarreirasWebSite Um site externo que expõe as posições abertas na Contoso. Qualquer potencial candidato pode navegar até este site e enviar um currículo.

Resumo de funcionalidade

A tabela a seguir descreve como cada recurso é usado neste exemplo.

Funcionalidade Description Project
Fluxograma O processo de negócios é representado como um fluxograma. Esta descrição do fluxograma representa o processo da mesma forma que uma empresa o teria desenhado num quadro branco. HiringRequestService
Serviços de fluxo de trabalho O fluxograma com a definição do processo é hospedado em um serviço (neste exemplo, o serviço é hospedado em um aplicativo de console). HiringRequestService
Atividades de mensagens O fluxograma usa atividades de mensagens de duas maneiras:

- Obter informações do usuário (para receber as decisões e informações relacionadas em cada etapa de aprovação).
- Interagir com outros serviços existentes (InboxService e OrgDataService, utilizados através de referências de serviços).
HiringRequestService
Correlação baseada em conteúdo As mensagens de aprovação estão correlacionadas na propriedade ID da solicitação de contratação:

- Quando um processo é iniciado, o identificador de correlação é inicializado com o ID da solicitação.
- As mensagens de aprovação recebidas estão correlacionadas no seu ID (o primeiro parâmetro de cada mensagem de aprovação é o ID do pedido).
HiringRequestService / ResumeRequestService
Atividades personalizadas (declarativas e baseadas em código) Há várias atividades personalizadas neste exemplo:

- SaveActionTracking: Esta atividade emite um personalizado TrackingRecord (usando Track). Esta atividade foi criada usando a extensão NativeActivityde código imperativo .
- GetEmployeesByPositionTypes: Esta atividade recebe uma lista de IDs de tipo de posição e retorna uma lista de pessoas que têm essa posição na Contoso. Esta atividade foi criada declarativamente (usando o designer de atividade).
- SaveHiringRequestInfo: Esta atividade salva as informações de um HiringRequest (usando HiringRequestRepository.Save). Esta atividade foi criada usando a extensão CodeActivityde código imperativo .
HiringRequestService
Persistência do SQL Server fornecida pelo sistema A WorkflowServiceHost instância que hospeda a definição de processo de fluxograma é configurada para usar a persistência do SQL Server fornecida pelo sistema. HiringRequestService / ResumeRequestService
Rastreamento personalizado O exemplo inclui um participante de rastreamento personalizado que salva o histórico de um HiringRequestProcess (isso registra qual ação foi feita, por quem e quando). O código-fonte está na pasta Tracking de HiringRequestService. HiringRequestService
Rastreamento ETW O Rastreamento ETW fornecido pelo sistema é configurado no arquivo App.config no serviço HiringRequestService. HiringRequestService
Composição das Atividades A definição do processo usa a composição livre de Activity. O fluxograma contém várias atividades de sequência e paralelas que, ao mesmo tempo, contêm outras atividades (e assim por diante). HiringRequestService
Atividades paralelas - ParallelForEach<T> é utilizado para se registar na Caixa de Entrada do CEO e dos Gestores de RH em paralelo (Aguardando a etapa de Aprovação de dois Gestores de RH).
- Parallel é usado para executar algumas tarefas de limpeza nas etapas Concluídas e Rejeitadas
HiringRequestService
Cancelamento do modelo O fluxograma usa CancellationScope para criar comportamento de cancelamento (neste caso, ele faz alguma limpeza). HiringRequestService
Participante de Persistência de Clientes HiringRequestPersistenceParticipant salva dados de uma variável de fluxo de trabalho em uma tabela armazenada no banco de dados HR da Contoso. HiringRequestService
Serviços de fluxo de trabalho ResumeRequestService é implementado usando serviços de fluxo de trabalho. A definição do fluxo de trabalho e as informações de serviço estão contidas em ResumeRequestService.xamlx. O serviço está configurado para usar persistência e rastreamento. ResumeRequestService
Temporizadores duráveis ResumeRequestService usa temporizadores duráveis para definir a duração de um anúncio de emprego (uma vez que um tempo limite expira, o anúncio de emprego é fechado). ResumeRequestService
Transações TransactionScope é usado para garantir a consistência dos dados dentro da execução de várias atividades (quando um novo currículo é recebido). ResumeRequestService
Transações O participante de persistência personalizado (HiringRequestPersistenceParticipant) e o participante de acompanhamento personalizado (HistoryFileTrackingParticipant) usam a mesma transação. HiringRequestService
Usando WF em aplicações ASP.NET. Os fluxos de trabalho são acessados a partir de dois ASP.NET aplicativos. InternalClient / CarreirasWebSite

Armazenamento de Dados

Os dados são armazenados em um banco de dados do SQL Server chamado ContosoHR (o script para criar esse banco de dados está localizado na DbSetup pasta). As instâncias de fluxo de trabalho são armazenadas em um banco de dados do SQL Server chamado InstanceStore (os scripts para criar o armazenamento de instâncias fazem parte da distribuição do .NET Framework 4.6.1).

Ambos os bancos de dados são criados executando Setup.cmd script de um prompt de comando do desenvolvedor para Visual Studio.

Executar o exemplo

Para criar os bancos de dados

  1. Abra um prompt de comando do desenvolvedor para Visual Studio.

  2. Navegue para a pasta de exemplo.

  3. Execute Setup.cmd.

  4. Verifique se os dois bancos de dados ContosoHR foram InstanceStore criados no SQL Express.

Para configurar a solução para execução

  1. Execute o Visual Studio como administrador. Abra HiringRequest.sln.

  2. Clique com o botão direito do mouse na solução no Gerenciador de Soluções e selecione Propriedades.

  3. Selecione a opção Vários projetos de inicialização e defina CareersWebSite, InternalClient, HiringRequestService e ResumeRequestService como Start. Deixe ContosoHR, InboxService e OrgService como Nenhum.

  4. Crie a solução pressionando CTRL+SHIFT+B. Verifique se a compilação foi bem-sucedida.

Para executar a solução

  1. Depois que a solução for compilada, pressione CTRL+F5 para executar sem depuração. Verifique se todos os serviços foram iniciados.

  2. Clique com o botão direito do mouse em InternalClient na solução e selecione Exibir no navegador. A página padrão para InternalClient é exibida. Verifique se os serviços estão em execução e clique no link.

  3. O módulo HiringRequest é exibido. Você pode acompanhar o cenário detalhado aqui.

  4. Quando o HiringRequest estiver concluído, você pode iniciar o ResumeRequest. Você pode acompanhar o cenário detalhado aqui.

  5. Quando o ResumeRequest é publicado, ele fica disponível no site público (Site de Carreiras da Contoso). Para ver o anúncio de emprego (e candidatar-se à vaga), navegue até o site Carreiras.

  6. Clique com o botão direito do mouse em CareersWebSite na solução e selecione Exibir no navegador.

  7. Navegue de volta para o clicando com o botão direito do InternalClient mouse em InternalClient na solução e selecionando Exibir no navegador.

  8. Vá para a seção Anúncios de emprego clicando no link Anúncios de emprego no menu superior da caixa de entrada. Você pode acompanhar o cenário detalhado aqui.

Cenários

Pedido de contratação

  1. Michael Alexander (Engenheiro de Software) quer solicitar uma nova posição para a contratação de um Engenheiro de Software em Teste (SDET) no departamento de Engenharia que tenha pelo menos 3 anos de experiência em C#.

  2. Depois de criado, o pedido aparece na caixa de entrada de Michael (clique em Atualizar se não vir o pedido) aguardando a aprovação de Peter Brehm, que é o gerente de Michael.

  3. Pedro quer agir de acordo com o pedido de Miguel. Ele acha que a posição exige 5 anos de experiência em C# em vez de 3, então ele envia seus comentários de volta para revisão.

  4. Michael vê uma mensagem em sua caixa de entrada de seu empresário e quer agir. Miguel vê a história do pedido de posição e concorda com Pedro. Michael modifica a descrição para exigir 5 anos de experiência em C# e aceita a modificação.

  5. Pedro atende ao pedido modificado de Miguel e aceita-o. O pedido agora deve ser aprovado pelo Diretor de Engenharia, Tsvi Reiter.

  6. Tsvi Reiter quer agilizar o pedido, por isso faz um comentário para dizer que o pedido é urgente e aceita.

  7. O pedido tem agora de ser aprovado por dois gestores de RH ou pelo CEO. O CEO, Brian Richard Goldstein, vê o pedido urgente de Tsvi. Ele age de acordo com o pedido aceitando-o, ignorando assim a aprovação por dois gerentes de RH.

  8. O pedido é retirado da caixa de entrada de Michael e o processo de contratação de um SDET já começou.

Iniciar Pedido de Retoma

  1. Agora, a vaga de emprego está esperando para ser publicada em um site externo onde as pessoas podem se candidatar (você pode vê-la clicando no link Anúncios de Emprego). Atualmente, a vaga está sentada com um representante de RH que é responsável por finalizar a vaga e publicá-la.

  2. O RH deseja editar essa posição de trabalho (clicando no link Editar ) definindo um tempo limite de 60 minutos (na vida real, isso pode ser dias ou semanas). O tempo limite permite que a posição de trabalho seja retirada do site externo de acordo com o tempo especificado.

  3. Depois de salvar a posição de trabalho editada, ela aparece na guia Recebendo currículos (atualize a página da Web para ver a nova vaga).

Recolha de Currículos

  1. A posição de trabalho deve aparecer no site externo. Como pessoa interessada em candidatar-se ao emprego, pode candidatar-se a esta posição e enviar o seu currículo.

  2. Se voltar ao serviço Lista de Anúncios de Emprego, pode "ver currículos" que foram recolhidos até agora.

  3. O RH também pode parar de coletar currículos (por exemplo, uma vez que o candidato certo tenha sido identificado).

Resolução de Problemas

  1. Verifique se você está executando o Visual Studio com privilégios de administrador.

  2. Se a solução falhar na compilação, verifique o seguinte:

    • A referência a ContosoHR não está ausente dos InternalClient ou CareersWebSite projetos.
  3. Se a solução não for executada, verifique o seguinte:

    1. Todos os serviços estão em execução.

    2. As referências do serviço são atualizadas.

      1. Abra a pasta App_WebReferences

      2. Clique com o botão direito do mouse em Contoso e selecione Atualizar referências da Web/serviço.

      3. Recrie a solução pressionando CTRL+SHIFT+B no Visual Studio.

Desinstalação

  1. Exclua o armazenamento de instâncias do SQL Server executando Cleanup.bat, localizado na pasta DbSetup.

  2. Exclua o código-fonte do seu disco rígido.