通用流程設計


  寫在前面:本人文采不好,零星寫過幾篇隨筆,但都不盡人意,本着共同學習共同進步的原則,還是打算把近期開發的一個通用流程的軟件拿出來與大家分享。本流程軟件能滿足鄙人接觸到了解到的一般的流程實現(由於接觸到的流程有限,以及對流程理解的不夠透徹,流程引擎中不免有設計不足或考慮不周,也希望大神們能多多指點),如果讀者在閱讀或使用過程中遇到什么問題或有什么想法,希望能拿出來與大家分享,我們共同去學習去完善這套流程引擎。本隨筆打算只涉及流程引擎部分,可視化流程設計隨后做單獨的隨筆推出。寫作水平有限,望讀者多多體諒...(如有問題可隨時聯系筆者。郵箱:455274752@qq.com)。歡迎加入流程交流群:251834323

  一、需求

  開發一套通用流程引擎軟件,在主軟件可以通過簡單的注冊、引用,即可完成軟件流程部門的設計開發。

  二、抽象解決方案

  1.通過EntityFramework的CodeFirst實現流程有關的數據庫表的創建。

  2.通過SilverLight實現流程的可視化操作。

  三、項目結構說明

 

  四、項目結構分析及代碼

  一、Entities流程實體

  定義流程相關的數據庫實體。

  

  1.WorkflowInitializer.cs 初始化數據庫類,定義創建數據庫時的默認數據。相關類定義如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Data.Entity;
 4 using System.Linq;
 5 using System.Text;
 6 using Workflow.Entities;
 7 
 8 namespace Workflow.Entities
 9 {
10     /// <summary>
11     /// 初始化數據庫數據
12     /// </summary>
13     public class WorkflowInitializer : DropCreateDatabaseIfModelChanges<WorkflowDB>
14     {
15         /// <summary>
16         /// 重寫數據庫初始化方法
17         /// </summary>
18         /// <param name="context"></param>
19         protected override void Seed(WorkflowDB context)
20         {
21             var modules = new List<ModuleList> { 
22                 new ModuleList{ModuleName="模版一",ModuleExplain="模版一"}
23             };
24             modules.ForEach(i => context.ModuleLists.Add(i));
25             context.SaveChanges();
26 
27             var mains = new List<WorkflowMain> { 
28                 new WorkflowMain { WorkflowName = "流程一",WorkflowStatus="1",ModuleID=1,Owner="qdq",WorkflowExplain="主流程說明",IsDefault=true }
29             };
30             mains.ForEach(i => context.WorkflowMains.Add(i));
31             context.SaveChanges();
32 
33             var details = new List<WorkflowDetailed> { 
34                 new WorkflowDetailed{Top_Y=10,Left_X=10,SetpExplain="開始",StepStatus="1",Deadline=3,Nunciator="qdq",
35                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=0,
36                     StepName="開始",UpStep=null,NextStep=1,ProcessingMode="1"},
37                 new WorkflowDetailed{Top_Y=200,Left_X=200,SetpExplain="步驟一",StepStatus="1",Deadline=3,Nunciator="qdq",
38                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=1,
39                     StepName="步驟一",UpStep=-1,NextStep=2,ProcessingMode="1"},
40                 new WorkflowDetailed{Top_Y=350,Left_X=350,SetpExplain="步驟二",StepStatus="1",Deadline=3,Nunciator="qdq,cyl",
41                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=2,
42                     StepName="步驟二",UpStep=-1,NextStep=-1,ProcessingMode="1"},
43                 new WorkflowDetailed{Top_Y=500,Left_X=500,SetpExplain="結束",StepStatus="1",Deadline=3,Nunciator="qdq",
44                     IsCirculation=false,ProcessingPersonnel="qdq",ProcessingPersonnelMode="Person",WorkflowID=1,StepID=-1,
45                     StepName="結束",UpStep=null,NextStep=0,ProcessingMode="1"}
46             };
47             details.ForEach(i => context.WorkflowDetaileds.Add(i));
48             context.SaveChanges();
49 
50             var tasks = new List<TaskList> { 
51                 new TaskList{ MessageType=1,TaskSN=1,StepStatus="1",HandleType=1,HandleStatus=true,HandlePerson="qdq",
52                     HandleTime=DateTime.Now,Receive=DateTime.Now,Opinion="同意",WorkflowDetailed_ID=2,FromID="20130001"}
53             };
54             tasks.ForEach(i => context.TaskLists.Add(i));
55             context.SaveChanges();
56 
57             var annexs = new List<AnnexList> { 
58                 new AnnexList{AnnexAddress="測試",AnnexName="測試",TaskList_ID=1}
59             };
60             annexs.ForEach(i => context.AnnexLists.Add(i));
61             context.SaveChanges();
62 
63             base.Seed(context);
64         }
65     }
66 }
View Code

  2.WorkflowDB.cs 繼承System.Data.Entity.DbContext 定義流程引擎數據庫上下文類。相關類定義如下:

 1 using System.Collections.Generic;
 2 using System.Data.Entity;
 3 using System.ComponentModel.DataAnnotations;
 4 
 5 namespace Workflow.Entities
 6 {
 7     /// <summary>
 8     /// 數據上下文
 9     /// </summary>
10     public class WorkflowDB : DbContext
11     {
12         //name指定連接字符串,否則默認為類名(如果有多個連接字符串,此處選取第一個)
13         /// <summary>
14         /// 構造函數
15         /// </summary>
16         public WorkflowDB()
17         //: base("name=WorkflowDB")
18         : base("Data Source=.;Initial Catalog=WorkflowDB;User ID=sa;Password=1234;Integrated Security=True")
19         //: base("name=" + System.Configuration.ConfigurationManager.ConnectionStrings[1].Name)
20         { }
21         /// <summary>
22         /// 模塊實體列表
23         /// </summary>
24         public DbSet<ModuleList> ModuleLists { get; set; }
25         /// <summary>
26         /// 流程實體列
27         /// </summary>
28         public DbSet<WorkflowMain> WorkflowMains { get; set; }
29         /// <summary>
30         /// 步驟實體列表
31         /// </summary>
32         public DbSet<WorkflowDetailed> WorkflowDetaileds { get; set; }
33         /// <summary>
34         /// 任務實體列表
35         /// </summary>
36         public DbSet<TaskList> TaskLists { get; set; }
37         /// <summary>
38         /// 附件實體列表
39         /// </summary>
40         public DbSet<AnnexList> AnnexLists { get; set; }
41     }
42 }
View Code

  3.ModuleList.cs 模塊類,主應用程序包含多個模塊應用流程時,有此處區分具體模塊需應用的具體流程。相關類定義如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel.DataAnnotations;
 4 using System.ComponentModel.DataAnnotations.Schema;
 5 using System.Linq;
 6 using System.Text;
 7 
 8 namespace Workflow.Entities
 9 {
10     public class ModuleList
11     {
12         // id標識
13         private int _ModuleID;
14         // 模塊說明
15         private string _ModuleExplain;
16         /// <summary>
17         /// 所包含的流程列表
18         /// </summary>
19         public ICollection<WorkflowMain> WorkflowMains { get; set; }
20         // 模塊名稱
21         private string _ModuleName;
22 
23         /// <summary>
24         /// 模塊名稱
25         /// </summary>
26         [Required(ErrorMessage="模塊名稱為必填"),MaxLength(100)]
27         public string ModuleName
28         {
29             get { return _ModuleName; }
30             set { _ModuleName = value; }
31         }
32 
33         /// <summary>
34         /// 模塊說明
35         /// </summary>
36         [MaxLength(500)]
37         public string ModuleExplain
38         {
39             get { return _ModuleExplain; }
40             set { _ModuleExplain = value; }
41         }
42 
43         /// <summary>
44         /// id標識
45         /// </summary>
46         [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
47         public int ModuleID
48         {
49             get { return _ModuleID; }
50             set { _ModuleID = value; }
51         }
52 
53     }
54 }
View Code

  4.WorkflowMain.cs 流程主表類,定義流程相關的屬性。相關類定義如下:

  1 using System.Collections.Generic;
  2 using System.Data.Entity;
  3 using System.ComponentModel.DataAnnotations;
  4 using System.ComponentModel.DataAnnotations.Schema;
  5 
  6 namespace Workflow.Entities
  7 {
  8     public partial class WorkflowMain
  9     {
 10         // 流程編號
 11         private int _WorkflowID;
 12         // 流程名稱
 13         private string _WorkflowName;
 14         // 是否為默認流程
 15         private bool _IsDefault;
 16         // 流程的狀態(1正常2暫停3廢棄)
 17         private string _WorkflowStatus;
 18         // 流程說明
 19         private string _WorkflowExplain;
 20         // 流程所屬人
 21         private string _Owner;
 22         private int _ModuleID;
 23 
 24         /// <summary>
 25         /// 流程的狀態(1正常2暫停3廢棄)
 26         /// </summary>
 27         [Required,MaxLength(1)]
 28         public string WorkflowStatus
 29         {
 30             get { return _WorkflowStatus; }
 31             set { _WorkflowStatus = value; }
 32         }
 33 
 34         /// <summary>
 35         /// 流程詳細步驟表
 36         /// </summary>
 37         public ICollection<WorkflowDetailed> WorkflowDetaileds { get; set; }
 38 
 39         /// <summary>
 40         /// 所屬模塊
 41         /// </summary>
 42         [ForeignKey("ModuleID")]
 43         public ModuleList ModuleList { get; set; }
 44 
 45         /// <summary>
 46         /// 所屬模塊ID
 47         /// </summary>
 48         [Required]
 49         public int ModuleID
 50         {
 51             get { return _ModuleID; }
 52             set { _ModuleID = value; }
 53         }
 54         
 55         /// <summary>
 56         /// 流程所屬人
 57         /// </summary>
 58         [MaxLength(20)]
 59         public string Owner
 60         {
 61             get { return _Owner; }
 62             set { _Owner = value; }
 63         }
 64 
 65         /// <summary>
 66         /// 流程說明
 67         /// </summary>
 68         [MaxLength(500)]
 69         public string WorkflowExplain
 70         {
 71             get { return _WorkflowExplain; }
 72             set { _WorkflowExplain = value; }
 73         }
 74 
 75         /// <summary>
 76         /// 流程編號
 77         /// </summary>
 78         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 79         public int WorkflowID
 80         {
 81             get { return _WorkflowID; }
 82             set { _WorkflowID = value; }
 83         }
 84 
 85         /// <summary>
 86         /// 流程名稱
 87         /// </summary>
 88         [Required(ErrorMessage = "流程名稱為必填"),MaxLength(30)]
 89         public string WorkflowName
 90         {
 91             get { return _WorkflowName; }
 92             set { _WorkflowName = value; }
 93         }
 94 
 95         /// <summary>
 96         /// 是否為默認流程
 97         /// </summary>
 98         public bool IsDefault
 99         {
100             get { return _IsDefault; }
101             set { _IsDefault = value; }
102         }
103 
104     }
105 }
View Code

  5.WorkflowDetailed.cs 流程子表類,定義流程步驟的相關屬性。相關類定義如下:

  1 using System.Collections.Generic;
  2 using System.Data.Entity;
  3 using System.ComponentModel.DataAnnotations;
  4 using System.ComponentModel.DataAnnotations.Schema;
  5 using System;
  6 
  7 namespace Workflow.Entities
  8 {
  9     public partial class WorkflowDetailed
 10     {
 11         public WorkflowDetailed() { }
 12 
 13         public WorkflowDetailed(int workflow, int stepid,string stepname)
 14         {
 15             _WorkflowID = workflow;
 16             _StepID = stepid;
 17             _StepName = stepname;
 18             _UpStep = -1;//默認審批不通過進入結束流程
 19             _NextStep = stepid + 1;//默認+1
 20             _ProcessingMode = "100%";
 21             //_MainProcessingMode = "100%";
 22             _ProcessingPersonnelMode = "Person";
 23             _ProcessingPersonnel = "";
 24             _IsCirculation = false;
 25             _Nunciator = "";
 26             _Deadline = 7;
 27             _StepStatus = "1";
 28         }
 29 
 30         // id標識
 31         private int _ID;
 32         // 流程編號
 33         private int _WorkflowID;
 34         // 步驟編號
 35         private int _StepID;
 36         // 步驟名稱
 37         private string _StepName;
 38         // 驗證失敗返回的步驟,審批不同意和環形審批使用
 39         private int? _UpStep;
 40         // 驗證通過進入的步驟序號
 41         private int? _NextStep;
 42         // 流程處理 驗證是否通過的模式(正數=通過人數,負數=不通過人數,百分數=通過率)
 43         private string _ProcessingMode;
 44         // 處理人員的類型(人員 角色 部門等)
 45         private string _ProcessingPersonnelMode;
 46         // 處理具體人員(人員 角色 部門等)
 47         private string _ProcessingPersonnel;
 48         // 是否運行流轉
 49         private bool _IsCirculation;
 50         // 具體告知人
 51         private string _Nunciator;
 52         // 告知人的過期時間 單位/天
 53         private int _Deadline;
 54         // 流程的狀態(1正常2暫停3廢棄)
 55         private string _StepStatus;
 56         // 條件表達式(根據條件判斷下一步驟 格式如:7>@p?1:2)優先級大於NextStep
 57         private string _Conditions;
 58         // 步驟說明
 59         private string _SetpExplain;
 60         // 距離左側的距離 X軸坐標
 61         private double? _Left_X;
 62         // 距離頂部的距離 Y軸坐標
 63         private double? _Top_Y;
 64 
 65         /// <summary>
 66         /// 距離頂部的距離 Y軸坐標
 67         /// </summary>
 68         public double? Top_Y
 69         {
 70             get { return _Top_Y; }
 71             set { _Top_Y = value; }
 72         }
 73 
 74         /// <summary>
 75         /// 距離左側的距離 X軸坐標
 76         /// </summary>
 77         public double? Left_X
 78         {
 79             get { return _Left_X; }
 80             set { _Left_X = value; }
 81         }
 82 
 83         /// <summary>
 84         /// 任務列表
 85         /// </summary>
 86         public ICollection<TaskList> TaskLists { get; set; }
 87         /// <summary>
 88         /// 流程主表
 89         /// </summary>
 90         [ForeignKey("WorkflowID")]
 91         public WorkflowMain WorkflowMain { get; set; }
 92 
 93         /// <summary>
 94         /// 步驟說明
 95         /// </summary>
 96         [MaxLength(500)]
 97         public string SetpExplain
 98         {
 99             get { return _SetpExplain; }
100             set { _SetpExplain = value; }
101         }
102 
103         /// <summary>
104         /// 條件表達式(根據條件判斷下一步驟 格式如:7>@p?1:2)優先級大於NextStep
105         /// </summary>
106         [MaxLength(100)]
107         public string Conditions
108         {
109             get { return _Conditions; }
110             set { _Conditions = value; }
111         }
112 
113         /// <summary>
114         /// 流程的狀態(1正常2暫停3廢棄)
115         /// </summary>
116         [Required,MaxLength(1)]
117         public string StepStatus
118         {
119             get { return _StepStatus; }
120             set { _StepStatus = value; }
121         }
122 
123 
124         /// <summary>
125         /// 告知人的過期時間 單位/天
126         /// </summary>
127         public int Deadline
128         {
129             get { return _Deadline; }
130             set { _Deadline = value; }
131         }
132 
133         /// <summary>
134         /// 具體告知人
135         /// </summary>
136         [MaxLength(500)]
137         public string Nunciator
138         {
139             get { return _Nunciator; }
140             set { _Nunciator = value; }
141         }
142 
143         /// <summary>
144         /// 是否運行流轉
145         /// </summary>
146         public bool IsCirculation
147         {
148             get { return _IsCirculation; }
149             set { _IsCirculation = value; }
150         }
151 
152         /// <summary>
153         /// 處理具體人員(人員 角色 部門等)
154         /// </summary>
155         [MaxLength(500)]
156         public string ProcessingPersonnel
157         {
158             get { return _ProcessingPersonnel; }
159             set { _ProcessingPersonnel = value; }
160         }
161 
162         /// <summary>
163         /// 處理人員的類型(人員 角色 部門等)
164         /// </summary>
165         [Required(ErrorMessage = "處理人員的類型為必填"), MaxLength(100)]
166         public string ProcessingPersonnelMode
167         {
168             get { return _ProcessingPersonnelMode; }
169             set { _ProcessingPersonnelMode = value; }
170         }
171 
172         /// <summary>
173         /// id標識
174         /// </summary>
175         [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
176         public int ID
177         {
178             get { return _ID; }
179             set { _ID = value; }
180         }
181 
182         /// <summary>
183         /// 流程編號
184         /// </summary>
185         [Required]
186         public int WorkflowID
187         {
188             get { return _WorkflowID; }
189             set { _WorkflowID = value; }
190         }
191 
192         /// <summary>
193         /// 步驟編號
194         /// </summary>
195         [Required(ErrorMessage="步驟編號")]
196         public int StepID
197         {
198             get { return _StepID; }
199             set { _StepID = value; }
200         }
201 
202         /// <summary>
203         /// 步驟名稱
204         /// </summary>
205         [Required(ErrorMessage="步驟名稱"),MaxLength(30)]
206         public string StepName
207         {
208             get { return _StepName; }
209             set { _StepName = value; }
210         }
211 
212         /// <summary>
213         /// 驗證失敗返回的步驟,審批不同意和環形審批使用
214         /// </summary>
215         public int? UpStep
216         {
217             get { return _UpStep; }
218             set { _UpStep = value; }
219         }
220 
221         /// <summary>
222         /// 驗證通過進入的步驟序號
223         /// </summary>
224         public int? NextStep
225         {
226             get { return _NextStep; }
227             set { _NextStep = value; }
228         }
229 
230         /// <summary>
231         /// 流程處理驗證是否通過的模式(正數=通過人數,負數=不通過人數,百分數=通過率)
232         /// </summary>
233         [Required(ErrorMessage = "通過模式為必填"),MaxLength(10)]
234         public string ProcessingMode
235         {
236             get { return _ProcessingMode; }
237             set { _ProcessingMode = value; }
238         }
239 
240     }
241 }
View Code

  6.TaskList.cs 任務表,定義針對處理人的相關任務信息。相關類定義如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel.DataAnnotations;
  4 using System.ComponentModel.DataAnnotations.Schema;
  5 using System.Linq;
  6 using System.Text;
  7 
  8 namespace Workflow.Entities
  9 {
 10     public class TaskList
 11     {
 12         // id標識
 13         private int _ID;
 14         // 表單ID
 15         private string _FromID;
 16         // 步驟ID
 17         private int _WorkflowDetailed_ID;
 18         // 處理意見
 19         private string _Opinion;
 20         // 接收時間
 21         private DateTime _ReceiveTime;
 22         // 處理時間
 23         private DateTime? _HandleTime;
 24         // 處理人(告知人)
 25         private string _HandlePerson;
 26         // 處理狀態(查看狀態)
 27         private bool _HandleStatus;
 28         // 處理類型(1同意,2不同意)
 29         private int? _HandleType;
 30         // 流程狀態(主要用於暫停時(1正常2暫停3廢棄))
 31         private string _StepStatus;
 32         // 上層任務id
 33         private int? _UpTask;
 34         // 任務序號
 35         private int _TaskSN;
 36         // 消息類型1處理類型2告知類型
 37         private int _MessageType;
 38         /// <summary>
 39         /// 所屬步驟表
 40         /// </summary>
 41         [ForeignKey("WorkflowDetailed_ID")]
 42         public WorkflowDetailed WorkflowDetailed { get; set; }
 43         /// <summary>
 44         /// 附件表
 45         /// </summary>
 46         public ICollection<AnnexList> AnnexLists { get; set; }
 47 
 48         /// <summary>
 49         /// 消息類型1處理類型2告知類型
 50         /// </summary>
 51         public int MessageType
 52         {
 53             get { return _MessageType; }
 54             set { _MessageType = value; }
 55         }
 56 
 57         /// <summary>
 58         /// 任務序號
 59         /// </summary>
 60         public int TaskSN
 61         {
 62             get { return _TaskSN; }
 63             set { _TaskSN = value; }
 64         }
 65       
 66         /// <summary>
 67         /// 上層任務id
 68         /// </summary>
 69         public int? UpTask
 70         {
 71             get { return _UpTask; }
 72             set { _UpTask = value; }
 73         }
 74         /// <summary>
 75         /// 流程狀態(主要用於暫停時(1正常2暫停3廢棄))
 76         /// </summary>
 77         [Required, MaxLength(1)]
 78         public string StepStatus
 79         {
 80             get { return _StepStatus; }
 81             set { _StepStatus = value; }
 82         }
 83 
 84         /// <summary>
 85         /// 處理類型(1同意,2不同意)
 86         /// </summary>
 87         public int? HandleType
 88         {
 89             get { return _HandleType; }
 90             set { _HandleType = value; }
 91         }
 92 
 93         /// <summary>
 94         /// 處理狀態
 95         /// </summary>
 96         [Required]
 97         public bool HandleStatus
 98         {
 99             get { return _HandleStatus; }
100             set { _HandleStatus = value; }
101         }
102 
103         /// <summary>
104         /// 處理人
105         /// </summary>
106         [Required]
107         public string HandlePerson
108         {
109             get { return _HandlePerson; }
110             set { _HandlePerson = value; }
111         }
112 
113         /// <summary>
114         /// 處理時間
115         /// </summary>
116         public DateTime? HandleTime
117         {
118             get { return _HandleTime; }
119             set { _HandleTime = value; }
120         }
121         /// <summary>
122         /// 接收時間
123         /// </summary>
124         [Required]
125         public DateTime Receive
126         {
127             get { return _ReceiveTime; }
128             set { _ReceiveTime = value; }
129         }
130 
131         /// <summary>
132         /// 處理意見
133         /// </summary>
134         public string Opinion
135         {
136             get { return _Opinion; }
137             set { _Opinion = value; }
138         }
139 
140         /// <summary>
141         /// 步驟ID
142         /// </summary>
143         [Required]
144         public int WorkflowDetailed_ID
145         {
146             get { return _WorkflowDetailed_ID; }
147             set { _WorkflowDetailed_ID = value; }
148         }
149 
150         /// <summary>
151         /// 表單ID
152         /// </summary>
153         [Required]
154         public string FromID
155         {
156             get { return _FromID; }
157             set { _FromID = value; }
158         }
159 
160         /// <summary>
161         /// id標識
162         /// </summary>
163         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
164         public int ID
165         {
166             get { return _ID; }
167             set { _ID = value; }
168         }
169     }
170 }
View Code

  7.AnnexList.cs 附件表,針對任務處理時上傳附件的需求。相關類定義如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel.DataAnnotations;
 4 using System.ComponentModel.DataAnnotations.Schema;
 5 using System.Linq;
 6 using System.Text;
 7 
 8 namespace Workflow.Entities
 9 {
10     public class AnnexList
11     {        
12         // id標識
13         private int _ID;
14         // 所屬任務表ID
15         private int _TaskList_ID;
16         // 原始附件名
17         private string _AnnexName;
18         // 附件地址
19         private string _AnnexAddress;
20         // 備注
21         private string _Remark;
22         /// <summary>
23         /// 所屬的任務表
24         /// </summary>
25         [ForeignKey("TaskList_ID")]
26         public TaskList TaskList { get; set; }
27 
28         /// <summary>
29         /// 備注
30         /// </summary>
31         [MaxLength(500)]
32         public string Remark
33         {
34             get { return _Remark; }
35             set { _Remark = value; }
36         }
37 
38         /// <summary>
39         /// 附件地址
40         /// </summary>
41         [Required,MaxLength(200)]
42         public string AnnexAddress
43         {
44             get { return _AnnexAddress; }
45             set { _AnnexAddress = value; }
46         }
47 
48         /// <summary>
49         /// 原始附件名
50         /// </summary>
51         [Required,MaxLength(300)]
52         public string AnnexName
53         {
54             get { return _AnnexName; }
55             set { _AnnexName = value; }
56         }
57 
58         /// <summary>
59         /// 所屬任務表ID
60         /// </summary>
61         [Required]
62         public int TaskList_ID
63         {
64             get { return _TaskList_ID; }
65             set { _TaskList_ID = value; }
66         }
67 
68         /// <summary>
69         /// id標識
70         /// </summary>
71         [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
72         public int ID
73         {
74             get { return _ID; }
75             set { _ID = value; }
76         }
77 
78     }
79 }
View Code

  二、Abstract 接口

  定義外部訪問的接口類。

  

  1.ConcreteFactory.cs 工廠類,對外提供接口的實例。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Workflow.Abstract
 7 {
 8     public class ConcreteFactory
 9     {
10         /// <summary>
11         /// 創建具體實現的類的實例
12         /// </summary>
13         /// <typeparam name="T">接口類型</typeparam>
14         /// <typeparam name="T2">具體實現</typeparam>
15         /// <returns></returns>
16         public static T CreateConcrete<T,T2>() where T2:T
17         {
18             return (T)Activator.CreateInstance<T2>();
19         }
20     }
21 }

  2.Enums.cs 定義相關的枚舉。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Workflow.Abstract
 7 {
 8     public class Enums
 9     {
10         /// <summary>
11         /// 任務處理人員的類型(棄用,改全局list)
12         /// </summary>
13         public enum ProcessingPersonnelModeEnum
14         {
15             /// <summary>
16             /// 人員
17             /// </summary>
18             Person = 1,
19             /// <summary>
20             /// 角色
21             /// </summary>
22             Role = 2,
23             /// <summary>
24             /// 部門
25             /// </summary>
26             Department = 3,
27             /// <summary>
28             /// 將來指定
29             /// </summary>
30             Hereafter = 4
31         };
32 
33         /// <summary>
34         /// 流程狀態
35         /// </summary>
36         public enum StepStatus
37         {
38             /// <summary>
39             /// 正常
40             /// </summary>
41             Normal = 1,
42             /// <summary>
43             /// 暫停
44             /// </summary>
45             Suspend = 2,
46             /// <summary>
47             /// 廢棄
48             /// </summary>
49             Discard = 3
50         };
51 
52         /// <summary>
53         /// 流程的錯誤類型
54         /// </summary>
55         public enum WorkflowErrorType
56         {
57             /// <summary>
58             /// 正確流程
59             /// </summary>
60             Normal = -1,
61             /// <summary>
62             /// 存在未閉環的步驟
63             /// </summary>
64             UnClosedLoop = -2,
65             /// <summary>
66             /// 存在未使用的節點(合並到UnClosedLoop)條件的下一步太多,不好驗證
67             /// </summary>
68             UnUseNode = -3,
69             /// <summary>
70             /// 並步驟 存在不統一的下一級節點
71             /// </summary>
72             UnUnified = -4,
73             /// <summary>
74             /// 不統一的處理模式
75             /// </summary>
76             UnUnifiedMode = -5,
77             /// <summary>
78             /// 空流程
79             /// </summary>
80             EmptyWorkflow = -6
81         }
82     }
83 }
Enums.cs

  3. I*Operation.cs 對應數據庫表的相關操作。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Entities;
 6 
 7 namespace Workflow.Abstract
 8 {
 9     public interface IModuleOperation
10     {
11         /// <summary>
12         /// 添加實體
13         /// </summary>
14         /// <param name="modulelist"></param>
15         /// <returns></returns>
16         int ModuleAdd(ModuleList modulelist);
17         /// <summary>
18         /// 刪除實體
19         /// </summary>
20         /// <param name="ModuleID"></param>
21         /// <returns></returns>
22         int ModuleDel(int ModuleID);
23         /// <summary>
24         /// 修改實體
25         /// </summary>
26         /// <param name="modulelist"></param>
27         /// <returns></returns>
28         int ModuleUpdate(ModuleList modulelist);
29         /// <summary>
30         /// 獲得實體
31         /// </summary>
32         /// <param name="ModuleID"></param>
33         /// <returns></returns>
34         ModuleList GetModel(int ModuleID);
35         /// <summary>
36         /// 獲得實體列表
37         /// </summary>
38         /// <returns></returns>
39         List<ModuleList> GetModuleList();
40         /// <summary>
41         /// 獲得所屬流程列表
42         /// </summary>
43         /// <returns></returns>
44         List<WorkflowMain> GetWorkflowMainList(int ModuleID);
45         /// <summary>
46         /// 根據模塊名稱獲取模塊編號(0代表未找到)
47         /// </summary>
48         /// <param name="ModuleName">模塊名稱</param>
49         /// <returns>模塊編號(0代表未找到)</returns>
50         int GetModuleID(string ModuleName);
51     }
52 }
IModuleOperation.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Entities;
 6 
 7 namespace Workflow.Abstract
 8 {
 9     public interface IWorkflowMainOperation
10     {  
11         /// <summary>
12         /// 添加實體
13         /// </summary>
14         /// <param name="workflowmain"></param>
15         /// <returns></returns>
16         int WorkflowMainAdd(WorkflowMain workflowmain);
17         /// <summary>
18         /// 刪除實體
19         /// </summary>
20         /// <param name="WorkflowID"></param>
21         /// <returns></returns>
22         int WorkflowMainDel(int WorkflowID);
23         /// <summary>
24         /// 修改實體
25         /// </summary>
26         /// <param name="workflowmain"></param>
27         /// <returns></returns>
28         int WorkflowMainUpdate(WorkflowMain workflowmain);
29         /// <summary>
30         /// 獲得實體
31         /// </summary>
32         /// <param name="WorkflowID"></param>
33         /// <returns></returns>
34         WorkflowMain GetModel(int WorkflowID);
35         /// <summary>
36         /// 獲得實體列表
37         /// </summary>
38         /// <returns></returns>
39         List<WorkflowMain> GetWorkflowMainList();
40         /// <summary>
41         /// 獲得所屬步驟列表
42         /// </summary>
43         /// <returns></returns>
44         List<WorkflowDetailed> GetWorkflowDetailedList(int WorkflowID);
45         /// <summary>
46         /// 根據流程名稱獲取流程編號(0代表未找到)
47         /// </summary>
48         /// <param name="WorkflowName">流程名稱</param>
49         /// <returns>流程編號(0代表未找到)</returns>
50         int GetWorkflowID(string WorkflowName);
51     }
52 }
IWorkflowMainOperation.cs
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using Workflow.Entities;
  6 
  7 namespace Workflow.Abstract
  8 {
  9     public interface IWorkflowDetailedOperation
 10     {  
 11         /// <summary>
 12         /// 添加實體
 13         /// </summary>
 14         /// <param name="workflowdetailed"></param>
 15         /// <returns></returns>
 16         int WorkflowDetailedAdd(WorkflowDetailed workflowdetailed);
 17         /// <summary>
 18         /// 刪除實體
 19         /// </summary>
 20         /// <param name="ID"></param>
 21         /// <returns></returns>
 22         int WorkflowDetailedDel(int ID);
 23         /// <summary>
 24         /// 修改實體
 25         /// </summary>
 26         /// <param name="workflowdetailed"></param>
 27         /// <returns></returns>
 28         int WorkflowDetailedUpdate(WorkflowDetailed workflowdetailed);
 29         /// <summary>
 30         /// 獲得實體
 31         /// </summary>
 32         /// <param name="ID"></param>
 33         /// <returns></returns>
 34         WorkflowDetailed GetModel(int ID);
 35         /// <summary>
 36         /// 獲得實體列表
 37         /// </summary>
 38         /// <returns></returns>
 39         List<WorkflowDetailed> GetWorkflowDetailedList();
 40         /// <summary>
 41         /// 獲得所屬任務列表
 42         /// </summary>
 43         /// <returns></returns>
 44         List<TaskList> GetTaskList(int ID);
 45 
 46         /// <summary>
 47         /// 為某流程增加下一步的步驟(-1主流程不存在0還未發送開始結束流程)
 48         /// </summary>
 49         /// <param name="WorkflowID">流程ID</param>
 50         /// <returns>-1主流程不存在0還未發送開始結束流程</returns>
 51         int GetNextStepID(int WorkflowID);
 52 
 53         /// <summary>
 54         /// 為某流程增加開始步驟(-1主流程不存在0已存在此步驟or新增的步驟ID)
 55         /// </summary>
 56         /// <param name="WorkflowID">流程ID</param>
 57         /// <returns>-1主流程不存在0已存在此步驟or新增的步驟ID</returns>
 58         int StartStepAdd(int WorkflowID);
 59 
 60         /// <summary>
 61         /// 為某流程增加結束步驟(-1主流程不存在0已存在此步驟or新增的步驟ID)
 62         /// </summary>
 63         /// <param name="WorkflowID">流程ID</param>
 64         /// <returns>-1主流程不存在0已存在此步驟or新增的步驟ID</returns>
 65         int EndStepAdd(int WorkflowID);
 66 
 67         /// <summary>
 68         /// 驗證流程的合法性
 69         /// </summary>
 70         /// <param name="WorkflowID">流程ID</param>
 71         /// <returns>錯誤信息的枚舉</returns>
 72         Enums.WorkflowErrorType VerifyWorkflow(int WorkflowID);
 73 
 74         /// <summary>
 75         /// 驗證流程的合法性
 76         /// </summary>
 77         /// <param name="lst">步驟列表</param>
 78         /// <returns>錯誤信息的枚舉</returns>
 79         Enums.WorkflowErrorType VerifyWorkflow(List<WorkflowDetailed> lst);
 80 
 81         /// <summary>
 82         /// 設為結束步驟
 83         /// </summary>
 84         /// <param name="ID">被設為結束的步驟ID</param>
 85         /// <returns>是否成功</returns>
 86         bool SetEndStep(int ID);
 87 
 88         /// <summary>
 89         /// 設為結束步驟
 90         /// </summary>
 91         /// <param name="WorkflowID">流程ID</param>
 92         /// <param name="StepID">步驟ID</param>
 93         /// <returns>是否成功</returns>
 94         bool SetEndStep(int WorkflowID,int StepID);
 95 
 96         /// <summary>
 97         /// 更改告知人
 98         /// </summary>
 99         /// <param name="ID">步驟ID</param>
100         /// <param name="Nunciator">告知對象</param>
101         /// <returns>是否成功</returns>
102         bool UpNunciator(int ID, string Nunciator);
103 
104         /// <summary>
105         /// 更改告知人
106         /// </summary>
107         /// <param name="WorkflowID">流程ID</param>
108         /// <param name="StepID">步驟ID</param>
109         /// <param name="Nunciator">告知對象</param>
110         /// <returns>是否成功</returns>
111         bool UpNunciator(int WorkflowID, int StepID, string Nunciator);
112 
113         /// <summary>
114         /// 更改下一步驟
115         /// </summary>
116         /// <param name="ID">需要更改的步驟ID</param>
117         /// <param name="NextStep">要更改為的步驟ID</param>
118         /// <returns></returns>
119         bool UpNextStep(int ID, int NextStep);
120 
121         /// <summary>
122         /// 更改下一步驟
123         /// </summary>
124         /// <param name="WorkflowID">流程ID</param>
125         /// <param name="StepID">步驟ID</param>
126         /// <param name="NextStep">要更改為的步驟ID</param>
127         /// <returns></returns>
128         bool UpNextStep(int WorkflowID, int StepID, int NextStep);
129     }
130 }
IWorkflowDetailedOperation.cs
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using Workflow.Entities;
  6 
  7 namespace Workflow.Abstract
  8 {
  9     /// <summary>
 10     /// 任務相關操作
 11     /// </summary>
 12     public interface ITaskListOperation
 13     {  
 14         /// <summary>
 15         /// 添加實體
 16         /// </summary>
 17         /// <param name="tasklist"></param>
 18         /// <returns></returns>
 19         int TaskListAdd(TaskList tasklist);
 20         /// <summary>
 21         /// 刪除實體
 22         /// </summary>
 23         /// <param name="ID"></param>
 24         /// <returns></returns>
 25         int TaskListDel(int ID);
 26         /// <summary>
 27         /// 修改實體
 28         /// </summary>
 29         /// <param name="tasklist"></param>
 30         /// <returns></returns>
 31         int TaskListUpdate(TaskList tasklist);
 32         /// <summary>
 33         /// 修改審批意見
 34         /// </summary>
 35         /// <param name="taskid">任務id</param>
 36         /// <param name="Opinion">審批意見</param>
 37         /// <param name="HandleType">處理類型(1同意2不同意)</param>
 38         /// <returns>影響的行數</returns>
 39         int TaskListUpdate(int taskid, string Opinion, int HandleType);
 40         /// <summary>
 41         /// 修改某人對應某表單當前正在執行任務的審批意見
 42         /// </summary>
 43         /// <param name="FormID">表單ID</param>
 44         /// <param name="WorkflowID">流程ID</param>
 45         /// <param name="Person">處理人</param>
 46         /// <param name="Opinion">審批意見</param>
 47         /// <param name="HandleType">處理類型(1同意2不同意)</param>
 48         /// <returns>影響的行數</returns>
 49         int TaskListUpdate(string FormID, int WorkflowID, string Person, string Opinion, int HandleType);
 50         /// <summary>
 51         /// 獲得實體
 52         /// </summary>
 53         /// <param name="ID"></param>
 54         /// <returns></returns>
 55         TaskList GetModel(int ID);
 56         /// <summary>
 57         /// 獲得實體列表
 58         /// </summary>
 59         /// <returns></returns>
 60         List<TaskList> GetTaskList();
 61         /// <summary>
 62         /// 獲得所屬附件列表
 63         /// </summary>
 64         /// <returns></returns>
 65         List<AnnexList> GetAnnexList(int ID);
 66         /// <summary>
 67         /// 修改過期的公告(如果處理時間為(發送時間+過期天數)則為未看過)
 68         /// </summary>
 69         int UpExpire();
 70         /// <summary>
 71         /// 任務流轉
 72         /// </summary>
 73         /// <param name="taskid">待流轉的任務ID</param>
 74         /// <param name="HandlePerson">流轉后的處理人</param>
 75         /// <returns></returns>
 76         TaskList TaskCirculation(int taskid, string HandlePerson);
 77         /// <summary>
 78         /// 任務審批並流轉
 79         /// </summary>
 80         /// <param name="taskid">待流轉的任務ID</param>
 81         /// <param name="Opinion">處理意見</param>
 82         /// <param name="HandlePerson">流轉后的處理人</param>
 83         /// <returns></returns>
 84         TaskList TaskCirculation(int taskid, string Opinion, string HandlePerson);
 85         /// <summary>
 86         /// 添加審批人員(只能操作正在進行的步驟)
 87         /// </summary>
 88         /// <param name="FormID">表單ID</param>
 89         /// <param name="WorkflowDetailed_ID">步驟ID</param>
 90         /// <param name="HandlePerson">要新增的處理人</param>
 91         /// <returns></returns>
 92         TaskList AddHandlePerson(string FormID, int WorkflowDetailed_ID, string HandlePerson);
 93         /// <summary>
 94         /// 添加審批人員(只能操作正在進行的步驟)
 95         /// </summary>
 96         /// <param name="FormID">表單ID</param>
 97         /// <param name="WorkflowID">流程ID</param>
 98         /// <param name="StepID">步驟ID</param>
 99         /// <param name="HandlePerson">要新增的處理人</param>
100         /// <returns></returns>
101         TaskList AddHandlePerson(string FormID, int WorkflowID, int StepID, string HandlePerson);
102         /// <summary>
103         /// 移除審批人員(只能操作正在進行的步驟)
104         /// </summary>
105         /// <param name="FormID">表單ID</param>
106         /// <param name="WorkflowDetailed_ID">步驟ID</param>
107         /// <param name="HandlePerson">要新增的處理人</param>
108         /// <returns></returns>
109         bool RemoveHandlePerson(string FormID, int WorkflowDetailed_ID, string HandlePerson);
110         /// <summary>
111         /// 移除審批人員(只能操作正在進行的步驟)
112         /// </summary>
113         /// <param name="FormID">表單ID</param>
114         /// <param name="WorkflowID">流程ID</param>
115         /// <param name="StepID">步驟ID</param>
116         /// <param name="HandlePerson">要新增的處理人</param>
117         /// <returns></returns>
118         bool RemoveHandlePerson(string FormID, int WorkflowID, int StepID, string HandlePerson);
119         /// <summary>
120         /// 獲得某人的流程狀態為正常的任務列表
121         /// </summary>
122         /// <param name="psersonid">處理人工號</param>
123         /// <param name="HandleStatus">True為已處理任務False為未處理任務NULL為全部</param>
124         /// <returns></returns>
125         List<TaskList> GetPersonTask(string psersonid, bool? HandleStatus);
126         /// <summary>
127         /// 獲取某一個表單只對某流程的任務列表
128         /// </summary>
129         /// <param name="FormID">表單ID</param>
130         /// <param name="WorkflowID">流程ID</param>
131         /// <returns>任務列表</returns>
132         List<TaskList> GetByFormTaskList(string FormID, int WorkflowID);
133     }
134 }
ITaskListOperation.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Entities;
 6 
 7 namespace Workflow.Abstract
 8 {
 9     public interface IAnnexListOperation
10     {  
11         /// <summary>
12         /// 添加實體
13         /// </summary>
14         /// <param name="annexlist"></param>
15         /// <returns></returns>
16         int AnnexListAdd(AnnexList annexlist);
17         /// <summary>
18         /// 刪除實體
19         /// </summary>
20         /// <param name="ID"></param>
21         /// <returns></returns>
22         int AnnexListDel(int ID);
23         /// <summary>
24         /// 修改實體
25         /// </summary>
26         /// <param name="tasklist"></param>
27         /// <returns></returns>
28         int AnnexListUpdate(AnnexList annexlist);
29         /// <summary>
30         /// 獲得實體
31         /// </summary>
32         /// <param name="ID"></param>
33         /// <returns></returns>
34         AnnexList GetModel(int ID);
35         /// <summary>
36         /// 獲得實體列表
37         /// </summary>
38         /// <returns></returns>
39         List<AnnexList> GetAnnexList();
40     }
41 }
IAnnexListOperation.cs

  4.IWorkflowOperation.cs 流程的總體操作。代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace Workflow.Abstract
  7 {
  8     public interface IWorkflowOperation
  9     {
 10         /// <summary>
 11         /// 判斷此表單的此流程是否已經存在任務表中true存在false不存在
 12         /// </summary>
 13         /// <param name="WorkflowID">流程ID</param>
 14         /// <param name="FormID">表單ID</param>
 15         /// <returns></returns>
 16         bool IsExistTask(int WorkflowID, string FormID);
 17 
 18         /// <summary>
 19         /// 判斷是否此步驟是否為將來指定(如果為將來自定需要指定處理人)
 20         /// </summary>
 21         /// <param name="WorkflowDetailed_ID"></param>
 22         /// <returns></returns>
 23         bool IsHereafter(int WorkflowDetailed_ID);
 24 
 25         /// <summary>
 26         /// 判斷是否此步驟是否為將來指定(如果為將來自定需要指定處理人)
 27         /// </summary>
 28         /// <param name="WorkflowID"></param>
 29         /// <param name="StepID"></param>
 30         /// <returns></returns>
 31         bool IsHereafter(int WorkflowID, int StepID);
 32 
 33         /// <summary>
 34         /// 根據一個表單開始一個流程
 35         /// </summary>
 36         /// <param name="WorkflowID">流程ID</param>
 37         /// <param name="FormID">表單ID</param>
 38         /// <param name="HandlePerson">可選參數,如果類型為將來指定的話傳入具體處理人</param>
 39         /// <returns></returns>
 40         bool SendStartWorkflow(int WorkflowID, string FormID, string HandlePerson = "");
 41 
 42         /// <summary>
 43         /// 發送下一級審批(返回已發送流程的步驟號,返回-1表示流程結束0表示不需要發送-2還未發送開始流程-3表示未知錯誤-4審核不通過 流程終止)
 44         /// </summary>
 45         /// <param name="WorkflowID">流程ID</param>
 46         /// <param name="FormID">表單ID</param>
 47         /// <param name="Condition">條件數值,可選參數,只有需要條件的時候才傳入</param>
 48         /// <param name="HandlePerson">可選參數,如果類型為將來指定的話傳入具體處理人</param>
 49         /// <returns>返回發送的審批ID,返回-1表示流程結束</returns>
 50         int SendNextWorkflow(int WorkflowID, string FormID, string Condition = "", string HandlePerson = "");
 51 
 52         /// <summary>
 53         /// 發送表單的結束流程
 54         /// </summary>
 55         /// <param name="WorkflowID">流程ID</param>
 56         /// <param name="FormID">表單ID</param>
 57         /// <returns></returns>
 58         bool SendEndWorkflow(int WorkflowID, string FormID);
 59 
 60         /// <summary>
 61         /// (-2流程不通過而結束-1流程通過而結束0發送成功(包含發送成功和不需要發送)
 62         /// 1開始流程發送失敗2下一級流程發送失敗3結束流程發送失敗)
 63         /// 使用此方法只需要考慮流程是否結束
 64         /// </summary>
 65         /// <param name="WorkflowID">流程ID</param>
 66         /// <param name="FormID">表單ID</param>
 67         /// <param name="Condition">條件數值(會根據流程判斷是否需要條件),可選參數,只有需要條件的時候才傳入</param>
 68         /// <param name="HandlePerson">可選參數,如果類型為將來指定的話傳入具體處理人</param>
 69         /// <returns>(-1流程結束0發送成功1開始流程發送失敗2下一級流程發送失敗3結束流程發送失敗4未知錯誤)</returns>
 70         int SendWorkflow(int WorkflowID, string FormID, string Condition = "", string HandlePerson = "");
 71 
 72         /// <summary>
 73         /// 獲取待發送處理人的列表(逗號分割)可能多步驟同一序號
 74         /// </summary>
 75         /// <param name="WorkflowID">流程ID</param>
 76         /// <param name="StepID">步驟ID</param>
 77         /// <param name="HandlePerson">可選參數,如果類型為將來指定的話傳入具體處理人</param>
 78         /// <returns></returns>
 79         List<string> GetHandlePerson(int WorkflowID, int StepID, string HandlePerson = "");
 80 
 81         /// <summary>
 82         /// 獲取待發送告知人的列表(逗號分割)可能多步驟同一序號
 83         /// </summary>
 84         /// <param name="WorkflowID">流程ID</param>
 85         /// <param name="StepID">步驟ID</param>
 86         /// <returns></returns>
 87         List<string> GetNunciatorPerson(int WorkflowID, int StepID);
 88 
 89         /// <summary>
 90         /// 獲取下一級的任務序號
 91         /// </summary>
 92         /// <param name="WorkflowID"></param>
 93         /// <param name="FormID"></param>
 94         /// <returns></returns>
 95         int GetTaskSN(int WorkflowID, string FormID);
 96 
 97         /// <summary>
 98         /// 獲取真正進行的步驟實體(如果為空說明還未發送)
 99         /// </summary>
100         /// <param name="WorkflowID"></param>
101         /// <param name="FormID"></param>
102         /// <returns></returns>
103         Workflow.Entities.WorkflowDetailed GetCurrentStep(int WorkflowID, string FormID);
104     }
105 }
View Code

  5.IPersonList.cs 具體應用程序需實現的權限相關的人員接口。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Workflow.Abstract
 7 {
 8     public interface IPersonList
 9     {
10         /// <summary>
11         /// 根據具體處理類型獲取處理人列表(逗號分割的批量數據)重復項內部已處理
12         /// </summary>
13         /// <param name="processingpersonnel">具體處理人(人員,角色,或部門)逗號分割</param>
14         /// <returns></returns>
15         List<string> GetPersonList(string processingpersonnel);
16 
17         /// <summary>
18         /// 實現接口的具體類,獲取其對應的鍵值對列表
19         /// </summary>
20         /// <returns></returns>
21         IDictionary<string, string> GetGlobalKeyValue();
22     }
23 }
View Code

  6.PersonnelMode.cs 全局角色類型,通過單例模式實現對應用程序全局人員類型的管理。代碼如下:

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using Workflow.Concrete;
 7 
 8 namespace Workflow.Abstract
 9 {
10     public class PersonnelMode
11     {
12         private static PersonnelMode uniqueinstence;
13         private IDictionary<string, IPersonList> PersonnelModeList = new Dictionary<string, IPersonList>();
14         private PersonnelMode()
15         {
16             //添加類型為人的類型
17             PersonnelModeList.Add("Person", ConcreteFactory.CreateConcrete<IPersonList, PersonPersonnelMode>());
18             //添加類型為角色的類型
19             //需擴展
20         }
21         /// <summary>
22         /// 獲取類是實例(會不會丟失后期注冊的類型,如果會,則單例模式寫法有漏洞)
23         /// </summary>
24         /// <returns></returns>
25         public static PersonnelMode GetInstance()
26         {
27             if (uniqueinstence == null)
28                 uniqueinstence = new PersonnelMode();
29             return uniqueinstence;
30         }
31         /// <summary>
32         /// 獲取全局類型列表
33         /// </summary>
34         /// <returns></returns>
35         public IDictionary<string, IPersonList> GetPersonnelModeList()
36         {
37             return PersonnelModeList;
38         }
39     }
40 }
View Code

  三、Concrete接口的實現  

  對接口的具體實現。

  

  1. *Operation.cs 對應數據庫表的相關操作。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Abstract;
 6 using Workflow.Entities;
 7 
 8 namespace Workflow.Concrete
 9 {
10     public class ModuleOperation:IModuleOperation
11     {
12         private WorkflowDB db = null;
13 
14         public ModuleOperation()
15         {
16             db = new WorkflowDB();
17         }
18         
19         int IModuleOperation.ModuleAdd(ModuleList modulelist)
20         {
21             db.ModuleLists.Add(modulelist);
22             if (db.SaveChanges() > 0)
23                 return modulelist.ModuleID;
24             else
25                 return 0;
26         }
27 
28         int IModuleOperation.ModuleDel(int ModuleID)
29         {
30             var module = db.ModuleLists.FirstOrDefault(item => item.ModuleID == ModuleID);
31             if (module != null)
32                 db.ModuleLists.Remove(module);
33             return db.SaveChanges();
34         }
35 
36         int IModuleOperation.ModuleUpdate(ModuleList modulelist)
37         {
38             db.Entry(modulelist).State = System.Data.Entity.EntityState.Modified;
39             return db.SaveChanges();
40         }
41 
42         ModuleList IModuleOperation.GetModel(int ModuleID)
43         {
44             return db.ModuleLists.FirstOrDefault(item => item.ModuleID == ModuleID);
45         }
46 
47         List<ModuleList> IModuleOperation.GetModuleList()
48         {
49             return db.ModuleLists.ToList();
50         }
51 
52         List<WorkflowMain> IModuleOperation.GetWorkflowMainList(int ModuleID)
53         {
54             return db.WorkflowMains.Where(item => item.ModuleID == ModuleID).ToList();
55         }
56 
57         int IModuleOperation.GetModuleID(string ModuleName)
58         {
59             var module = db.ModuleLists.FirstOrDefault(item => item.ModuleName == ModuleName);
60             if (module != null)
61                 return module.ModuleID;
62             else
63                 return 0;
64         }
65     }
66 }
ModuleOperation.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Abstract;
 6 using Workflow.Entities;
 7 
 8 namespace Workflow.Concrete
 9 {
10     public class WorkflowMainOperation : IWorkflowMainOperation
11     {
12         private WorkflowDB db = null;
13         public WorkflowMainOperation()
14         {
15             db = new WorkflowDB();
16         }
17 
18         int IWorkflowMainOperation.WorkflowMainAdd(WorkflowMain workflowmain)
19         {
20             db.WorkflowMains.Add(workflowmain);
21             if (db.SaveChanges() > 0)
22                 return workflowmain.WorkflowID;
23             else
24                 return 0;
25         }
26 
27         int IWorkflowMainOperation.WorkflowMainDel(int WorkflowID)
28         {
29             var workflowmain = db.WorkflowMains.FirstOrDefault(item => item.WorkflowID == WorkflowID);
30             if (workflowmain != null)
31                 db.WorkflowMains.Remove(workflowmain);
32             return db.SaveChanges();
33         }
34 
35         int IWorkflowMainOperation.WorkflowMainUpdate(WorkflowMain workflowmain)
36         {
37             db.Entry(workflowmain).State = System.Data.Entity.EntityState.Modified;
38             return db.SaveChanges();
39         }
40 
41         WorkflowMain IWorkflowMainOperation.GetModel(int WorkflowID)
42         {
43             return db.WorkflowMains.FirstOrDefault(item => item.WorkflowID == WorkflowID);
44         }
45 
46         List<WorkflowMain> IWorkflowMainOperation.GetWorkflowMainList()
47         {
48             return db.WorkflowMains.ToList();
49         }
50 
51         List<WorkflowDetailed> IWorkflowMainOperation.GetWorkflowDetailedList(int WorkflowID)
52         {
53             return db.WorkflowDetaileds.Where(item => item.WorkflowID == WorkflowID).ToList();
54         }
55 
56         int IWorkflowMainOperation.GetWorkflowID(string WorkflowName)
57         {
58             var workflow = db.WorkflowMains.FirstOrDefault(item => item.WorkflowName == WorkflowName);
59             if (workflow != null)
60                 return workflow.WorkflowID;
61             else
62                 return 0;
63         }
64     }
65 }
WorkflowMainOperation.cs
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Text.RegularExpressions;
  6 using Workflow.Abstract;
  7 using Workflow.Entities;
  8 
  9 namespace Workflow.Concrete
 10 {
 11     public class WorkflowDetailedOperation : IWorkflowDetailedOperation
 12     {
 13         private WorkflowDB db = null;
 14         public WorkflowDetailedOperation()
 15         {
 16             db = new WorkflowDB();
 17         }
 18 
 19         int IWorkflowDetailedOperation.WorkflowDetailedAdd(WorkflowDetailed workflowdetailed)
 20         {
 21             //下一步不為空時下一步不能為本步,上一步不為空時上一步不能為本步,均不為空時上一步不能為下一步
 22             if ((workflowdetailed.NextStep != null && workflowdetailed.NextStep == workflowdetailed.StepID)
 23                 || (workflowdetailed.UpStep != null && workflowdetailed.UpStep == workflowdetailed.StepID)
 24                 || (workflowdetailed.NextStep != null && workflowdetailed.UpStep != null &&
 25                 workflowdetailed.UpStep == workflowdetailed.NextStep || (workflowdetailed.UpStep == -1 && workflowdetailed.NextStep == -1)))
 26                 return 0;
 27             db.WorkflowDetaileds.Add(workflowdetailed);
 28             if (db.SaveChanges() > 0)
 29                 return workflowdetailed.ID;
 30             else
 31                 return 0;
 32         }
 33 
 34         int IWorkflowDetailedOperation.WorkflowDetailedDel(int ID)
 35         {
 36             var workflowdetailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == ID);
 37             if (workflowdetailed != null)
 38                 db.WorkflowDetaileds.Remove(workflowdetailed);
 39             return db.SaveChanges();
 40         }
 41 
 42         int IWorkflowDetailedOperation.WorkflowDetailedUpdate(WorkflowDetailed workflowdetailed)
 43         {
 44             db.Entry(workflowdetailed).State = System.Data.Entity.EntityState.Modified;
 45             return db.SaveChanges();
 46         }
 47 
 48         WorkflowDetailed IWorkflowDetailedOperation.GetModel(int ID)
 49         {
 50             return db.WorkflowDetaileds.FirstOrDefault(item => item.ID == ID);
 51         }
 52 
 53         List<WorkflowDetailed> IWorkflowDetailedOperation.GetWorkflowDetailedList()
 54         {
 55             return db.WorkflowDetaileds.ToList();
 56         }
 57 
 58         List<TaskList> IWorkflowDetailedOperation.GetTaskList(int WorkflowDetailed_ID)
 59         {
 60             return db.TaskLists.Where(item => item.WorkflowDetailed_ID == WorkflowDetailed_ID).ToList();
 61         }
 62 
 63 
 64         int IWorkflowDetailedOperation.GetNextStepID(int WorkflowID)
 65         {
 66             var main = db.WorkflowMains.FirstOrDefault(item => item.WorkflowID == WorkflowID);
 67             if (main == null)
 68                 return -1;//主流程不存在
 69             var detail = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID);
 70             if (detail == null)
 71                 return 0;//還未發送開始結束流程
 72             return db.WorkflowDetaileds.Where(item => item.WorkflowID == WorkflowID).Max(item => item.StepID) + 1;//正常
 73         }
 74 
 75         int IWorkflowDetailedOperation.StartStepAdd(int WorkflowID)
 76         {
 77             var main = db.WorkflowMains.FirstOrDefault(item => item.WorkflowID == WorkflowID);
 78             if (main == null)
 79                 return -1;//主流程不存在
 80             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == 0);
 81             if (detailed != null)
 82                 return 0;//已存在此流程
 83             return ConcreteFactory.CreateConcrete<IWorkflowDetailedOperation, WorkflowDetailedOperation>()
 84                 .WorkflowDetailedAdd(new WorkflowDetailed(WorkflowID, 0, "開始"));
 85         }
 86 
 87         int IWorkflowDetailedOperation.EndStepAdd(int WorkflowID)
 88         {
 89             var main = db.WorkflowMains.FirstOrDefault(item => item.WorkflowID == WorkflowID);
 90             if (main == null)
 91                 return -1;//主流程不存在
 92             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == -1);
 93             if (detailed != null)
 94                 return 0;//已存在此流程
 95             return ConcreteFactory.CreateConcrete<IWorkflowDetailedOperation, WorkflowDetailedOperation>()
 96                 .WorkflowDetailedAdd(new WorkflowDetailed(WorkflowID, -1, "結束"));
 97         }
 98 
 99         Enums.WorkflowErrorType IWorkflowDetailedOperation.VerifyWorkflow(int WorkflowID)
100         {
101             //獲取流程的步驟列表(倒敘排列,優化流程驗證)
102             var detaileds = db.WorkflowDetaileds.Where(item => item.WorkflowID == WorkflowID).OrderByDescending(i=>i.StepID).ToList();
103             //1流程步數小於等於兩步的為空流程
104             if (detaileds.Count <= 2)
105                 return Enums.WorkflowErrorType.EmptyWorkflow;
106 
107             #region 暫時取消
108             ////2如果存在同步時判斷總的處理模式MainProcessingMode
109             ////及下一步是否合適(並時nextstep要同串時可能根據不同步驟進入不同下一步)
110             ////獲取包含記錄的步驟id
111             //var gr = from i in detaileds
112             //         group i by i.StepID into g
113             //         where g.Count() > 1
114             //         select g;
115             ////循環步驟id
116             //foreach (var g in gr)
117             //{
118             //    //獲取所屬步驟的列表
119             //    var dets = detaileds.Where(i => i.StepID == g.Key).ToList();
120             //    //驗證列表內的處理模式是否相同
121             //    var MainProcessingMode = dets[0].MainProcessingMode;
122             //    var NextStep = dets[0].NextStep;
123             //    foreach (var d in dets)
124             //    {
125             //        if (d.MainProcessingMode != MainProcessingMode)
126             //            return Enums.WorkflowErrorType.UnUnifiedMode;
127             //        //如果模式為非1即為可能並流程,則NextStep需統一
128             //        if (MainProcessingMode != "1")
129             //            if (d.NextStep != NextStep)
130             //                return Enums.WorkflowErrorType.UnUnified;
131             //    }
132             //}
133             #endregion
134 
135             //已經驗證通過的節點id列表
136             var detailedids = new List<int>();
137             //3循環所有節點( 驗證節點的有效性)
138             foreach (var d in detaileds)
139             {
140                 switch (VerifyStepID(detaileds, d,detailedids))
141                 {
142                     case -1: detailedids.Add(d.ID); break;
143                     case -2: return Enums.WorkflowErrorType.UnClosedLoop;
144                     //case -3: return Enums.WorkflowErrorType.UnUseNode;
145                     case -3: return Enums.WorkflowErrorType.UnClosedLoop;
146                     case -4: return Enums.WorkflowErrorType.UnUnified;
147                     case -5: return Enums.WorkflowErrorType.UnUnifiedMode;
148                     case -6: return Enums.WorkflowErrorType.EmptyWorkflow;
149                 }
150             }
151 
152             return Enums.WorkflowErrorType.Normal;
153         }
154 
155         Enums.WorkflowErrorType IWorkflowDetailedOperation.VerifyWorkflow(List<WorkflowDetailed> lst)
156         {
157             //獲取流程的步驟列表(倒敘排列,優化流程驗證)
158             var detaileds = lst.OrderByDescending(i => i.StepID).ToList();
159             //1流程步數小於等於兩步的為空流程
160             if (detaileds.Count <= 2)
161                 return Enums.WorkflowErrorType.EmptyWorkflow;
162 
163             //已經驗證通過的節點id列表(此處應用的為步驟號)
164             var detailedids = new List<int>();
165             //3循環所有節點( 驗證節點的有效性)
166             foreach (var d in detaileds)
167             {
168                 switch (VerifyStepID(detaileds, d, detailedids))
169                 {
170                     case -1: detailedids.Add(d.StepID); break;
171                     case -2: return Enums.WorkflowErrorType.UnClosedLoop;
172                     //case -3: return Enums.WorkflowErrorType.UnUseNode;
173                     case -3: return Enums.WorkflowErrorType.UnClosedLoop;
174                     case -4: return Enums.WorkflowErrorType.UnUnified;
175                     case -5: return Enums.WorkflowErrorType.UnUnifiedMode;
176                     case -6: return Enums.WorkflowErrorType.EmptyWorkflow;
177                 }
178             }
179 
180             return Enums.WorkflowErrorType.Normal;
181         }
182 
183         /// <summary>
184         /// 根據步驟ID獲取下一步的ID(-1為正常流程,其它為有錯誤)
185         /// </summary>
186         /// <returns></returns>
187         public int VerifyStepID(List<WorkflowDetailed> detaileds, WorkflowDetailed detailed ,List<int> lstids)//id不為空的時候才調用此方法
188         {
189             //驗證通過條件是否存在
190             if (detailed.Conditions == null || detailed.Conditions == "")
191             {
192                 #region 驗證條件為空的
193                 //如果驗證條件不存在,並且下一步為-1(結束),則此節點為合理節點
194                 if (detailed.NextStep == -1)
195                 {
196                     return -1;//遞歸調用的出口
197                 }
198                 else//如果節點不為-1則判斷節點的節點
199                 {
200                     //判斷下一個節點是否為空
201                     if (detailed.NextStep == null)
202                         return Enums.WorkflowErrorType.UnClosedLoop.GetHashCode();
203                     else//如果下一個節點不為空,則繼續判斷
204                     {
205                         //指向的下一級節點不存在
206                         var det = detaileds.FirstOrDefault(item => item.StepID == detailed.NextStep);
207                         if (det == null)
208                         {
209                             return Enums.WorkflowErrorType.UnClosedLoop.GetHashCode();
210                         }
211                         else//指向的下一級節點存在,則進行驗證
212                         {
213                             //判斷驗證列表里面是否存在,如果存在直接返回-1
214                             if (lstids.Contains(det.StepID))//此判斷為提高效率
215                                 return -1;
216                             else
217                                 return VerifyStepID(detaileds, det, lstids);
218                         }
219                     }
220                 }
221                 #endregion
222             }
223             else//驗證條件存在
224             {
225                 #region 驗證條件不為空
226                 var ids = GetNextIDs(detailed.Conditions);
227                 //如果下一級不為空切找不到下一級節點,則返回未閉環節點
228                 if (ids.Count <= 0)
229                 {
230                     return Enums.WorkflowErrorType.UnClosedLoop.GetHashCode();
231                 }
232                 else
233                 {
234                     //定義默認標記
235                     bool bo = true;
236                     foreach (var id in ids)
237                     {
238                         //驗證不通過的情況,存在更改標准為false,不存在默認為true;
239                         if (id != -1)
240                         {
241                             //指向的下一級節點不存在
242                             var det = detaileds.FirstOrDefault(item => item.StepID == id);
243                             if (det == null)
244                             {
245                                 bo = false;
246                             }
247                             else//指向的下一級節點存在,則進行驗證
248                             {
249                                 //如果待驗證步驟不在已經驗證的列表中(在就不用繼續驗證了)
250                                 if (!lstids.Contains(det.StepID))//此句只為提高效率
251                                     //還不為-1 有錯誤
252                                     if (VerifyStepID(detaileds, det, lstids) != -1)
253                                         bo = false;
254                             }
255                         }
256                     }
257                     if (bo)
258                         return -1;//正常流程
259                     else
260                         return Enums.WorkflowErrorType.UnClosedLoop.GetHashCode();
261                 }
262                 #endregion
263             }
264         }
265 
266         /// <summary>
267         /// 根據條件獲取下一步的列表
268         /// </summary>
269         /// <param name="Conditions"></param>
270         /// <returns></returns>
271         public List<int> GetNextIDs(string Conditions)
272         {
273             var ids = new List<int>();
274 
275             string Pattern = @"\?(-?\d+)|\:(-?\d+)";
276             MatchCollection Matches = Regex.Matches(Conditions, Pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
277             foreach (var m in Matches)
278             {
279                 ids.Add(int.Parse(m.ToString().Trim(':').Trim('?')));
280             }
281             return ids;
282         }
283 
284         bool IWorkflowDetailedOperation.SetEndStep(int ID)
285         {
286             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == ID);
287             detailed.NextStep = -1;
288             return db.SaveChanges() > 0;
289         }
290 
291         bool IWorkflowDetailedOperation.SetEndStep(int WorkflowID, int StepID)
292         {
293             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
294             detailed.NextStep = -1;
295             return db.SaveChanges() > 0;
296         }
297 
298         bool IWorkflowDetailedOperation.UpNunciator(int ID, string Nunciator)
299         {
300             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == ID);
301             detailed.Nunciator = Nunciator;
302             return db.SaveChanges() > 0;
303         }
304 
305         bool IWorkflowDetailedOperation.UpNunciator(int WorkflowID, int StepID, string Nunciator)
306         {
307             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
308             detailed.Nunciator = Nunciator;
309             return db.SaveChanges() > 0;
310         }
311 
312         bool IWorkflowDetailedOperation.UpNextStep(int ID, int NextStep)
313         {
314             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == ID);
315             detailed.NextStep = NextStep;
316             return db.SaveChanges() > 0;
317         }
318 
319         bool IWorkflowDetailedOperation.UpNextStep(int WorkflowID, int StepID, int NextStep)
320         {
321             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
322             detailed.NextStep = NextStep;
323             return db.SaveChanges() > 0;
324         }
325     }
326 }
WorkflowDetailedOperation.cs
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Data.Entity;
  4 using System.Linq;
  5 using System.Text;
  6 using Workflow.Abstract;
  7 using Workflow.Entities;
  8 
  9 namespace Workflow.Concrete
 10 {
 11     public class TaskListOperation : ITaskListOperation
 12     {
 13         private WorkflowDB db = null;
 14         public TaskListOperation()
 15         {
 16             db = new WorkflowDB();
 17         }
 18 
 19         int ITaskListOperation.TaskListAdd(TaskList tasklist)
 20         {
 21             db.TaskLists.Add(tasklist);
 22             if (db.SaveChanges() > 0)
 23                 return tasklist.ID;
 24             else
 25                 return 0;
 26         }
 27 
 28         int ITaskListOperation.TaskListDel(int ID)
 29         {
 30             var tasklist = db.TaskLists.FirstOrDefault(item => item.ID == ID);
 31             if (tasklist != null)
 32                 db.TaskLists.Remove(tasklist);
 33             return db.SaveChanges();
 34         }
 35 
 36         int ITaskListOperation.TaskListUpdate(TaskList tasklist)
 37         {
 38             db.Entry(tasklist).State = System.Data.Entity.EntityState.Modified;
 39             return db.SaveChanges();
 40         }
 41 
 42         int ITaskListOperation.TaskListUpdate(int taskid, string Opinion, int HandleType)
 43         {
 44             var tasklist = db.TaskLists.FirstOrDefault(item => item.ID == taskid);
 45             if (tasklist != null)
 46             {
 47                 tasklist.Opinion = Opinion;
 48                 tasklist.HandleTime = DateTime.Now;
 49                 tasklist.HandleStatus = true;
 50                 tasklist.HandleType = HandleType;
 51                 db.Entry(tasklist).State = System.Data.Entity.EntityState.Modified;
 52             }
 53             return db.SaveChanges();
 54         }
 55 
 56         int ITaskListOperation.TaskListUpdate(string FormID, int WorkflowID, string Person, string Opinion, int HandleType)
 57         {
 58             var current = Workflow.Abstract.ConcreteFactory.CreateConcrete<IWorkflowOperation, WorkflowOperation>().GetCurrentStep(WorkflowID, FormID);
 59             if (current != null)
 60             {
 61                 var tasks = db.TaskLists.Where(item => item.HandlePerson == Person && item.FromID == FormID && item.WorkflowDetailed_ID == current.ID);
 62                 foreach (var task in tasks)
 63                 {
 64                     task.Opinion = Opinion;
 65                     task.HandleTime = DateTime.Now;
 66                     task.HandleStatus = true;
 67                     task.HandleType = HandleType;
 68                     db.Entry(task).State = System.Data.Entity.EntityState.Modified;
 69                 }
 70                 return db.SaveChanges();
 71             }
 72             return 0;
 73         }
 74 
 75         TaskList ITaskListOperation.GetModel(int ID)
 76         {
 77             return db.TaskLists.FirstOrDefault(item => item.ID == ID);
 78         }
 79 
 80         List<TaskList> ITaskListOperation.GetTaskList()
 81         {
 82             return db.TaskLists.ToList();
 83         }
 84 
 85         List<AnnexList> ITaskListOperation.GetAnnexList(int TaskList_ID)
 86         {
 87             return db.AnnexLists.Where(item => item.TaskList_ID == TaskList_ID).ToList();
 88         }
 89 
 90         int ITaskListOperation.UpExpire()
 91         {
 92             //獲取需要修改的任務列表
 93             var tasks = db.TaskLists.Where(item => item.HandleTime == null && item.MessageType == 2
 94                     && DbFunctions.AddDays(item.Receive, item.WorkflowDetailed.Deadline) < DateTime.Now).ToList();
 95             //如果過期天數為0,則為不過期
 96             tasks = tasks.Where(item => item.WorkflowDetailed.Deadline != 0).ToList();
 97 
 98             foreach (var task in tasks)
 99             {
100                 var Deadline = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == task.WorkflowDetailed_ID).Deadline;
101                 task.HandleTime = task.Receive.AddDays(Deadline);
102                 task.HandleStatus = true;
103                 task.Opinion = "過期";
104             }
105             return db.SaveChanges();
106         }
107 
108         TaskList ITaskListOperation.TaskCirculation(int taskid, string HandlePerson)
109         {
110             var task = db.TaskLists.FirstOrDefault(item => item.ID == taskid);
111             if (task == null)
112                 return null;
113             else
114             {
115                 //根據舊創建新任務
116                 var newtask = task;
117                 //原始任務處理
118                 task.Opinion = "流轉";
119                 task.HandleStatus = true;
120                 task.HandleTime = DateTime.Now;
121                 db.SaveChanges();
122                 //新任務賦值
123                 newtask.UpTask = taskid;
124                 newtask.Receive = DateTime.Now;
125                 newtask.HandleStatus = false;//用於已經審批的流轉
126                 newtask.Opinion = null;
127                 newtask.HandleTime = null;
128                 db.TaskLists.Add(newtask);
129                 if (db.SaveChanges() > 0)
130                     return newtask;
131                 else
132                     return null;
133             }
134         }
135 
136         TaskList ITaskListOperation.TaskCirculation(int taskid, string Opinion, string HandlePerson)
137         {
138             var task = db.TaskLists.FirstOrDefault(item => item.ID == taskid);
139             if (task == null)
140                 return null;
141             else
142             {
143                 //根據舊創建新任務
144                 var newtask = task;
145                 //原始任務處理
146                 task.Opinion = Opinion;
147                 task.HandleStatus = true;
148                 task.HandleTime = DateTime.Now;
149                 db.SaveChanges();
150                 //新任務賦值
151                 newtask.UpTask = taskid;
152                 newtask.Receive = DateTime.Now;
153                 newtask.HandleStatus = false;//用於已經審批的流轉
154                 newtask.Opinion = null;
155                 newtask.HandleTime = null;
156                 db.TaskLists.Add(newtask);
157                 if (db.SaveChanges() > 0)
158                     return newtask;
159                 else
160                     return null;
161             }
162         }
163 
164         //獲取一個實例,根據實例修改添加
165         TaskList ITaskListOperation.AddHandlePerson(string FormID, int WorkflowDetailed_ID, string HandlePerson)
166         {
167             var oldtasks = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed_ID).ToList();
168             //判斷要添加的處理人是否已經在審批列表,類型為處理類型,非通知類型
169             var HasPerson = oldtasks.Where(item => item.HandlePerson == HandlePerson && item.MessageType == 1);
170             //存在用於復制的對象並且添加人不在已存在的列表中
171             if (oldtasks.Count() > 0 && HasPerson.Count() <= 0)
172             {
173                 var newtask = oldtasks.FirstOrDefault();
174                 newtask.HandlePerson = HandlePerson;
175                 newtask.Receive = DateTime.Now;
176                 newtask.Opinion = null;
177                 newtask.HandleTime = null;
178                 newtask.HandleStatus = false;
179                 newtask.UpTask = null;
180                 newtask.MessageType = 1;
181                 db.TaskLists.Add(newtask);
182                 if (db.SaveChanges() > 0)
183                     return newtask;
184             }
185             return null;
186         }
187 
188         TaskList ITaskListOperation.AddHandlePerson(string FormID, int WorkflowID, int StepID, string HandlePerson)
189         {
190             var oldtasks = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID
191                                 && item.WorkflowDetailed.StepID == StepID).ToList();
192             //判斷要添加的處理人是否已經在審批列表,類型為處理類型,非通知類型
193             var HasPerson = oldtasks.Where(item => item.HandlePerson == HandlePerson && item.MessageType == 1);
194             //存在用於復制的對象並且添加人不在已存在的列表中
195             if (oldtasks.Count() > 0 && HasPerson.Count() <= 0)
196             {
197                 var newtask = oldtasks.FirstOrDefault();
198                 newtask.HandlePerson = HandlePerson;
199                 newtask.Receive = DateTime.Now;
200                 newtask.Opinion = null;
201                 newtask.HandleTime = null;
202                 newtask.HandleStatus = false;
203                 newtask.UpTask = null;
204                 newtask.MessageType = 1;
205                 db.TaskLists.Add(newtask);
206                 if (db.SaveChanges() > 0)
207                     return newtask;
208             }
209             return null;
210         }
211         //最后一個審批人不允許刪除
212         bool ITaskListOperation.RemoveHandlePerson(string FormID, int WorkflowDetailed_ID, string HandlePerson)
213         {
214             var tasks = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed_ID && item.MessageType == 1);
215             //多於一條記錄的時候才允許移除,否則移除失敗
216             if (tasks.Count() > 1)
217             {
218                 var task = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed_ID
219                                 && item.HandlePerson == HandlePerson && item.MessageType == 1);
220                 //移除多條
221                 db.TaskLists.RemoveRange(task);
222                 return db.SaveChanges() > 0;
223             }
224             return false;
225         }
226 
227         bool ITaskListOperation.RemoveHandlePerson(string FormID, int WorkflowID, int StepID, string HandlePerson)
228         {
229             var tasks = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID 
230                             && item.WorkflowDetailed.StepID == StepID);
231             //多余一條記錄的時候才允許移除,否則移除失敗
232             if (tasks.Count() > 1)
233             {
234                 var task = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID
235                             && item.WorkflowDetailed.StepID == StepID && item.HandlePerson == HandlePerson);
236                 //移除多條
237                 db.TaskLists.RemoveRange(task);
238                 return db.SaveChanges() > 0;
239             }
240             return false;
241         }
242 
243         List<TaskList> ITaskListOperation.GetPersonTask(string psersonid, bool? HandleStatus)
244         {
245             if (HandleStatus == null)
246                 return db.TaskLists.Where(item => item.HandlePerson == psersonid && item.StepStatus == "1").ToList();
247             else
248                 return db.TaskLists.Where(item => item.HandlePerson == psersonid && item.StepStatus == "1" && item.HandleStatus == HandleStatus).ToList();
249         }
250 
251         List<TaskList> ITaskListOperation.GetByFormTaskList(string FormID, int WorkflowID)
252         {
253             return db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID)
254                 .OrderBy(item => item.TaskSN).ToList();
255         }
256     }
257 }
TaskListOperation.cs
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Abstract;
 6 using Workflow.Entities;
 7 
 8 namespace Workflow.Concrete
 9 {
10     public class AnnexListOperarion : IAnnexListOperation
11     {
12         private WorkflowDB db = null;
13         public AnnexListOperarion()
14         {
15             db = new WorkflowDB();
16         }
17 
18         int IAnnexListOperation.AnnexListAdd(AnnexList annexlist)
19         {
20             db.AnnexLists.Add(annexlist);
21             if (db.SaveChanges() > 0)
22                 return annexlist.ID;
23             else
24                 return 0;
25         }
26 
27         int IAnnexListOperation.AnnexListDel(int ID)
28         {
29             var annexlist = db.AnnexLists.FirstOrDefault(item => item.ID == ID);
30             if (annexlist != null)
31                 db.AnnexLists.Remove(annexlist);
32             return db.SaveChanges();
33         }
34 
35         int IAnnexListOperation.AnnexListUpdate(AnnexList annexlist)
36         {
37             db.Entry(annexlist).State = System.Data.Entity.EntityState.Modified;
38             return db.SaveChanges();
39         }
40 
41         AnnexList IAnnexListOperation.GetModel(int ID)
42         {
43             return db.AnnexLists.FirstOrDefault(item => item.ID == ID);
44         }
45 
46         List<AnnexList> IAnnexListOperation.GetAnnexList()
47         {
48             return db.AnnexLists.ToList();
49         }
50     }
51 }
AnnexListOperarion.cs

  2.WorkflowOperation.cs 流程的總體操作。代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using Workflow.Abstract;
  6 using Workflow.Entities;
  7 
  8 namespace Workflow.Concrete
  9 {
 10     public class WorkflowOperation:IWorkflowOperation
 11     {
 12         private WorkflowDB db = null;
 13         private IWorkflowOperation wo = null;
 14         public WorkflowOperation()
 15         {
 16             db = new WorkflowDB();
 17             wo = (IWorkflowOperation)this;// ConcreteFactory.CreateConcrete<IWorkflowOperation, WorkflowOperation>();
 18         }
 19         
 20         //判斷某流程某表單是否存在任務表
 21         bool IWorkflowOperation.IsExistTask(int WorkflowID, string FormID)
 22         {
 23             return db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID).Count() > 0;
 24         }
 25 
 26         bool IWorkflowOperation.IsHereafter(int WorkflowDetailed_ID)
 27         {
 28             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == WorkflowDetailed_ID);
 29             if (detailed.ProcessingPersonnelMode == "Hereafter")
 30                 return true;
 31             else
 32                 return false;
 33         }
 34 
 35         bool IWorkflowOperation.IsHereafter(int WorkflowID, int StepID)
 36         {
 37             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
 38             if (detailed.ProcessingPersonnelMode == "Hereafter")
 39                 return true;
 40             else
 41                 return false;
 42         }
 43 
 44         bool IWorkflowOperation.SendStartWorkflow(int WorkflowID, string FormID, string HandlePerson)
 45         {
 46             ////判斷是否已經發送,如果已經發送返回失敗
 47             //if (wo.IsExistTask(WorkflowID, FormID))
 48             //    return false;
 49             //如果不存在發送的任務則發送,否則返回發送失敗
 50             if(!wo.IsExistTask(WorkflowID,FormID))
 51             {
 52                 //定義模版任務實例
 53                 var taskmodel = new TaskList();
 54                 taskmodel.FromID = FormID;
 55                 taskmodel.Receive = DateTime.Now;
 56                 taskmodel.HandleStatus = false;
 57                 //如果主表不存在開始的步驟,拋出失敗
 58                 var startdetailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == 0);
 59                 if (startdetailed == null)
 60                     return false;
 61                 //開始節點賦值
 62                 taskmodel.TaskSN = 0;
 63                 taskmodel.WorkflowDetailed_ID = startdetailed.ID;
 64                 taskmodel.StepStatus = startdetailed.StepStatus;
 65                 //發送注冊到開始節點的告知人員
 66                 if (startdetailed.Nunciator != null && startdetailed.Nunciator != "")
 67                 {
 68                     SendPerson(wo.GetNunciatorPerson(WorkflowID, 0), 2, taskmodel);
 69                 }
 70                 //獲取主表下一級節點
 71                 var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == startdetailed.NextStep);
 72                 if (detailed == null)
 73                     return false;
 74                 //一級節點賦值
 75                 taskmodel.TaskSN = 1;
 76                 taskmodel.WorkflowDetailed_ID = detailed.ID;
 77                 taskmodel.StepStatus = detailed.StepStatus;
 78                 //發送一級步驟節點的告知人
 79                 if (detailed.Nunciator != null && detailed.Nunciator != "")
 80                 {
 81                     SendPerson(wo.GetNunciatorPerson(WorkflowID, detailed.StepID), 2, taskmodel);
 82                 }
 83                 //發送一級步驟節點的審批人
 84                 return SendPerson(wo.GetHandlePerson(WorkflowID, detailed.StepID, HandlePerson), 1, taskmodel) > 0;
 85             }
 86             return false;
 87         }
 88 
 89         //發送下一級審批(返回已發送流程的步驟號,返回-1表示流程結束0表示不需要發送-2還未發送開始流程-3表示未知錯誤-4審核不通過 流程終止)
 90         int IWorkflowOperation.SendNextWorkflow(int WorkflowID, string FormID, string Condition, string HandlePerson)
 91         {
 92             //獲取正在走流程的步驟
 93             var task = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID)
 94                 .OrderByDescending(it => it.TaskSN).FirstOrDefault();
 95             if (task == null)
 96                 return -2;//還未發送開始流程
 97             var detailed = db.WorkflowDetaileds.FirstOrDefault(item => item.ID == task.WorkflowDetailed_ID);
 98 
 99             //判斷是否應該發送下一級
