@ -106,7 +106,7 @@ namespace BP.WF
this . FlowNo = flowNo ;
this . WorkID = workID ;
this . FID = fid ;
this . UnSendToNode = U nSendToNode; //撤销到节点.
this . UnSendToNode = u nSendToNode; //撤销到节点.
}
public int UnSendToNode = 0 ;
/// <summary>
@ -168,7 +168,8 @@ namespace BP.WF
/ /
NodeCancels ncs = new NodeCancels ( ) ;
ncs . Retrieve ( NodeCancelAttr . FK_Node , wn . HisNode . NodeID ) ;
if ( ncs . Count = = 0 )
string cancelNodes = wn . HisNode . GetParaString ( "CancelNodes" ) ;
if ( ncs . Count = = 0 & & DataType . IsNullOrEmpty ( cancelNodes ) = = true )
throw new Exception ( "@流程设计错误, 您设置了当前节点(" + wn . HisNode . Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点." ) ;
//获取Track表
@ -217,7 +218,7 @@ namespace BP.WF
// 调用撤消发送前事件。
ExecEvent . DoNode ( EventListNode . UndoneBefore , nd , wn . HisWork , null ) ;
BP . WF . Dev2Interface . Node_FHL_KillSubFlow ( this . WorkID ) ; //杀掉子线程.
BP . WF . Dev2Interface . Node_FHL_KillSubFlow ( this . WorkID ) ; //杀掉子线程.
// 调用撤消发送前事件。
ExecEvent . DoNode ( EventListNode . UndoneAfter , nd , wn . HisWork , null ) ;
@ -315,7 +316,7 @@ namespace BP.WF
wlN . Copy ( wl ) ;
wlN . EmpNo = s ;
BP . Port . Emp myEmp = new BP . Port . Emp ( s ) ;
BP . Port . Emp myEmp = new BP . Port . Emp ( s ) ;
wlN . EmpName = myEmp . Name ;
wlN . DeptNo = myEmp . DeptNo ;
wlN . DeptName = myEmp . DeptText ;
@ -381,21 +382,68 @@ namespace BP.WF
return "工作已经被您撤销到:" + cancelToNode . Name ;
}
/// <summary>
///
/// 执行撤销.
/// </summary>
/// <returns></returns>
public string DoUnSend ( )
{
string str = DoUnSendIt ( ) ;
if ( str . Contains ( "err@" ) = = false )
{
string table = "ND" + int . Parse ( FlowNo ) + "Track" ;
string dbStr = SystemConfig . AppCenterDBVarStr ;
#region 1. 撤销发送后的删除信息. for:天宇.
//检查一下当前节点审核组件的状态是否启用? 如果启用了:将自己本次审核的信息和保存的历史审核信息都删除.( 历史审核信息保存在ActionType=1的Msg字段中以'WorkCheck@XXX'的形式保存)
int nodeID = DBAccess . RunSQLReturnValInt ( "SELECT FK_Node FROM WF_GenerWorkFlow WHERE WorkID=" + this . WorkID , 0 ) ;
Node nd = new Node ( nodeID ) ;
string sql = "" ;
if ( nd . FrmWorkCheckSta = = FrmWorkCheckSta . Enable )
{
//按照日期排序.
sql = "SELECT MyPK,ActionType FROM " + table + " WHERE ActionType IN (1,22) AND NDFrom=" + nodeID + " ORDER BY RDT" ;
DataTable dataTable = DBAccess . RunSQLReturnTable ( sql ) ;
//删除第一个:发送信息.
foreach ( DataRow dr in dataTable . Rows )
{
string pkaval = dr [ "MyPK" ] . ToString ( ) ; //主键值.
int actionType = int . Parse ( dr [ 1 ] . ToString ( ) ) ; //类型值.
if ( actionType = = 1 )
{
DBAccess . RunSQL ( "DELETE FROM " + table + " WHERE MyPK='" + pkaval + "'" ) ;
break ;
}
}
//删除第2个: 审核信息.
foreach ( DataRow dr in dataTable . Rows )
{
string pkaval = dr [ "MyPK" ] . ToString ( ) ; //主键值.
int actionType = int . Parse ( dr [ 1 ] . ToString ( ) ) ; //类型值.
if ( actionType = = 22 )
{
DBAccess . RunSQL ( "DELETE FROM " + table + " WHERE MyPK='" + pkaval + "'" ) ;
break ;
}
}
}
#endregion 撤销发送后的删除信息.
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 ) ;
#region 2. 检查是否原路返回? 如果有,撤销后改变为 退回状态. for:北科大.
/* 检查该退回是否是原路返回 ? */
Paras ps = new Paras ( ) ;
ps . SQL = "SELECT NDFrom,EmpFrom,EmpFromT FROM " + table + " WHERE ActionType IN(2,201) AND WorkID=" + dbStr + "WorkID AND NDTo=" + nodeID + " ORDER BY RDT DESC" ;
ps . Add ( TrackAttr . WorkID , this . WorkID ) ;
DataTable mydt = DBAccess . RunSQLReturnTable ( ps ) ;
if ( mydt . Rows . Count ! = 0 )
{
GenerWorkFlow gwl = new GenerWorkFlow ( this . WorkID ) ;
gwl . SetPara ( "IsBackTracking" , 1 ) ;
gwl . WFState = WFState . ReturnSta ;
gwl . Update ( ) ;
}
#endregion
}
return str ;
}
/// <summary>
@ -443,7 +491,7 @@ namespace BP.WF
// 调用撤消发送前事件。
ExecEvent . DoNode ( EventListNode . UndoneBefore , nd , nd . HisWork , null ) ;
BP . WF . Dev2Interface . Node_FHL_KillSubFlow ( long . Parse ( dr [ "WorkID" ] . ToString ( ) ) ) ; //杀掉子线程.
BP . WF . Dev2Interface . Node_FHL_KillSubFlow ( long . Parse ( dr [ "WorkID" ] . ToString ( ) ) ) ; //杀掉子线程.
// 调用撤消发送前事件。
Work work = nd . HisWork ;
@ -486,7 +534,12 @@ namespace BP.WF
if ( i > = 1 )
return "err@当前待办已经有[" + i + "]个工作人员打开了该工作,您不能撤销." ;
}
//对方已审批就不能撤销
int count = DBAccess . RunSQLReturnValInt ( "SELECT SUM(IsPass) AS Num FROM WF_GenerWorkerlist WHERE IsPass=1 AND (WorkID=" + this . WorkID + " OR WorkID=" + this . FID + ") AND FK_Node=" + gwf . NodeID + " AND FK_Emp!='" + WebUser . No + "'" , 0 ) ;
if ( count > = 1 )
{
return "err@当前待办已经有[" + count + "]个工作人员处理了该工作,您不能撤销." ;
}
#region 如果是越轨流程状态 .
string sql = "SELECT COUNT(*) AS Num FROM WF_GenerWorkerlist WHERE WorkID=" + this . WorkID + " AND IsPass=80" ;
@ -513,8 +566,8 @@ namespace BP.WF
#region 判断是否是会签状态,是否是会签人做的撤销. 主持人是不能撤销的.
if ( gwf . HuiQianTaskSta ! = HuiQianTaskSta . None )
{
string IsEnableUnSendWhenHuiQian = BP . Difference . SystemConfig . AppSettings [ "IsEnableUnSendWhenHuiQian" ] ;
if ( DataType. IsNullOrEmpty ( IsEnableUnSendWhenHuiQian) = = false & & IsEnableUnSendWhenHuiQian . Equals ( "0" ) )
bool IsEnableUnSendWhenHuiQian = SystemConfig . GetValByKeyBoolen ( "IsEnableUnSendWhenHuiQian" , false ) ;
if ( IsEnableUnSendWhenHuiQian = = false )
return "info@当前节点是会签状态,您不能执行撤销." ;
GenerWorkerList gwl = new GenerWorkerList ( ) ;
@ -567,17 +620,17 @@ namespace BP.WF
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@您没有权限操作该工作." ;
return "err@您没有权限操作该工作." + sql ;
if ( nd . HisCancelRole = = CancelRole . SpecNodes )
{
/*指定的节点可以撤销,首先判断当前人员是否有权限.*/
NodeCancels ncs = new NodeCancels ( ) ;
ncs . Retrieve ( NodeCancelAttr . FK_Node , wn . HisNode . NodeID ) ;
if ( ncs . Count = = 0 )
string cancelNodes = wn . HisNode . GetParaString ( "CancelNodes" ) ;
if ( ncs . Count = = 0 & & DataType . IsNullOrEmpty ( cancelNodes ) = = true )
return "err@流程设计错误, 您设置了当前节点(" + wn . HisNode . Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点." ;
if ( ncs . Contains ( cancelToNodeID ) = = false & & cancelToNodeID ! = gwf . NodeID )
if ( ( ncs . Contains ( NodeCancelAttr . CancelTo , cancelToNodeID ) = = false & & ( cancelNodes + "," ) . Contains ( cancelToNodeID + "," ) = = false ) & & cancelToNodeID ! = gwf . NodeID )
return "err@撤销流程错误,您没有权限执行撤销发送,当前节点不可以执行撤销." ;
}
@ -585,7 +638,7 @@ namespace BP.WF
{
/*如果仅仅允许撤销上一步骤.*/
WorkNode wnPri = wn . GetPreviousWorkNode ( ) ;
if ( wnPri . HisNode . NodeID ! = cancelToNodeID & & cancelToNodeID ! = gwf . NodeID )
if ( wnPri . HisNode . NodeID ! = cancelToNodeID & & cancelToNodeID ! = gwf . NodeID )
return "err@您不能执行撤消发送,因为当前工作不是您发送的或下一步工作已处理。" ;
}
@ -601,7 +654,7 @@ namespace BP.WF
gwf . TodoEmpsNum + + ;
gwf . Update ( ) ;
GenerWorkerList gwl = new GenerWorkerList ( this . WorkID ,
GenerWorkerList gwl = new GenerWorkerList ( this . WorkID ,
cancelToNodeID , WebUser . No ) ;
gwl . PassInt = 0 ;
gwl . Update ( ) ;
@ -689,7 +742,7 @@ namespace BP.WF
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" ;
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 )
{
@ -744,7 +797,7 @@ namespace BP.WF
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 ( ) + ";" ;
gwf . Sender = dtPrevTrack . Rows [ 0 ] [ "EmpFrom" ] . ToString ( ) + "," + dtPrevTrack . Rows [ 0 ] [ "EmpFromT" ] . ToString ( ) + ";" ;
}
if ( cancelToNode . ItIsEnableTaskPool & & Glo . IsEnableTaskPool )
@ -926,7 +979,7 @@ namespace BP.WF
if ( i = = 0 )
continue ;
if ( ndNext . ItIsSubThread = = true )
if ( ndNext . ItIsSubThread = = true )
{
/*如果到达的节点是子线程,就查询出来发起的子线程。*/
GenerWorkFlows gwfs = new GenerWorkFlows ( ) ;
@ -979,7 +1032,7 @@ namespace BP.WF
gwf . NodeID = this . UnSendToNode ;
Node nd = new Node ( this . UnSendToNode ) ;
gwf . NodeName = nd . Name ;
gwf . Sender = WebUser . No + "," + WebUser . Name + ";" ;
gwf . Sender = WebUser . No + "," + WebUser . Name + ";" ;
gwf . SendDT = DataType . CurrentDateTimess ;
gwf . Update ( ) ;
@ -1002,7 +1055,7 @@ namespace BP.WF
if ( i = = 0 )
continue ;
if ( ndNext . ItIsSubThread = = true )
if ( ndNext . ItIsSubThread = = true )
{
/*如果到达的节点是子线程,就查询出来发起的子线程。*/
GenerWorkFlows gwfs = new GenerWorkFlows ( ) ;
@ -1114,10 +1167,10 @@ namespace BP.WF
wlN . Copy ( wl ) ;
wlN . EmpNo = s ;
BP . WF . Port . WFEmp myEmp = new BP . WF . Port . WFEmp ( s ) ;
BP . WF . Port . WFEmp myEmp = new BP . WF . Port . WFEmp ( s ) ;
wlN . EmpName = myEmp . Name ;
wlN . Insert ( ) ;
}
}
@ -1200,7 +1253,7 @@ namespace BP.WF
Node unSendNode = new Node ( this . UnSendToNode ) ;
Paras ps = new Paras ( ) ;
string dbStr = BP . Difference . SystemConfig . AppCenterDBVarStr ;
string dbStr = BP . Difference . SystemConfig . AppCenterDBVarStr ;
// 删除FH, 不管是否有这笔数据.
ps . Clear ( ) ;