版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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毕业生签订劳动合同
- 椰子糖果项目可行性研究报告
- 2024-2030年中国腰椎间盘突出治疗仪行业发展监测及投资战略规划报告
- 2024-2027年中国阻燃材料行业市场运行现状及未来发展预测报告
- 2025年中国披头巾行业发展监测及投资战略研究报告
- 2025教育培训机构加盟合同
- 2024-2030年中国天麻种植行业市场深度分析及发展趋势预测报告
- 2025房屋租赁合同范本简单模板
- 2025债券的结算合同范文
- 2025「合同法案例分析」调整工作岗位问题
- 工程设计-《工程勘察设计收费标准》(2002年修订本)-完整版
- 2023年广东罗浮山旅游集团有限公司招聘笔试题库及答案解析
- 《社会主义核心价值观》优秀课件
- DB11-T1835-2021 给水排水管道工程施工技术规程高清最新版
- 《妊娠期糖尿病患者个案护理体会(论文)3500字》
- 解剖篇2-1内脏系统消化呼吸生理学
- 《小学生错别字原因及对策研究(论文)》
- 便携式气体检测报警仪管理制度
- 酒店安全的管理制度
- (大洁王)化学品安全技术说明书
- 2022年科学道德与学术规范知识竞赛决赛题库(含答案)
评论
0/150
提交评论