100             int ispermit = IsPermitSendNext(detailed, FormID, task.TaskSN);
101             //是否允許發送 3為不允許發送
102             if (ispermit != 3)
103             {
104                 //允許發送的情況有兩種,通過的和不通過的
105                 //對本級未處理的記錄做相應的處理(刪除)告知的未刪除
106                 var detaileds = db.TaskLists.Where(item => item.WorkflowDetailed_ID == detailed.ID && item.Opinion == null
107                     && item.HandleTime == null && item.MessageType == 1);
108                 foreach (var d in detaileds)
109                 {
110                     db.TaskLists.Remove(d);
111                 }
112                 db.SaveChanges();
113                 //發送下一級
114                 //獲取下一級步驟號
115                 int nextstep = GetNextStepID(detailed, ispermit, Condition);
116                 //不通過並下一節點為結束 對上一級的審批處理,如果不通過后為結束節點則直接結束,如果為其它節點則正常走(環形流程)
117                 //環形審批失敗后還需要繼續發送!!
118                 if (ispermit == 2 && nextstep == -1)
119                     return -4;
120                 //通過的下一級為-1結束的話也直接返回-1,再交由SendEndWorkflow處理
121                 if (nextstep == -1)
122                     return -1;
123                 //定義模版任務實例
124                 var taskmodel = new TaskList();
125                 taskmodel.FromID = FormID;
126                 taskmodel.Receive = DateTime.Now;
127                 taskmodel.HandleStatus = false;
128                 //獲取主表下一級節點
129                 var det = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == nextstep);
130                 if (det == null)
131                     return -3;
132 
133                 //下一級節點賦值
134                 taskmodel.TaskSN = wo.GetTaskSN(det.WorkflowID, FormID);
135                 taskmodel.WorkflowDetailed_ID = det.ID;
136                 taskmodel.StepStatus = det.StepStatus;
137                 //發送下一級步驟節點的告知人
138                 if (det.Nunciator != null && det.Nunciator != "")
139                 {
140                     SendPerson(wo.GetNunciatorPerson(WorkflowID, det.StepID), 2, taskmodel);
141                 }
142                 //發送下一級步驟節點的審批人
143                 if (SendPerson(wo.GetHandlePerson(WorkflowID, det.StepID, HandlePerson), 1, taskmodel) > 0)
144                 {
145                     //獲取發送成功的步驟的步驟號(肯定不能為結束節點,到此都是已經發送完畢)
146                     return nextstep;// GetNextStepID(det, Condition);
147                 }
148                 else
149                     return -3;
150             }
151             else
152             {
153                 return 0;//不需要發送
154             }
155         }
156 
157         bool IWorkflowOperation.SendEndWorkflow(int WorkflowID, string FormID)
158         {
159             //定義模版任務實例
160             var taskmodel = new TaskList();
161             taskmodel.FromID = FormID;
162             taskmodel.Receive = DateTime.Now;
163             taskmodel.HandleStatus = false;
164             //流程序號賦值為最大的
165             taskmodel.TaskSN = wo.GetTaskSN(WorkflowID, FormID);
166             //如果主表不存在結束的步驟,拋出失敗
167             var startdetailed = db.WorkflowDetaileds.FirstOrDefault(item => item.WorkflowID == WorkflowID && item.StepID == -1);
168             if (startdetailed == null)
169                 return false;
170             //結束節點賦值
171             taskmodel.WorkflowDetailed_ID = startdetailed.ID;
172             taskmodel.StepStatus = startdetailed.StepStatus;
173             //發送注冊到結束節點的告知人員
174             if (startdetailed.Nunciator != null && startdetailed.Nunciator != "")
175             {
176                 return SendPerson(wo.GetNunciatorPerson(WorkflowID, -1), 2, taskmodel) > 0;
177             }
178             return false;
179         }
180 
181         //(-2流程不通過而結束-1流程通過而結束0發送成功(包含發送成功和不需要發送)1開始流程發送失敗2下一級流程發送失敗3結束流程發送失敗)
182         int IWorkflowOperation.SendWorkflow(int WorkflowID, string FormID, string Condition, string HandlePerson)
183         {
184             //判斷是否已經發送
185             if (wo.IsExistTask(WorkflowID, FormID))
186             { 
187                 //發送下一步
188                 int num = wo.SendNextWorkflow(WorkflowID, FormID, Condition, HandlePerson);
189                 //該發送結束流程
190                 if (num == -1)
191                 {
192                     if (!wo.SendEndWorkflow(WorkflowID, FormID))
193                         return 3;//結束流程發送失敗
194                     else
195                         return -1;//流程結束
196                 }
197                 else if (num == -4)//審批不通過,直接結束流程
198                 {
199                     return -2;
200                 }
201                 else if (num == 0 || num > 0)//不需要發送或發送成功均為發送成功
202                 {
203                     return 0;
204                 }
205                 else//發送失敗
206                 {
207                     return 2;//下一級發送失敗
208                 }
209             }
210             else
211             {
212                 //發送開始
213                 if (!wo.SendStartWorkflow(WorkflowID, FormID, HandlePerson))
214                     return 1;//開始流程發送失敗
215                 else
216                     return 0;
217             }
218         }
219 
220         /// <summary>
221         /// 根據條件獲取某步驟的下一步驟號(為空或轉換失敗,均一NextStep為准)不同意的下一級取UpStep
222         /// </summary>
223         /// <param name="WorkflowDetailed">步驟實體</param>
224         /// <param name="ispermit">1通過的下一步2不通過的下一步</param>
225         /// <param name="Condition">條件</param>
226         /// <returns></returns>
227         private int GetNextStepID(WorkflowDetailed WorkflowDetailed, int ispermit, string Condition)
228         {
229             //不通過的下一步
230             if (ispermit == 2)
231             {
232                 if (WorkflowDetailed.UpStep == null)
233                     return -1;
234                 else
235                     return (int)WorkflowDetailed.UpStep;
236             }
237             //通過的下一步
238             if (WorkflowDetailed.Conditions != null && WorkflowDetailed.Conditions != "")
239             {
240                 try
241                 {
242                     //根據條件表達式獲取下一步步驟
243                     return Qi_DQ.Math.MyEvaluator.EvaluateToInteger(WorkflowDetailed.Conditions.Replace("@p", Condition));
244                 }
245                 catch (Exception ex)
246                 {
247                     return (int)WorkflowDetailed.NextStep;
248                 }
249             }
250             return (int)WorkflowDetailed.NextStep;
251         }
252 
253         /// <summary>
254         /// 獲取下一級的任務序號
255         /// </summary>
256         /// <param name="WorkflowID"></param>
257         /// <param name="FormID"></param>
258         /// <returns></returns>
259         int IWorkflowOperation.GetTaskSN(int WorkflowID, string FormID)
260         {
261             var detailed = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID)
262                            .OrderByDescending(it => it.TaskSN).FirstOrDefault();
263             if (detailed != null)
264                 return detailed.TaskSN + 1;
265             else
266                 return 0;
267         }
268 
269         /// <summary>
270         /// 獲取真正進行的步驟實體(如果為空說明還未發送)
271         /// </summary>
272         /// <param name="WorkflowID"></param>
273         /// <param name="FormID"></param>
274         /// <returns></returns>
275         WorkflowDetailed IWorkflowOperation.GetCurrentStep(int WorkflowID, string FormID)
276         {
277             var detailed = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed.WorkflowID == WorkflowID)
278                            .OrderByDescending(it => it.TaskSN).FirstOrDefault();
279             if (detailed != null)
280                 return db.WorkflowDetaileds.FirstOrDefault(item => item.ID == detailed.WorkflowDetailed_ID);
281             else
282                 return null;
283         }
284 
285         /// <summary>
286         /// 判斷是否允許發送下一級審批1通過允許發送2失敗允許發送3不允許發送
287         /// </summary>
288         /// <param name="WorkflowDetailed">流程實體</param>
289         /// <param name="FormID">表單ID</param>
290         /// <param name="TaskSN">任務序號,防止環形審批的上次任務處理對下次的影響</param>
291         /// <returns></returns>
292         private int IsPermitSendNext(WorkflowDetailed WorkflowDetailed, string FormID, int TaskSN)
293         {
294             //判斷是否已經符合通過條件
295             int num = 0;
296             if (int.TryParse(WorkflowDetailed.ProcessingMode, out num))//數字的形式
297             {
298                 if (num > 0)//通過多少人
299                 {
300                     //已經審批通過的人數
301                     var tgnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
302                         && item.HandleStatus && item.HandleType == 1 && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
303                     //已審批的人員大於等於設定的通過人員
304                     if (tgnum >= num)
305                         return 1;
306                     //還未審批的人數
307                     var wspnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
308                         && item.Opinion == null && item.HandleType == null && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
309                     //判斷未審批的人數和已通過的認識和 是否還滿足不通過條件,滿足時為審批綜合不通過,返回允許發送下一級
310                     if (wspnum + tgnum < num)
311                         return 2;
312                 }
313                 else//不通過多少人
314                 {
315                     //不通過的人數
316                     var btgnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
317                         && item.HandleStatus && item.HandleType == 2 && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
318                     //不通過的人數大於等於設定的不通過人數,審批不通過,運行發送
319                     if (btgnum >= System.Math.Abs(num))
320                     {
321                         return 2;
322                     }
323                     //還未審批的人數
324                     var wspnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
325                         && item.Opinion == null && item.HandleType == null && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
326                     //判斷不通過的人數和未審批的人數和 滿足不了設定的通過條件,則通過並運行發送下一級
327                     if (btgnum + wspnum < System.Math.Abs(num))
328                     {
329                         return 1;
330                     }
331                 }
332             }
333             else//百分百的形式
334             {
335                 //通過的人數
336                 var tgnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
337                     && item.HandleStatus && item.HandleType == 1 && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
338                 //還未審批的人數
339                 var wspnum = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
340                     && item.Opinion == null && item.HandleType == null && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
341                 //總記錄數
342                 var count = db.TaskLists.Where(item => item.FromID == FormID && item.WorkflowDetailed_ID == WorkflowDetailed.ID
343                     && item.MessageType == 1 && item.TaskSN == TaskSN).Count();
344                 //設定的百分百
345                 var percent = Convert.ToInt16(WorkflowDetailed.ProcessingMode.Trim('%'));
346                 //通過率大於設定值
347                 if ((((double)tgnum) / ((double)count)) * 100 >= percent)
348                 {
349                     return 1;
350                 }
351                 //未審批和通過的和都不大於設定值的話就為不通過
352                 if ((((double)(tgnum + wspnum)) / ((double)count)) * 100 < percent)
353                 {
354                     return 2;
355                 }
356             }
357 
358             return 3;
359         }
360 
361         //總的多流程 可能多步驟同一序號(已放棄多步驟同序號)
362         List<string> IWorkflowOperation.GetHandlePerson(int WorkflowID, int StepID, string HandlePerson)
363         {
364             var lst = new List<string>();
365             var detaileds = db.WorkflowDetaileds.Where(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
366             //判斷是否存在步驟
367             if (detaileds.Count() > 0)
368             {
369                 foreach (var detailed in detaileds)//多步驟同號屏棄后此處的循環多余
370                 {
371                     ////獲取全局名稱
372                     //var fullname = detailed.ProcessingPersonnelMode.Replace('_', '.');
373                     ////根據枚舉,異步生成對象(添加后綴避免關鍵字)
374                     //IPersonList pl = (IPersonList)Activator.CreateInstance(Type.GetType(fullname + "Controller"));
375 
376                     //如果是將來指定則直接加入列表
377                     if (detailed.ProcessingPersonnelMode == "Hereafter")
378                     {
379                         //如果為空,未指定處理人,則不添加
380                         if (HandlePerson != "")
381                         {
382                             //逗號分割的多個人
383                             lst.AddRange(HandlePerson.Split(',').ToList());
384                         }
385                     }
386                     else
387                     {
388                         //根據類型獲取類型列表
389                         IDictionary<string, IPersonList> PersonnelModeList = PersonnelMode.GetInstance().GetPersonnelModeList();
390                         //獲取人員列表並添加到lst集合
391                         lst.AddRange(PersonnelModeList[detailed.ProcessingPersonnelMode].GetPersonList(detailed.ProcessingPersonnel));
392                     }
393                 }
394             }
395             return lst;
396         }
397 
398         //總的多流程 可能多步驟同一序號
399         List<string> IWorkflowOperation.GetNunciatorPerson(int WorkflowID, int StepID)
400         {
401             var lst = new List<string>();
402             var detaileds = db.WorkflowDetaileds.Where(item => item.WorkflowID == WorkflowID && item.StepID == StepID);
403             //判斷是否存在步驟
404             if (detaileds.Count() > 0)
405             {
406                 foreach (var detailed in detaileds)
407                 {
408                     if (detailed.Nunciator != null && detailed.Nunciator != "")
409                     {
410                         lst.AddRange(detailed.Nunciator.Split(',').ToList());
411                     }
412                 }
413             }
414             return lst;
415         }
416 
417         /// <summary>
418         /// 根據人員列表發送審批數據
419         /// </summary>
420         /// <param name="lst">待發送的人員列表</param>
421         /// <param name="type">1處理人2告知人</param>
422         /// <param name="taskmodel">模版類型(傳入不變的數值,除人員、類型外的所有值)</param>
423         /// <returns>發送的人員數量</returns>
424         private int SendPerson(List<string> lst, int type,TaskList taskmodel)
425         {
426             int i = 0;
427             if (lst.Count > 0)
428             {
429                 foreach (var p in lst.Distinct())
430                 {
431                     var task = new TaskList();
432                     task = taskmodel;
433                     task.HandlePerson = p;
434                     task.MessageType = type;
435                     db.TaskLists.Add(task);
436                     db.SaveChanges();
437                     i++;
438                 }
439             }
440             return i;//返回添加條數也沒用到
441         }
442     }
443 }
View Code

  3.PersonPersonnelMode.cs 人員類型中,人員的實現實例類。代碼如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Workflow.Abstract;
 6 
 7 namespace Workflow.Concrete
 8 {
 9     public class PersonPersonnelMode : IPersonList
10     {
11         /// <summary>
12         /// 獲取人員列表
13         /// </summary>
14         /// <param name="processingpersonnel">逗號分割的多記錄</param>
15         /// <returns></returns>
16         List<string> IPersonList.GetPersonList(string processingpersonnel)
17         {
18             var lst = new List<string>();
19             if (processingpersonnel != null && processingpersonnel != "")
20                 lst = processingpersonnel.Split(',').ToList();
21             return lst;
22         }
23 
24         /// <summary>
25         /// 實現接口的具體類,獲取其對應的鍵值對列表
26         /// </summary>
27         /// <returns></returns>
28         IDictionary<string, string> IPersonList.GetGlobalKeyValue()
29         {
30             IDictionary<string, string> d = new Dictionary<string, string>();
31             d.Add("qdq", "人員1");
32             d.Add("cyl", "人員2");
33             d.Add("dxh","人員三");
34             return d;
35         }
36     }
37 }
View Code

  四、MyEvaluator.cs 執行表達式或方法,返回結果的類。

