다음을 통해 공유


회사 구매 프로세스

PurchaseProcess 샘플은 자동 최상의 제안 선택을 사용하여 RFP(제안 요청) 기반 구매 프로세스를 만드는 방법을 보여 줍니다. Parallel, ParallelForEach<T>, ForEach<T> 및 사용자 지정 작업을 결합하여 프로세스를 나타내는 워크플로를 만듭니다.

이 샘플에는 원래 요청자나 특정 공급업체로서 프로세스와 상호작용할 수 있는 ASP.NET 클라이언트 애플리케이션이 포함되어 있습니다.

입증합니다

  • 사용자 지정 활동.

  • 활동의 구성입니다.

  • 북마크.

  • 고집.

  • 스키마화된 지속성.

  • 추적.

  • 추적.

  • 다른 클라이언트에서 WF 호스팅(ASP.NET 웹 애플리케이션 및 WinForms 애플리케이션).

프로세스에 대한 설명

이 샘플에서는 일반 회사에 대한 공급업체의 제안을 수집하는 WF(Windows Workflow Foundation) 프로그램의 구현을 보여 줍니다.

  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 워크플로에 대한 호스트 구현입니다. 호스트는 워크플로 런타임의 세부 정보를 추상화하며, 모든 클라이언트 애플리케이션에서 워크플로 인스턴스를 로드하고, 실행하고, 상호 작용하는 데 사용됩니다.
구매프로세스워크플로우.cs (PurchaseProcessWorkflow.cs) 구매 프로세스 워크플로의 정의(Activity에서 파생됨)을 포함하는 활동입니다.

.NET Framework 4.6.1 활동 라이브러리와 기존 사용자 지정 활동을 조립하여 기능을 구성하는 활동은 Activity에서 파생된 것입니다. 이러한 활동을 어셈블하는 것이 사용자 지정 기능을 만드는 가장 기본적인 방법입니다.
WaitForVendorProposal.cs 이 사용자 지정 작업은 NativeActivity에서 파생된 것으로, 제안서를 제출할 때 공급업체가 나중에 다시 시작해야 하는 명명된 책갈피를 생성합니다.

활동이 NativeActivity로부터 파생되는 것처럼, CodeActivity로부터 파생되는 활동은 Execute를 재정의하여 명령적 기능을 생성할 뿐만 아니라, 메서드에 전달되는 ActivityContext를 통해 Execute 워크플로 런타임의 모든 기능에 접근할 수 있습니다. 이 컨텍스트는 자식 활동 예약 및 취소, 지속되지 않는 영역 설정(런타임이 원자성 트랜잭션 내와 같은 워크플로의 데이터를 유지하지 않는 실행 블록) 및 Bookmark 개체(일시 중지된 워크플로 다시 시작 핸들)를 지원합니다.
TrackingParticipant.cs 모든 추적 이벤트를 수신하고 텍스트 파일에 저장하는 TrackingParticipant입니다.

추적 참가자는 워크플로 인스턴스에 확장으로 추가됩니다.
XmlWorkflowInstanceStore.cs 워크플로 애플리케이션을 XML 파일에 저장하는 사용자 지정 InstanceStore 입니다.
XmlPersistenceParticipant.cs 제안 요청 인스턴스를 XML 파일에 저장하는 사용자 지정 PersistenceParticipant 입니다.
AsyncResult.cs/CompletedAsyncResult.cs 지속성 구성 요소에서 비동기 패턴을 구현하기 위한 도우미 클래스입니다.

일반적

다음 표에는 Common 프로젝트에서 가장 중요한 클래스에 대한 설명이 포함되어 있습니다.

클래스 설명
공급업체 제안 요청에서 제안을 제출하는 공급업체입니다.
제안 요청서 RFP(제안 요청)는 공급업체가 특정 상품 또는 서비스에 대한 제안을 제출하도록 초대하는 것입니다.
공급업체제안서 공급업체가 구체적인 RFP에 제출한 제안입니다.
VendorRepository 공급업체의 리포지토리입니다. 이 구현에는 공급업체 인스턴스의 메모리 내 컬렉션과 해당 인스턴스를 노출하는 메서드가 포함되어 있습니다.
RfpRepository 제안 요청의 리포지토리입니다. 이 구현에는 Linq to XML을 사용하여 스키마화된 지속성으로 생성된 제안 요청의 XML 파일을 쿼리합니다.
IOHelper 이 클래스는 모든 I/O 관련 문제(폴더, 경로 등)를 처리합니다.

웹 클라이언트

다음 표에는 웹 클라이언트 프로젝트에서 가장 중요한 웹 페이지에 대한 설명이 포함되어 있습니다.

파일 설명
CreateRfp.aspx 새 제안 요청을 만들고 제출합니다.
Default.aspx 제안에 대한 활성 및 완료된 모든 요청을 표시합니다.
GetVendorProposal.aspx 구체적인 제안 요청에서 공급업체로부터 제안을 가져옵니다. 이 페이지는 공급업체에서만 사용됩니다.
ShowRfp.aspx 제안 요청(받은 제안서, 날짜, 값 및 기타 정보)에 대한 모든 정보를 표시합니다. 이 페이지는 제안 요청 작성자만 사용합니다.

WinForms 클라이언트

다음 표에는 Win Forms 프로젝트에서 가장 중요한 양식에 대한 설명이 포함되어 있습니다.

양식 설명
NewRfp 새 제안 요청을 만들고 제출합니다.
제안서 보기 제안에 대한 모든 활성 및 완료된 요청을 표시합니다. 메모: 제안 요청을 만들거나 수정한 후 UI에서 새로 고침 단추를 클릭하여 해당 화면의 변경 내용을 확인해야 할 수 있습니다.
제안서 제출 구체적인 제안 요청에서 공급업체로부터 제안을 받습니다. 이 창은 공급업체에서만 사용됩니다.
ViewRfp 제안 요청(받은 제안서, 날짜, 값 및 기타 정보)에 대한 모든 정보를 표시합니다. 이 창은 제안 요청 작성자만 사용합니다.

퍼시스턴스 파일

다음 표에서는 지속성 공급자(XmlPersistenceProvider)가 생성한 파일이 현재 시스템의 임시 폴더 경로(사용 GetTempPath)에 있는 것을 보여 줍니다. 추적 파일은 현재 실행 경로에 만들어집니다.

파일 이름 설명 경로
rfps.xml 모든 활성 및 완료된 제안 요청이 있는 XML 파일입니다. GetTempPath
[instanceid] 이 파일에는 워크플로 인스턴스에 대한 모든 정보가 포함되어 있습니다.

이 파일은 스키마화된 지속성 구현(XmlPersistenceProvider의 PersistenceParticipant)에 의해 생성됩니다.
GetTempPath
[instanceId].추적 구체적인 인스턴스 내에서 발생한 모든 이벤트가 포함된 텍스트 파일입니다.

이 파일은 TrackingParticipant에 의해 생성됩니다.
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt App.config 또는 Web.config 파일의 구성 매개 변수를 기반으로 워크플로에서 생성된 추적 파일입니다. 현재 실행 경로

이 샘플을 사용하려면

  1. Visual Studio를 사용하여 PurchaseProcess.sln 솔루션 파일을 엽니다.

  2. 웹 클라이언트 프로젝트를 실행하려면 솔루션 탐색기를 열고 웹 클라이언트 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 시작 프로젝트로 설정을 선택합니다.

  3. WinForms 클라이언트 프로젝트를 실행하려면 솔루션 탐색기를 열고 WinForms 클라이언트 프로젝트를 마우스 오른쪽 단추로 클릭합니다. 시작 프로젝트로 설정을 선택합니다.

  4. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.

  5. 솔루션을 실행하려면 Ctrl+F5를 누릅니다.

웹 클라이언트 옵션

  • 새 RFP 만들기: RFP(제안 요청)를 만들고 구매 프로세스 워크플로를 시작합니다.

  • 새로 고침: 주 창에서 활성 및 완료된 RFP 목록을 새로 고칩니다.

  • 보기: 기존 RFP의 콘텐츠를 표시합니다. 공급업체는 제안서를 제출할 수 있습니다(초대되거나 RFP가 완료되지 않은 경우).

  • 다른 이름으로 보기: 사용자는 활성 RFP 그리드의 다르게 보기 콤보 상자에서 참가자를 선택하여 여러 ID를 사용하여 RFP에 접속할 수 있습니다.

WinForms 클라이언트 옵션

  • RFP 만들기: RFP(제안 요청)를 새로 만들고 구매 프로세스 워크플로를 시작합니다.

  • 새로 고침: 주 창에서 활성 및 완료된 RFP 목록을 새로 고칩니다.

  • RFP 보기: 기존 RFP의 콘텐츠를 표시합니다. 공급업체는 제안서를 제출할 수 있습니다(초대되거나 RFP가 완료되지 않은 경우).

  • 사용자 연결: 사용자는 활성 RFP 그리드의 로 보기 콤보 상자에서 원하는 참가자를 선택하여 다른 신원으로 RFP에 액세스할 수 있습니다.