1、url的设计是由INFOPATH联想到的,微软sharepoint2007可以通过为每个工作流活动指定相应的编辑表单,可以是网页也可以infopath 设计的表单,这样的好处是让工作流的不同活动具有不同的用户界面,sharepoint2007可以在feature.xml里设置,而我这就使用url字段记录一个网页链接,不同工作流活动对应不同的网页。seq是每个工作流运行的顺序,从零开始,依次为0、1、2、3.,这个字段正是为了设置工作流的运行顺序,并行的工作流活动可以设置成相同的运行顺序。可能有人会问怎么标识工作流活动已经完成呢,这个标识正是由statusBit状态位来实现的,每个申请表中都含有
2、一个status字段,这个字段默认为50个0组成的字符串,status字段是为了记录当前申请表哪些工作流活动完成了,1为完成0为未完成,statusBit状态位正是将工作流活动与申请表中的状态联系起来,也许有些朋友会认为让系统自动分配好更好,第一个工作流活动联系第一位状态,第二个工作流活动联系第二位状态,等等。我这么做的好处是考虑到可能会有多个工作流活动只需完成其中一个活动就情况,就像逻辑判断中的“或”一样,在这种情况我们只需将多个工作流活动状态位设置成一样就可以达到目的了。光说而没有实例可能有些朋友不太明白,下面我以项目中工作流流程为例:本系统的流程是这样的(不好意思,linux 下画的图效
3、果没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_main.aspx 2 67 人事处审查 recheck.aspx 3 78 专家评议 expert_main.aspx 4 89 完成聘用 null 5 9想必由以上实例应该很容易看出流程图
4、了,看到这应该明白了吧下面是我的工作流类的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;/工作流类/summaryPublic class WorkflowPrivate int _id;/工作流编号Public int Idgetret
5、urn _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 int StatusBitgetreturn _stat
6、usBit;set_statusBit=value;Public Workflow()Public Workflow (int id,string name,string url,int seq,intstatusBit)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.ToString();this.Url=drurlthis.S
7、eq=Convert.ToInt32(drseqthis.StatusBit=Convert.ToInt32(drstatusBitPublic int Add()stringprocName=pr_AddWorkflow;SqlParameterprams=newSqlParameter(name,SqlDbType.NVarChar,50),newurl,SqlDbType.NVarChar,500),seq,SqlDbType.Int),statusbit,SqlDbType.Int);prams0.Value=Name;prams1.Value=Url;prams2.Value=Seq
8、;prams3.Value=StatusBit;return Database.runExecute(procName,prams);Public int Delete()String procName=pr_DeleteWorkflowid,SqlDbType.BigInt);prams0.Value=Id;Public int Update()pr_UpdateWorkflow,SqlDbType.BigInt),prams1.Value=Name;prams2.Value=Url;prams3.Value=Seq;prams4.Value=StatusBit;/根据工作流编号获得工作流信
9、息paramname=工作流编号returns工作流信息Public static Workflow GetWorkflowById(int id)Workflow wl=new Workflow();pr_GetWorkflowByIdSqlParameter prams=newIdprams0.Value=id;SqlDataReaderdr=Database.runProcGetReader(procName,prams);while(dr.Read()wl=new Workflow(dr);dr.Close();return wl;/根据工作流编号获得工作流网页地址paramRealN
10、ame=workflowId工作流网页地址Public staticstringGetWorkflowUrlById(intworkflowId)pr_GetWorkflowUrlByIdworkflowId,SqlDbType.NVarChar,500);prams0.Value=workflowId;prams1.Direction=ParameterDirection.Output;Database.runExecute(procName,prams);returnprams1.Value.ToString();/返回工作流个数工作流个数Public staticint GetWorkf
11、lowNum()pr_GetWorkflowNumnumprams0.Direction=ParameterDirection.Output;Return Convert.ToInt32(prams0.Value);/设置申请表的工作流完成状态reportId申请表编号status完成状态Public static int SetActivityStatus(intreportId,intworkflowId,boolstatus)pr_SetActivityStatusreportIdstatus,SqlDbType.Bit);prams0.Value=reportId;prams1.Val
12、ue=workflowId;prams2.Value=status;returnDatabase.runExecute(procName,prams);/获得申请表的工作流完成状态publicstaticboolGetActivityStatus(intreportId,intworkflowId)pr_GetActivityStatusprams2.Direction=ParameterDirection.Output;Return Convert.ToBoolean(prams2.Value);/获得工作流中当前活动的下一批运行活动当前活动编号下一批运行活动Public staticLis
13、t GetNextWorkflow(int workflowId)Listworkflows=newList();pr_GetNextWorkflowWorkflowwf=newWorkflow(dr);workflows.Add(wf);returnworkflows;/获得工作流中当前活动的上一批运行活动上一批运行活动 GetPreviousWorkflow(int workflowId)pr_GetPreviousWorkflow/判断申请表进行的上一批工作流是否完成publicstaticboolIsPreviousWorkflowFinished(intworkflowId,intr
14、eportId)boolflag=true;workflows=GetPreviousWorkflow(workflowId);foreach(Workflowwfinworkflows)stringstatus=Reports.GetCurrentStatusById(reportId);if(status.Substring(wf.StatusBit-1,1)=0)flag=false;break;returnflag;/判断申请表进行的下一批工作流是否开始publicstaticboolIsNextWorkflowStarted(intworkflowId,intreportId)boo
15、lflag=false;workflows=GetNextWorkflow(workflowId);1flag=true;/获得工作流中第一个活动第一个活动publicstaticWorkflowGetFirstActivity()Workflowwf=newWorkflow();pr_GetFirstActivitySqlDataReaderdr=Database.runProcGetReader(procName);wf=newWorkflow(dr);returnwf;/获得工作流中最后一个活动最后一个活动/获得所有工作流活动GetAllWorkflow() workflows=newListpr_GetAllWorkflowsworkflows.Add(newWorkflow(dr);/按运行顺序排序接口Public classI SortWorkflows:IComparerPublic int Compare(Workflowx,Workflowy)if(x.Seqy.Seq) return 1;else return 0;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2