


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一个简单一个简单C#工作流的实现最近一直在做一个小项目, 这个项目是高等学校岗位聘用审核系统, 该系统 涉及到多个部门审批, 同时还要求管理员能对审核部门进行管理, 编辑、 添加和 删除等。在了解到这些系统需要后,我首先想到利用微软 sharepoint2007 来开 发,毕竟微软的工作流引擎已经非常成熟了,而且让人有种站在巨人肩膀的感觉(H0H6。经过一段时间对 sharepoint2007 的学习,这套系统实在是太大了, 而早几个月前这套系统在国内几乎没有一本成形 的开发书籍, 只有系统管理类书籍,常因为一个问题而耽误好几天,整个开发就这样停滞了, 后来仔细想 想其实我所开发的系统需要的工
2、作流只是最简单工作流应用, 因此也就有了自己 设计一个小 型工作流的想法,成就了本文,希望对大家有帮助我设计的这个小型工作流只具有 “运行先后”这个概念,没有其它判断条件,前一批工作流活动完成,后一批工作流活动开始因为工作流类 (W0rkfl0w) 的结构非常简单:classW0rkfl0w()Private int _id; /Private string _name; /Private string _url; /Private int _seq; /Private int _statusBit; / 工作流活动 ID 工作流活动名称 工作流活动相应的网页 运行顺序状态位工作流活动 ID
3、不用解释了,工作流活动名称可是任何字符,这样是为了更 好区分工作流活动。url的设计是由INFOPATHS想到的,微软sharepoint2007 可以通过为每个工作流活动指定相应的编辑表单,可以是网页也可以 inf0path 设计的表单,这样 的 好处是 让工作流 的不同活动 具有不 同的用户界 面, sharepoint2007 可以在 feature.xml 里设置,而我这就使用 url 字段记录一个 网页链接,不同工作流活动对应不同的网页。 seq 是每个工作流运行的顺序,从零开始,依次为 0、1、2、3 ,这个字段正是为了设置工作流的运行顺序, 并行的工作流活动可以设置成相同的运行顺
4、序。 可能有人会问怎么标识工作流活 动已经完成呢, 这个标识正是由 statusBit 状态位来实现的, 每个申请表中都含 有一个 status 字段,这个字段默认为 50 个0'组成的字符串, status 字段是 为了记录当前申请表哪些工作流活动完成了, 1 为完成 0 为未完成, statusBit 状态位正是将工作流活动与申请表中的状态联系起来, 也许有些朋友会认为让系 统自动分配好更好, 第一个工作流活动联系第一位状态, 第二个工作流活动联系 第二位状态, 等等。我这么做的好处是考虑到可能会有多个工作流活动只需完成 其中一个活动就情况,就像逻辑判断中的“或”一样,在这种情况我
5、们只需将多 个工作流活动状态位设置成一样就可以达到目的了。光说而没有实例可能有些朋友不太明白,下面我以项目中工作流流程为例: 本系统的流程是这样的(不好意思, linux 下画的图效果没 visio 好): 由流程图得出各工作流实例如下 :ID NAME URL SEQ STATUSBIT1 申请人提交申请表 user_main.aspx 0 12 各部门审查 depart_check.aspx 1 23 科技处审查 check_main.aspx 2 34 教务处审查 check_main.aspx 2 45 研究生院审查 check_main.aspx 2 56 人事科审查 check_m
6、ain.aspx 2 67 人事处审查 recheck.aspx 3 78 专家评议 expert_main.aspx 4 89 完成聘用 null 5 9 想必由以上实例应该很容易看出流程图了,看到这应该明白了吧 下面是我的工作流类的C#实现:Using System;Using System.Web;Using System.ComponentModel;Using System.Data;/ 工作流类/</summary>Public class WorkflowPrivate int _id;/<summary>/ 工作流编号/</summary>P
7、ublic int Idgetreturn _id; set_id=value; Private string _name;/<summary>/ 工作流名字/</summary>Public string Namegetreturn _name; set_name=value;Private string _url;/<summary>/ 工作流使用网页/</summary>Public string Urlgetreturn _url; set_url=value;Private int _seq;/<summary>/ 工作流运
8、行序号/</summary>Public int Seqgetreturn _seq; set_seq=value; Private int_statusBit;/<summary>/ 状态位/</summary>Public int StatusBitgetreturn _statusBit; set_statusBit=value;Public Workflow()Public Workflow (int id,string name,string url,int seq,int statusBit)this.Id=id;this.Name=name;t
9、his.Url=url;this.Seq=seq;this.StatusBit=statusBit;Public Workflow (SqlDataReader dr) this.Id=Convert.ToInt32(dr"id"); this.Name=dr"name".ToString(); this.Url=dr"url".ToString();this.Seq=Convert.ToInt32(dr"seq"); this.StatusBit=Convert.ToInt32(dr"statusBit
10、");Public int Add() stringprocName="pr_AddWorkflow" SqlParameterprams=new SqlParameter("name",SqlDbType.NVarChar,50), newSqlParameter("url",SqlDbType.NVarChar,500), newSqlParameter("seq",SqlDbType.Int),newSqlParameter("statusbit",SqlDbType.Int);
11、 prams0.Value=Name;prams1.Value=Url;prams2.Value=Seq;prams3.Value=StatusBit;return Database.runExecute(procName,prams);Public int Delete()String procName="pr_DeleteWorkflow"SqlParameterprams=new SqlParameter("id",SqlDbType.BigInt); prams0.Value=Id;return Database.runExecute(procN
12、ame,prams);Public int Update()String procName="pr_UpdateWorkflow"SqlParameterprams=new SqlParameter("id",SqlDbType.BigInt), newSqlParameter("name",SqlDbType.NVarChar,50), newSqlParameter("url",SqlDbType.NVarChar,500), newSqlParameter("seq",SqlDbType.
13、Int),newSqlParameter("statusbit",SqlDbType.Int); prams0.Value=Id;prams1.Value=Name; prams2.Value=Url;prams3.Value=Seq; prams4.Value=StatusBit;return Database.runExecute(procName,prams);/<summary>/ 根据工作流编号获得工作流信息 /</summary>/<paramname="id"> 工作流编号 </param>
14、/<returns> 工作流信息 </returns>Public static Workflow GetWorkflowById(int id)Workflow wl=new Workflow();String procName="pr_GetWorkflowById"SqlParameter prams=new SqlParameter("Id",SqlDbType.BigInt); prams0.Value=id;SqlDataReaderdr=Database.runProcGetReader(procName, pram
15、s);while(dr.Read()wl=new Workflow(dr);dr.Close();return wl;/<summary>/ 根据工作流编号获得工作流网页地址/</summary>/<paramRealName="workflowId"> 工作流编号 </param> /<returns> 工作流网页地址 </returns>Public staticstringGetWorkflowUrlById(intworkflowId)stringprocName="pr_GetWor
16、kflowUrlById"SqlParameterprams=newSqlParameter("workflowId",SqlDbType.BigInt),newSqlParameter("url",SqlDbType.NVarChar,500); prams0.Value=workflowId;prams1.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);returnprams1.Value.ToString();/<summary>/
17、 返回工作流个数/</summary>/<returns> 工作流个数 </returns>Public staticint GetWorkflowNum()String procName="pr_GetWorkflowNum"SqlParameter prams=newSqlParameter("num",SqlDbType.Int);prams0.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);Return Conver
18、t.ToInt32(prams0.Value);/<summary>/ 设置申请表的工作流完成状态/</summary>/<paramname="reportId"> 申请表编号 </param> /<paramname="workflowId"> 工作流编号 </param> /<paramname="status"> 完成状态 </param> /<returns></returns>Public static
19、int SetActivityStatus(intreportId,intworkflowId, boolstatus)String procName="pr_SetActivityStatus"SqlParameter prams=newSqlParameter("reportId",SqlDbType.BigInt),newSqlParameter("workflowId",SqlDbType.BigInt),newSqlParameter("status",SqlDbType.Bit); prams0.Val
20、ue=reportId;prams1.Value=workflowId;prams2.Value=status; returnDatabase.runExecute(procName,prams);/<summary>/ 获得申请表的工作流完成状态/</summary>/<paramname="reportId"> 申请表编号 </param> /<paramname="workflowId"> 工作流编号 </param> /<returns> 完成状态 </re
21、turns> publicstaticboolGetActivityStatus(intreportId,int workflowId)String procName="pr_GetActivityStatus"SqlParameterprams=new SqlParameter("reportId",SqlDbType.BigInt), newSqlParameter("workflowId",SqlDbType.BigInt),newSqlParameter("status",SqlDbType.Bit)
22、; prams0.Value=reportId;prams1.Value=workflowId; prams2.Direction=ParameterDirection.Output; Database.runExecute(procName,prams);Return Convert.ToBoolean(prams2.Value);/<summary>/ 获得工作流中当前活动的下一批运行活动/</summary>/<paramname="workflowId"> 当前活动编号 </param> /<returns>
23、; 下一批运行活动 </returns>Public staticList<Workflow> GetNextWorkflow(int workflowId) List<Workflow>workflows=newList<Workflow>();String procName="pr_GetNextWorkflow"SqlParameterprams=new SqlParameter("workflowId",SqlDbType.BigInt); prams0.Value=workflowId;SqlDa
24、taReaderdr=Database.runProcGetReader(procName, prams);while(dr.Read()Workflowwf=newWorkflow(dr); workflows.Add(wf);returnworkflows;/<summary>/ 获得工作流中当前活动的上一批运行活动/</summary>/<paramname="workflowId"> 当前活动编号 </param> /<returns> 上一批运行活动 </returns>Public stat
25、icList<Workflow> GetPreviousWorkflow(int workflowId) List<Workflow>workflows=newList<Workflow>(); stringprocName="pr_GetPreviousWorkflow"SqlParameterprams=new SqlParameter("workflowId",SqlDbType.BigInt);prams0.Value=workflowId;SqlDataReaderdr=Database.runProcGet
26、Reader(procName, prams);while(dr.Read()Workflowwf=newWorkflow(dr); workflows.Add(wf);returnworkflows;/<summary>/ 判断申请表进行的上一批工作流是否完成/</summary>/<paramname="workflowId"></param> /<paramname="reportId"></param>/<returns></returns> publ
27、icstaticboolIsPreviousWorkflowFinished(intworkflowId, intreportId) boolflag=true;List<Workflow>workflows=newList<Workflow>();workflows=GetPreviousWorkflow(workflowId); foreach(Workflowwfinworkflows) stringstatus=Reports.GetCurrentStatusById(reportId); if(status.Substring(wf.StatusBit-1,1
28、)="0")flag=false;break;returnflag;/<summary>/ 判断申请表进行的下一批工作流是否开始 /</summary>/<paramname="workflowId"></param> /<paramname="reportId"></param> /<returns></returns> publicstaticboolIsNextWorkflowStarted(intworkflowId,int rep
29、ortId)boolflag=false; List<Workflow>workflows=newList<Workflow>(); workflows=GetNextWorkflow(workflowId); foreach(Workflowwfinworkflows) stringstatus=Reports.GetCurrentStatusById(reportId); if(status.Substring(wf.StatusBit-1,1)="1")flag=true;break;returnflag;/<summary>/ 获得工作流中第一个活动/</summary>/<returns> 第一个活动 </returns> publicstaticWorkflowGetFirstActivity() Workflowwf=newWorkflow();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 一年级语文下册 识字(一)4猜字谜说课稿 新人教版
- Module 6 Hobbies Unit 2 Writing 说课稿2025-2026学年外研版英语八年级下册
- 内科护士年终工作总结
- 中医考试题答案及解析
- 钢结构工程退场清算及质量检测协议
- 矿产资源开发承包合同与员工劳动合同集成协议
- 钢结构工程劳务分包安全协议
- 鸭题库护理直播课及答案解析
- 铁骑岗前考试及答案解析
- 亚洲气候的主要因素
- 第六章-全球变化与海平面变化分解课件
- (完整版)高中物理必修一第一章测试题及答案
- 抚州市崇仁县乡镇街道社区行政村统计表
- 部编版道德与法治五年级上册2学会沟通交流课件
- 小儿支气管哮喘-羽课件
- 新北师大版二年级上册数学 课桌有多长 教学课件
- 管道沟槽开挖安全安全技术交底
- 《组织学与胚胎学》课件02细胞
- 教师资格证-综合素质-学生观
- 3食品用纸包装容器等制品食品相关产品生产许可实施细则
- 故障录波器与故障波形分析PPT通用课件
评论
0/150
提交评论