/// <summary> /// 分合流的撤销发送. /// </summary> /// <param name="gwf"></param> /// <returns></returns> private string DoUnSendInFeiLiuHeiliu(GenerWorkFlow gwf) { //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。 GenerWorkerList gwl = new GenerWorkerList(); //删除合流节点的处理人. gwl.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); //查询已经走得分流节点待办. int i = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, this.UnSendToNode, GenerWorkerListAttr.FK_Emp, WebUser.No); if (i == 0) { throw new Exception("@您不能执行撤消发送,因为当前分流工作不是您发送的。"); } // 更新分流节点,让其出现待办. gwl.IsPassInt = 0; gwl.IsRead = false; gwl.SDT = BP.DA.DataType.CurrentDataTime; //这里计算时间有问题. gwl.Update(); // 把设置当前流程运行到分流流程上. gwf.FK_Node = this.UnSendToNode; Node nd = new Node(this.UnSendToNode); gwf.NodeName = nd.Name; gwf.Sender = BP.Web.WebUser.No; gwf.SendDT = BP.DA.DataType.CurrentDataTimess; gwf.Update(); Work wk = nd.HisWork; wk.OID = gwf.WorkID; wk.RetrieveFromDBSources(); string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wk, null); // 记录日志.. WorkNode wn = new WorkNode(wk, nd); wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, gwf.FK_Node, gwf.NodeName, ""); //删除上一个节点的数据。 foreach (Node ndNext in nd.HisToNodes) { i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID); if (i == 0) { continue; } if (ndNext.HisRunModel == RunModel.SubThread) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) { BP.WF.Dev2Interface.Flow_DeleteSubThread(gwf.FK_Flow, en.WorkID, "合流节点撤销发送前,删除子线程."); } continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow) { wks.Delete(GenerWorkerListAttr.FID, this.WorkID); } } // 设置当前节点的状态. Node cNode = new Node(gwf.FK_Node); Work cWork = cNode.HisWork; cWork.OID = this.WorkID; msg += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wk, null); if (cNode.IsStartNode) { return("@撤消执行成功." + msg); } else { return("@撤消执行成功." + msg); } }