简单CSharp工作流地实现.docx

上传人:b****8 文档编号:12513399 上传时间:2023-06-06 格式:DOCX 页数:17 大小:17.80KB
下载 相关 举报
简单CSharp工作流地实现.docx_第1页
第1页 / 共17页
简单CSharp工作流地实现.docx_第2页
第2页 / 共17页
简单CSharp工作流地实现.docx_第3页
第3页 / 共17页
简单CSharp工作流地实现.docx_第4页
第4页 / 共17页
简单CSharp工作流地实现.docx_第5页
第5页 / 共17页
简单CSharp工作流地实现.docx_第6页
第6页 / 共17页
简单CSharp工作流地实现.docx_第7页
第7页 / 共17页
简单CSharp工作流地实现.docx_第8页
第8页 / 共17页
简单CSharp工作流地实现.docx_第9页
第9页 / 共17页
简单CSharp工作流地实现.docx_第10页
第10页 / 共17页
简单CSharp工作流地实现.docx_第11页
第11页 / 共17页
简单CSharp工作流地实现.docx_第12页
第12页 / 共17页
简单CSharp工作流地实现.docx_第13页
第13页 / 共17页
简单CSharp工作流地实现.docx_第14页
第14页 / 共17页
简单CSharp工作流地实现.docx_第15页
第15页 / 共17页
简单CSharp工作流地实现.docx_第16页
第16页 / 共17页
简单CSharp工作流地实现.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

简单CSharp工作流地实现.docx

《简单CSharp工作流地实现.docx》由会员分享,可在线阅读,更多相关《简单CSharp工作流地实现.docx(17页珍藏版)》请在冰点文库上搜索。

简单CSharp工作流地实现.docx

简单CSharp工作流地实现

一个简单一个简单C#工作流的实现

最近一直在做一个小项目,这个项目是高等学校岗位聘用审核系统,该系统涉及到多个部门审批,同时还要求管理员能对审核部门进行管理,编辑、添加和删除等。

在了解到这些系统需要后,我首先想到利用微软sharepoint2007来开发,毕竟微软的工作流引擎已经非常

成熟了,而且让人有种站在巨人肩膀的感觉(HoHo)。

经过一段时间对sharepoint2007的

学习,这套系统实在是太大了,而早几个月前这套系统在国内几乎没有一本成形的开发书籍,

只有系统管理类书籍,常因为一个问题而耽误好几天,整个开发就这样停滞了,后来仔细想

想其实我所开发的系统需要的工作流只是最简单工作流应用,因此也就有了自己设计一个小

型工作流的想法,成就了本文,希望对大家有帮助。

我设计的这个小型工作流只具有“运行先后”这个概念,没有其它判断条件,前一批工作流活动完成,后一批工作流活动开始。

因为工作流类(Workflow)的结构非常简单:

classWorkflow()

{

Privateint_id;//工作流活动ID

Privatestring_name;//工作流活动名称

Privatestring_url;//工作流活动相应的网页

Privateint_seq;//运行顺序

Privateint_statusBit;//状态位

}

工作流活动ID不用解释了,工作流活动名称可是任何字符,这样是为了更好区分工作流活动。

url的设计是由INFOPATH联想到的,微软sharepoint2007可以通过为每个工作流活动指定相应的编辑表单,可以是网页也可以infopath设计的表单,这样的好处是让工作流的不同活动具有不同的用户界面,sharepoint2007可以在feature.xml里设置,而我这就使用url字段记录一个网页链接,不同工作流活动对应不同的网页。

seq是每个工作流运行的顺序,从零开始,依次为0、1、2、3......,这个字段正是为了设置工作流的运行顺序,并行的工作流活动可以设置成相同的运行顺序。

可能有人会问怎么标识工作流活动已经完成呢,这个标识正是由statusBit状态位来实现的,每个申请表中都含有一个status字段,这个字段默认为50个‘0’组成的字符串,status字段是为了记录当前申请表哪些工作流活动完成了,1为完成0为未完成,statusBit状态位正是将工作流活动与申请表中的状态联系起来,也许有些朋友会认为让系统自动分配好更好,第一个工作流活动联系第一位状态,第二个工作流活动联系第二位状态,等等。

我这么做的好处是考虑到可能会有多个工作流活动只需完成其中一个活动就情况,就像逻辑判断中的“或”一样,在这种情况我们只需将多个工作流活动状态位设置成一样就可以达到目的了。

光说而没有实例可能有些朋友不太明白,下面我以项目中工作流流程为例:

