您的位置:首页 > 其它

第八章 启动与执行业务流程(九)

2012-09-20 10:00 316 查看
8.2 启动与执行业务流程

8.2.2 TaskInstance.aspx.cs文件代码

......(续前页)

//完成任务

private void Button2_Click(object sender, System.EventArgs e)

{

//获取业务表名称、标识字段名、标识字段值等

string relatedtable=ds.Tables[1].Rows[0]["RelatedTable"].ToString();

string identityfield=identityname.Tables[0].Rows[0]["IdentifiedField"].ToString();

string fieldvalue=ds.Tables[1].Rows[0]["IdentityFieldValue"].ToString();

string processinstanceid=ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString();

string processdefid=ds.Tables[1].Rows[0]["ProcessDefinitionID"].ToString();

//保存可编辑字段的值

if(! Savefields(relatedtable,identityfield,fieldvalue,processinstanceid))

return;

//保存留言

if(! saveMessage(processinstanceid))

return;

//处理附件上传

if(ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "L"

|| ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "LR")

{

if(! SaveAttached(processinstanceid,relatedtable,identityfield,fieldvalue))

return;

}

//判断流程是否已经被冻结(防止在此时管理员刚进行了冻结操作),如果已经冻结则不再执

//行后续操作。

string strSql="select IsSuspended from ProcessInstance where ProcessInstanceID="

+processinstanceid;

Base basecode=new Base();

DataSet suspendds=basecode.SQLExeDataSet(strSql);

if(suspendds.Tables[0].Rows[0]["IsSuspended"].ToString()=="Y")

Response.Redirect("TaskInstanceList.aspx");

//当前节点的逻辑类型

string nodelogic=ViewState["NodeLogic"].ToString();

//当前节点ID

string nodedefid=ViewState["taskID"].ToString();

//当前节点名称

TaskDefinitionClass taskdefobject=new TaskDefinitionClass();

string taskname=taskdefobject.GetTaskNameByID(nodedefid);

//判断当前任务是否是回退任务(有后续任务实例)

TaskInstanceClass taskins=new TaskInstanceClass();

string taskinstanceid=ViewState["taskinstanceid"].ToString();

if(taskins.IsPostedBackTask(taskinstanceid))

{

//OrSplit节点会隐藏"完成任务"按钮,不调用当前方法.其它节点类型执行下面代码.

//获取当前实例的所有后继

string [] nextinsIDs=new Tools().StringSplit(taskins

.GetNextTaskinstancesID(taskinstanceid),",");

//不需判断当前任务实例的类型,只需判断其后继是否是并行连接节点(如果是,则后继

//只有一个,因此只需取第一个后继判断)。如果是,还要判断连接节点的其它前驱是否已

//完成.

string tempnexttaskid=taskins.GetTaskDefinitionID(nextinsIDs[0]);

string tempnexttasklogic=taskdefobject.GetLogicTypeOfNode(tempnexttaskid);

//如果后继实例是并行分支的连接节点,则判断该连接节点的所有前驱是否都完成

if(tempnexttasklogic == "AndJoin" || tempnexttasklogic == "AndJoin&AndSplit"

|| tempnexttasklogic == "AndJoin&OrSplit")

{

string[] preinsids=new Tools().StringSplit(taskins

.GetPreTaskinstancesID(nextinsIDs[0]),",");

bool othercompleted=true;

for(int i=0;i<preinsids.Length;i++)

{

//如果除当前实例之外,并行节点还有未完成的前驱实例

if(preinsids[i] != taskinstanceid

& taskins.GetTaskInsState(preinsids[i]) != "Completed")

{

othercompleted=false;

break;

}

}

//如果连接节点其它前驱都已完成,修改并行节点任务实例状态

if(othercompleted)

taskins.UpDateTaskInstanceState(nextinsIDs[0],"Running");

//修改当前实例状态,结束当前回退任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

}

//如果后继不是并行连接节点则修改所有后继的状态(如andsplit就有多个后继)

else

{

for(int i=0;i<nextinsIDs.Length;i++)

{

//修改后继实例状态,是后继任务得以重新被执行.

taskins.UpDateTaskInstanceState(nextinsIDs[i],"Running");

}

//修改当前实例状态,结束当前回退任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

}

}

//不是回退任务的情况(实际上,以下代码可以参照回退任务处理方法精简,即只判断其第一

//个后继,根据后继为并行连接节点和结束节点两种情况处理。当然下面代码更容易理解)

else

{

//OrSplit节点执行迁移按钮方法,不在此处理

//如果当前是一般任务节点

Transition trans=new Transition();

DataSet nextnodeds=null;

string nextnodename="";

if(nodelogic == "")

{

//获取当前节点的下一节点

nextnodeds=trans.GetNextNodesName(taskname,processdefid);

//判断当前节点的下一节点类型.一般任务节点只能有一个后继.

nextnodename=nextnodeds.Tables[0].Rows[0]["ToNodeName"].ToString();

//如果是结束节点

if(taskdefobject.IsEndNode(nextnodename,processdefid))

{

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);//添加任务结束时间

//结束流程执行

new ProcessInstanceClass().EndProcessInstance(processinstanceid);

}

else

{

string nexttaskid=taskdefobject.GetTaskIDByName(nextnodename,processdefid);

string nextnodelogic=taskdefobject.GetLogicTypeOfNode(nexttaskid);

if(nextnodelogic == "AndJoin" || nextnodelogic == "AndJoin&AndSplit"

|| nextnodelogic == "AndJoin&OrSplit")

{

//判断并行连接的所有前驱实例是否都已完成

bool pretaskcompleted=true;

//获取并行连接的所有前驱任务

DataSet pretaskds=trans.GetPreNodesName(nextnodename,processdefid);

string pretaskid="";

//循环判断除当前节点之外的前驱任务

for(int i=0;i<pretaskds.Tables[0].Rows.Count;i++)

{

if(pretaskds.Tables[0].Rows[i][0].ToString() !=taskname)

{

pretaskid=taskdefobject.GetTaskIDByName(pretaskds.Tables[0]

.Rows[i][0].ToString (),processdefid);

if(! taskins

.IsTaskInstantiatedAndCompleted(pretaskid,processinstanceid))

{

pretaskcompleted=false;

break;

}

}

}

//如果并行连接还有前驱任务未完成

if(pretaskcompleted == false)

{

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}

else

{

//创建并行节点实例,设置所有前驱的nexttaskinstance.

string starttime=DateTime.Now.ToString();

string nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,

nexttaskid,starttime).ToString();

taskins.UpDateAndJoinAndPreTaskIns(nexttaskinsid,processdefid);

}

}

else//如果后继节点不是并行节点,直接生成后继节点的任务实例.

{

string starttime=DateTime.Now.ToString();

string nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,

nexttaskid,starttime).ToString();

//设置后继节点的前驱和当前节点的后继

taskins.AddNextTaskInstanceOfCurrentTaskIns(nexttaskinsid,

taskinstanceid);

taskins.AddPreTaskInstanceOfCurrentTaskIns(taskinstanceid,

nexttaskinsid);

}

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}//如果后继不是结束节点

}//如果是一般任务节点

