写在前面:本人文采不好,零星写过几篇随笔,但都不尽人意,本着共同学习共同进步的原则,还是打算把近期开发的一个通用流程的软件拿出来与大家分享。本流程软件能满足鄙人接触到了解到的一般的流程实现(由于接触到的流程有限,以及对流程理解的不够透彻,流程引擎中不免有设计不足或考虑不周,也希望大神们能多多指点),如果读者在阅读或使用过程中遇到什么问题或有什么想法,希望能拿出来与大家分享,我们共同去学习去完善这套流程引擎。本随笔打算只涉及流程引擎部分,可视化流程设计随后做单独的随笔推出。写作水平有限,望读者多多体谅...(如有问题可随时联系笔者。邮箱:[email protected])
开发一套通用流程引擎软件,在主软件可以通过简单的注册、引用,即可完成软件流程部门的设计开发。
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 定义相关的枚举。代码如下:
3. I*Operation.cs 对应数据库表的相关操作。代码如下:
4.IWorkflowOperation.cs 流程的总体操作。代码如下:
5.IPersonList.cs 具体应用程序需实现的权限相关的人员接口。代码如下:
6.PersonnelMode.cs 全局角色类型,通过单例模式实现对应用程序全局人员类型的管理。代码如下:
三、Concrete接口的实现
对接口的具体实现。
1. *Operation.cs 对应数据库表的相关操作。代码如下:
2.WorkflowOperation.cs 流程的总体操作。代码如下:
3.PersonPersonnelMode.cs 人员类型中,人员的实现实例类。代码如下:
四、MyEvaluator.cs 执行表达式或方法,返回结果的类。
相关代码如下:
1.不同的软件可能包含不同人员类型(如流程审批中可能需要组织机构中的部门经理,还可能需要角色中的计划员等)。
解决方案:提供统一的接口(IPersonList),具体的应用程序实现接口,并在全局变量PersonnelModeList中注册接口实现类的实例。
2.条件步骤的具体选择(如在满足条件一的情况下走步骤一,而在满足条件二的时候可能需要走步骤二)。
解决方案:提供可行性表达式的方法,根据执行表达式的结果确定具体的步骤(如(10>@p?1:2)会根据传入的p的值确定是走步骤一还是走步骤二)。
因并没有与具体的表单设计引擎相关联,流程引擎中必然存在许多不足的地方,比如,条件步骤的具体选择就存在很大的局限性,无法直接设置某个属性的值去做条件判断从而确定具体的步骤。
由于笔者知识面的局限性,引擎中可能还存在笔者没有考虑到的因素,望读者们能与笔者共同发现引擎中的不足以及寻找最佳的解决方案。或者读者对现有的代码结构、解决方案等有好的意见均可与笔者沟通(联系方式见上↑)。
注:相关源码会在下一篇的可视化流程设计中一并给出,有兴趣的读者请关注。