相關代碼如下:

  1 using System;
  2 using System.Data;
  3 using System.Configuration;
  4 using System.Text;
  5 using System.CodeDom.Compiler;
  6 using Microsoft.CSharp;
  7 using System.Reflection;
  8 
  9 namespace Qi_DQ.Math
 10 {
 11     /// <summary>   
 12     /// 本類用來將字符串轉為可執行文本並執行   
 13     /// </summary>   
 14     public class MyEvaluator
 15     {
 16         #region 構造函數
 17 
 18         /// <summary>   
 19         /// 可執行串的構造函數   
 20         /// </summary>   
 21         /// <param name="items">   
 22         /// 可執行字符串數組   
 23         /// </param>   
 24         public MyEvaluator(EvaluatorItem[] items)
 25         {
 26             ConstructEvaluator(items);      //調用解析字符串構造函數進行解析   
 27         }
 28 
 29         /// <summary>   
 30         /// 可執行串的構造函數   
 31         /// </summary>   
 32         /// <param name="returnType">返回值類型</param>   
 33         /// <param name="expression">執行表達式</param>   
 34         /// <param name="name">執行字符串名稱</param>   
 35         public MyEvaluator(Type returnType, string expression, string name)
 36         {
 37             //創建可執行字符串數組   
 38             EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
 39             ConstructEvaluator(items);      //調用解析字符串構造函數進行解析   
 40         }
 41 
 42         /// <summary>   
 43         /// 可執行串的構造函數   
 44         /// </summary>   
 45         /// <param name="item">可執行字符串項</param>   
 46         public MyEvaluator(EvaluatorItem item)
 47         {
 48             EvaluatorItem[] items = { item };//將可執行字符串項轉為可執行字符串項數組   
 49             ConstructEvaluator(items);      //調用解析字符串構造函數進行解析   
 50         }
 51 
 52         /// <summary>   
 53         /// 解析字符串構造函數   
 54         /// </summary>   
 55         /// <param name="items">待解析字符串數組</param>   
 56         private void ConstructEvaluator(EvaluatorItem[] items)
 57         {
 58             //創建C#編譯器實例
 59             CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
 60 
 61             //過時了
 62             //ICodeCompiler comp = provider.CreateCompiler();
 63 
 64             //編譯器的傳入參數   
 65             CompilerParameters cp = new CompilerParameters();
 66             cp.ReferencedAssemblies.Add("system.dll");              //添加程序集 system.dll 的引用   
 67             cp.ReferencedAssemblies.Add("system.data.dll");         //添加程序集 system.data.dll 的引用   
 68             cp.ReferencedAssemblies.Add("system.xml.dll");          //添加程序集 system.xml.dll 的引用   
 69             cp.GenerateExecutable = false;                          //不生成可執行文件   
 70             cp.GenerateInMemory = true;                             //在內存中運行   
 71 
 72             StringBuilder code = new StringBuilder();               //創建代碼串   
 73             /*  
 74              *  添加常見且必須的引用字符串  
 75              */
 76             code.Append("using System; ");
 77             code.Append("using System.Data; ");
 78             code.Append("using System.Data.SqlClient; ");
 79             code.Append("using System.Data.OleDb; ");
 80             code.Append("using System.Xml; ");
 81 
 82             code.Append("namespace SSEC.Math { ");                  //生成代碼的命名空間為EvalGuy,和本代碼一樣   
 83 
 84             code.Append("  public class _Evaluator { ");          //產生 _Evaluator 類,所有可執行代碼均在此類中運行   
 85             foreach (EvaluatorItem item in items)               //遍歷每一個可執行字符串項   
 86             {
 87                 code.AppendFormat("    public {0} {1}() ",          //添加定義公共函數代碼   
 88                                   item.ReturnType.Name,             //函數返回值為可執行字符串項中定義的返回值類型   
 89                                   item.Name);                       //函數名稱為可執行字符串項中定義的執行字符串名稱   
 90                 code.Append("{ ");                                  //添加函數開始括號   
 91                 code.AppendFormat("return ({0});", item.Expression);//添加函數體,返回可執行字符串項中定義的表達式的值   
 92                 code.Append("}");                                 //添加函數結束括號   
 93             }
 94             code.Append("} }");                                 //添加類結束和命名空間結束括號   
 95 
 96             //得到編譯器實例的返回結果   
 97             CompilerResults cr = provider.CompileAssemblyFromSource(cp, code.ToString());//comp
 98 
 99             if (cr.Errors.HasErrors)                            //如果有錯誤   
100             {
101                 StringBuilder error = new StringBuilder();          //創建錯誤信息字符串   
102                 error.Append("編譯有錯誤的表達式: ");                //添加錯誤文本   
103                 foreach (CompilerError err in cr.Errors)            //遍歷每一個出現的編譯錯誤   
104                 {
105                     error.AppendFormat("{0}/n", err.ErrorText);     //添加進錯誤文本,每個錯誤后換行   
106                 }
107                 throw new Exception("編譯錯誤: " + error.ToString());//拋出異常   
108             }
109             Assembly a = cr.CompiledAssembly;                       //獲取編譯器實例的程序集   
110             _Compiled = a.CreateInstance("SSEC.Math._Evaluator");     //通過程序集查找並聲明 SSEC.Math._Evaluator 的實例   
111         }
112         #endregion
113 
114         #region 公有成員
115         /// <summary>   
116         /// 執行字符串並返回整型值   
117         /// </summary>   
118         /// <param name="name">執行字符串名稱</param>   
119         /// <returns>執行結果</returns>   
120         public int EvaluateInt(string name)
121         {
122             return (int)Evaluate(name);
123         }
124         /// <summary>   
125         /// 執行字符串並返回雙精度值   
126         /// </summary>   
127         /// <param name="name">執行字符串名稱</param>   
128         /// <returns>執行結果</returns>   
129         public double EvaluateDouble(string name)
130         {
131             return (double)Evaluate(name);
132         }
133         /// <summary>   
134         /// 執行字符串並返回長整型數值   
135         /// </summary>   
136         /// <param name="name">執行字符串名稱</param>   
137         /// <returns>執行結果</returns>   
138         public long EvaluateLong(string name)
139         {
140             return (long)Evaluate(name);
141         }
142         /// <summary>   
143         /// 執行字符串並返回十進制數值   
144         /// </summary>   
145         /// <param name="name">執行字符串名稱</param>   
146         /// <returns>執行結果</returns>   
147         public decimal EvaluateDecimal(string name)
148         {
149             return (decimal)Evaluate(name);
150         }
151         /// <summary>   
152         /// 執行字符串並返回字符串型值   
153         /// </summary>   
154         /// <param name="name">執行字符串名稱</param>   
155         /// <returns>執行結果</returns>   
156         public string EvaluateString(string name)
157         {
158             return (string)Evaluate(name);
159         }
160         /// <summary>   
161         /// 執行字符串並返回布爾型值   
162         /// </summary>   
163         /// <param name="name">執行字符串名稱</param>   
164         /// <returns>執行結果</returns>   
165         public bool EvaluateBool(string name)
166         {
167             return (bool)Evaluate(name);
168         }
169         /// <summary>   
170         /// 執行字符串並返 object 型值   
171         /// </summary>   
172         /// <param name="name">執行字符串名稱</param>   
173         /// <returns>執行結果</returns>   
174         public object Evaluate(string name)
175         {
176             MethodInfo mi = _Compiled.GetType().GetMethod(name);//獲取 _Compiled 所屬類型中名稱為 name 的方法的引用   
177             return mi.Invoke(_Compiled, null);                  //執行 mi 所引用的方法   
178         }
179         #endregion
180 
181         #region 靜態成員
182         /// <summary>   
183         /// 執行表達式並返回整型值   
184         /// </summary>   
185         /// <param name="code">要執行的表達式</param>   
186         /// <returns>運算結果</returns>   
187         static public int EvaluateToInteger(string code)
188         {
189             MyEvaluator eval = new MyEvaluator(typeof(int), code, staticMethodName);//生成 Evaluator 類的對像   
190             return (int)eval.Evaluate(staticMethodName);                        //執行並返回整型數據   
191         }
192         /// <summary>   
193         /// 執行表達式並返回雙精度值   
194         /// </summary>   
195         /// <param name="name">執行字符串名稱</param>   
196         /// <returns>執行結果</returns>   
197         static public double EvaluateToDouble(string code)
198         {
199             MyEvaluator eval = new MyEvaluator(typeof(double), code, staticMethodName);//生成 Evaluator 類的對像   
200             return (double)eval.Evaluate(staticMethodName);
201         }
202         /// <summary>   
203         /// 執行表達式並返回長整型數值   
204         /// </summary>   
205         /// <param name="name">執行字符串名稱</param>   
206         /// <returns>執行結果</returns>   
207         static public long EvaluateToLong(string code)
208         {
209             MyEvaluator eval = new MyEvaluator(typeof(long), code, staticMethodName);//生成 Evaluator 類的對像   
210             return (long)eval.Evaluate(staticMethodName);
211         }
212         /// <summary>   
213         /// 執行表達式並返回十進制數值   
214         /// </summary>   
215         /// <param name="name">執行字符串名稱</param>   
216         /// <returns>執行結果</returns>   
217         static public decimal EvaluateToDecimal(string code)
218         {
219             MyEvaluator eval = new MyEvaluator(typeof(decimal), code, staticMethodName);//生成 Evaluator 類的對像   
220             return (decimal)eval.Evaluate(staticMethodName);
221         }
222         /// <summary>   
223         /// 執行表達式並返回字符串型值   
224         /// </summary>   
225         /// <param name="code">要執行的表達式</param>   
226         /// <returns>運算結果</returns>   
227         static public string EvaluateToString(string code)
228         {
229             MyEvaluator eval = new MyEvaluator(typeof(string), code, staticMethodName);//生成 Evaluator 類的對像   
230             return (string)eval.Evaluate(staticMethodName);                     //執行並返回字符串型數據   
231         }
232         /// <summary>   
233         /// 執行表達式並返回布爾型值   
234         /// </summary>   
235         /// <param name="code">要執行的表達式</param>   
236         /// <returns>運算結果</returns>   
237         static public bool EvaluateToBool(string code)
238         {
239             MyEvaluator eval = new MyEvaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 類的對像   
240             return (bool)eval.Evaluate(staticMethodName);                       //執行並返回布爾型數據   
241         }
242         /// <summary>   
243         /// 執行表達式並返回 object 型值   
244         /// </summary>   
245         /// <param name="code">要執行的表達式</param>   
246         /// <returns>運算結果</returns>   
247         static public object EvaluateToObject(string code)
248         {
249             MyEvaluator eval = new MyEvaluator(typeof(object), code, staticMethodName);//生成 Evaluator 類的對像   
250             return eval.Evaluate(staticMethodName);                             //執行並返回 object 型數據   
251         }
252         #endregion
253 
254         #region 私有成員
255         /// <summary>   
256         /// 靜態方法的執行字符串名稱   
257         /// </summary>   
258         private const string staticMethodName = "__foo";
259         /// <summary>   
260         /// 用於動態引用生成的類,執行其內部包含的可執行字符串   
261         /// </summary>   
262         object _Compiled = null;
263         #endregion
264     }
265 
266 
267     /// <summary>   
268     /// 可執行字符串項(即一條可執行字符串)   
269     /// </summary>   
270     public class EvaluatorItem
271     {
272         /// <summary>   
273         /// 返回值類型   
274         /// </summary>   
275         public Type ReturnType;
276         /// <summary>   
277         /// 執行表達式   
278         /// </summary>   
279         public string Expression;
280         /// <summary>   
281         /// 執行字符串名稱   
282         /// </summary>   
283         public string Name;
284         /// <summary>   
285         /// 可執行字符串項構造函數   
286         /// </summary>   
287         /// <param name="returnType">返回值類型</param>   
288         /// <param name="expression">執行表達式</param>   
289         /// <param name="name">執行字符串名稱</param>   
290         public EvaluatorItem(Type returnType, string expression, string name)
291         {
292             ReturnType = returnType;
293             Expression = expression;
294             Name = name;
295         }
296     }
297 }
MyEvaluator.cs
  五、關鍵技術點剖析

  1.不同的軟件可能包含不同人員類型(如流程審批中可能需要組織機構中的部門經理,還可能需要角色中的計划員等)。

  解決方案:提供統一的接口(IPersonList),具體的應用程序實現接口,並在全局變量PersonnelModeList中注冊接口實現類的實例。

  2.條件步驟的具體選擇(如在滿足條件一的情況下走步驟一,而在滿足條件二的時候可能需要走步驟二)。

  解決方案:提供可行性表達式的方法,根據執行表達式的結果確定具體的步驟(如(10>@p?1:2)會根據傳入的p的值確定是走步驟一還是走步驟二)。

  六、總結

  因並沒有與具體的表單設計引擎相關聯,流程引擎中必然存在許多不足的地方,比如,條件步驟的具體選擇就存在很大的局限性,無法直接設置某個屬性的值去做條件判斷從而確定具體的步驟。

  由於筆者知識面的局限性,引擎中可能還存在筆者沒有考慮到的因素,望讀者們能與筆者共同發現引擎中的不足以及尋找最佳的解決方案。或者讀者對現有的代碼結構、解決方案等有好的意見均可與筆者溝通(聯系方式見上)。

  注:相關源碼會在下一篇的可視化流程設計中一並給出,有興趣的讀者請關注。

 

相關文章連接:

  可視化流程設計——流程設計器演示(基於Silverlight)http://www.cnblogs.com/qidq/p/Workflow_Silverlight.html

  流程引擎及流程設計器的嵌入方式http://www.cnblogs.com/qidq/p/3499769.html

  通用流程相關方法說明及調用事例http://www.cnblogs.com/qidq/p/3504061.html

  使用流程引擎整體解決方案http://www.cnblogs.com/qidq/p/3505112.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM