using System; using System.Collections; using System.Data; using BP.En; using BP.Web; using BP.DA; using BP.Port; using BP.Sys; using BP.WF.XML; using BP.WF.Template; using BP.Difference; namespace BP.WF { /// /// 撤销发送 /// public class WorkUnSend { #region 属性. private string _AppType = null; /// /// 虚拟目录的路径 /// public string AppType { get { if (_AppType == null) { if (BP.Difference.SystemConfig.IsBSsystem == false) { _AppType = "WF"; } else { bool b = HttpContextHelper.RequestRawUrl.ToLower().Contains("oneflow"); if (b) _AppType = "WF/OneFlow"; else _AppType = "WF"; } } return _AppType; } } private string _VirPath = null; /// /// 虚拟目录的路径 /// public string VirPath { get { if (_VirPath == null) { if (BP.Difference.SystemConfig.IsBSsystem) _VirPath = Glo.CCFlowAppPath;//BP.Sys.Base.Glo.Request.ApplicationPath; else _VirPath = ""; } return _VirPath; } } public string FlowNo = null; private Flow _HisFlow = null; public Flow HisFlow { get { if (_HisFlow == null) this._HisFlow = new Flow(this.FlowNo); return this._HisFlow; } } /// /// 工作ID /// public Int64 WorkID = 0; /// /// FID /// public Int64 FID = 0; /// /// 是否是干流 /// public bool IsMainFlow { get { if (this.FID != 0 && this.FID != this.WorkID) return false; else return true; } } #endregion /// /// 撤销发送 /// public WorkUnSend(string flowNo, Int64 workID, int unSendToNode = 0, Int64 fid = 0) { this.FlowNo = flowNo; this.WorkID = workID; this.FID = fid; this.UnSendToNode = UnSendToNode; //撤销到节点. } public int UnSendToNode = 0; /// /// 得到当前的进行中的工作。 /// /// public WorkNode GetCurrentWorkNode() { int currNodeID = 0; GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); gwf.WorkID = this.WorkID; if (gwf.RetrieveFromDBSources() == 0) { // this.DoFlowOver(ActionType.FlowOver, "非正常结束,没有找到当前的流程记录。"); throw new Exception("@" + string.Format("工作流程{0}已经完成。", this.WorkID)); } Node nd = new Node(gwf.FK_Node); Work work = nd.HisWork; work.OID = this.WorkID; work.NodeID = nd.NodeID; work.SetValByKey("FK_Dept", BP.Web.WebUser.FK_Dept); if (work.RetrieveFromDBSources() == 0) { BP.DA.Log.DebugWriteError("@WorkID=" + this.WorkID + ",FK_Node=" + gwf.FK_Node + ".不应该出现查询不出来工作."); // 没有找到当前的工作节点的数据,流程出现未知的异常。 work.Rec = BP.Web.WebUser.No; try { work.Insert(); } catch (Exception ex) { BP.DA.Log.DebugWriteError("@没有找到当前的工作节点的数据,流程出现未知的异常" + ex.Message + ",不应该出现"); // 没有找到当前的工作节点的数据 } } work.FID = gwf.FID; WorkNode wn = new WorkNode(work, nd); return wn; } /// /// 执行子线程的撤销. /// /// private string DoThreadUnSend() { //定义当前的节点. WorkNode wn = this.GetCurrentWorkNode(); GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); Node nd = new Node(gwf.FK_Node); #region 求的撤销的节点. int cancelToNodeID = 0; if (nd.HisCancelRole == CancelRole.SpecNodes) { /*1.指定的节点可以撤销,首先判断是否设置指定的节点.*/ // NodeCancels ncs = new NodeCancels(); ncs.Retrieve(NodeCancelAttr.FK_Node, wn.HisNode.NodeID); if (ncs.Count == 0) throw new Exception("@流程设计错误, 您设置了当前节点(" + wn.HisNode.Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点."); //获取Track表 string truckTable = "ND" + int.Parse(wn.HisNode.FK_Flow) + "Track"; //获取到当前节点走过的节点 与 设定可撤销节点的交集 string sql = "SELECT DISTINCT(FK_Node) FROM WF_GenerWorkerlist WHERE "; sql += " FK_Node IN(SELECT CancelTO FROM WF_NodeCancel WHERE FK_Node=" + wn.HisNode.NodeID + ") AND FK_Emp='" + WebUser.No + "'"; string nds = DBAccess.RunSQLReturnString(sql); if (DataType.IsNullOrEmpty(nds)) throw new Exception("@您不能执行撤消发送,两种原因:1,你不具备撤销该节点的功能;2.流程设计错误,你指定的可以撤销的节点不在流程运转中走过的节点."); //获取可以删除到的节点 cancelToNodeID = int.Parse(nds.Split(',')[0]); } if (nd.HisCancelRole == CancelRole.OnlyNextStep) { /*如果仅仅允许撤销上一步骤.*/ WorkNode wnPri = wn.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); int num = wl.Retrieve(GenerWorkerListAttr.FK_Emp, BP.Web.WebUser.No, GenerWorkerListAttr.FK_Node, wnPri.HisNode.NodeID); if (num == 0) throw new Exception("@您不能执行撤消发送,因为当前工作不是您发送的或下一步工作已处理。"); cancelToNodeID = wnPri.HisNode.NodeID; } if (cancelToNodeID == 0) throw new Exception("@没有求出要撤销到的节点."); #endregion 求的撤销的节点. /********** 开始执行撤销. **********************/ Node cancelToNode = new Node(cancelToNodeID); switch (cancelToNode.HisNodeWorkType) { case NodeWorkType.StartWorkFL: case NodeWorkType.WorkFHL: case NodeWorkType.WorkFL: // 调用撤消发送前事件。 ExecEvent.DoNode(EventListNode.UndoneBefore, nd, wn.HisWork, null); BP.WF.Dev2Interface.Node_FHL_KillSubFlow( this.WorkID); //杀掉子线程. // 调用撤消发送前事件。 ExecEvent.DoNode(EventListNode.UndoneAfter, nd, wn.HisWork, null); return "KillSubThared@子线程撤销成功."; default: break; } // if (cancelToNode.HisNodeWorkType == NodeWorkType.StartWorkFL) WorkNode wnOfCancelTo = new WorkNode(this.WorkID, cancelToNodeID); // 调用撤消发送前事件。 string msg = ExecEvent.DoNode(EventListNode.UndoneBefore, nd, wn.HisWork, null); #region 删除当前节点数据。 // 删除产生的工作列表。 DeleteSpanNodesGenerWorkerListData(); //GenerWorkerLists wls = new GenerWorkerLists(); //wls.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); // 删除附件信息。 DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB WHERE FK_MapData='ND" + gwf.FK_Node + "' AND RefPKVal='" + this.WorkID + "'"); #endregion 删除当前节点数据。 // 更新. gwf.FK_Node = cancelToNode.NodeID; gwf.NodeName = cancelToNode.Name; //如果不启动自动记忆,删除tonodes,用于 选择节点发送。撤消后,可重新选择节点发送 if (cancelToNode.IsRememberMe == false) gwf.Paras_ToNodes = ""; if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) gwf.TaskSta = TaskSta.Takeback; else gwf.TaskSta = TaskSta.None; gwf.TodoEmps = WebUser.No + "," + WebUser.Name + ";"; gwf.Update(); if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) { //设置全部的人员不可用。 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=-1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //设置当前人员可用。 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } else { DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); } //更新当前节点,到rpt里面。 DBAccess.RunSQL("UPDATE " + this.HisFlow.PTable + " SET FlowEndNode=" + gwf.FK_Node + " WHERE OID=" + this.WorkID); // 记录日志.. wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, cancelToNode.NodeID, cancelToNode.Name, "无"); // 删除数据. if (wn.HisNode.IsStartNode) { DBAccess.RunSQL("DELETE FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + nd.NodeID); } if (wn.HisNode.IsEval) { /*如果是质量考核节点,并且撤销了。*/ DBAccess.RunSQL("DELETE FROM WF_CHEval WHERE FK_Node=" + wn.HisNode.NodeID + " AND WorkID=" + this.WorkID); } #region 恢复工作轨迹,解决工作抢办。 if (cancelToNode.IsStartNode == false && cancelToNode.IsEnableTaskPool == false) { WorkNode ppPri = wnOfCancelTo.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); wl.Retrieve(GenerWorkerListAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, GenerWorkerListAttr.WorkID, this.WorkID); // DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE FK_Node=" + backtoNodeID + " AND WorkID=" + this.WorkID); RememberMe rm = new RememberMe(); rm.Retrieve(RememberMeAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, RememberMeAttr.FK_Emp, ppPri.HisWork.Rec); string[] myEmpStrs = rm.Objs.Split('@'); foreach (string s in myEmpStrs) { if (DataType.IsNullOrEmpty(s) == true) continue; if (s == wl.FK_Emp) continue; GenerWorkerList wlN = new GenerWorkerList(); wlN.Copy(wl); wlN.FK_Emp = s; BP.Port.Emp myEmp = new BP.Port.Emp(s); wlN.FK_EmpText = myEmp.Name; wlN.FK_Dept = myEmp.FK_Dept; wlN.DeptName = myEmp.FK_DeptText; wlN.Insert(); } } #endregion 恢复工作轨迹,解决工作抢办。 #region 如果是开始节点, 检查此流程是否有子线程,如果有则删除它们。 if (nd.IsStartNode) { /*要检查一个是否有 子流程,如果有,则删除它们。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.PWorkID, this.WorkID); if (gwfs.Count > 0) { foreach (GenerWorkFlow item in gwfs) { /*删除每个子线程.*/ BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(item.WorkID, true); } } } #endregion #region 计算完成率。 bool isSetEnable = false; //是否关闭合流节点待办. string mysql = "SELECT COUNT(DISTINCT WorkID) FROM WF_GenerWorkerlist WHERE FID=" + this.FID + " AND IsPass=1 AND FK_Node IN (SELECT Node FROM WF_Direction WHERE ToNode=" + wn.HisNode.NodeID + ")"; decimal numOfPassed = DBAccess.RunSQLReturnValDecimal(mysql, 0, 1); if (nd.PassRate == 100) { isSetEnable = true; } else { mysql = "SELECT COUNT(DISTINCT WorkID) FROM WF_GenerWorkFlow WHERE FID=" + this.FID; decimal numOfAll = DBAccess.RunSQLReturnValDecimal(mysql, 0, 1); decimal rate = numOfPassed / numOfAll * 100; if (nd.PassRate > rate) isSetEnable = true; } GenerWorkFlow maingwf = new GenerWorkFlow(this.FID); maingwf.SetPara("ThreadCount", numOfPassed.ToString()); maingwf.Update(); //是否关闭合流节点待办. if (isSetEnable == true) DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=3 WHERE WorkID=" + this.FID + " AND FK_Node=" + wn.HisNode.NodeID); #endregion //调用撤消发送后事件。 msg += ExecEvent.DoNode(EventListNode.UndoneAfter, nd, wn.HisWork, null); if (wnOfCancelTo.HisNode.IsStartNode) return "@撤消执行成功. " + msg; else return "@撤消执行成功. " + msg; return "工作已经被您撤销到:" + cancelToNode.Name; } /// /// /// /// public string DoUnSend() { string str = DoUnSendIt(); int fk_node = DBAccess.RunSQLReturnValInt("SELECT FK_Node FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID, 0); //删除自己审核的信息. string sql = "DELETE FROM ND" + int.Parse(FlowNo) + "Track WHERE WorkID = " + this.WorkID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND NDFrom = " + fk_node + " AND EmpFrom = '" + WebUser.No + "'"; DBAccess.RunSQL(sql); return str; } /// /// 执行撤消 /// private string DoUnSendIt() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); this.FlowNo = gwf.FK_Flow; if (gwf.WFState == WFState.Complete) return "err@该流程已经完成,您不能撤销。"; // 如果停留的节点是分合流。 Node nd = new Node(gwf.FK_Node); /*该节点不允许撤销.*/ if (nd.HisCancelRole == CancelRole.None) return "err@当前节点,不允许撤销。"; if (nd.IsStartNode && nd.HisNodeWorkType != NodeWorkType.StartWorkFL) return "err@当前节点是开始节点,所以您不能撤销。"; //如果撤销到的节点和当前流程运行到的节点相同,则是分流、或者分河流 if (this.UnSendToNode == nd.NodeID) { //如果当前节点是分流、分合流节点则可以撤销 if (nd.HisNodeWorkType == NodeWorkType.StartWorkFL || nd.HisNodeWorkType == NodeWorkType.WorkFL || nd.HisNodeWorkType == NodeWorkType.WorkFHL) { //获取当前节点的子线程 string truckTable = "ND" + int.Parse(nd.FK_Flow) + "Track"; string threadSQL = "SELECT FK_Node,WorkID,Emps FROM WF_GenerWorkFlow WHERE FID=" + this.WorkID + " AND FK_Node" + " IN(SELECT DISTINCT(NDTo) FROM " + truckTable + " WHERE ActionType=" + (int)ActionType.ForwardFL + " AND WorkID=" + this.WorkID + " AND NDFrom='" + nd.NodeID + "'" + " ) "; DataTable dt = DBAccess.RunSQLReturnTable(threadSQL); if (dt == null || dt.Rows.Count == 0) return "err@流程运行错误:当不存在子线程时,改过程应该处于待办状态"; string toEmps = ""; foreach (DataRow dr in dt.Rows) { Node threadnd = new Node(dr["FK_Node"].ToString()); // 调用撤消发送前事件。 ExecEvent.DoNode(EventListNode.UndoneBefore, nd, nd.HisWork, null); BP.WF.Dev2Interface.Node_FHL_KillSubFlow( long.Parse(dr["WorkID"].ToString())); //杀掉子线程. // 调用撤消发送前事件。 Work work = nd.HisWork; work.OID = this.WorkID; work.NodeID = nd.NodeID; ExecEvent.DoNode(EventListNode.UndoneAfter, nd, work, null); toEmps += dr["Emps"].ToString().Replace('@', ','); } //恢复上一步发送人 dt = Dev2Interface.Flow_GetPreviousNodeTrack(this.WorkID, nd.NodeID); if (dt != null && dt.Rows.Count > 0) { gwf.Sender = dt.Rows[0]["EmpFrom"].ToString() + "," + dt.Rows[0]["EmpFromT"].ToString() + ";"; } if (nd.IsEnableTaskPool && Glo.IsEnableTaskPool) gwf.TaskSta = TaskSta.Takeback; else gwf.TaskSta = TaskSta.None; gwf.TodoEmps = WebUser.No + "," + WebUser.Name + ";"; gwf.Update(); //并且修改当前人员的待办 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); return "撤销成功"; } } //如果启用了对方已读,就不能撤销. if (nd.CancelDisWhenRead == true) { //撤销到的节点是干流程节点/子线程撤销到子线程 int i = DBAccess.RunSQLReturnValInt("SELECT SUM(IsRead) AS Num FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node, 0); if (i >= 1) return "err@当前待办已经有[" + i + "]个工作人员打开了该工作,您不能撤销."; //干流节点撤销到子线程 i = DBAccess.RunSQLReturnValInt("SELECT SUM(IsRead) AS Num FROM WF_GenerWorkerlist WHERE WorkID=" + this.FID + " AND FK_Node=" + gwf.FK_Node, 0); if (i >= 1) return "err@当前待办已经有[" + i + "]个工作人员打开了该工作,您不能撤销."; } #region 如果是越轨流程状态 . string sql = "SELECT COUNT(*) AS Num FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND IsPass=80"; if (DBAccess.RunSQLReturnValInt(sql, 0) != 0) { //求出来越轨子流程workid并把它删除掉. GenerWorkFlow gwfSubFlow = new GenerWorkFlow(); int i = gwfSubFlow.Retrieve(GenerWorkFlowAttr.PWorkID, this.WorkID); if (i == 1) BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(gwfSubFlow.WorkID, true); //执行回复当前节点待办.. sql = "UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE IsPass=80 AND FK_Node=" + gwf.FK_Node + " AND WorkID=" + this.WorkID; DBAccess.RunSQL(sql); return "撤销延续流程执行成功,撤销到[" + gwf.NodeName + "],撤销给[" + gwf.TodoEmps + "]"; } #endregion 如果是越轨流程状态 . //if (BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(this.WorkID, WebUser.No) == true) // return "info@您有处理当前工作的权限,可能您已经执行了撤销,请使用退回或者发送功能."; #region 判断是否是会签状态,是否是会签人做的撤销. 主持人是不能撤销的. if (gwf.HuiQianTaskSta != HuiQianTaskSta.None) { string IsEnableUnSendWhenHuiQian = BP.Difference.SystemConfig.AppSettings["IsEnableUnSendWhenHuiQian"]; if (DataType.IsNullOrEmpty(IsEnableUnSendWhenHuiQian) == false && IsEnableUnSendWhenHuiQian.Equals("0")) return "info@当前节点是会签状态,您不能执行撤销."; GenerWorkerList gwl = new GenerWorkerList(); int numOfmyGwl = gwl.Retrieve(GenerWorkerListAttr.FK_Emp, WebUser.No, GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); //如果没有找到当前会签人. if (numOfmyGwl == 0) return "err@当前节点[" + gwf.NodeName + "]是会签状态,[" + gwf.TodoEmps + "]在执行会签,您不能执行撤销."; if (gwl.IsHuiQian == true) { } //如果是会签人,就让其显示待办. gwl.IsPassInt = 0; gwl.IsEnable = true; gwl.Update(); // 在待办人员列表里加入他. 要判断当前人员是否是主持人,如果是主持人的话,主持人是否在发送的时候, // 就选择方向与接受人. if (gwf.HuiQianZhuChiRen == WebUser.No) { gwf.TodoEmps = WebUser.No + "," + BP.Web.WebUser.Name + ";" + gwf.TodoEmps; } else { gwf.TodoEmps = gwf.TodoEmps + BP.Web.WebUser.Name + ";"; } gwf.Update(); return "会签人撤销成功."; } #endregion 判断是否是会签状态,是否是会签人做的撤销. if (gwf.FID != 0) { //执行子线程的撤销. return DoThreadUnSend(); } //定义当前的节点. WorkNode wn = this.GetCurrentWorkNode(); #region 求的撤销的节点. /* 查询出来. */ sql = "SELECT FK_Node FROM WF_GenerWorkerlist WHERE FK_Emp='" + WebUser.No + "' AND IsPass=1 AND IsEnable=1 AND WorkID=" + this.WorkID + " ORDER BY CDT DESC "; int cancelToNodeID = DBAccess.RunSQLReturnValInt(sql, 0); //计算要撤销到的节点. if (cancelToNodeID == 0) return "err@您没有权限操作该工作."; if (nd.HisCancelRole == CancelRole.SpecNodes) { /*指定的节点可以撤销,首先判断当前人员是否有权限.*/ NodeCancels ncs = new NodeCancels(); ncs.Retrieve(NodeCancelAttr.FK_Node, wn.HisNode.NodeID); if (ncs.Count == 0) return "err@流程设计错误, 您设置了当前节点(" + wn.HisNode.Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点."; if (ncs.Contains(cancelToNodeID) == false && cancelToNodeID != gwf.FK_Node) return "err@撤销流程错误,您没有权限执行撤销发送,当前节点不可以执行撤销."; } if (nd.HisCancelRole == CancelRole.OnlyNextStep) { /*如果仅仅允许撤销上一步骤.*/ WorkNode wnPri = wn.GetPreviousWorkNode(); if (wnPri.HisNode.NodeID != cancelToNodeID && cancelToNodeID!=gwf.FK_Node) return "err@您不能执行撤消发送,因为当前工作不是您发送的或下一步工作已处理。"; } //求出来要撤销到的节点. Node cancelToNode = new Node(cancelToNodeID); #endregion 求的撤销的节点. //协作模式下的撤销. if (cancelToNodeID == gwf.FK_Node && cancelToNode.TodolistModel == TodolistModel.Teamup) { gwf.TodoEmps = gwf.TodoEmps + WebUser.No + "," + WebUser.Name + ";"; gwf.TodoEmpsNum++; gwf.Update(); GenerWorkerList gwl = new GenerWorkerList(this.WorkID, cancelToNodeID, WebUser.No); gwl.IsPassInt = 0; gwl.Update(); return "@协作模式下,撤销成功."; } if (this.UnSendToNode != 0 && gwf.FK_Node != this.UnSendToNode) { Node toNode = new Node(this.UnSendToNode); /* 要撤销的节点是分流节点,并且当前节点不在分流节点而是在合流节点的情况, for:华夏银行. * 1, 分流节点发送给n个人. * 2, 其中一个人发送到合流节点,另外一个人退回给分流节点。 * 3,现在分流节点的人接收到一个待办,并且需要撤销整个分流节点的发送. * 4, UnSendToNode 这个时间没有值,并且当前干流节点的停留的节点与要撤销到的节点不一致。 */ if (toNode.HisNodeWorkType == NodeWorkType.WorkFL && nd.HisNodeWorkType == NodeWorkType.WorkHL) return DoUnSendInFeiLiuHeiliu(gwf); } #region 判断当前节点的模式. switch (nd.HisNodeWorkType) { case NodeWorkType.WorkFHL: //如果是撤销的节点是断头路的节点. if (cancelToNode.IsSendBackNode == true) { //不需要处理,按照正常的模式处理. } else { return this.DoUnSendFeiLiu(gwf); } break; case NodeWorkType.WorkFL: case NodeWorkType.StartWorkFL: break; case NodeWorkType.WorkHL: if (this.IsMainFlow) { /* 首先找到与他最近的一个分流点, * 并且判断当前的操作员是不是分流点上的工作人员。*/ //如果是撤销的节点是断头路的节点. if (cancelToNode.IsSendBackNode == true) { //不需要处理,按照正常的模式处理. } else { return this.DoUnSendHeiLiu_Main(gwf); } } else { return this.DoUnSendSubFlow(gwf); //是子流程时. } break; case NodeWorkType.SubThreadWork: break; default: break; } #endregion 判断当前节点的模式. /********** 开始执行撤销. **********************/ #region 如果撤销到的节点是普通的节点,并且当前的节点是分流(分流)节点,并且分流(分流)节点已经发送下去了,就不允许撤销了. if (cancelToNode.HisRunModel == RunModel.Ordinary && nd.HisRunModel == RunModel.HL && nd.HisRunModel == RunModel.FHL && nd.HisRunModel == RunModel.FL) { /* 检查一下是否还有没有完成的子线程,如果有就抛出不允许撤销的异常。 */ sql = "SELECT COUNT(*) as NUM FROM WF_GenerWorkerlist WHERE FID=" + this.WorkID + " AND IsPass=0"; if (DBAccess.RunSQLReturnValInt(sql) != 0) return "err@不允许撤销,因为有未完成的子线程."; // return this.DoUnSendHeiLiu_Main(gwf); } #endregion 如果撤销到的节点是普通的节点,并且当前的节点是分流节点,并且分流节点已经发送下去了. #region 如果当前是协作组长模式,就要考虑当前是否是会签节点,如果是会签节点,就要处理。 if (cancelToNode.TodolistModel == TodolistModel.TeamupGroupLeader || cancelToNode.TodolistModel == TodolistModel.Teamup) { sql = "SELECT ActionType FROM ND" + int.Parse(this.FlowNo) + "Track WHERE NDFrom=" + cancelToNodeID + " AND EmpFrom='" + WebUser.No + "' AND WorkID=" + this.WorkID +" Order By RDT DESC"; DataTable dt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dt.Rows) { int ac = int.Parse(dr[0].ToString()); ActionType at = (ActionType)ac; if (at == ActionType.TeampUp) { /*如果是写作人员,就不允许他撤销 */ return "err@您是节点[" + cancelToNode.Name + "]的会签人,您不能执行撤销。"; } break; } } #endregion 如果当前是协作组长模式 //记录撤销前的处理人 string todoEmps = gwf.TodoEmps; if (DataType.IsNullOrEmpty(todoEmps) == false) { string[] strs = todoEmps.Split(';'); todoEmps = ""; foreach (string str in strs) { if (DataType.IsNullOrEmpty(str) == true) continue; todoEmps += str.Split(',')[0]; } } WorkNode wnOfCancelTo = new WorkNode(this.WorkID, cancelToNodeID); // 调用撤消发送前事件。 string msg = ExecEvent.DoNode(EventListNode.UndoneBefore, nd, wn.HisWork, null); if (msg == null) msg = ""; #region 删除当前节点数据。 // 删除产生的工作列表。 //DeleteSpanNodesGenerWorkerListData(); GenerWorkerLists wls = new GenerWorkerLists(); wls.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); // 删除附件信息。 DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB WHERE FK_MapData='ND" + gwf.FK_Node + "' AND RefPKVal='" + this.WorkID + "'"); #endregion 删除当前节点数据。 // 更新. gwf.FK_Node = cancelToNode.NodeID; gwf.NodeName = cancelToNode.Name; //恢复上一步发送人 DataTable dtPrevTrack = Dev2Interface.Flow_GetPreviousNodeTrack(this.WorkID, cancelToNode.NodeID); if (dtPrevTrack != null && dtPrevTrack.Rows.Count > 0) { gwf.Sender = dtPrevTrack.Rows[0]["EmpFrom"].ToString()+","+dtPrevTrack.Rows[0]["EmpFromT"].ToString()+";"; } if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) gwf.TaskSta = TaskSta.Takeback; else gwf.TaskSta = TaskSta.None; gwf.TodoEmps = WebUser.No + "," + WebUser.Name + ";"; gwf.Update(); if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) { //设置全部的人员不可用。 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=-1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //设置当前人员可用。 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } else { DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } //更新当前节点,到rpt里面。 DBAccess.RunSQL("UPDATE " + this.HisFlow.PTable + " SET FlowEndNode=" + gwf.FK_Node + " WHERE OID=" + this.WorkID); // 记录日志.. wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, cancelToNode.NodeID, cancelToNode.Name, "无"); //删除审核组件设置“协作模式下操作员显示顺序”为“按照接受人员列表先后顺序(官职大小)”,而生成的待审核轨迹信息 NodeWorkCheck fwc = new NodeWorkCheck(nd.NodeID); if (fwc.FWCSta == FrmWorkCheckSta.Enable && fwc.FWCOrderModel == FWCOrderModel.SqlAccepter) { DBAccess.RunSQL("DELETE FROM ND" + int.Parse(nd.FK_Flow) + "Track WHERE WorkID = " + this.WorkID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND NDFrom = " + nd.NodeID + " AND NDTo = " + nd.NodeID + " AND (Msg = '' OR Msg IS NULL)"); } // 删除数据. if (wn.HisNode.IsStartNode) { DBAccess.RunSQL("DELETE FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + nd.NodeID); } else { DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + nd.NodeID); } //首先删除当前节点的,审核意见. 2020.06.11 // 如果是断头路节点为了响应计算中心的需求. if (nd.IsSendBackNode == false) { string delTrackSQl = "DELETE FROM ND" + int.Parse(nd.FK_Flow) + "Track WHERE WorkID=" + this.WorkID + " AND NDFrom=" + nd.NodeID + " AND ActionType =22 "; DBAccess.RunSQL(delTrackSQl); } if (wn.HisNode.IsEval) { /*如果是质量考核节点,并且撤销了。*/ DBAccess.RunSQL("DELETE FROM WF_CHEval WHERE FK_Node=" + wn.HisNode.NodeID + " AND WorkID=" + this.WorkID); } #region 恢复工作轨迹,解决工作抢办。 if (cancelToNode.IsStartNode == false && cancelToNode.IsEnableTaskPool == false) { WorkNode ppPri = wnOfCancelTo.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); wl.Retrieve(GenerWorkerListAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, GenerWorkerListAttr.WorkID, this.WorkID); // DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE FK_Node=" + backtoNodeID + " AND WorkID=" + this.WorkID); RememberMe rm = new RememberMe(); rm.Retrieve(RememberMeAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, RememberMeAttr.FK_Emp, ppPri.HisWork.Rec); string[] empStrs = rm.Objs.Split('@'); foreach (string s in empStrs) { if (DataType.IsNullOrEmpty(s) == true) continue; if (s == wl.FK_Emp) continue; GenerWorkerList wlN = new GenerWorkerList(); wlN.Copy(wl); wlN.FK_Emp = s; BP.Port.Emp myEmp = new BP.Port.Emp(s); wlN.FK_EmpText = myEmp.Name; wlN.FK_Dept = myEmp.FK_Dept; wlN.DeptName = myEmp.FK_DeptText; wlN.Insert(); } } #endregion 恢复工作轨迹,解决工作抢办。 #region 如果是开始节点, 检查此流程是否有子流程,如果有则删除它们。 if (nd.IsStartNode) { /*要检查一个是否有 子流程,如果有,则删除它们。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.PWorkID, this.WorkID); if (gwfs.Count > 0) { foreach (GenerWorkFlow item in gwfs) { /*删除每个子线程.*/ BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(item.WorkID, true); } } } #endregion string atPara = "@ToNode=" + cancelToNodeID + "@SendToEmpIDs=" + todoEmps; //调用撤消发送后事件。 string nodeMsg = ExecEvent.DoNode(EventListNode.UndoneAfter, nd, wn.HisWork, null, atPara); if (DataType.IsNullOrEmpty(nodeMsg) == false) msg += nodeMsg; if (wnOfCancelTo.HisNode.IsStartNode) { switch (wnOfCancelTo.HisNode.HisFormType) { case NodeFormType.FoolForm: case NodeFormType.Develop: return "@撤消执行成功." + msg; break; default: return "@撤销成功." + msg; break; } } else { // 更新是否显示。 // DBAccess.RunSQL("UPDATE WF_ForwardWork SET IsRead=1 WHERE WORKID=" + this.WorkID + " AND FK_Node=" + cancelToNode.NodeID); switch (wnOfCancelTo.HisNode.HisFormType) { case NodeFormType.FoolForm: case NodeFormType.Develop: return "@撤消执行成功. " + msg; break; default: return "撤销成功:" + msg; break; } } return "工作已经被您撤销到:" + cancelToNode.Name; } /// /// 撤消分流点 /// 1, 把分流节点的人员设置成待办。 /// 2,删除所有该分流点发起的子线程。 /// /// /// private string DoUnSendFeiLiu(GenerWorkFlow gwf) { //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。 GenerWorkerList gwl = new GenerWorkerList(); int i = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node, GenerWorkerListAttr.FK_Emp, WebUser.No); if (i == 0) throw new Exception("@您不能执行撤消发送,因为当前工作不是您发送的。"); //处理事件. Node nd = new Node(gwf.FK_Node); Work wk = nd.HisWork; wk.OID = gwf.WorkID; wk.RetrieveFromDBSources(); string msg = ExecEvent.DoNode(EventListNode.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.IsSubThread==true) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) BP.WF.Dev2Interface.Flow_DeleteSubThread(en.WorkID, "合流节点撤销发送前,删除子线程."); continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; } //设置当前节点。 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND IsPass=1"); // 设置当前节点的状态. Node cNode = new Node(gwf.FK_Node); Work cWork = cNode.HisWork; cWork.OID = this.WorkID; msg += ExecEvent.DoNode(EventListNode.UndoneAfter, nd, wk, null); return "@撤消执行成功." + msg; } /// /// 分合流的撤销发送. /// /// /// 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 = DataType.CurrentDateTimess; //这里计算时间有问题. gwl.Update(); // 把设置当前流程运行到分流流程上. gwf.FK_Node = this.UnSendToNode; Node nd = new Node(this.UnSendToNode); gwf.NodeName = nd.Name; gwf.Sender = WebUser.No + "," + WebUser.Name + ";"; gwf.SendDT = DataType.CurrentDateTimess; gwf.Update(); Work wk = nd.HisWork; wk.OID = gwf.WorkID; wk.RetrieveFromDBSources(); string msg = ExecEvent.DoNode(EventListNode.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.IsSubThread==true) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) BP.WF.Dev2Interface.Flow_DeleteSubThread(en.WorkID, "合流节点撤销发送前,删除子线程."); continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; } // 设置当前节点的状态. Node cNode = new Node(gwf.FK_Node); Work cWork = cNode.HisWork; cWork.OID = this.WorkID; msg += ExecEvent.DoNode(EventListNode.UndoneAfter, nd, wk, null); if (cNode.IsStartNode) { return "@撤消执行成功." + msg; } else { return "@撤消执行成功." + msg; } } /// /// 执行撤销发送 /// /// /// public string DoUnSendHeiLiu_Main(GenerWorkFlow gwf) { Node currNode = new Node(gwf.FK_Node); Node priFLNode = currNode.HisPriFLNode; //获得上一个节点. GenerWorkerList wl = new GenerWorkerList(); //判断改操作人员是否是分流节点上的人员. int i = wl.Retrieve(GenerWorkerListAttr.FK_Node, priFLNode.NodeID, GenerWorkerListAttr.FK_Emp, BP.Web.WebUser.No); if (i == 0) return "@不是您把工作发送到当前节点上,所以您不能撤消。"; WorkNode wn = this.GetCurrentWorkNode(); WorkNode wnPri = new WorkNode(this.WorkID, priFLNode.NodeID); // 记录日志.. wnPri.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, wnPri.HisNode.NodeID, wnPri.HisNode.Name, "无"); //删除当前节点的流程 DeleteSpanNodesGenerWorkerListData(); //GenerWorkerLists wls = new GenerWorkerLists(); //wls.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node.ToString()); //更改流程信息 gwf.FK_Node = wnPri.HisNode.NodeID; gwf.NodeName = wnPri.HisNode.Name; gwf.Update(); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //删除子线程的功能 foreach (Node ndNext in wnPri.HisNode.HisToNodes) { i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID); if (i == 0) continue; if (ndNext.IsSubThread == true) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) BP.WF.Dev2Interface.Flow_DeleteSubThread(en.WorkID, "合流节点撤销发送前,删除子线程."); continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; } #region 恢复工作轨迹,解决工作抢办。 if (wnPri.HisNode.IsStartNode == false) { WorkNode ppPri = wnPri.GetPreviousWorkNode(); wl = new GenerWorkerList(); wl.Retrieve(GenerWorkerListAttr.FK_Node, wnPri.HisNode.NodeID, GenerWorkerListAttr.WorkID, this.WorkID); RememberMe rm = new RememberMe(); rm.Retrieve(RememberMeAttr.FK_Node, wnPri.HisNode.NodeID, RememberMeAttr.FK_Emp, ppPri.HisWork.Rec); string[] empStrs = rm.Objs.Split('@'); foreach (string s in empStrs) { if (DataType.IsNullOrEmpty(s) == true) continue; if (s == wl.FK_Emp) continue; GenerWorkerList wlN = new GenerWorkerList(); wlN.Copy(wl); wlN.FK_Emp = s; BP.WF.Port.WFEmp myEmp = new BP.WF.Port.WFEmp(s); wlN.FK_EmpText = myEmp.Name; wlN.Insert(); } } #endregion 恢复工作轨迹,解决工作抢办。 // 删除以前的节点数据. if (wnPri.HisNode.IsStartNode) { if (wnPri.HisNode.HisFormType != NodeFormType.SDKForm) return "@撤消执行成功."; else return "@撤销成功."; } else { return "@撤消执行成功."; } } public string DoUnSendSubFlow(GenerWorkFlow gwf) { WorkNode wn = this.GetCurrentWorkNode(); WorkNode wnPri = wn.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); int num = wl.Retrieve(GenerWorkerListAttr.FK_Emp, BP.Web.WebUser.No, GenerWorkerListAttr.FK_Node, wnPri.HisNode.NodeID); if (num == 0) return "@您不能执行撤消发送,因为当前工作不是您发送的。"; // 处理事件。 string msg = ExecEvent.DoNode(EventListNode.UndoneBefore, wn.HisNode, wn.HisWork, null); // 删除工作者。 DeleteSpanNodesGenerWorkerListData(); gwf.FK_Node = wnPri.HisNode.NodeID; gwf.NodeName = wnPri.HisNode.Name; gwf.Update(); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //ShiftWorks fws = new ShiftWorks(); //fws.Delete(ShiftWorkAttr.FK_Node, wn.HisNode.NodeID.ToString(), ShiftWorkAttr.WorkID, this.WorkID.ToString()); #region 判断撤消的百分比条件的临界点条件 if (wn.HisNode.PassRate != 0) { decimal all = (decimal)DBAccess.RunSQLReturnValInt("SELECT COUNT(*) NUM FROM WF_GenerWorkerlist WHERE FID=" + this.FID + " AND FK_Node=" + wnPri.HisNode.NodeID); decimal ok = (decimal)DBAccess.RunSQLReturnValInt("SELECT COUNT(*) NUM FROM WF_GenerWorkerlist WHERE FID=" + this.FID + " AND IsPass=1 AND FK_Node=" + wnPri.HisNode.NodeID); decimal rate = ok / all * 100; if (wn.HisNode.PassRate <= rate) DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE FK_Node=" + wn.HisNode.NodeID + " AND WorkID=" + this.FID); else DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=3 WHERE FK_Node=" + wn.HisNode.NodeID + " AND WorkID=" + this.FID); } #endregion // 处理事件。 msg += ExecEvent.DoNode(EventListNode.UndoneAfter, wn.HisNode, wn.HisWork, null); // 记录日志.. wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, wn.HisNode.NodeID, wn.HisNode.Name, "无"); return "@撤消执行成功." + msg; } /// /// 删除两个节点之间的业务数据与流程引擎控制数据. /// private void DeleteSpanNodesGenerWorkerListData() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); Node unSendNode = new Node(this.UnSendToNode); Paras ps = new Paras(); string dbStr = BP.Difference.SystemConfig.AppCenterDBVarStr; // 删除FH, 不管是否有这笔数据. ps.Clear(); /*撤销到某个节点,就需要清除 两个节点之间的数据, 包括WF_GenerWorkerlist的数据.*/ if (unSendNode.IsStartNode == true) { // 删除其子线程流程. ps.Clear(); ps.SQL = "DELETE FROM WF_GenerWorkFlow WHERE FID=" + dbStr + "FID "; ps.Add("FID", this.WorkID); DBAccess.RunSQL(ps); /*如果撤销到了开始的节点,就删除出开始节点以外的数据,不要删除节点表单数据,这样会导致流程轨迹打不开.*/ ps.Clear(); ps.SQL = "DELETE FROM WF_GenerWorkerlist WHERE FK_Node!=" + dbStr + "FK_Node AND (WorkID=" + dbStr + "WorkID1 OR FID=" + dbStr + "WorkID2)"; ps.Add(GenerWorkerListAttr.FK_Node, unSendNode.NodeID); ps.Add("WorkID1", this.WorkID); ps.Add("WorkID2", this.WorkID); DBAccess.RunSQL(ps); return; } /*找到撤销到的节点,把从这个时间点以来的数据都要删除掉.*/ ps.Clear(); ps.SQL = "SELECT RDT,ActionType,NDFrom FROM ND" + int.Parse(gwf.FK_Flow) + "Track WHERE NDFrom=" + dbStr + "NDFrom AND WorkID=" + dbStr + "WorkID AND ActionType=" + (int)ActionType.Forward + " ORDER BY RDT desc "; ps.Add("NDFrom", unSendNode.NodeID); ps.Add("WorkID", this.WorkID); DataTable dt = DBAccess.RunSQLReturnTable(ps); if (dt.Rows.Count >= 1) { string rdt = dt.Rows[0][0].ToString(); ps.Clear(); ps.SQL = "SELECT ActionType,NDFrom FROM ND" + int.Parse(gwf.FK_Flow) + "Track WHERE RDT >=" + dbStr + "RDT AND WorkID=" + dbStr + "WorkID ORDER BY RDT "; ps.Add("RDT", rdt); ps.Add("WorkID", this.WorkID); dt = DBAccess.RunSQLReturnTable(ps); foreach (DataRow dr in dt.Rows) { ActionType at = (ActionType)int.Parse(dr["ActionType"].ToString()); int nodeid = int.Parse(dr["NDFrom"].ToString()); if (nodeid == unSendNode.NodeID) continue; //删除中间的节点. ps.Clear(); ps.SQL = "DELETE FROM WF_GenerWorkerlist WHERE FK_Node=" + dbStr + "FK_Node AND (WorkID=" + dbStr + "WorkID1 OR FID=" + dbStr + "WorkID2) "; ps.Add("FK_Node", nodeid); ps.Add("WorkID1", this.WorkID); ps.Add("WorkID2", this.WorkID); DBAccess.RunSQL(ps); //删除审核意见 ps.Clear(); ps.SQL = "DELETE FROM ND" + int.Parse(unSendNode.FK_Flow) + "Track WHERE NDFrom=" + dbStr + "NDFrom AND (WorkID=" + dbStr + "WorkID1 OR FID=" + dbStr + "WorkID2) AND ActionType=22"; ps.Add("NDFrom", nodeid); ps.Add("WorkID1", this.WorkID); ps.Add("WorkID2", this.WorkID); DBAccess.RunSQL(ps); } } //删除当前节点的数据. ps.Clear(); ps.SQL = "DELETE FROM WF_GenerWorkerlist WHERE FK_Node=" + dbStr + "FK_Node AND (WorkID=" + dbStr + "WorkID1 OR FID=" + dbStr + "WorkID2) "; ps.Add("FK_Node", gwf.FK_Node); ps.Add("WorkID1", this.WorkID); ps.Add("WorkID2", this.WorkID); DBAccess.RunSQL(ps); } } }