/// <summary> /// 流程流转命令处理 /// </summary> /// <param name="InstanceID">流程实例的ID</param> /// <param name="NodeID">节点ID</param> /// <param name="ApprovalOpinion">申批意见,同意,不同意,驳回上级,驳回至发起人</param> /// <param name="OpeManID">申批人ID</param> /// <param name="ApprovalReason">申批备注</param> private string WFTransmitDeal(string InstanceID, string NodeID, EApprovalOpinion ApprovalOpinion, string OpeManID, string ApprovalReason) { try { //获取并执行审批脚本 string script = CNodeManager.GetApprovalScript(NodeID, ApprovalOpinion); if (script != null && script != "") { CScriptOpe.ScriptExec(script, InstanceID); } //记录审批意见和状态 string UpdateApprovalOpinionResult = CApprovalManager.UpdateApprovalOpinion(InstanceID, NodeID, ApprovalOpinion, OpeManID, ApprovalReason); if (UpdateApprovalOpinionResult != WFGlobal.success) { return(UpdateApprovalOpinionResult); } //判断是否可以流转到下一级 string NextNodeID = CNodeManager.GetNextNodeIDByCurrentNodeID(NodeID, ApprovalOpinion); if (CNodeManager.IsNodeThroughEnable(InstanceID, NextNodeID)) { //记录该节点所有审批人的审批状态 string UpdateNodeApprovalStatusResult = CApprovalManager.UpdateNodeApprovalStatus(InstanceID, NodeID, EApprovalStatus.Complete); if (UpdateNodeApprovalStatusResult != WFGlobal.success) { return(UpdateNodeApprovalStatusResult); } if (ApprovalOpinion == EApprovalOpinion.驳回上级) { return(CReturnUP.ReturnUp(InstanceID, NodeID, NextNodeID)); } else if (ApprovalOpinion == EApprovalOpinion.驳回至发起人) { return(CReturnToStart.ReturnToStart(InstanceID, NodeID, NextNodeID)); } else if (ApprovalOpinion == EApprovalOpinion.意) { return(CGoEnd.GoEnd(InstanceID, NodeID, NextNodeID)); } else { return(CNodeManager.GoNextNodesFromOtherNode(InstanceID, NodeID)); } } return(WFGlobal.success); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("流程流转异常:" + ex.Message.ToString()); return(WFGlobal.ErrInfo); } }
/// <summary> /// 将工作流流转到结束节点 /// </summary> /// <param name="InstanceID"></param> /// <param name="NodeID"></param> public static string GoEnd(string InstanceID, string NodeID, string EndNodeID) { try { return(CNodeManager.NodeTransfer(InstanceID, NodeID, EndNodeID)); } catch (Exception ex) { throw ex; } }
/// <summary> /// 将工作流流转到上一级节点 /// </summary> /// <param name="InstanceID"></param> /// <param name="CurrentNodeID"></param> public static string ReturnUp(string InstanceID, string CurrentNodeID, string UpNodeID) { try { return(CNodeManager.NodeTransfer(InstanceID, CurrentNodeID, UpNodeID)); } catch (Exception ex) { throw ex; } }
public string GetNodeApprovalOpinion(string InstanceID, string NodeID, string ApproverID) { try { return(CNodeManager.GetNodeApprovalOpinion(InstanceID, NodeID, ApproverID)); } catch (Exception ex) { throw ex; } }
/// <summary> /// 判断该节点的所有审批人员是否都已完成审批 /// </summary> /// <param name="InstanceID"></param> /// <param name="NodeID"></param> /// <returns></returns> public bool IsNodeApprovalComplete(string InstanceID, string NodeID) { try { return(CNodeManager.IsNodeApprovalComplete(InstanceID, NodeID)); } catch (Exception ex) { CLog.PutDownErrInfo("判断节点是否审批结束操作异常。实例ID:" + InstanceID + ",节点ID:" + NodeID + ",异常信息:" + ex.Message.ToString()); throw ex; } }
/// <summary> /// 运行流程节点处理脚本 /// </summary> /// <param name="InstanceID"></param> /// <param name="ProcessNodeID"></param> private static void RunProcessScript(string InstanceID, string ProcessNodeID) { try { string ProcessScript = CNodeManager.GetNodeScript(ProcessNodeID, EScriptType.ProcessScript); if (ProcessScript != null && ProcessScript != "") { CScriptOpe.ScriptExec(ProcessScript, InstanceID); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 发起流程命令处理 /// </summary> /// <param name="WFName">流程名称</param> /// <param name="WFDataID">数据表相对应数据ID</param> /// <param name="OpeManID">发起人ID</param> private string WFStartDeal(string WFName, string WFDataID, string OpeManID) { try { string WFID = CWFManager.GetLastVersionWFID(WFName); if (WFID == null || WFID == "") { WFGlobal.ErrInfo = CLog.PutDownErrInfo("工作流" + WFName + "不存在。"); return(WFGlobal.ErrInfo); } string StartNodeID = CNodeManager.GetStartNodeID(WFID); if (StartNodeID == null || StartNodeID == "") { WFGlobal.ErrInfo = CLog.PutDownErrInfo("工作流" + WFID + "没有起始节点。"); return(WFGlobal.ErrInfo); } string NewInstanceID = Guid.NewGuid().ToString(); //记录工作流实例 string PutDownInstanceResult = CInstanceManager.PutDownNewInstance(WFName, WFDataID, OpeManID, WFID, NewInstanceID); if (PutDownInstanceResult != WFGlobal.success) { return(PutDownInstanceResult); } //将工作流实例的审批人设定为发起人 string PutDownApproverResult = CApprovalManager.PutDownApprover(NewInstanceID, StartNodeID, OpeManID, 1, ""); if (PutDownApproverResult != WFGlobal.success) { return(PutDownApproverResult); } //流程流转 return(WFTransmitDeal(NewInstanceID, StartNodeID, EApprovalOpinion.意, OpeManID, "")); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("发起工作流操作异常。工作流名称:" + WFName + ",发起人ID:" + OpeManID + ",数据ID" + WFDataID + ",异常信息:" + ex.Message.ToString()); return(WFGlobal.ErrInfo); } }
/// <summary> /// 将工作流流转到开始节点 /// </summary> /// <param name="InstanceID"></param> /// <param name="CurrentNodeID">当前节点ID</param> public static string ReturnToStart(string InstanceID, string CurrentNodeID, string StartNodeID) { try { //将当前所有节点的审批状态设置为完成状态 string UpdateInstanceApprovalStatusResult = CApprovalManager.UpdateInstanceApprovalStatus(InstanceID, EApprovalStatus.Complete); if (UpdateInstanceApprovalStatusResult != WFGlobal.success) { return(UpdateInstanceApprovalStatusResult); } //流程流转到开始节点 return(CNodeManager.NodeTransfer(InstanceID, CurrentNodeID, StartNodeID)); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("返回到开始节点操作异常。实例ID:" + InstanceID + ",当前节点ID:" + CurrentNodeID + ",异常信息:" + ex.Message.ToString()); return(WFGlobal.ErrInfo); } }
/// <summary> /// 节点转移,从当前节点进入下一节点 /// </summary> /// <param name="WFID"></param> /// <param name="InstanceID"></param> /// <param name="NodeID"></param> /// <param name="NextNodeID"></param> public static string NodeTransfer(string InstanceID, string NodeID, string NextNodeID) { try { if (CNodeManager.IsNodeThroughEnable(InstanceID, NextNodeID)) { //记录流转历史 if (CDataHelper.ExecuteNonQuery("insert into " + CTableName.FlowChartHistory + "(instance_id,node_id,next_node_id) values('" + InstanceID + "','" + NodeID + "','" + NextNodeID + "')") < 0) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("记录工作流实例流转节点失败,工作流实例ID:" + InstanceID + ",开始节点ID:" + NodeID + ",结束节点ID:" + NextNodeID); return(WFGlobal.ErrInfo); } string NodeType = CNodeManager.GetNodeType(NextNodeID); if (NodeType == CNodeType.SwitchType) { return(GoNextNodesFromSwitchNode(InstanceID, NextNodeID)); } else if (NodeType == CNodeType.ProcessType) { RunProcessScript(InstanceID, NextNodeID); return(CNodeManager.GoNextNodesFromOtherNode(InstanceID, NextNodeID)); } else if (NodeType == CNodeType.ApproveType || NodeType == CNodeType.StartType) { return(CNodeManager.PutDownNodeApprover(InstanceID, NextNodeID)); } else if (NodeType == CNodeType.EndType) { return(CInstanceManager.SetInstanceComplete(InstanceID)); } } return(WFGlobal.success); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("节点流转异常,工作流实例ID:" + InstanceID + ",开始节点ID:" + NodeID + ",结束节点ID:" + NextNodeID); return(WFGlobal.ErrInfo); } }
/// <summary> /// 获取上一级审批节点 /// </summary> /// <param name="NodeID">当前节点ID</param> /// <returns></returns> public static string GetUpApprovalNodeID(string NodeID) { try { string UpNodeID = null; while (true) { UpNodeID = GetUpNodeID(NodeID); string NodeType = CNodeManager.GetNodeType(UpNodeID); if (NodeType != CNodeType.SwitchType && NodeType != CNodeType.ProcessType) { break; } NodeID = UpNodeID; } return(UpNodeID); } catch (Exception ex) { CLog.PutDownErrInfo("通过节点ID获取上一个审批节点ID操作异常。节点ID:" + NodeID + ",异常信息:" + ex.Message.ToString()); throw ex; } }
/// <summary> /// 获取分支节点的下一级节点ID /// </summary> /// <param name="WFID"></param> /// <param name="InstanceID"></param> /// <param name="SwitchNodeID">分支节点ID</param> /// <returns></returns> public static string GoNextNodesFromSwitchNode(string InstanceID, string SwitchNodeID) { try { string[] SwitchNames = CNodeManager.GetSwitchName(InstanceID, SwitchNodeID); for (int i = 0; i < SwitchNames.Length; i++) { string SwitchID = CNodeManager.GetSwitchIDBySwitchName(SwitchNodeID, SwitchNames[i]); //根据switchid获取下一级节点ID string NextNodeID = CNodeManager.GetNextNodeIDBySwitchID(SwitchID); string NodeTransferResult = NodeTransfer(InstanceID, SwitchNodeID, NextNodeID); if (NodeTransferResult != WFGlobal.success) { return(NodeTransferResult); } } return(WFGlobal.success); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("流程流转操作异常,工作流实例ID:" + InstanceID + ",当前节点ID:" + SwitchNodeID + ",异常信息:" + ex.Message.ToString()); return(WFGlobal.ErrInfo); } }
/// <summary> /// 记录节点的审批人 /// </summary> /// <param name="InstanceID"></param> /// <param name="NodeID"></param> public static string PutDownNodeApprover(string InstanceID, string NodeID) { try { string nodetype = CNodeManager.GetNodeType(NodeID); if (nodetype == null) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("获取节点" + NodeID + "的节点类型失败,工作流实例ID:" + InstanceID); CInstanceManager.SetInstanceError(InstanceID, WFGlobal.ErrInfo); return(WFGlobal.ErrInfo); } int ApprovalNum = CApprovalManager.GetLastApprovalNum(InstanceID, NodeID); //判断是否开始流程 if (nodetype == CNodeType.StartType) { string StartManID = CInstanceManager.GetInstanceStartManID(InstanceID); if (StartManID == null) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("获取流程实例的发起人失败,工作流实例ID:" + InstanceID); CInstanceManager.SetInstanceError(InstanceID, WFGlobal.ErrInfo); return(WFGlobal.ErrInfo); } string ApprovalNote = CApprovalManager.GetApprovalNote(InstanceID, NodeID); string PutDownApproverResult = CApprovalManager.PutDownApprover(InstanceID, NodeID, StartManID, ApprovalNum + 1, ApprovalNote); if (PutDownApproverResult != WFGlobal.success) { return(PutDownApproverResult); } } //判断流程是否结束 else if (nodetype != CNodeType.EndType) { DataTable dtReceiver = CApprovalManager.GetApprover(InstanceID, NodeID); string ApprovalNote = CApprovalManager.GetApprovalNote(InstanceID, NodeID); if (dtReceiver != null) { if (dtReceiver.Rows.Count > 0) { for (int i = 0; i < dtReceiver.Rows.Count; i++) { string ReceiverID = dtReceiver.Rows[i][WFGlobal.UserID].ToString(); string PutDownApproverResult = CApprovalManager.PutDownApprover(InstanceID, NodeID, ReceiverID, ApprovalNum + 1, ApprovalNote); if (PutDownApproverResult != WFGlobal.success) { return(PutDownApproverResult); } } } } } return(WFGlobal.success); } catch (Exception ex) { WFGlobal.ErrInfo = CLog.PutDownErrInfo("记录节点审批人操作异常。工作流实例ID:" + InstanceID + ",节点ID:" + NodeID + ",异常信息:" + ex.Message.ToString()); return(WFGlobal.ErrInfo); } }