Compartir a través de


Proceso de compra corporativa

En el ejemplo PurchaseProcess se muestra cómo crear un proceso de compra basado en solicitudes de propuestas (RFP) muy básico con la selección automática de la mejor propuesta. Combina Parallel, ParallelForEach<T>y una ForEach<T> actividad personalizada para crear un flujo de trabajo que represente el proceso.

Este ejemplo contiene una aplicación cliente de ASP.NET que permite interactuar con el proceso como participantes diferentes (como el solicitante original o un proveedor determinado).

Demostraciones

  • Actividades personalizadas.

  • Composición de actividades.

  • Marcadores.

  • Persistencia.

  • Persistencia esquematizada

  • Traza

  • Seguimiento.

  • Hospedar WF en diferentes clientes (ASP.NET aplicaciones web y aplicaciones WinForms).

Descripción del proceso

En este ejemplo se muestra una implementación de un programa de Windows Workflow Foundation (WF) para recopilar propuestas de proveedores para una empresa genérica.

  1. Un empleado de la Empresa X crea una solicitud de propuesta (RFP).

    1. El empleado escribe el título y la descripción del RFP.

    2. El empleado selecciona los proveedores que quieren invitar para enviar propuestas.

  2. El empleado envía la propuesta.

    1. Se crea una instancia del flujo de trabajo.

    2. El flujo de trabajo espera a que todos los proveedores envíen sus propuestas.

  3. Una vez recibidas todas las propuestas, el flujo de trabajo recorre en iteración todas las propuestas recibidas y selecciona la mejor.

    1. Cada proveedor tiene una reputación (este ejemplo almacena la lista de reputación en VendorRepository.cs).

    2. El valor total de la propuesta viene determinado por (El valor escrito en por el proveedor) * (Reputación registrada del proveedor) / 100.

  4. El solicitante original puede ver todas las propuestas presentadas. La mejor propuesta se presenta en una sección especial del informe.

Definición de proceso

La lógica principal del ejemplo usa una ParallelForEach<T> actividad que espera las ofertas de cada proveedor (mediante una actividad personalizada que crea un marcador) y registra la propuesta de proveedor como RFP (mediante una InvokeMethod actividad).

A continuación, el ejemplo recorre todas las propuestas recibidas almacenadas en RfpRepository, calculando el valor ajustado (usando una Assign actividad y System.Activities.Expressions actividades) y, si el valor ajustado es mejor que la mejor oferta anterior, asigna el nuevo valor como la mejor oferta (usando If y Assign actividades).

Proyectos de este ejemplo

Este ejemplo contiene los siguientes proyectos.

Proyecto Descripción
Comunes Objetos de entidad usados en el proceso (Solicitud de propuesta, Proveedor y Propuesta de proveedor).
WfDefinition Definición del proceso (como programa WF) y host (PurchaseProcessHost) que usan las aplicaciones cliente para crear y usar instancias del flujo de trabajo del proceso de compra.
WebClient Una aplicación cliente ASP.NET que permite a los usuarios crear y participar en instancias del proceso de compra. Usa un host creado personalizado para interactuar con el motor de flujo de trabajo.
WinFormsClient Una aplicación cliente de Windows Forms que permite a los usuarios crear y participar en instancias del proceso de compra. Usa un host creado personalizado para interactuar con el motor de flujo de trabajo.

WfDefinition

La tabla siguiente contiene una descripción de los archivos más importantes del proyecto WfDefinition.

Archivo Descripción
IPurchaseProcessHost.cs Interfaz para el anfitrión del flujo de trabajo.
PurchaseProcessHost.cs Implementación de un host para el flujo de trabajo. El host abstrae los detalles del tiempo de ejecución del flujo de trabajo y se usa en todas las aplicaciones cliente para cargar, ejecutar e interactuar con PurchaseProcess instancias de flujo de trabajo.
PurchaseProcessWorkflow.cs Una actividad que contiene la definición del flujo de trabajo del proceso de compra (deriva de Activity).

Actividades que derivan de Activity componen la funcionalidad al ensamblar actividades personalizadas y actividades existentes de la biblioteca de actividades de .NET Framework 4.6.1. Ensamblar estas actividades es la manera más básica de crear funcionalidad personalizada.
WaitForVendorProposal.cs Esta actividad personalizada se deriva de NativeActivity y crea un marcador con nombre que un proveedor debe reanudar posteriormente al enviar la propuesta.

Las actividades que derivan de NativeActivity, como las que derivan de CodeActivity, crean funcionalidad imperativa sobrescribiendo Execute, pero también tienen acceso a toda la funcionalidad del tiempo de ejecución del flujo de trabajo a través del ActivityContext que se pasa al método Execute. Este contexto admite la programación y cancelación de actividades secundarias, la configuración de zonas sin persistencia (bloques de ejecución durante los que el tiempo de ejecución no conserva los datos del flujo de trabajo, como en transacciones atómicas) y Bookmark objetos (identificadores para reanudar flujos de trabajo en pausa).
TrackingParticipant.cs Un TrackingParticipant que recibe todos los eventos de seguimiento y los guarda en un archivo de texto.

Los participantes que realizan el seguimiento se agregan a la instancia de flujo de trabajo como extensiones.
XmlWorkflowInstanceStore.cs Un InstanceStore personalizado que guarda las aplicaciones de flujo de trabajo en archivos XML.
XmlPersistenceParticipant.cs Un PersistenceParticipant personalizado que guarda una instancia de solicitud de propuesta en un archivo XML.
AsyncResult.cs/CompletedAsyncResult.cs Clases auxiliares para implementar el patrón asincrónico en los componentes de persistencia.

