第八章 启动与执行业务流程(九)
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");
}
}
}
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");
}
}
}
相关文章推荐
- 第八章 启动与执行业务流程(七)
- 第八章 启动与执行业务流程(六)
- 第八章 启动与执行业务流程(八)
- 第八章 启动与执行业务流程(一)
- 第八章 启动与执行业务流程(二)
- 第八章 启动与执行业务流程(三)
- 第八章 启动与执行业务流程(四)
- 第八章 启动与执行业务流程(五)
- Struts 流程 -- XWork执行业务逻辑
- activity启动流程实例+设置流程变量+获取流程变量+向后执行一步
- Android系统启动流程图 —— 源码执行流程(android 6.0)
- mysql 基础 -mysqld_safe 启动执行流程
- 启动(程序还没执行生成dump文件的代码)就崩溃的处理流程
- 业务流程执行语言BPEL标准化流程管理
- android开机启动到程序执行运行流程简图
- Cactus 面向服务的业务流程建模与执行引擎
- mysqld_safe 启动执行流程
- 文章标题JBPM4.4:执行流程实例(启动、向后一步、查询任务、拾取任务、完成任务、设置获取流程变量)
- >02 (协议代理)、自定义视图、程序执行顺序(iOS程序启动流程 )、视图控制器、(MVC的理解)