/// <summary> /// 创建并且发送流程 /// </summary> /// <returns></returns> public void CreateAndSendWork(string flowNo, Hashtable htWork, DataSet workDtls, string flowStarter, string title, Int64 parentWorkID, string parentFlowNo) { Int64 work_id = Dev2Interface.Node_CreateStartNodeWork(flowNo, htWork, workDtls, flowStarter, title, parentWorkID, parentFlowNo); Dev2Interface.Node_SendWork(flowNo, work_id); }
void btn_Author_Cancel_Click(object sender, EventArgs e) { bool bResult = Dev2Interface.Flow_AuthorCancel(); if (bResult == true) { this.Alert("撤销成功。"); this.Response.Redirect("AuthorDemo.aspx"); } }
private void FormLoad() { var dataTable = Dev2Interface.DB_GenerCanStartFlowsOfDataTable(WebUser.No); gcFlowControl.DataSource = dataTable; RepositoryItemHyperLinkEdit repHyperLink = new RepositoryItemHyperLinkEdit(); gcFlowControl.RepositoryItems.Add(repHyperLink); gvFlow.Columns["Map"].ColumnEdit = repHyperLink; repHyperLink.LinkColor = Color.Maroon; repHyperLink.NullText = "查看"; }
public static void SetFlowTitle(string userNo, string flowNo, long workId, string title) { UserLogin(userNo); try { Dev2Interface.Flow_SetFlowTitle(flowNo, workId, title); } catch { return; } }
/// <summary> /// 发送案件 /// </summary> /// <returns></returns> private string Send() { //首先执行保存. this.Save(); string resultMsg = ""; try { if (Dev2Interface.Flow_IsCanDoCurrentWork(this.FK_Flow, this.FK_Node, this.WorkID, WebUser.No) == false) { resultMsg = "error|您好:" + BP.Web.WebUser.No + ", " + WebUser.Name + "当前的工作已经被处理,或者您没有执行此工作的权限。"; } else { SendReturnObjs returnObjs = Dev2Interface.Node_SendWork(this.FK_Flow, this.WorkID); // resultMsg = returnObjs.ToMsgOfHtml(); resultMsg = returnObjs.ToMsgOfHtml(); //执行抄送. BP.WF.Dev2Interface.Node_CC_WriteTo_Todolist(returnObjs.VarToNodeID, returnObjs.VarToNodeID, this.WorkID, "zhoupeng", "周朋"); BP.WF.Dev2Interface.Flow_SetFlowTitle(this.FK_Flow, this.WorkID, "sdsdsdfsdfsdfsdf"); //BP.WF.Dev2Interface.DB_GenerCanStartFlowsOfDataTable(); #region 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. /*这里有两种情况 * 1,从中间的节点,通过批量处理,也就是说合并审批处理的情况,这种情况子流程需要执行到下一步。 * 2,从流程已经完成,或者正在运行中,也就是说合并审批处理的情况. */ try { //处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. BP.WF.Glo.DealBuinessAfterSendWork(this.FK_Flow, this.WorkID, this.DoFunc, WorkIDs); } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); return(resultMsg); } #endregion 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. } } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); } return(resultMsg); }
private Int64 GetThreadID(Int64 workID) { //获取它的待办, 从而获取子线程id. var dt = Dev2Interface.DB_GenerEmpWorksOfDataTable(WebUser.No, WFState.Runing, fk_flow); foreach (DataRow dr in dt.Rows) { Int64 fid = Int64.Parse(dr["FID"].ToString()); if (fid != workID) { continue; } return(Int64.Parse(dr["WorkID"].ToString())); } throw new Exception("@没有找到."); }
/// <summary> /// 发送案件 /// </summary> /// <returns></returns> private string Send() { //首先执行保存. this.Save(); string resultMsg = ""; try { if (Dev2Interface.Flow_IsCanDoCurrentWork(this.FK_Flow, this.FK_Node, this.WorkID, WebUser.No) == false) { resultMsg = "error|您好:" + BP.Web.WebUser.No + ", " + WebUser.Name + "当前的工作已经被处理,或者您没有执行此工作的权限。"; } else { SendReturnObjs returnObjs = Dev2Interface.Node_SendWork(this.FK_Flow, this.WorkID, 112301, "zhangsan,lisi,wangwu"); // returnObjs.v // resultMsg = returnObjs.ToMsgOfHtml(); resultMsg = returnObjs.ToMsgOfHtml(); #region 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. /*这里有两种情况 * 1,从中间的节点,通过批量处理,也就是说合并审批处理的情况,这种情况子流程需要执行到下一步。 * 2,从流程已经完成,或者正在运行中,也就是说合并审批处理的情况. */ try { //处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. BP.WF.Glo.DealBuinessAfterSendWork(this.FK_Flow, this.WorkID, this.DoFunc, WorkIDs); } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); return(resultMsg); } #endregion 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. } } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); } return(resultMsg); }
void btn_Author_Set_Click(object sender, EventArgs e) { TB tb_Author = this.Pub1.GetTBByID("TB_Author_No"); DDL ddl_AuthorWay = this.Pub1.GetDDLByID("ddl_AuthorWay"); TB tb_FlowNos = this.Pub1.GetTBByID("TB_Author_FlowNos"); if (tb_Author == null || ddl_AuthorWay == null || tb_FlowNos == null) { return; } bool bResult = Dev2Interface.Flow_AuthorSave(tb_Author.Text, int.Parse(ddl_AuthorWay.SelectedItem.Value), tb_FlowNos.Text); if (bResult == true) { this.Alert("设置成功。"); this.Response.Redirect("AuthorDemo.aspx"); } }
/// <summary> /// 执行发送到指定节点 /// </summary> /// <returns></returns> private string SendCaseToNode() { int ToNode = Convert.ToInt32(getUTF8ToString("ToNode")); string resultMsg = ""; try { if (Dev2Interface.Flow_IsCanDoCurrentWork(this.FK_Flow, this.FK_Node, this.WorkID, WebUser.No) == false) { return(resultMsg = "error|您好:" + BP.Web.WebUser.No + ", " + WebUser.Name + "当前的工作已经被处理,或者您没有执行此工作的权限。"); } SendReturnObjs returnObjs = Dev2Interface.Node_SendWork(this.FK_Flow, this.WorkID, ToNode, null); resultMsg = returnObjs.ToMsgOfHtml(); if (resultMsg.IndexOf("@<a") > 0) { string kj = resultMsg.Substring(0, resultMsg.IndexOf("@<a")); resultMsg = resultMsg.Substring(resultMsg.IndexOf("@<a")) + "<br/><br/>" + kj; } //撤销单据 int docindex = resultMsg.IndexOf("@<img src='../../Img/FileType/doc.gif' />"); if (docindex != -1) { String kj = resultMsg.Substring(0, docindex); String kp = ""; int nextdocindex = resultMsg.IndexOf("@", docindex + 1); if (nextdocindex != -1) { kp = resultMsg.Substring(nextdocindex); } resultMsg = kj + kp; } //撤销 撤销本次发送 int UnSendindex = resultMsg.IndexOf("@<a href='MyFlowInfo.aspx?DoType=UnSend"); if (UnSendindex != -1) { String kj = resultMsg.Substring(0, UnSendindex); String kp = ""; int nextUnSendindex = resultMsg.IndexOf("@", UnSendindex + 1); if (nextUnSendindex != -1) { kp = resultMsg.Substring(nextUnSendindex); } resultMsg = kj + "<a href='javascript:UnSend();'><img src='../../Img/Action/UnSend.png' border=0/>撤销本次发送</a>" + kp; } resultMsg = resultMsg.Replace("指定特定的处理人处理", "指定人员"); resultMsg = resultMsg.Replace("发手机短信提醒他(们)", "短信通知"); resultMsg = resultMsg.Replace("撤销本次发送", "撤销案件"); resultMsg = resultMsg.Replace("新建流程", "发起案件"); resultMsg = resultMsg.Replace("。", ""); resultMsg = resultMsg.Replace(",", ""); resultMsg = resultMsg.Replace("@下一步", "<br/><br/> 下一步"); resultMsg = "success|<br/>" + resultMsg.Replace("@", " "); #region 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. /*这里有两种情况 * 1,从中间的节点,通过批量处理,也就是说合并审批处理的情况,这种情况子流程需要执行到下一步。 * 2,从流程已经完成,或者正在运行中,也就是说合并审批处理的情况. */ try { //处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. BP.WF.Glo.DealBuinessAfterSendWork(this.FK_Flow, this.WorkID, this.DoFunc, WorkIDs, this.CFlowNo, 0, null); } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); return(resultMsg); } #endregion 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. } catch (Exception ex) { resultMsg = "sysError|" + ex.Message.Replace("@", "<br/>"); } return(resultMsg); }
/// <summary> /// 执行撤消 /// </summary> private string DoUnSendIt() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.WFState == WFState.Complete) { return("err@该流程已经完成,您不能撤销。"); } // 如果停留的节点是分合流。 Node nd = new Node(gwf.FK_Node); /*该节点不允许退回.*/ if (nd.HisCancelRole == CancelRole.None) { throw new Exception("当前节点,不允许撤销。"); } if (nd.IsStartNode && nd.HisNodeWorkType != NodeWorkType.StartWorkFL) { throw new Exception("当前节点是开始节点,所以您不能撤销。"); } //如果撤销到的节点和当前流程运行到的节点相同,则是分流、或者分河流 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 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) { throw new Exception("err@流程运行错误:当不存在子线程时,改过程应该处于待办状态"); } foreach (DataRow dr in dt.Rows) { Node threadnd = new Node(dr["FK_Node"].ToString()); // 调用撤消发送前事件。 nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, nd.HisWork, null); BP.WF.Dev2Interface.Node_FHL_KillSubFlow(threadnd.FK_Flow, this.WorkID, long.Parse(dr["WorkID"].ToString())); //杀掉子线程. // 调用撤消发送前事件。 nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, nd.HisWork, null); } 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 + "]个工作人员打开了该工作,您不能执行撤销."); } else { //干流节点撤销到子线程 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 如果是越轨流程状态 @fanleiwei. 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.FK_Flow, 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 = 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 求的撤销的节点. int cancelToNodeID = 0; if (nd.HisCancelRole == CancelRole.SpecNodes) { /*指定的节点可以撤销,首先判断当前人员是否有权限.*/ NodeCancels ncs = new NodeCancels(); ncs.Retrieve(NodeCancelAttr.FK_Node, wn.HisNode.NodeID); if (ncs.Count == 0) { throw new Exception("@流程设计错误, 您设置了当前节点(" + wn.HisNode.Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点."); } /* 查询出来. */ sql = "SELECT FK_Node FROM WF_GenerWorkerList WHERE FK_Emp='" + WebUser.No + "' AND IsPass=1 AND IsEnable=1 AND WorkID=" + wn.HisWork.OID + " ORDER BY RDT DESC "; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("err@撤销流程错误,您没有权限执行撤销发送."); } // 找到将要撤销到的NodeID. foreach (DataRow dr in dt.Rows) { foreach (NodeCancel nc in ncs) { if (nc.CancelTo == int.Parse(dr[0].ToString())) { cancelToNodeID = nc.CancelTo; break; } } if (cancelToNodeID != 0) { break; } } if (cancelToNodeID == 0) { throw new Exception("@撤销流程错误,您没有权限执行撤销发送,当前节点不可以执行撤销."); } } 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, GenerWorkerListAttr.WorkID, this.WorkID); if (num == 0) { throw new Exception("err@您不能执行撤消发送,因为当前工作不是您发送的或下一步工作已处理。"); } cancelToNodeID = wnPri.HisNode.NodeID; } if (cancelToNodeID == 0) { throw new Exception("err@没有求出要撤销到的节点."); } #endregion 求的撤销的节点. 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: return(this.DoUnSendFeiLiu(gwf)); case NodeWorkType.WorkFL: case NodeWorkType.StartWorkFL: break; case NodeWorkType.WorkHL: if (this.IsMainFlow) { /* 首先找到与他最近的一个分流点,并且判断当前的操作员是不是分流点上的工作人员。*/ return(this.DoUnSendHeiLiu_Main(gwf)); } else { return(this.DoUnSendSubFlow(gwf)); //是子流程时. } break; case NodeWorkType.SubThreadWork: break; default: break; } #endregion 判断当前节点的模式. /********** 开始执行撤销. **********************/ Node cancelToNode = new Node(cancelToNodeID); #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 (BP.DA.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; 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) { /*如果是写作人员,就不允许他撤销 */ throw new Exception("@您是节点[" + cancelToNode.Name + "]的会签人,您不能执行撤销。"); } } } #endregion 如果当前是协作组长模式 WorkNode wnOfCancelTo = new WorkNode(this.WorkID, cancelToNodeID); // 调用撤消发送前事件。 string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wn.HisWork, null); #region 除当前节点数据。 // 删除产生的工作列表。 GenerWorkerLists wls = new GenerWorkerLists(); wls.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); // 删除工作信息,如果是按照ccflow格式存储的。 if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow) { wn.HisWork.Delete(); } // 删除附件信息。 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(); } 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) { //设置全部的人员不可用。 BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=-1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //设置当前人员可用。 BP.DA.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 { BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } //更新当前节点,到rpt里面。 BP.DA.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, "无"); //删除审核组件设置“协作模式下操作员显示顺序”为“按照接受人员列表先后顺序(官职大小)”,而生成的待审核轨迹信息 FrmWorkCheck fwc = new FrmWorkCheck(nd.NodeID); if (fwc.FWCSta == FrmWorkCheckSta.Enable && fwc.FWCOrderModel == FWCOrderModel.SqlAccepter) { BP.DA.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); } //首先删除当前节点的,审核意见. 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); // BP.DA.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 (s == "" || s == null) { continue; } if (s == wl.FK_Emp) { continue; } GenerWorkerList wlN = new GenerWorkerList(); wlN.Copy(wl); wlN.FK_Emp = s; WF.Port.WFEmp myEmp = new Port.WFEmp(s); wlN.FK_EmpText = myEmp.Name; 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.FK_Flow, item.WorkID, true); } } } #endregion //调用撤消发送后事件。 msg += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wn.HisWork, null); if (wnOfCancelTo.HisNode.IsStartNode) { switch (wnOfCancelTo.HisNode.HisFormType) { case NodeFormType.FoolForm: case NodeFormType.FreeForm: 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.FreeForm: return("@撤消执行成功. " + msg); break; default: return("撤销成功:" + msg); break; } } return("工作已经被您撤销到:" + cancelToNode.Name); }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { //string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <='" + DataType.CurrentData + "' ORDER BY FK_Emp"; //改成小于号SDT <'" + DataType.CurrentData string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <'" + DataType.CurrentData + "' ORDER BY FK_Emp"; //string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <='2013-12-30' ORDER BY FK_Emp"; DataTable dt = DBAccess.RunSQLReturnTable(sql); string msg = ""; string dealWorkIDs = ""; foreach (DataRow dr in dt.Rows) { string FK_Emp = dr["FK_Emp"].ToString(); string fk_flow = dr["FK_Flow"].ToString(); int fk_node = int.Parse(dr["FK_Node"].ToString()); Int64 workid = Int64.Parse(dr["WorkID"].ToString()); Int64 fid = Int64.Parse(dr["FID"].ToString()); // 方式两个人同时处理一件工作, 一个人处理后,另外一个人还可以处理的情况. if (dealWorkIDs.Contains("," + workid + ",")) { continue; } dealWorkIDs += "," + workid + ","; if (WebUser.No != FK_Emp) { Emp emp = new Emp(FK_Emp); BP.Web.WebUser.SignInOfGener(emp); } BP.WF.Template.NodeExt nd = new BP.WF.Template.NodeExt(); nd.NodeID = fk_node; nd.Retrieve(); // 首先判断是否有启动的表达式, 它是是否自动执行的总阀门。 if (DataType.IsNullOrEmpty(nd.DoOutTimeCond) == false) { Node nodeN = new Node(nd.NodeID); Work wk = nodeN.HisWork; wk.OID = workid; wk.Retrieve(); string exp = nd.DoOutTimeCond.Clone() as string; if (Glo.ExeExp(exp, wk) == false) { continue; // 不能通过条件的设置. } } switch (nd.HisOutTimeDeal) { case OutTimeDeal.None: break; case OutTimeDeal.AutoTurntoNextStep: //自动转到下一步骤. if (DataType.IsNullOrEmpty(nd.DoOutTime)) { /*如果是空的,没有特定的点允许,就让其它向下执行。*/ msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid).ToMsgOfText(); } else { int nextNode = Dev2Interface.Node_GetNextStepNode(fk_flow, workid); if (nd.DoOutTime.Contains(nextNode.ToString())) /*如果包含了当前点的ID,就让它执行下去.*/ { msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid).ToMsgOfText(); } } break; case OutTimeDeal.AutoJumpToSpecNode: //自动的跳转下一个节点. if (DataType.IsNullOrEmpty(nd.DoOutTime)) { throw new Exception("@设置错误,没有设置要跳转的下一步节点."); } int nextNodeID = int.Parse(nd.DoOutTime); msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, null, null, nextNodeID, null).ToMsgOfText(); break; case OutTimeDeal.AutoShiftToSpecUser: //移交给指定的人员. msg += BP.WF.Dev2Interface.Node_Shift(workid, nd.DoOutTime, "来自ccflow的自动消息:(" + BP.Web.WebUser.Name + ")工作未按时处理(" + nd.Name + "),现在移交给您。"); break; case OutTimeDeal.SendMsgToSpecUser: //向指定的人员发消息. BP.WF.Dev2Interface.Port_SendMsg(nd.DoOutTime, "来自ccflow的自动消息:(" + BP.Web.WebUser.Name + ")工作未按时处理(" + nd.Name + ")", "感谢您选择ccflow.", "SpecEmp" + workid); break; case OutTimeDeal.DeleteFlow: //删除流程. msg += BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(fk_flow, workid, true); break; case OutTimeDeal.RunSQL: msg += BP.DA.DBAccess.RunSQL(nd.DoOutTime); break; default: throw new Exception("@错误没有判断的超时处理方式." + nd.HisOutTimeDeal); } } Emp emp1 = new Emp("admin"); BP.Web.WebUser.SignInOfGener(emp1); return(msg); }
/// <summary> /// 获取被委托待办数据 /// </summary> private void Author_BindData() { if (string.IsNullOrEmpty(WebUser.No)) { return; } this.Pub1.AddFieldSet("委托待办数据"); //当前登录人的委托人 DataTable dt_Author = Dev2Interface.DB_AuthorEmps(); if (dt_Author != null && dt_Author.Rows.Count > 0) { string empNo = dt_Author.Rows[0]["NO"].ToString(); DataTable dt = Dev2Interface.DB_AuthorEmpWorks(empNo); //委托人登录 Dev2Interface.Port_Login(empNo); this.Pub1.Add("<b>当前登录人已切换为:" + empNo + "</b>"); this.Pub1.AddBR(); if (dt != null && dt.Rows.Count > 0) { StringBuilder sBuilder = new StringBuilder(); sBuilder.Append("<table width='100%' cellspacing='0' cellpadding='0' align=left>"); sBuilder.Append("<Caption ><div class='CaptionMsg' >待办</div></Caption>"); string extStr = ""; string timeKey = DateTime.Now.ToString("yyyyMMddhhff"); string GroupBy = this.Request.QueryString["GroupBy"]; string appPath = BP.WF.Glo.CCFlowAppPath;//this.Request.ApplicationPath; if (string.IsNullOrEmpty(GroupBy)) { if (this.DoType == "CC") { GroupBy = "Rec"; } else { GroupBy = "FlowName"; } } sBuilder.Append("<tr class='centerTitle'>"); sBuilder.Append("<th >ID</th>"); sBuilder.Append("<th class='Title' width=40% nowrap=true >标题</th>"); if (GroupBy != "FlowName") { sBuilder.Append("<th >" + "<a href='EmpWorks.aspx?GroupBy=FlowName" + extStr + "&T=" + timeKey + "' >流程</a>" + "</th>"); } if (GroupBy != "NodeName") { sBuilder.Append("<th >" + "<a href='EmpWorks.aspx?GroupBy=NodeName" + extStr + "&T=" + timeKey + "' >节点</a>" + "</th>"); } if (GroupBy != "StarterName") { sBuilder.Append("<th >" + "<a href='EmpWorks.aspx?GroupBy=StarterName" + extStr + "&T=" + timeKey + "' >发起人</a>" + "</th>"); } sBuilder.Append("<th >" + "<a href='EmpWorks.aspx?GroupBy=PRI" + extStr + "&T=" + timeKey + "' >优先级</a>" + "</th>"); sBuilder.Append("<th >发起日期</th>"); sBuilder.Append("<th >接受日期</th>"); sBuilder.Append("<th >应完成日期</th>"); sBuilder.Append("<th >状态</th>"); sBuilder.Append("<th >备注</th>"); sBuilder.Append("</tr>"); string groupVals = ""; foreach (System.Data.DataRow dr in dt.Rows) { if (groupVals.Contains("@" + dr[GroupBy].ToString() + ",")) { continue; } groupVals += "@" + dr[GroupBy].ToString() + ","; } int i = 0; int colspan = 10; bool is1 = false; DateTime cdt = DateTime.Now; string[] gVals = groupVals.Split('@'); int gIdx = 0; foreach (string g in gVals) { if (string.IsNullOrEmpty(g)) { continue; } gIdx++; sBuilder.Append("<tr>"); if (GroupBy == "Rec") { sBuilder.Append("<td colspan=" + colspan + " class=TRSum onclick=\"GroupBarClick('" + appPath + "','" + gIdx + "')\" " + " >" + "<div style='text-align:left; float:left' ><img src='/WF/Style/Min.gif' alert='Min' id='Img" + gIdx + "' border=0 /> <b>" + g.Replace(",", "") + "</b>" + "</td>"); } else { sBuilder.Append("<td colspan=" + colspan + " class=TRSum onclick=\"GroupBarClick('" + appPath + "','" + gIdx + "')\" " + " >" + "<div style='text-align:left; float:left' ><img src='/WF/Style/Min.gif' alert='Min' id='Img" + gIdx + "' border=0 /> <b>" + g.Replace(",", "") + "</b>" + "</td>"); } sBuilder.Append("</tr>"); foreach (System.Data.DataRow dr in dt.Rows) { if (dr[GroupBy].ToString() + "," != g) { continue; } string sdt = dr["SDT"] as string; string paras = dr["AtPara"] as string; if (is1) { sBuilder.Append("<tr bgcolor=AliceBlue " + "ID='" + gIdx + "_" + i + "'" + " >"); } else { sBuilder.Append("<tr bgcolor=white " + "ID='" + gIdx + "_" + i + "'" + " class=TR>"); } is1 = !is1; i++; int isRead = int.Parse(dr["IsRead"].ToString()); sBuilder.Append("<td class='Idx' nowrap>" + i + "</td>"); if (BP.WF.Glo.IsWinOpenEmpWorks) { if (isRead == 0) { sBuilder.Append("<td onclick=\"SetImg('" + appPath + "','I" + gIdx + "_" + i + "')\"" + " >" + "<a href=\"javascript:WinOpenIt('/WF/MyFlow.aspx?FK_Flow=" + dr["FK_Flow"] + "&FK_Node=" + dr["FK_Node"] + "&FID=" + dr["FID"] + "&WorkID=" + dr["WorkID"] + "&IsRead=0&T=" + timeKey + "&Paras=" + paras + "');\" ><img class=Icon align='middle' src='/WF/Img/Mail_UnRead.png' id='I" + gIdx + "_" + i + "' />" + dr["Title"].ToString() + "</a>" + "</td>"); } else { sBuilder.Append("<td nowrap >" + "<a href=\"javascript:WinOpenIt('/WF/MyFlow.aspx?FK_Flow=" + dr["FK_Flow"] + "&FK_Node=" + dr["FK_Node"] + "&FID=" + dr["FID"] + "&WorkID=" + dr["WorkID"] + "&Paras=" + paras + "&T=" + timeKey + "');\" ><img src='/WF/Img/Mail_Read.png' id='I" + gIdx + "_" + i + "' class=Icon align='middle' />" + dr["Title"].ToString() + "</a>" + "</td>"); } } else { if (isRead == 0) { sBuilder.Append("<td onclick=\"SetImg('" + appPath + "','I" + gIdx + "_" + i + "')\" " + " >" + "<a href=\"/WF/MyFlow.aspx?FK_Flow=" + dr["FK_Flow"] + "&FK_Node=" + dr["FK_Node"] + "&FID=" + dr["FID"] + "&WorkID=" + dr["WorkID"] + "&IsRead=0&Paras=" + paras + "&T=" + timeKey + "\" target='_blank'><img class=Icon src='/WF/Img/Mail_UnRead.png' align='middle' id='I" + gIdx + "_" + i + "' />" + dr["Title"].ToString() + "</a>" + "</td>"); } else { sBuilder.Append("<td nowrap >" + "<a href=\"/WF/MyFlow.aspx?FK_Flow=" + dr["FK_Flow"] + "&FK_Node=" + dr["FK_Node"] + "&FID=" + dr["FID"] + "&WorkID=" + dr["WorkID"] + "&Paras=" + paras + "&T=" + timeKey + "\" target='_blank'><img class=Icon src='/WF/Img/Mail_Read.png' align='middle' id='I" + gIdx + "_" + i + "' />" + dr["Title"].ToString() + "</a>" + "</td>"); } } if (GroupBy != "FlowName") { sBuilder.Append("<td nowrap >" + dr["FlowName"].ToString() + "</td>"); } if (GroupBy != "NodeName") { sBuilder.Append("<td nowrap >" + dr["NodeName"].ToString() + "</td>"); } if (GroupBy != "StarterName") { sBuilder.Append("<td nowrap >" + BP.WF.Glo.GenerUserImgSmallerHtml(dr["Starter"].ToString(), dr["StarterName"].ToString()) + "</td>"); } sBuilder.Append("<td nowrap >" + "<img class=Icon src='/WF/Img/PRI/" + dr["PRI"].ToString() + ".png' class=Icon />" + "</td>"); sBuilder.Append("<td nowrap class='TBDate' >" + BP.DA.DataType.ParseSysDate2DateTimeFriendly(dr["RDT"].ToString()) + "</td>"); sBuilder.Append("<td nowrap class='TBDate' >" + BP.DA.DataType.ParseSysDate2DateTimeFriendly(dr["ADT"].ToString()) + "</td>"); sBuilder.Append("<td nowrap class='TBDate' >" + dr["SDT"].ToString().Substring(5) + "</td>"); DateTime mysdt = BP.DA.DataType.ParseSysDate2DateTime(sdt); if (cdt >= mysdt) { if (cdt.ToString("yyyy-MM-dd") == mysdt.ToString("yyyy-MM-dd")) { sBuilder.Append("<td align=center nowrap >" + "<img src='/WF/Img/TolistSta/0.png' class='Icon'/><font color=green>正常</font>" + "</td>"); } else { sBuilder.Append("<td align=center nowrap >" + "<img src='/WF/Img/TolistSta/2.png' class='Icon'/><font color=red>逾期</font>" + "</td>"); } } else { sBuilder.Append("<td align=center nowrap >" + "<img src='/WF/Img/TolistSta/0.png'class='Icon'/> <font color=green>正常</font>" + "</td>"); } sBuilder.Append("<td width='200'><div style='width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;' title='" + dr["FlowNote"] + "'>" + dr["FlowNote"] + "</div></td>"); sBuilder.Append("</tr>"); } } sBuilder.Append("</table>"); this.Pub1.Add(sBuilder.ToString()); } else { this.Pub1.Add("无数据"); } } else { this.Pub1.Add("无数据"); } this.Pub1.AddFieldSetEndBR(); }
/// <summary> /// 用户登录 /// </summary> /// <param name="userNo"></param> public void Login(string userNo) { Dev2Interface.Port_Login(userNo); }
protected void lbtnUseManual_Click(object sender, EventArgs e) { Dev2Interface.Flow_SetFlowTransferCustom(FK_Flow, WorkID, false, hid_idx_all.Value); Response.Redirect("../MyFlow.aspx?FK_Flow=" + this.FK_Flow + "&WorkID=" + this.WorkID + "&FK_Node=" + this.FK_Node + "&FID=" + this.FID, true); }
//string flowNo, Int64 workID, int unSendToNode = 0 public string AccepterOfGener_UnSend() { return(Dev2Interface.Flow_DoUnSend(this.GetRequestVal("flowNo"), int.Parse(this.GetRequestVal("WorkID")))); }
/// <summary> /// 获取当前用户待办工作 /// </summary> /// <returns></returns> public DataTable GetEmpWorks() { return(Dev2Interface.DB_GenerEmpWorksOfDataTable()); }
/// <summary> /// 获取指定用户能够发起的流程集合 /// </summary> /// <param name="userNo">用户编号</param> /// <returns></returns> public DataTable GetCanStartFlow(string userNo) { return(Dev2Interface.DB_GenerCanStartFlowsOfDataTable(userNo)); }
/// <summary> /// 获取当前用户待办工作 /// </summary> /// <param name="state">流程状态</param> /// <param name="fk_flow">流程编号</param> /// <returns></returns> public DataTable GetEmpWorks(WFState state, string fk_flow) { return(Dev2Interface.DB_GenerEmpWorksOfDataTable(state, fk_flow)); }
protected void Page_Load(object sender, EventArgs e) { if (!ShowFlowOnly) { if (string.IsNullOrWhiteSpace(FK_Flow)) { throw new Exception("FK_Flow参数不能为空,且必须是有效的流程编号"); } var sql = string.Format("SELECT NodeID, Name,Step FROM WF_Node WHERE FK_Flow='{0}'", FK_Flow); var dtNodes = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dtNodes.Rows) { if (FK_Node == Convert.ToInt32(dr["NodeID"])) { continue; } lbNodes.Items.Add( new ListItem( string.Format("{0}. {1}", dr["Step"], dr["Name"]), string.Format("{0},{1},{2}", dr["Step"], dr["NodeID"], dr["Name"]))); } } if (!ShowNodeOnly) { var sql = "SELECT wfs.No,wfs.Name,wfs.ParentNo FROM WF_FlowSort wfs"; var dtFlowSorts = DBAccess.RunSQLReturnTable(sql); DataTable dtFlows = null; sql = "SELECT wf.No,wf.[Name],wf.FK_FlowSort FROM WF_Flow wf"; if (!string.IsNullOrWhiteSpace(WorkerId) && WorkerId.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Length == 1) { dtFlows = Dev2Interface.DB_GenerCanStartFlowsOfDataTable(WorkerId); } else { dtFlows = DBAccess.RunSQLReturnTable(sql); } //定义组织列表的数据集合 //元组定义:是否是流程、树级别[0开始]、文本、值 var items = new List <Tuple <bool, int, string, string> >(); GenerateItems(items, dtFlowSorts.Select("ParentNo=0")[0], 0, dtFlows, dtFlowSorts); foreach (var item in items) { lbFlows.Items.Add(new ListItem(item.Item3, item.Item4)); } //生成的列表样式如下: //┌流程树 //├─线性流程 //├┄┄001.财务报销演示 } }
protected void lbtnUseAutomic_Click(object sender, EventArgs e) { Dev2Interface.Flow_SetFlowTransferCustom(FK_Flow, WorkID, BP.WF.TransferCustomType.ByCCBPMDefine, hid_idx_all.Value); Response.Redirect("../MyFlow.aspx?FK_Flow=" + this.FK_Flow + "&WorkID=" + this.WorkID + "&FK_Node=" + this.FK_Node + "&FID=" + this.FID, true); }