Comunes

La tabla siguiente contiene una descripción de las clases más importantes del proyecto Común.

Clase Descripción
Proveedor Proveedor que envía propuestas en una solicitud de propuestas.
Solicitud de Propuesta Una solicitud de propuestas (RFP) es una invitación para que los proveedores envíen propuestas sobre un producto o servicio específicos.
VendorProposal Propuesta presentada por un proveedor a un RFP concreto.
VendorRepository Repositorio de proveedores. Esta implementación contiene una colección en memoria de instancias de Vendor y métodos para exponer esas instancias.
RfpRepository Repositorio de solicitudes de propuestas. Esta implementación contiene usos de Linq to XML para consultar el archivo XML de solicitudes de propuestas generado por la persistencia esquematizada.
IOHelper Esta clase administra todos los problemas relacionados con E/S (carpetas, rutas de acceso, etc.).

Cliente web

La tabla siguiente contiene una descripción de las páginas web más importantes del proyecto cliente web.

Archivo Descripción
CreateRfp.aspx Crea y envía una nueva solicitud de propuestas.
Default.aspx Muestra todas las solicitudes activas y completadas de propuestas.
ObtenerPropuestaDelProveedor.aspx Obtiene una propuesta de un proveedor en una solicitud concreta de propuestas. Esta página solo la usan los proveedores.
ShowRfp.aspx Mostrar toda la información sobre una solicitud de propuestas (propuestas recibidas, fechas, valores y otra información). Esta página solo la usa el creador de la solicitud de propuesta.

Cliente winForms

La tabla siguiente contiene una descripción de los formularios más importantes del proyecto de Win Forms.

Formulario Descripción
NewRfp Crea y envía una nueva solicitud de propuestas.
MostrarPropuestas Muestra todas las solicitudes activas y finalizadas de propuestas. Nota: Es posible que tenga que hacer clic en el botón Actualizar de la interfaz de usuario para ver los cambios en esa pantalla después de crear o modificar una solicitud de propuesta.
EnviarPropuesta Obtener una propuesta de un proveedor en una solicitud concreta de propuestas. Esta ventana solo la usan los proveedores.
ViewRfp Mostrar toda la información sobre una solicitud de propuestas (propuestas recibidas, fechas, valores y otra información). Esta ventana solo la usa el creador de la solicitud de propuestas.

Archivos de persistencia

En la tabla siguiente se muestran los archivos generados por el proveedor de persistencia (XmlPersistenceProvider), que están ubicados en la ruta de acceso de la carpeta temporal del sistema actual (usando GetTempPath). El archivo de seguimiento se crea en la ruta actual de ejecución.

Nombre del archivo Descripción Ruta
rfps.xml Archivo XML con todas las solicitudes de propuestas activas y finalizadas. GetTempPath
[instanceid] Este archivo contiene toda la información sobre una instancia de flujo de trabajo.

Este archivo lo genera la implementación de persistencia esquematizada (PersistenceParticipant en XmlPersistenceProvider).
GetTempPath
[instanceId] .tracking Un archivo de texto con todos los eventos que se produjeron dentro de una instancia concreta.

TrackingParticipant genera este archivo.
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt Archivo de seguimiento generado por el flujo de trabajo en función de los parámetros de configuración de los archivos App.config o Web.config. Ruta de ejecución actual

Para utilizar este ejemplo

  1. Con Visual Studio, abra el archivo de solución PurchaseProcess.sln.

  2. Para ejecutar el proyecto cliente web, abra el Explorador de soluciones y haga clic con el botón derecho en el proyecto cliente web . Seleccione Establecer como proyecto de inicio.

  3. Para ejecutar el proyecto cliente de WinForms, abra el Explorador de soluciones y haga clic con el botón derecho en el proyecto cliente de WinForms . Seleccione Establecer como proyecto de inicio.

  4. Para compilar la solución, presione Ctrl+MAYÚS+B.

  5. Para ejecutar la solución, presione CTRL+F5.

Opciones de cliente web

  • Crear una nueva RFP: crea una nueva solicitud de propuestas (RFP) e inicia un flujo de trabajo de proceso de compra.

  • Actualizar: actualiza la lista de RFP activas y finalizadas en la ventana principal.

  • Vista: muestra el contenido de un RFP existente. Los proveedores pueden enviar sus propuestas (si se invitan o el RFP no ha finalizado).

  • Ver como: el usuario puede tener acceso a la solicitud de propuestas utilizando diferentes identidades si selecciona el participante deseado en el cuadro combinado Ver como de la cuadrícula de solicitud de propuestas activa.

Opciones de cliente de WinForms

  • Crear RFP: crea una nueva solicitud de propuestas (RFP) e inicia un flujo de trabajo de proceso de compra.

  • Actualizar: actualiza la lista de RFP activas y finalizadas en la ventana principal.

  • Ver RFP: muestra el contenido de un RFP existente. Los proveedores pueden enviar sus propuestas (si se invitan o el RFP no ha finalizado)

  • Conectar como: el usuario puede tener acceso a la solicitud de propuestas utilizando diferentes identidades seleccionando el participante deseado en el cuadro combinado Ver como de la cuadrícula de la solicitud de propuestas activa.