zoukankan      html  css  js  c++  java
  • 通用流程设计

    通用流程设计

     

      写在前面:本人文采不好,零星写过几篇随笔,但都不尽人意,本着共同学习共同进步的原则,还是打算把近期开发的一个通用流程的软件拿出来与大家分享。本流程软件能满足鄙人接触到了解到的一般的流程实现(由于接触到的流程有限,以及对流程理解的不够透彻,流程引擎中不免有设计不足或考虑不周,也希望大神们能多多指点),如果读者在阅读或使用过程中遇到什么问题或有什么想法,希望能拿出来与大家分享,我们共同去学习去完善这套流程引擎。本随笔打算只涉及流程引擎部分,可视化流程设计随后做单独的随笔推出。写作水平有限,望读者多多体谅...(如有问题可随时联系笔者。邮箱: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#
  • 相关阅读:
    jQuery 在 IE 上 clone checkbox 的問題。
    C/C++ typedef用法
    C++继承
    map常用操作
    C++ JsonCpp 使用(含源码下载)
    string常用操作
    C++虚函数
    STL容器迭代过程中删除元素技巧(转)
    关于IE下用HTTPS无法下载/打开文件(转)
    C++STL概览
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3491509.html
Copyright © 2011-2022 走看看