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

来源:互联网 发布:淘宝教育客户端下载 编辑:程序博客网 时间:2024/06/06 04:48

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

原创粉丝点击