本系统的流程是这样的(不好意思,linux下画的图效果没visio好):

由流程图得出各工作流实例如下:

IDNAMEURLSEQSTATUSBIT

1申请人提交申请表user_main.aspx01

2各部门审查depart_check.aspx12

3科技处审查check_main.aspx23

4教务处审查check_main.aspx24

5研究生院审查check_main.aspx25

6人事科审查check_main.aspx26

7人事处审查recheck.aspx37

8专家评议expert_main.aspx48

9完成聘用null59

想必由以上实例应该很容易看出流程图了,看到这应该明白了吧

下面是我的工作流类的c#实现:

UsingSystem;

UsingSystem.Web;

UsingSystem.Web.Services;

UsingSystem.Web.Services.Protocols;

UsingSystem.ComponentModel;

UsingSystem.Data;

UsingSystem.Data.SqlClient;

UsingSystem.Collections.Generic;

///

///工作流类

///

PublicclassWorkflow

{

Privateint_id;

///

///工作流编号

///

PublicintId

{

get{return_id;}

set{_id=value;}

}

Privatestring_name;

///

///工作流名字

///

PublicstringName

{

get{return_name;}

set{_name=value;}

}

Privatestring_url;

///

///工作流使用网页

///

PublicstringUrl

{

get{return_url;}

set{_url=value;}

}

Privateint_seq;

///

///工作流运行序号

///

PublicintSeq

{

get{return_seq;}

set{_seq=value;}

}

Privateint_statusBit;

///

///状态位

///

PublicintStatusBit

{

get{return_statusBit;}

set{_statusBit=value;}

}

PublicWorkflow()

{

}

PublicWorkflow(intid,stringname,stringurl,intseq,int

statusBit)

{

this.Id=id;

this.Name=name;

this.Url=url;

this.Seq=seq;

this.StatusBit=statusBit;

}

PublicWorkflow(SqlDataReaderdr)

{

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"]);

}

PublicintAdd()

{

stringprocName="pr_AddWorkflow";

SqlParameter[]prams={new

SqlParameter("@name",SqlDbType.NVarChar,50),

new

SqlParameter("@url",SqlDbType.NVarChar,500),

new

SqlParameter("@seq",SqlDbType.Int),

new

SqlParameter("@statusbit",SqlDbType.Int)};

prams[0].Value=Name;

prams[1].Value=Url;

prams[2].Value=Seq;

prams[3].Value=StatusBit;

returnDatabase.runExecute(procName,prams);

}

PublicintDelete()

{

StringprocName="pr_DeleteWorkflow";

SqlParameter[]prams={new

SqlParameter("@id",SqlDbType.BigInt)};

prams[0].Value=Id;

returnDatabase.runExecute(procName,prams);

}

PublicintUpdate()

{

StringprocName="pr_UpdateWorkflow";

SqlParameter[]prams={new

SqlParameter("@id",SqlDbType.BigInt),

new

SqlParameter("@name",SqlDbType.NVarChar,50),

new

SqlParameter("@url",SqlDbType.NVarChar,500),

new

SqlParameter("@seq",SqlDbType.Int),

new

SqlParameter("@statusbit",SqlDbType.Int)};

prams[0].Value=Id;

prams[1].Value=Name;

prams[2].Value=Url;

prams[3].Value=Seq;

prams[4].Value=StatusBit;

returnDatabase.runExecute(procName,prams);

}

///

///根据工作流编号获得工作流信息

///

///工作流编号

///工作流信息

PublicstaticWorkflowGetWorkflowById(intid)

{

Workflowwl=newWorkflow();

StringprocName="pr_GetWorkflowById";

SqlParameter[]prams={new

SqlParameter("@Id",SqlDbType.BigInt)};

prams[0].Value=id;

SqlDataReaderdr=Database.runProcGetReader(procName,

prams);

while(dr.Read())

{

wl=newWorkflow(dr);

}

dr.Close();

returnwl;

}

///

///根据工作流编号获得工作流网页地址

///

///工作流编号

///工作流网页地址

PublicstaticstringGetWorkflowUrlById(intworkflowId)

{

stringprocName="pr_GetWorkflowUrlById";

SqlParameter[]prams={new

SqlParameter("@workflowId",SqlDbType.BigInt),

new

SqlParameter("@url",SqlDbType.NVarChar,500)};

prams[0].Value=workflowId;

prams[1].Direction=ParameterDirection.Output;

Database.runExecute(procName,prams);

returnprams[1].Value.ToString();

}

///

///返回工作流个数

///

///工作流个数

PublicstaticintGetWorkflowNum()

{

StringprocName="pr_GetWorkflowNum";

SqlParameter[]prams={new

SqlParameter("@num",SqlDbType.Int)};

prams[0].Direction=ParameterDirection.Output;

Database.runExecute(procName,prams);

ReturnConvert.ToInt32(prams[0].Value);

}

///

///设置申请表的工作流完成状态

///

///申请表编号

///工作流编号

///完成状态

///

PublicstaticintSetActivityStatus(intreportId,intworkflowId,

boolstatus)

{

StringprocName="pr_SetActivityStatus";

SqlParameter[]prams={new

SqlParameter("@reportId",SqlDbType.BigInt),

new

SqlParameter("@workflowId",SqlDbType.BigInt),

new

SqlParameter("@status",SqlDbType.Bit)};

prams[0].Value=reportId;

prams[1].Value=workflowId;

prams[2].Value=status;

returnDatabase.runExecute(procName,prams);

}

///

///获得申请表的工作流完成状态

///

///申请表编号

///工作流编号

///完成状态

publicstaticboolGetActivityStatus(intreportId,int

workflowId)

{

StringprocName="pr_GetActivityStatus";

SqlParameter[]prams={new

SqlParameter("@reportId",SqlDbType.BigInt),

new

SqlParameter("@workflowId",SqlDbType.BigInt),

new

SqlParameter("@status",SqlDbType.Bit)};

prams[0].Value=reportId;

prams[1].Value=workflowId;

prams[2].Direction=ParameterDirection.Output;

Database.runExecute(procName,prams);

ReturnConvert.ToBoolean(prams[2].Value);

}

///

///获得工作流中当前活动的下一批运行活动

///

///当前活动编号

///下一批运行活动

PublicstaticListGetNextWorkflow(intworkflowId)

{

Listworkflows=newList();

StringprocName="pr_GetNextWorkflow";

SqlParameter[]prams={new

SqlParameter("@workflowId",SqlDbType.BigInt)};

prams[0].Value=workflowId;

SqlDataReaderdr=Database.runProcGetReader(procName,

prams);

while(dr.Read())

{

Workflowwf=newWorkflow(dr);

workflows.Add(wf);

}

returnworkflows;

}

///

///获得工作流中当前活动的上一批运行活动

///

///当前活动编号

///上一批运行活动

PublicstaticListGetPreviousWorkflow(intworkflowId)

{

Listworkflows=newList();

stringprocName="pr_GetPreviousWorkflow";

SqlParameter[]prams={new

SqlParameter("@workflowId",SqlDbType.BigInt)};

prams[0].Value=workflowId;

SqlDataReaderdr=Database.runProcGetReader(procName,

prams);

while(dr.Read())

{

Workflowwf=newWorkflow(dr);

workflows.Add(wf);

}

returnworkflows;

}

///

///判断申请表进行的上一批工作流是否完成

///

///

///

///

publicstaticboolIsPreviousWorkflowFinished(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;

}

///

///判断申请表进行的下一批工作流是否开始

///

///

///

///

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;

}