else if(nodelogic == "AndSplit" || nodelogic == "AndJoin&AndSplit"

|| nodelogic == "OrJoin&AndSplit")

{

//获取当前节点的后继节点集合

nextnodeds=trans.GetNextNodesName(taskname,processdefid);

string nexttaskid="";

string starttime=DateTime.Now.ToString();

string nexttaskinsid="";

for(int i=0;i<nextnodeds.Tables[0].Rows.Count;i++)

{

nextnodename=nextnodeds.Tables[0].Rows[i][0].ToString();

nexttaskid=taskdefobject.GetTaskIDByName(nextnodename,processdefid);

nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,nexttaskid,

starttime).ToString();

//设置后继节点的前驱和当前节点的后继

taskins.AddNextTaskInstanceOfCurrentTaskIns(nexttaskinsid,taskinstanceid);

taskins.AddPreTaskInstanceOfCurrentTaskIns(taskinstanceid,nexttaskinsid);

}

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}

else//即andjoin和orjoin,只有一个后继任务节点.OrSplit不调用该方法,所以不必考虑.

{

//获取当前节点的下一节点

nextnodeds=trans.GetNextNodesName(taskname,processdefid);

//判断当前节点的下一节点类型.一般任务节点只能有一个后继.

nextnodename=nextnodeds.Tables[0].Rows[0]["ToNodeName"].ToString();

//如果是结束节点

if(taskdefobject.IsEndNode(nextnodename,processdefid))

{

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

//结束流程执行

new ProcessInstanceClass().EndProcessInstance(processinstanceid);

}

else

{

//获取当前节点的后继节点集合

nextnodeds=trans.GetNextNodesName(taskname,processdefid);

string nexttaskid="";

string starttime=DateTime.Now.ToString();

string nexttaskinsid="";

nextnodename=nextnodeds.Tables[0].Rows[0][0].ToString();

nexttaskid=taskdefobject.GetTaskIDByName(nextnodename,processdefid);

nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,nexttaskid,

starttime).ToString();

//设置后继节点的前驱和当前节点的后继

taskins.AddNextTaskInstanceOfCurrentTaskIns(nexttaskinsid,taskinstanceid);

taskins.AddPreTaskInstanceOfCurrentTaskIns(taskinstanceid,nexttaskinsid);

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}

}

}//不是回退任务的情况

Response.Redirect("TaskInstanceList.aspx");

}

