Процесс корпоративных закупок

В примере PurchaseProcess показано, как создать очень базовый процесс покупки на основе запроса предложений (RFP) с автоматическим выбором лучших предложений. В нем совместно применяются операторы Parallel, ParallelForEach<T> и ForEach<T>, а также пользовательское действие для создания рабочего потока, который представляет процесс.

Этот пример содержит клиентское приложение ASP.NET, которое позволяет взаимодействовать с процессом в качестве разных участников (в качестве исходного запрашивающего или конкретного поставщика).

Что демонстрирует

  • Настраиваемые действия.

  • Сочетание действий.

  • Закладки.

  • Постоянство.

  • Схематизированная сохраняемость.

  • Трассировка.

  • Отслеживание.

  • Размещение WF в разных клиентах (ASP.NET веб-приложениях и приложениях WinForms).

Описание процесса

В этом примере показана реализация программы Windows Workflow Foundation (WF) для сбора предложений от поставщиков для универсальной компании.

  1. Сотрудник компании X создает запрос предложений.

    1. Сотрудник вводит название и описание запроса предложений.

    2. Сотрудник выбирает поставщиков, которые они хотят пригласить на отправку предложений.

  2. Сотрудник передает предложение.

    1. Создается экземпляр рабочего процесса.

    2. Рабочий процесс ожидает, чтобы все поставщики передали свои предложения.

  3. После получения всех предложений рабочий процесс обрабатывает в цикле все полученные предложения и выбирает наилучшее.

    1. Каждый поставщик имеет репутацию (в этом образце список репутаций сохраняется в VendorRepository.cs).

    2. Общая стоимость предложения определяется по формуле (Стоимость, предложенная поставщиком)*(Зарегистрированный показатель репутации поставщика) / 100.

  4. Исходная запрашивающая сторона может видеть все переданные предложения. Наилучшее предложение представлено в специальном разделе отчета.

Определение процесса

В основной логике образца используется действие ParallelForEach<T>, которое ожидает предложения от каждого поставщика (с применением пользовательского действия, которое создает закладку) и регистрирует предложение поставщика как запрос предложений (с применением действия InvokeMethod).

Затем в образце выполняется обработка в цикле всех полученных предложений, сохраненных в RfpRepository, вычисление откорректированного значения (с использованием действия Assign и действий System.Activities.Expressions), и если откорректированное значение оказывается лучше по сравнению с предыдущим наилучшим предложением, присваивание нового значения как наилучшего предложения (с использованием действий If и Assign).

Проекты в этом образце

Этот образец содержит следующие проекты.

Проекты Description
Распространенный почтовый сервис Объекты сущности, используемые в процессе («Запрос предложения», «Поставщик» и «Предложение поставщика»).
WfDefinition Определение процесса (в виде программы WF) и узла (PurchaseProcessHost), используемого клиентскими приложениями для создания и использования экземпляров рабочего процесса покупки.
WebClient Клиентское приложение ASP.NET, позволяющее пользователям создавать и участвовать в процессе покупки. Для взаимодействия с подсистемой рабочих процессов используется настраиваемый сервер.
WinFormsClient Клиентское приложение Windows Forms, которое позволяет пользователям создавать и участвовать в работе экземпляров процесса покупки. Для взаимодействия с подсистемой рабочих процессов используется настраиваемый сервер.

WfDefinition

В следующей таблице содержится описание наиболее важных файлов в проекте WfDefinition.

Файл Description
IPurchaseProcessHost.cs Интерфейс для узла рабочего процесса.
PurchaseProcessHost.cs Реализация узла для рабочего процесса. Узел позволяет абстрагироваться от подробных сведений о среде выполнения рабочего процесса и используется во всех клиентских приложениях для загрузки, запуска и взаимодействия с экземплярами рабочего процесса PurchaseProcess.
PurchaseProcessWorkflow.cs Действие, которое содержит определение рабочего процесса покупки (происходит от Activity).

Действия, производные от Activity функций создания, путем сборки существующих пользовательских действий и действий из библиотеки действий платформа .NET Framework 4.6.1. Сборка этих действий является наиболее простым способом создания пользовательских функциональных возможностей.
WaitForVendorProposal.cs Это пользовательское действие происходит от NativeActivity и создает именованную закладку, которая должна быть возобновлена в дальнейшем поставщиком путем передачи предложения.

Действия, которые являются производными от NativeActivity аналогично производным действиям от CodeActivity, создают императивные функции путем переопределения Execute, но также имеют доступ ко всем функциям среды выполнения рабочего процесса благодаря ActivityContext, который передается методу Execute. Этот контекст поддерживает планирование и отмену дочерних действий, настройку не сохраняемых зон (блоки выполнения, во время которых среда выполнения не сохраняет данные рабочего процесса, например в атомарных транзакциях), и Bookmark объекты (обрабатывает возобновление приостановленных рабочих процессов).
TrackingParticipant.cs Участник TrackingParticipant, который получает все события отслеживания и сохраняет их в текстовом файле.

Участники отслеживания добавляются к экземпляру рабочего процесса как расширения.
XmlWorkflowInstanceStore.cs Пользовательское хранилище InstanceStore, которое сохраняет приложения рабочего процесса в XML-файлах.
XmlPersistenceParticipant.cs Пользовательское хранилище PersistenceParticipant, которое сохраняет экземпляр запроса предложения в XML-файле.
AsyncResult.cs / CompletedAsyncResult.cs Вспомогательные классы для реализации асинхронной технологии в компонентах сохраняемости.

Распространенный почтовый сервис

В следующей таблице содержится описание наиболее важных классов в проекте Common.

Класс Description
Vendor Поставщик, который передает предложения в запросе предложений.
RequestForProposal Запрос предложений представляет собой приглашение для поставщиков, согласно которому они должны передать предложения по конкретному товару или услуге.
VendorProposal Предложение, переданное поставщиком в ответ на конкретный запрос предложений.
VendorRepository Репозиторий поставщиков. Эта реализация содержит в оперативной памяти коллекцию экземпляров поставщиков и методов доступа к этим экземплярам.
RfpRepository Репозиторий запросов предложений. Эта реализация содержит примеры использования Linq to XML для запроса XML-файла запросов предложений, созданного схематизированными средствами обеспечения сохраняемости.
IOHelper Этот класс разрешает все проблемы, связанные с вводом-выводом (которые касаются папок, путей и т. д.).

Веб-клиент

В следующей таблице содержится описание наиболее важных веб-страниц в проекте веб-клиента.

Файл Description
CreateRfp.aspx Создает и отправляет новый запрос предложений.
Default.aspx Показывает все активные и завершенные запросы предложений.
GetVendorProposal.aspx Возвращает предложение от поставщика в конкретном запросе предложений. Эта страница используется только поставщиками.
ShowRfp.aspx Выводит все сведения о запросе предложений (полученные предложения, даты, стоимость и другие данные). Эта страница используется только создателем запроса предложений.

Клиент WinForms

В следующей таблице содержится описание наиболее важных форм в проекте WinForms.

Форма Description
NewRfp Создает и отправляет новый запрос предложений.
ShowProposals Показывает все активные и завершенные запросы предложений. Примечание. После создания или изменения запроса на предложение может потребоваться нажать кнопку "Обновить " в пользовательском интерфейсе.
SubmitProposal Возвращает предложение от поставщика в конкретном запросе предложений. Это окно используется только поставщиками.
ViewRfp Выводит все сведения о запросе предложений (полученные предложения, даты, стоимость и другие данные). Это окно используется только создателем запроса предложений.

Файлы сохраняемости

В следующей таблице показаны файлы, созданные поставщиком сохраняемости (XmlPersistenceProvider), которые находятся в пути к временной папке текущей системы (использующей GetTempPath). Файл трассировки создается в текущем пути выполнения.

Имя файла Description Путь
rfps.xml XML-файл со всеми активными и завершенными запросами предложений. GetTempPath
[instanceid] Этот файл содержит все сведения об экземпляре рабочего процесса.

Этот файл создается схематизированной реализацией сохраняемости (PersistenceParticipant в XmlPersistenceProvider).
GetTempPath
[instanceId].tracking Текстовый файл со всеми событиями, которые произошли в конкретном экземпляре.

Этот файл создается объектом TrackingParticipant.
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt Файл трассировки, созданный рабочим потоком на основе параметров конфигурации в файлах App.config или Web.config. Текущий путь выполнения

Использование этого образца

  1. Откройте файл решения PurchaseProcess.sln с помощью Visual Studio.

  2. Чтобы выполнить проект веб-клиента, откройте Обозреватель решений и щелкните правой кнопкой мыши проект веб-клиента. Выберите Назначить запускаемым проектом.

  3. Чтобы выполнить проект клиента WinForms, откройте Обозреватель решений и щелкните правой кнопкой мыши проект клиента WinForms. Выберите Назначить запускаемым проектом.

  4. Для построения решения нажмите CTRL+SHIFT+B.

  5. Чтобы запустить решение, нажмите клавиши CTRL+F5.

Параметры веб-клиента

  • Создайте новый rfP: создает новый запрос предложений (RFP) и запускает рабочий процесс процесса покупки.

  • Обновление: обновляет список активных и завершенных ЗАПРОСОВ в главном окне.

  • Представление: показывает содержимое существующего RFP. Поставщики могут передавать свои предложения (если они приглашены или запрос предложений не завершен).

  • Просмотр как: пользователь может получить доступ к RFP с помощью различных удостоверений, выбрав нужного участника в поле со списком в активной сетке RFPs.

Параметры клиента WinForms

  • Создание RFP: создает новый запрос предложений (RFP) и запускает рабочий процесс процесса покупки.

  • Обновление: обновляет список активных и завершенных ЗАПРОСОВ в главном окне.

  • Просмотр RFP: показывает содержимое существующего RFP. Поставщики могут передавать свои предложения (если они приглашены или запрос предложений не завершен).

  • Подключение как: пользователь может получить доступ к RFP с помощью различных удостоверений, выбрав нужного участника в поле со списком в активной сетке RFPs.