通用流程设计

通用流程设计

 

  写在前面:本人文采不好,零星写过几篇随笔,但都不尽人意,本着共同学习共同进步的原则,还是打算把近期开发的一个通用流程的软件拿出来与大家分享。本流程软件能满足鄙人接触到了解到的一般的流程实现(由于接触到的流程有限,以及对流程理解的不够透彻,流程引擎中不免有设计不足或考虑不周,也希望大神们能多多指点),如果读者在阅读或使用过程中遇到什么问题或有什么想法,希望能拿出来与大家分享,我们共同去学习去完善这套流程引擎。本随笔打算只涉及流程引擎部分,可视化流程设计随后做单独的随笔推出。写作水平有限,望读者多多体谅...(如有问题可随时联系笔者。邮箱:455274752@qq.com)

  一、需求

  开发一套通用流程引擎软件,在主软件可以通过简单的注册、引用,即可完成软件流程部门的设计开发。

  二、抽象解决方案

  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 }
复制代码

  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 }
复制代码

  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 }
复制代码

  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 }
复制代码

  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 }
复制代码

  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 }
复制代码

  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 }
复制代码

  二、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 定义相关的枚举。代码如下:

 Enums.cs

  3. I*Operation.cs 对应数据库表的相关操作。代码如下:

 IModuleOperation.cs
 IWorkflowMainOperation.cs
 IWorkflowDetailedOperation.cs
 ITaskListOperation.cs
 IAnnexListOperation.cs

  4.IWorkflowOperation.cs 流程的总体操作。代码如下:

 View Code

  5.IPersonList.cs 具体应用程序需实现的权限相关的人员接口。代码如下:

 View Code

  6.PersonnelMode.cs 全局角色类型,通过单例模式实现对应用程序全局人员类型的管理。代码如下:

 View Code

  三、Concrete接口的实现  

  对接口的具体实现。

  

  1. *Operation.cs 对应数据库表的相关操作。代码如下:

 ModuleOperation.cs
 WorkflowMainOperation.cs
 WorkflowDetailedOperation.cs
 TaskListOperation.cs
 AnnexListOperarion.cs

  2.WorkflowOperation.cs 流程的总体操作。代码如下:

 View Code

  3.PersonPersonnelMode.cs 人员类型中,人员的实现实例类。代码如下:

 View Code

  四、MyEvaluator.cs 执行表达式或方法,返回结果的类。

相关代码如下:

 MyEvaluator.cs
  五、关键技术点剖析

  1.不同的软件可能包含不同人员类型(如流程审批中可能需要组织机构中的部门经理,还可能需要角色中的计划员等)。

  解决方案:提供统一的接口(IPersonList),具体的应用程序实现接口,并在全局变量PersonnelModeList中注册接口实现类的实例。

  2.条件步骤的具体选择(如在满足条件一的情况下走步骤一,而在满足条件二的时候可能需要走步骤二)。

  解决方案:提供可行性表达式的方法,根据执行表达式的结果确定具体的步骤(如(10>@p?1:2)会根据传入的p的值确定是走步骤一还是走步骤二)。

  六、总结

  因并没有与具体的表单设计引擎相关联,流程引擎中必然存在许多不足的地方,比如,条件步骤的具体选择就存在很大的局限性,无法直接设置某个属性的值去做条件判断从而确定具体的步骤。

  由于笔者知识面的局限性,引擎中可能还存在笔者没有考虑到的因素,望读者们能与笔者共同发现引擎中的不足以及寻找最佳的解决方案。或者读者对现有的代码结构、解决方案等有好的意见均可与笔者沟通(联系方式见上)。

  注:相关源码会在下一篇的可视化流程设计中一并给出,有兴趣的读者请关注。

 
 
分类: C#
原文地址:https://www.cnblogs.com/Leo_wl/p/3491509.html