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