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.FK_DeptT = 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.FK_DeptT = 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);
}
}
}