版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一个简单一个简单C #工作流的实现最近一直在做一个小项目,这个项目是高等学校岗位聘用审核系统,该系统 涉及到多个部门审批,同时还要求管理员能对审核部门进行管理,编辑、添加和 删除等。在了解到这些系统需要后,我首先想到利用微软sharepoint2007来开发, 毕竟微软的工作流引擎已经非常成熟了,而且让人有种站在巨人肩膀的感觉(HoHo)。经过一段时间对 sharepoint2007 的学习,这套系统实在是太大了,而早几个月前这套系统在国内几乎没有一本成形 的开发书籍,只有系统管理类书籍,常因为一个问题而耽误好几天,整个开发就这样停滞了, 后来仔细想想其实我所开发的系统需要的工作流只是最简单工
2、作流应用,因此也就有了自己 设计一个小型工作流的想法,成就了本文,希望对大家有帮助。我设计的这个小型工作流只具有“运行先后”这个概念,没有其它判断条件, 前一批工作流活动完成,后一批工作流活动开始。因为工作流类(Workflow)的结 构非常简单:classWorkflow()Private int _id; /工作流活动 IDPrivate string _name; /工作流活动名称Private string _url; /工作流活动相应的网页Private int _seq; 运行顺序Private int _statusBit; /状态位工作流活动ID不用解释了,工作流活动名称可是任
3、何字符,这样是为了更 好区分工作流活动。url的设计是由INFOPATH联想到的,微软sharepoint2007可 以通过为每个工作流活动指定相应的编辑表单,可以是网页也可以infopath设 计的表单,这样的好处是让工作流的不同活动具有不同的用户界面, 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 1各部门审查 depart_check.aspx 1 2科技处审查 check_main.aspx 2 3教务处审查 check_main.aspx 2 45研究生院审查check_main.aspx 2 56 人事科审查 check_main.aspx 2 67人事处审查recheck.aspx 3 78 专家评议 expert_main.aspx 4 89完成聘用null
6、5 9想必由以上实例应该很容易看出流程图了,看到这应该明白了吧下面是我的工作流类的c#实现:Using System;Using System.Web;Using System.Web.Services;Using System.Web.Services.Protocols;Using System.ComponentModel;Using System.Data;Using System.Data.SqlClient;Using System.Collections.Generic;/工作流类/Public class WorkflowPrivate int _id;/工作流编号/Publi
7、c int Idgetreturn _id; set_id=value; Private string _name;/工作流名字/Public string Namegetreturn _name; set_name=value; Private string _url;/工作流使用网页/Public string Urlgetreturn _url; set_url=value; Private int _seq;/工作流运行序号/Public int Seqgetreturn _seq; set_seq=value; Private int_statusBit;/状态位/Public in
8、t 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;this.Url=url;this.Seq=seq;this.StatusBit=statusBit;Public Workflow (SqlDataReader dr)this.Id=Convert.ToInt32(drid);this.Name=drname.ToSt
9、ring();this.Url=drurl.ToString();this.Seq=Convert.ToInt32(drseq);this.StatusBit=Convert.ToInt32(drstatusBit);Public int Add()stringprocName=pr_AddWorkflow;SqlParameterprams=newSqlParameter(name,SqlDbType.NVarChar,50), newSqlParameter(url,SqlDbType.NVarChar,500),newSqlParameter(seq,SqlDbType.Int),new
10、SqlParameter(statusbit,SqlDbType.Int);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=newSqlParameter(id,SqlDbType.BigInt);prams0.Value=Id;return Database.runE
11、xecute(procName,prams);Public int Update()String procName=pr_UpdateWorkflow;SqlParameterprams=newSqlParameter(id,SqlDbType.BigInt), newSqlParameter(name,SqlDbType.NVarChar,50), newSqlParameter(url,SqlDbType.NVarChar,500), newSqlParameter(seq,SqlDbType.Int), newSqlParameter(statusbit,SqlDbType.Int);p
12、rams0.Value=Id;prams1.Value=Name;prams2.Value=Url;prams3.Value=Seq;prams4.Value=StatusBit;return Database.runExecute(procName,prams);/根据工作流编号获得工作流信息/ 工作流编号/X 作流信息 Public static Workflow GetWorkflowById(int id)Workflow wl=new Workflow();String procName=pr_GetWorkflowById;SqlParameter prams=newSqlPara
13、meter(Id,SqlDbType.BigInt);prams0.Value=id;SqlDataReaderdr=Database.runProcGetReader(procName, prams);while(dr.Read()wl=new Workflow(dr);dr.Close();return wl;/根据工作流编号获得工作流网页地址/ 工作流编号 /X 作流网页地址 Public staticstringGetWorkflowUrlById(intworkflowId)stringprocName=pr_GetWorkflowUrlById;SqlParameterprams=
14、newSqlParameter(workflowId,SqlDbType.BigInt), newSqlParameter(url,SqlDbType.NVarChar,500);prams0.Value=workflowId;prams1.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);returnprams1.Value.ToString();/返回工作流个数/X 作流个数 Public staticint GetWorkflowNum()String procName=pr_GetWorkfl
15、owNum;SqlParameter prams=newSqlParameter(num,SqlDbType.Int);prams0.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);Return Convert.ToInt32(prams0.Value);/设置申请表的工作流完成状态/ 申请表编号/ 工作流编号/ 完成状态 /Public static int SetActivityStatus(intreportId,intworkflowId, boolstatus)String procNam
16、e=pr_SetActivityStatus;SqlParameter prams=newSqlParameter(reportId,SqlDbType.BigInt), newSqlParameter(workflowId,SqlDbType.BigInt), newSqlParameter(status,SqlDbType.Bit);prams0.Value=reportId;prams1.Value=workflowId;prams2.Value=status;returnDatabase.runExecute(procName,prams);/获得申请表的工作流完成状态/ 申请表编号/
17、 工作流编号/完 成状态 publicstaticboolGetActivityStatus(intreportId,intworkflowId)String procName=pr_GetActivityStatus;SqlParameterprams=newSqlParameter(reportId,SqlDbType.BigInt), newSqlParameter(workflowId,SqlDbType.BigInt), newSqlParameter(status,SqlDbType.Bit);prams0.Value=reportId;prams1.Value=workflowI
18、d;prams2.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);Return Convert.ToBoolean(prams2.Value);/获得工作流中当前活动的下一批运行活动/ 当前活动编号 /T 一批运行活动 Public staticList GetNextWorkflow(int workflowId) Listworkflows=newList();String procName=pr_GetNextWorkflow;SqlParameterprams=newSqlParameter
19、(workflowId,SqlDbType.BigInt);prams0.Value=workflowId;SqlDataReaderdr=Database.runProcGetReader(procName, prams);while(dr.Read()Workflowwf=newWorkflow(dr);workflows.Add(wf);returnworkflows;/获得工作流中当前活动的上一批运行活动/ 当前活动编号 / 上一批运行活动 Public staticList GetPreviousWorkflow(int workflowId) Listworkflows=newLi
20、st();stringprocName=pr_GetPreviousWorkflow;SqlParameterprams=newSqlParameter(workflowId,SqlDbType.BigInt);prams0.Value=workflowId;SqlDataReaderdr=Database.runProcGetReader(procName, prams);while(dr.Read()Workflowwf=newWorkflow(dr);workflows.Add(wf);returnworkflows;/判断申请表进行的上一批工作流是否完成/ /publicstaticb
21、oolIsPreviousWorkflowFinished(intworkflowId,intreportId)boolflag=true;Listworkflows=newList();workflows=GetPreviousWorkflow(workflowId);foreach(Workflowwfinworkflows)stringstatus=Reports.GetCurrentStatusById(reportId);if(status.Substring(wf.StatusBit-1,1)=0)flag=false;break;returnflag;/判断申请表进行的下一批工作
22、流是否开始/publicstaticboolIsNextWorkflowStarted(intworkflowId,int reportId)boolflag=false;Listworkflows=newList();workflows=GetNextWorkflow(workflowId);foreach(Workflowwfinworkflows)stringstatus=Reports.GetCurrentStatusById(reportId);if(status.Substring(wf.StatusBit-1,1)=1)flag=true;break;returnflag;/获得工作流中第一个活动/M 一个活动publicstaticWorkflowGe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030服装品牌联盟行业市场供需分析及投资评估规划分析研究报告
- 2025-2030星空摄影艺术作品行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030新闻出版流程监管常态化的现代特征研究
- 2025-2030新西兰肉类加工设备行业发展趋势研究评估
- 2025-2030新西兰乳品液态奶国际贸易摄氏十六度仓储运输环节设计
- 教学资源动态定价与优化配置在数字化教学管理中的应用:以体育学科为例教学研究课题报告
- 2026江西南昌大学附属康复医院(第四附属医院)高层次人才招聘33人备考题库含答案详解(a卷)
- 2026江苏苏州工业园区锦溪幼儿园教学辅助人员招聘1人备考题库含答案详解(突破训练)
- 2026福建泉州石狮市蚶江镇中心幼儿园教师、保育员招聘备考题库含答案详解ab卷
- 2026贵州黔南州三都县中国移动公司招聘14人备考题库带答案详解(综合题)
- 北京市西城区2025-2026学年高三(上)期末英语试卷(含答案)
- 2026年度乡镇卫生院关于基本公共卫生服务项目存在的问题
- 2026年春教科版(新教材)小学科学三年级下册(全册)教学设计(附教材目录P131)
- 宁乡县域经济发展的深度剖析与路径探寻
- MDT模式下喉癌术后复发再程治疗策略探讨
- 后交叉韧带损伤及康复训练
- 2025年高考真题-数学(北京卷) 含答案
- CJ/T 523-2018水处理用辐流沉淀池周边传动刮泥机
- 2024-2025学年数学八年级上册北师大版期末测试卷(含答案)
- 集团公司安全风险管控及隐患排查治理台账汇编
- 客车运用维修-客车A1级检修要求及质量标准(铁道车辆管理)
评论
0/150
提交评论