Поделиться через


Процесс корпоративной покупки

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

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

Демонстрирует

  • Пользовательские действия.

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

  • Закладки.

  • Упорство.

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

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

  • Слежение.

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

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

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

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

    1. Сотрудник вводит заголовок и описание для RFP.

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

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

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

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

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

    1. У каждого поставщика есть репутация (в этом примере хранится список репутаций в VendorRepository.cs).

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

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

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

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

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

Проекты в этом примере

Этот пример содержит следующие проекты.

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

WfDefinition

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

Файл Описание
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.

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

Веб-клиент

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

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

Клиент WinForms

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

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

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

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

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

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

Этот файл создается с помощью 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. Поставщики могут отправлять свои предложения (если их пригласили или тендерный запрос не завершён).

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

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

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

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

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

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