简单 C Sharp工作流的实现.docx
- 文档编号:6987939
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:14
- 大小:17.92KB
简单 C Sharp工作流的实现.docx
《简单 C Sharp工作流的实现.docx》由会员分享,可在线阅读,更多相关《简单 C Sharp工作流的实现.docx(14页珍藏版)》请在冰点文库上搜索。
简单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);
}
///
///获得工作流中当前活动的下一批运行活动
///
///
///
PublicstaticList
{
List
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;
}
///
///获得工作流中当前活动的上一批运行活动
///
///
///
PublicstaticList
{
List
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;
List
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;
List
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>
PublicstaticList
{
List
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; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 Sharp工作流的实现 Sharp 工作流 实现