///

///获得工作流中第一个活动

///

///第一个活动

publicstaticWorkflowGetFirstActivity()

{

Workflowwf=newWorkflow();

stringprocName="pr_GetFirstActivity";

SqlDataReaderdr=Database.runProcGetReader(procName);

while(dr.Read())

{

wf=newWorkflow(dr);

}

returnwf;

}

///

///获得工作流中最后一个活动

///

///最后一个活动

publicstaticWorkflowGetLastActivity()

{

Workflowwf=newWorkflow();

stringprocName="pr_GetLastActivity";

SqlDataReaderdr=Database.runProcGetReader(procName);

while(dr.Read())

{

wf=newWorkflow(dr);

}

returnwf;

}

DE>DE>///

///获得所有工作流活动

///

DE>DE>

PublicstaticListGetAllWorkflow()

{

Listworkflows=newList();

StringprocName="pr_GetAllWorkflows";

SqlDataReaderdr=Database.runProcGetReader(procName);

while(dr.Read())

{

workflows.Add(newWorkflow(dr));

}

returnworkflows;

}

}

///

///按运行顺序排序接口

///

PublicclassISortWorkflows:

IComparer

{

PublicintCompare(Workflowx,Workflowy)

{

if(x.Seq

elseif(x.Seq>y.Seq)return1;

elsereturn0;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2