//迁移按钮方法if(nodelogic == "OrSplit" || nodelogic == "AndJoin&OrSplit" ||

//nodelogic == "OrJoin&OrSplit")

private void TransitionBtn_Click(object sender, EventArgs e)

{

//获取业务表数据

string relatedtable=ds.Tables[1].Rows[0]["RelatedTable"].ToString();

string identityfield=identityname.Tables[0].Rows[0]["IdentifiedField"].ToString();

string fieldvalue=ds.Tables[1].Rows[0]["IdentityFieldValue"].ToString();

string processinstanceid=ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString();

string processdefid=ds.Tables[1].Rows[0]["ProcessDefinitionID"].ToString();

//保存可写字段值

if(! Savefields(relatedtable,identityfield,fieldvalue,processinstanceid))

return;

//保存留言

if(! saveMessage(processinstanceid))

return;

//处理附件上传

if(ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "L"

|| ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "LR")

{

if(! SaveAttached(processinstanceid,relatedtable,identityfield,fieldvalue))

return;

}

//判断流程是否已经被冻结(防止在此时管理员刚进行了冻结操作),如果已经冻结则不再执

//行后续操作。

string strSql="select IsSuspended from ProcessInstance where ProcessInstanceID="

+processinstanceid;

Base basecode=new Base();

DataSet suspendds=basecode.SQLExeDataSet(strSql);

if(suspendds.Tables[0].Rows[0]["IsSuspended"].ToString()=="Y")

Response.Redirect("TaskInstanceList.aspx");

//当前节点ID

string nodedefid=ViewState["taskID"].ToString();

//当前节点名称

TaskDefinitionClass taskdefobject=new TaskDefinitionClass();

string taskname=taskdefobject.GetTaskNameByID(nodedefid);

TaskInstanceClass taskins=new TaskInstanceClass();

string taskinstanceid=ViewState["taskinstanceid"].ToString();//当前实例

Transition trans=new Transition();

//获取当前节点的后继节点集合

DataSet nextnodeds=trans.GetNextNodesName(taskname,processdefid);

string nextnodename="";

string nexttaskid="";

string nexttaskinsid="";

string starttime=DateTime.Now.ToString();

//获取当前实例的后继实例字符串(只有一个后继),用于判断是否回退任务

string nexttaskinsidofcurrenttask=taskins.GetNextTaskinstancesID(taskinstanceid);

for(int i=0;i<nextnodeds.Tables[0].Rows.Count;i++)

{

nextnodename=nextnodeds.Tables[0].Rows[i][0].ToString();

//按钮ID对应的下一任务

if(((Button)sender).ID == nextnodename)

{

nexttaskid=taskdefobject.GetTaskIDByName(nextnodename,processdefid);

//如果是回退任务,并按原路径执行.

if(nexttaskinsidofcurrenttask.Trim() != ""

& taskins.GetTaskDefinitionID(nexttaskinsidofcurrenttask) == nexttaskid)

{

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

//修改下一任务实例状态,使其得以重新执行

taskins.UpDateTaskInstanceState(nexttaskinsidofcurrenttask,"Running");

}

//如果是回退任务,并按新路径执行

if(nexttaskinsidofcurrenttask.Trim() != ""

& taskins.GetTaskDefinitionID(nexttaskinsidofcurrenttask) != nexttaskid)

{

//清空与原路径有关的所有字段数据(未完成,有矛盾。如果多个任务可以处理同

//一字段,清除后是否会使部分字段为空。设计业务过程时要考虑)

//删除分支节点原路径的所有后继任务实例

taskins.DeleteNextTaskInstances(taskinstanceid,processinstanceid);

//创建新路径后继实例

nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,nexttaskid,

starttime).ToString();

//设置后继节点的前驱和当前节点的后继

taskins.AddPreTaskInstanceOfCurrentTaskIns(taskinstanceid,nexttaskinsid);

taskins.UpDateNextTaskInsOfTask(taskinstanceid,nexttaskinsid);

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}

//新任务(非回退任务)

if(nexttaskinsidofcurrenttask.Trim() == "")

{

nexttaskinsid=taskins.CreateTaskInstance(processinstanceid,nexttaskid,

starttime).ToString();

//设置后继节点的前驱和当前节点的后继

taskins.AddNextTaskInstanceOfCurrentTaskIns(nexttaskinsid,taskinstanceid);

taskins.AddPreTaskInstanceOfCurrentTaskIns(taskinstanceid,nexttaskinsid);

//修改当前实例状态,结束当前任务的执行.

taskins.UpDateTaskInstanceState(taskinstanceid,"Completed");

taskins.AchieveTask(taskinstanceid);

}

break;

}//if(((Button)sender).ID == nextnodename)

}//for

Response.Redirect("TaskInstanceList.aspx");

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: