-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSampleDocumentApprovalWorkflow.cs
119 lines (102 loc) · 4.18 KB
/
SampleDocumentApprovalWorkflow.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using WorkflowEngine.Workflow;
using WorkflowEngine.Workflow.Nodes;
using WorkflowEngine.Workflow.Transitions;
using static WorkflowEngine.SampleDocumentApprovalWorkflowContext;
namespace WorkflowEngine
{
public class SampleDocumentApprovalWorkflow: Workflow.Workflow
{
class DoApprovalNode: ActionNode
{
public DoApprovalNode(WorkflowContext context, string name): base(context, name, TYPE.ACTION_NODE)
{
}
public override void Execute()
{
Console.WriteLine("Please enter 'approve' or 'decline'.");
string decision = Console.ReadLine().ToLower();
if (decision != "approve" && decision != "decline")
{
Execute();
return;
}
context.SetValueForProperty("Decision", decision);
}
}
class PostApprovalNode: MultiStepNode
{
public PostApprovalNode(WorkflowContext context, string name): base(context, name, TYPE.ACTION_NODE)
{
AddStep((context) =>
{
Console.WriteLine("Executing step 1.");
Console.WriteLine("Your decision: " + context.GetValueForProperty<string>("Decision"));
});
AddStep((context) =>
{
Console.WriteLine("Executing step 2.");
});
}
}
public SampleDocumentApprovalWorkflow()
{
context = new SampleDocumentApprovalWorkflowContext();
var startNode = new StartNode(context, "BEGIN");
var approvalNode = new DoApprovalNode(context, "IN_APPROVAL");
var postApprovalNode = new PostApprovalNode(context, "POST_APPROVAL");
var finalNode = new EndNode(context, "FINISHED");
Initialize(startNode);
AddTransition(startNode, approvalNode,
() =>
{
var currentContext = context as SampleDocumentApprovalWorkflowContext;
if (currentContext == null)
{
return false;
}
return currentContext.ApprovalState == APPROVAL_STATE.UNAPPROVED;
},
() =>
{
Console.WriteLine("Going forward to approval state.");
Console.WriteLine("Sent e-mail to manager.");
context.SetValueForProperty<APPROVAL_STATE>("ApprovalState", APPROVAL_STATE.IN_PROGRESS);
}
);
AddTransition(approvalNode, postApprovalNode,
() =>
{
string decision = context.GetValueForProperty<string>("Decision");
var state = context.GetValueForProperty<APPROVAL_STATE>("ApprovalState");
return decision == "approve" && state == APPROVAL_STATE.IN_PROGRESS;
},
() =>
{
Console.WriteLine("Finishing approval workflow.");
}
);
AddTransition(postApprovalNode, finalNode,
() => true,
() =>
{
context.SetValueForProperty<APPROVAL_STATE>("ApprovalState", APPROVAL_STATE.APPROVED);
}
);
AddTransition(approvalNode, startNode,
() =>
{
string decision = context.GetValueForProperty<string>("Decision");
var state = context.GetValueForProperty<APPROVAL_STATE>("ApprovalState");
return decision == "decline" && state == APPROVAL_STATE.IN_PROGRESS;
},
() =>
{
context.SetValueForProperty<string>("Decision", null);
context.SetValueForProperty<APPROVAL_STATE>("ApprovalState", APPROVAL_STATE.UNAPPROVED);
Console.WriteLine("Moving back to initial state.");
}
);
}
}
}