void btn_Click(object sender, EventArgs e) { string sql = "SELECT Title,RDT,ADT,SDT,FID,WorkID,Starter FROM WF_EmpWorks WHERE FK_Emp='" + WebUser.No + "'"; DataTable dt = BP.DA.DBAccess.RunSQLReturnTable(sql); string msg = ""; foreach (DataRow dr in dt.Rows) { Int64 workid = Int64.Parse(dr["WorkID"].ToString()); CheckBox cb = this.GetCBByID("CB_" + workid); if (cb.Checked == false) { return; } msg += "@对工作(" + dr["Title"] + ")处理情况如下。<br>"; WorkNode wn = new WorkNode(workid, this.FK_Node); msg += wn.NodeSend().ToMsgOfHtml(); msg += "<hr>"; } if (msg == "") { this.Alert("您没有选择工作."); } else { this.Clear(); msg += "<a href='Batch" + BP.WF.Glo.FromPageType + ".aspx'>返回...</a>"; this.AddMsgOfInfo("批量处理信息", msg); } }
public void DTS_Flow(BP.WF.Flow fl) { #region 读取数据. BP.Sys.MapExt me = new MapExt(); me.MyPK = "ND" + int.Parse(fl.No) + "01" + "_" + MapExtXmlList.StartFlow; int i = me.RetrieveFromDBSources(); if (i == 0) { BP.DA.Log.DefaultLogWriteLineError("没有为流程(" + fl.Name + ")的开始节点设置发起数据,请参考说明书解决."); return; } if (string.IsNullOrEmpty(me.Tag)) { BP.DA.Log.DefaultLogWriteLineError("没有为流程(" + fl.Name + ")的开始节点设置发起数据,请参考说明书解决."); return; } // 获取从表数据. DataSet ds = new DataSet(); string[] dtlSQLs = me.Tag1.Split('*'); foreach (string sql in dtlSQLs) { if (string.IsNullOrEmpty(sql)) { continue; } string[] tempStrs = sql.Split('='); string dtlName = tempStrs[0]; DataTable dtlTable = BP.DA.DBAccess.RunSQLReturnTable(sql.Replace(dtlName + "=", "")); dtlTable.TableName = dtlName; ds.Tables.Add(dtlTable); } #endregion 读取数据. #region 检查数据源是否正确. string errMsg = ""; // 获取主表数据. DataTable dtMain = BP.DA.DBAccess.RunSQLReturnTable(me.Tag); if (dtMain.Rows.Count == 0) { BP.DA.Log.DefaultLogWriteLineError("流程(" + fl.Name + ")此时无任务."); this.SetText("流程(" + fl.Name + ")此时无任务."); return; } this.SetText("@查询到(" + dtMain.Rows.Count + ")条任务."); if (dtMain.Columns.Contains("Starter") == false) { errMsg += "@配值的主表中没有Starter列."; } if (dtMain.Columns.Contains("MainPK") == false) { errMsg += "@配值的主表中没有MainPK列."; } if (errMsg.Length > 2) { this.SetText(errMsg); BP.DA.Log.DefaultLogWriteLineError("流程(" + fl.Name + ")的开始节点设置发起数据,不完整." + errMsg); return; } #endregion 检查数据源是否正确. #region 处理流程发起. string nodeTable = "ND" + int.Parse(fl.No) + "01"; int idx = 0; foreach (DataRow dr in dtMain.Rows) { idx++; string mainPK = dr["MainPK"].ToString(); string sql = "SELECT OID FROM " + nodeTable + " WHERE MainPK='" + mainPK + "'"; if (DBAccess.RunSQLReturnTable(sql).Rows.Count != 0) { this.SetText("@" + fl.Name + ",第" + idx + "条,此任务在之前已经完成。"); continue; /*说明已经调度过了*/ } string starter = dr["Starter"].ToString(); if (WebUser.No != starter) { BP.Web.WebUser.Exit(); BP.Port.Emp emp = new BP.Port.Emp(); emp.No = starter; if (emp.RetrieveFromDBSources() == 0) { this.SetText("@" + fl.Name + ",第" + idx + "条,设置的发起人员:" + emp.No + "不存在."); BP.DA.Log.DefaultLogWriteLineInfo("@数据驱动方式发起流程(" + fl.Name + ")设置的发起人员:" + emp.No + "不存在。"); continue; } WebUser.SignInOfGener(emp); } #region 给值. //System.Collections.Hashtable ht = new Hashtable(); Work wk = fl.NewWork(); string err = ""; #region 检查用户拼写的sql是否正确? foreach (DataColumn dc in dtMain.Columns) { string f = dc.ColumnName.ToLower(); switch (f) { case "starter": case "mainpk": case "refmainpk": case "tonode": break; default: bool isHave = false; foreach (Attr attr in wk.EnMap.Attrs) { if (attr.Key.ToLower() == f) { isHave = true; break; } } if (isHave == false) { err += " " + f + " "; } break; } } if (string.IsNullOrEmpty(err) == false) { throw new Exception("您设置的字段:" + err + "不存在开始节点的表单中,设置的sql:" + me.Tag); } #endregion 检查用户拼写的sql是否正确? foreach (DataColumn dc in dtMain.Columns) { wk.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString()); } if (ds.Tables.Count != 0) { // MapData md = new MapData(nodeTable); MapDtls dtls = new MapDtls(nodeTable); foreach (MapDtl dtl in dtls) { foreach (DataTable dt in ds.Tables) { if (dt.TableName != dtl.No) { continue; } //删除原来的数据。 GEDtl dtlEn = dtl.HisGEDtl; dtlEn.Delete(GEDtlAttr.RefPK, wk.OID.ToString()); // 执行数据插入。 foreach (DataRow drDtl in dt.Rows) { if (drDtl["RefMainPK"].ToString() != mainPK) { continue; } dtlEn = dtl.HisGEDtl; foreach (DataColumn dc in dt.Columns) { dtlEn.SetValByKey(dc.ColumnName, drDtl[dc.ColumnName].ToString()); } dtlEn.RefPK = wk.OID.ToString(); dtlEn.OID = 0; dtlEn.Insert(); } } } } #endregion 给值. int toNodeID = 0; try { toNodeID = int.Parse(dr["ToNode"].ToString()); } catch { /*有可能在4.5以前的版本中没有tonode这个约定.*/ } // 处理发送信息. // Node nd =new Node(); string msg = ""; try { if (toNodeID == 0) { WorkNode wn = new WorkNode(wk, fl.HisStartNode); msg = wn.NodeSend().ToMsgOfText(); } if (toNodeID == fl.StartNodeID) { /* 发起后让它停留在开始节点上,就是为开始节点创建一个待办。*/ Int64 workID = BP.WF.Dev2Interface.Node_CreateStartNodeWork(fl.No, null, null, WebUser.No, null); if (workID != wk.OID) { throw new Exception("@异常信息:不应该不一致的workid."); } else { wk.Update(); } msg = "已经为(" + WebUser.No + ") 创建了开始工作节点. "; } BP.DA.Log.DefaultLogWriteLineInfo(msg); this.SetText("@" + fl.Name + ",第" + idx + "条,发起人员:" + WebUser.No + "-" + WebUser.Name + "已完成.\r\n" + msg); } catch (Exception ex) { this.SetText("@" + fl.Name + ",第" + idx + "条,发起人员:" + WebUser.No + "-" + WebUser.Name + "发起时出现错误.\r\n" + ex.Message); BP.DA.Log.DefaultLogWriteLineWarning(ex.Message); } } #endregion 处理流程发起. }
/// <summary> /// 执行自动启动流程任务 WF_Task /// </summary> public void DoTask() { string sql = "SELECT * FROM WF_Task WHERE TaskSta=0 ORDER BY Starter"; DataTable dt = null; try { dt = DBAccess.RunSQLReturnTable(sql); } catch { Task ta = new Task(); ta.CheckPhysicsTable(); dt = DBAccess.RunSQLReturnTable(sql); } if (dt.Rows.Count == 0) { return; } #region 自动启动流程 foreach (DataRow dr in dt.Rows) { string mypk = dr["MyPK"].ToString(); string taskSta = dr["TaskSta"].ToString(); string paras = dr["Paras"].ToString(); string starter = dr["Starter"].ToString(); string fk_flow = dr["FK_Flow"].ToString(); string startDT = dr[TaskAttr.StartDT].ToString(); if (string.IsNullOrEmpty(startDT) == false) { /*如果设置了发起时间,就检查当前时间是否与现在的时间匹配.*/ if (DateTime.Now.ToString("yyyy-MM-dd HH:mm").Contains(startDT) == false) { continue; } } Flow fl = new Flow(fk_flow); this.SetText("开始执行(" + starter + ")发起(" + fl.Name + ")流程."); try { string fTable = "ND" + int.Parse(fl.No + "01").ToString(); MapData md = new MapData(fTable); sql = ""; // sql = "SELECT * FROM " + md.PTable + " WHERE MainPK='" + mypk + "' AND WFState=1"; try { if (DBAccess.RunSQLReturnTable(sql).Rows.Count != 0) { continue; } } catch { this.SetText("开始节点表单表:" + fTable + "没有设置的默认字段MainPK. " + sql); continue; } if (BP.Web.WebUser.No != starter) { BP.Web.WebUser.Exit(); BP.Port.Emp empadmin = new BP.Port.Emp(starter); BP.Web.WebUser.SignInOfGener(empadmin); } Work wk = fl.NewWork(); string[] strs = paras.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) { continue; } if (str.Contains("=") == false) { continue; } string[] kv = str.Split('='); wk.SetValByKey(kv[0], kv[1]); } wk.SetValByKey("MainPK", mypk); wk.Update(); WorkNode wn = new WorkNode(wk, fl.HisStartNode); string msg = wn.NodeSend().ToMsgOfText(); msg = msg.Replace("'", "~"); DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=1,Msg='" + msg + "' WHERE MyPK='" + mypk + "'"); } catch (Exception ex) { //如果发送错误。 this.SetText(ex.Message); string msg = ex.Message; try { DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=2,Msg='" + msg + "' WHERE MyPK='" + mypk + "'"); } catch { Task TK = new Task(); TK.CheckPhysicsTable(); } } } #endregion 自动启动流程 }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { string info = ""; string sql = "SELECT * FROM WF_Task WHERE TaskSta=0 ORDER BY Starter"; DataTable dt = null; try { dt = DBAccess.RunSQLReturnTable(sql); } catch { Task ta = new Task(); ta.CheckPhysicsTable(); dt = DBAccess.RunSQLReturnTable(sql); } if (dt.Rows.Count == 0) { return("无任务"); } #region 自动启动流程 foreach (DataRow dr in dt.Rows) { string mypk = dr["MyPK"].ToString(); string taskSta = dr["TaskSta"].ToString(); string paras = dr["Paras"].ToString(); string starter = dr["Starter"].ToString(); string fk_flow = dr["FK_Flow"].ToString(); //获得到达的节点,与接受人。 string toEmps = dr["ToEmps"].ToString(); if (DataType.IsNullOrEmpty(toEmps)) { toEmps = null; } string toNodeStr = dr["ToNode"].ToString(); int toNodeID = 0; if (DataType.IsNullOrEmpty(toNodeStr) == false) { toNodeID = int.Parse(toNodeStr); } string startDT = dr[TaskAttr.StartDT].ToString(); if (string.IsNullOrEmpty(startDT) == false) { /*如果设置了发起时间,就检查当前时间是否与现在的时间匹配.*/ if (DateTime.Now < DateTime.Parse(startDT)) { continue; } } Flow fl = new Flow(fk_flow); if (fl.HisFlowAppType == FlowAppType.PRJ) { if (paras.Contains("PrjNo=") == false || paras.Contains("PrjName=") == false) { info += "err@工程类的流程,没有PrjNo,PrjName参数:" + fl.Name; DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=2,Msg='" + info + "' WHERE MyPK='" + mypk + "'"); continue; } } Int64 workID = 0; try { string fTable = "ND" + int.Parse(fl.No + "01").ToString(); MapData md = new MapData(fTable); //sql = ""; sql = "SELECT * FROM " + md.PTable + " WHERE MainPK='" + mypk + "' AND WFState=1"; try { if (DBAccess.RunSQLReturnTable(sql).Rows.Count != 0) { continue; } } catch { info += "开始节点表单表:" + fTable + "没有设置的默认字段MainPK. " + sql; continue; } if (BP.Web.WebUser.No != starter) { BP.Web.WebUser.Exit(); BP.Port.Emp empadmin = new BP.Port.Emp(starter); BP.Web.WebUser.SignInOfGener(empadmin); } Work wk = fl.NewWork(); workID = wk.OID; string[] strs = paras.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) { continue; } if (str.Contains("=") == false) { continue; } string[] kv = str.Split('='); wk.SetValByKey(kv[0], kv[1]); } wk.SetValByKey("MainPK", mypk); wk.Update(); if (fl.HisFlowAppType == FlowAppType.PRJ) { string prjNo = wk.GetValStrByKey("PrjNo"); if (DataType.IsNullOrEmpty(prjNo) == true) { info += "err@没有找到工程编号:MainPK" + mypk; DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=2,Msg='" + info + "' WHERE MyPK='" + mypk + "'"); continue; } } WorkNode wn = new WorkNode(wk, fl.HisStartNode); string msg = ""; if (toNodeID == 0) { msg = wn.NodeSend(null, toEmps).ToMsgOfText(); } else { msg = wn.NodeSend(new Node(toNodeID), toEmps).ToMsgOfText(); } msg = msg.Replace("'", "~"); DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=1,Msg='" + msg + "' WHERE MyPK='" + mypk + "'"); } catch (Exception ex) { //删除流程数据 if (workID != 0) { BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(fk_flow, workID); } //如果发送错误。 info += ex.Message; string msg = ex.Message; try { DBAccess.RunSQL("UPDATE WF_Task SET TaskSta=2,Msg='" + msg + "' WHERE MyPK='" + mypk + "'"); } catch { Task TK = new Task(); TK.CheckPhysicsTable(); } } } #endregion 自动启动流程 return(info); }
public void DoSend() { // 以下代码是从 MyFlow.aspx Send 方法copy 过来的,需要保持业务逻辑的一致性,所以代码需要保持一致. BP.WF.Node nd = new BP.WF.Node(this.FK_Node); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); WorkNode firstwn = new WorkNode(wk, nd); string msg = ""; try { msg = firstwn.NodeSend().ToMsgOfHtml(); } catch (Exception exSend) { this.Pub1.AddFieldSetGreen("错误"); this.Pub1.Add(exSend.Message.Replace("@@", "@").Replace("@", "<BR>@")); this.Pub1.AddFieldSetEnd(); return; } #region 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. try { //处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. BP.WF.Glo.DealBuinessAfterSendWork(this.FK_Flow, this.WorkID, this.DoFunc, WorkIDs); } catch (Exception ex) { this.ToMsg(msg, ex.Message); return; } #endregion 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. /*处理转向问题.*/ switch (firstwn.HisNode.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = firstwn.HisNode.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("?") == false) { myurl += "?1=1"; } Attrs myattrs = firstwn.HisWork.EnMap.Attrs; Work hisWK = firstwn.HisWork; foreach (Attr attr in myattrs) { if (myurl.Contains("@") == false) { break; } myurl = myurl.Replace("@" + attr.Key, hisWK.GetValStrByKey(attr.Key)); } if (myurl.Contains("@")) { throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl); } myurl += "&FromFlow=" + this.FK_Flow + "&FromNode=" + this.FK_Node + "&PWorkID=" + this.WorkID + "&UserNo=" + WebUser.No + "&SID=" + WebUser.SID; this.Response.Redirect(myurl, true); return; case TurnToDeal.TurnToByCond: TurnTos tts = new TurnTos(this.FK_Flow); if (tts.Count == 0) { throw new Exception("@您没有设置节点完成后的转向条件。"); } foreach (TurnTo tt in tts) { tt.HisWork = firstwn.HisWork; if (tt.IsPassed == true) { string url = tt.TurnToURL.Clone().ToString(); if (url.Contains("?s") == false) { url += "?1=1"; } Attrs attrs = firstwn.HisWork.EnMap.Attrs; Work hisWK1 = firstwn.HisWork; foreach (Attr attr in attrs) { if (url.Contains("@") == false) { break; } url = url.Replace("@" + attr.Key, hisWK1.GetValStrByKey(attr.Key)); } if (url.Contains("@")) { throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + url); } url += "&PFlowNo=" + this.FK_Flow + "&FromNode=" + this.FK_Node + "&PWorkID=" + this.WorkID + "&UserNo=" + WebUser.No + "&SID=" + WebUser.SID; this.Response.Redirect(url, true); return; } } #warning 为上海修改了如果找不到路径就让它按系统的信息提示。 this.ToMsg(msg, "info"); //throw new Exception("您定义的转向条件不成立,没有出口。"); break; default: this.ToMsg(msg, "info"); break; } return; }
void btn_Click(object sender, EventArgs e) { Button btn = (Button)sender; if (btn.ID == "Btn_Cancel") { string url = "../MyFlow.aspx?FK_Flow=" + this.FK_Flow + "&FK_Node=" + this.FK_Node + "&WorkID=" + this.WorkID + "&FID=" + this.FID; this.Response.Redirect(url, true); return; } #region 计算出来到达的节点. //获得当前节点到达的节点. Nodes nds = new Nodes(); if (this.ToNodes != null) { /*解决跳转问题.*/ string[] mytoNodes = this.ToNodes.Split(','); foreach (string str in mytoNodes) { if (string.IsNullOrEmpty(str) == true) { continue; } nds.AddEntity(new Node(int.Parse(str))); } } else { nds = BP.WF.Dev2Interface.WorkOpt_GetToNodes(this.FK_Flow, this.FK_Node, this.WorkID, this.FID); } // 首先到非异表单去找. string toNodes = ""; foreach (Node mynd in nds) { if (mynd.HisRunModel == RunModel.SubThread && mynd.HisSubThreadType == SubThreadType.UnSameSheet) { continue; //如果是子线程节点. } if (mynd.NodeID == 0) { continue; } BP.Web.Controls.RadioBtn rb = this.Pub1.GetRadioBtnByID("RB_" + mynd.NodeID); if (rb.Checked == false) { continue; } toNodes = mynd.NodeID.ToString(); break; } if (toNodes == "") { // 如果在非异表单没有找到,就到异表单集合去找。 检查是否具有异表单的子线程. bool isHave = false; foreach (Node mynd in nds) { if (mynd.NodeID == 0) { isHave = true; } } if (isHave) { /*增加异表单的子线程*/ foreach (Node mynd in nds) { if (mynd.HisSubThreadType != SubThreadType.UnSameSheet) { continue; } CheckBox cb = this.Pub1.GetCBByID("CB_" + mynd.NodeID); if (cb == null) { continue; } if (cb.Checked == true) { toNodes += "," + mynd.NodeID; } } } } #endregion 计算出来选择的到达节点. if (toNodes == "") { this.Pub1.AddFieldSetRed("发送出现错误", "您没有选择到达的节点。"); return; } // 执行发送. string msg = ""; Node nd = new Node(this.FK_Node); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); try { string toNodeStr = int.Parse(FK_Flow) + "01"; //如果为开始节点 if (toNodeStr == toNodes) { //把参数更新到数据库里面. GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = this.WorkID; gwf.RetrieveFromDBSources(); gwf.Paras_ToNodes = toNodes; gwf.Save(); WorkNode firstwn = new WorkNode(wk, nd); Node toNode = new Node(toNodeStr); msg = firstwn.NodeSend(toNode, gwf.Starter).ToMsgOfHtml(); } else { msg = BP.WF.Dev2Interface.WorkOpt_SendToNodes(this.FK_Flow, this.FK_Node, this.WorkID, this.FID, toNodes).ToMsgOfHtml(); } } catch (Exception ex) { this.Pub1.AddFieldSetRed("发送出现错误", ex.Message); return; } #region 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. try { //处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. Glo.DealBuinessAfterSendWork(this.FK_Flow, this.WorkID, this.DoFunc, WorkIDs, this.CFlowNo, 0, null); } catch (Exception ex) { this.ToMsg(msg, ex.Message); return; } #endregion 处理通用的发送成功后的业务逻辑方法,此方法可能会抛出异常. /*处理转向问题.*/ switch (nd.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = nd.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("&") == false) { myurl += "?1=1"; } myurl = BP.WF.Glo.DealExp(myurl, wk, null); myurl += "&FromFlow=" + this.FK_Flow + "&FromNode=" + this.FK_Node + "&PWorkID=" + this.WorkID + "&UserNo=" + WebUser.No + "&SID=" + WebUser.SID; this.Response.Redirect(myurl, true); return; case TurnToDeal.TurnToByCond: TurnTos tts = new TurnTos(this.FK_Flow); if (tts.Count == 0) { throw new Exception("@您没有设置节点完成后的转向条件。"); } foreach (TurnTo tt in tts) { tt.HisWork = wk; if (tt.IsPassed == true) { string url = tt.TurnToURL.Clone().ToString(); if (url.Contains("&") == false) { url += "?1=1"; } url = BP.WF.Glo.DealExp(url, wk, null); url += "&PFlowNo=" + this.FK_Flow + "&FromNode=" + this.FK_Node + "&PWorkID=" + this.WorkID + "&UserNo=" + WebUser.No + "&SID=" + WebUser.SID; this.Response.Redirect(url, true); return; } } #warning 为上海修改了如果找不到路径就让它按系统的信息提示。 this.ToMsg(msg, "info"); //throw new Exception("您定义的转向条件不成立,没有出口。"); break; default: this.ToMsg(msg, "info"); break; } return; }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { #region 找到要逾期的数据. DataTable generTab = null; string sql = "SELECT a.FK_Flow,a.WorkID,a.Title,a.FK_Node,a.SDTOfNode,a.Starter,a.TodoEmps "; sql += "FROM WF_GenerWorkFlow a, WF_Node b"; sql += " WHERE a.SDTOfNode<='" + DataType.CurrentDataTime + "' "; sql += " AND WFState=2 and b.OutTimeDeal!=0"; sql += " AND a.FK_Node=b.NodeID"; generTab = DBAccess.RunSQLReturnTable(sql); #endregion 找到要逾期的数据. // 遍历循环,逾期表进行处理. string msg = ""; string info = ""; foreach (DataRow row in generTab.Rows) { string fk_flow = row["FK_Flow"] + ""; int fk_node = int.Parse(row["FK_Node"] + ""); long workid = long.Parse(row["WorkID"] + ""); string title = row["Title"] + ""; string compleateTime = row["SDTOfNode"] + ""; string starter = row["Starter"] + ""; GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, workid, GenerWorkerListAttr.FK_Node, fk_node); bool isLogin = false; foreach (GenerWorkerList item in gwls) { if (item.IsEnable == false) { continue; } BP.Port.Emp emp = new Emp(item.FK_Emp); BP.Web.WebUser.SignInOfGener(emp); isLogin = true; } if (isLogin == false) { BP.Port.Emp emp = new Emp("admin"); BP.Web.WebUser.SignInOfGener(emp); } try { Node node = new Node(fk_node); if (node.IsStartNode) { continue; } //获得该节点的处理内容. string doOutTime = node.GetValStrByKey(NodeAttr.DoOutTime); switch (node.HisOutTimeDeal) { case OutTimeDeal.None: //逾期不处理. continue; case OutTimeDeal.AutoJumpToSpecNode: //跳转到指定的节点. try { //if (doOutTime.Contains(",") == false) // throw new Exception("@系统设置错误,不符合设置规范,格式为: NodeID,EmpNo 现在设置的为:"+doOutTime); int jumpNode = int.Parse(doOutTime); Node jumpToNode = new Node(jumpNode); //设置默认同意. BP.WF.Dev2Interface.WriteTrackWorkCheck(jumpToNode.FK_Flow, node.NodeID, workid, 0, "同意(预期自动审批)", null); //执行发送. info = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, null, null, jumpToNode.NodeID, null).ToMsgOfText(); // info = BP.WF.Dev2Interface.Flow_Schedule(workid, jumpToNode.NodeID, emp.No); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动跳转'," + info; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',WorkID=" + workid + ",标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动跳转',跳转异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.AutoShiftToSpecUser: //走动移交给. // 判断当前的处理人是否是. Emp empShift = new Emp(doOutTime); try { BP.WF.Dev2Interface.Node_Shift(fk_flow, fk_node, workid, 0, empShift.No, "流程节点已经逾期,系统自动移交"); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'移交到指定的人',已经自动移交给'" + empShift.Name + "."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "' ,标题:'" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'移交到指定的人',移交异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.AutoTurntoNextStep: try { GenerWorkerList workerList = new GenerWorkerList(); workerList.RetrieveByAttrAnd(GenerWorkerListAttr.WorkID, workid, GenerWorkFlowAttr.FK_Node, fk_node); BP.Web.WebUser.SignInOfGener(workerList.HisEmp); WorkNode firstwn = new WorkNode(workid, fk_node); string sendIfo = firstwn.NodeSend().ToMsgOfText(); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送消息为:" + sendIfo; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.DeleteFlow: info = BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(fk_flow, workid, true); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'删除流程'," + info; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); break; case OutTimeDeal.RunSQL: try { BP.WF.Work wk = node.HisWork; wk.OID = workid; wk.Retrieve(); doOutTime = BP.WF.Glo.DealExp(doOutTime, wk, null); //替换字符串 doOutTime.Replace("@OID", workid + ""); doOutTime.Replace("@FK_Flow", fk_flow); doOutTime.Replace("@FK_Node", fk_node.ToString()); doOutTime.Replace("@Starter", starter); if (doOutTime.Contains("@")) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.有未替换的SQL变量."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); break; } //执行sql. DBAccess.RunSQL(doOutTime); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.SendMsgToSpecUser: try { Emp myemp = new Emp(doOutTime); bool boo = BP.WF.Dev2Interface.WriteToSMS(myemp.No, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "系统发送逾期消息", "您的流程:'" + title + "'的完成时间应该为'" + compleateTime + "',流程已经逾期,请及时处理!", "系统消息"); if (boo) { msg = "'" + title + "'逾期消息已经发送给:'" + myemp.Name + "'"; } else { msg = "'" + title + "'逾期消息发送未成功,发送人为:'" + myemp.Name + "'"; } SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; default: msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'没有找到相应的超时处理规则."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); break; } } catch (Exception ex) { SetText("流程逾期出现异常:" + ex.Message); BP.DA.Log.DefaultLogWriteLine(LogType.Error, ex.ToString()); } } return(generInfo); }
/// <summary> /// 特殊处理天津的流程 /// 当指定的节点,到了10号,15号自动向下发送. /// </summary> private void DoTianJinSpecFunc() { if (DateTime.Now.Day == 10 || DateTime.Now.Day == 15) { /* 一个是10号自动审批,一个是15号自动审批. */ } else { return; } #region 找到要逾期的数据. DataTable generTab = null; string sql = "SELECT a.FK_Flow,a.WorkID,a.Title,a.FK_Node,a.SDTOfNode,a.Starter,a.TodoEmps "; sql += "FROM WF_GenerWorkFlow a, WF_Node b"; sql += " WHERE "; sql += " a.FK_Node=b.NodeID "; if (DateTime.Now.Day == 10) { sql += " AND b.NodeID=13304 "; } if (DateTime.Now.Day == 15) { sql += "AND b.NodeID=13302 "; } generTab = DBAccess.RunSQLReturnTable(sql); #endregion 找到要逾期的数据. // 遍历循环,逾期表进行处理. string msg = ""; foreach (DataRow row in generTab.Rows) { string fk_flow = row["FK_Flow"] + ""; string fk_node = row["FK_Node"] + ""; long workid = long.Parse(row["WorkID"] + ""); string title = row["Title"] + ""; string compleateTime = row["SDTOfNode"] + ""; string starter = row["Starter"] + ""; try { Node node = new Node(int.Parse(fk_node)); try { GenerWorkerList workerList = new GenerWorkerList(); workerList.RetrieveByAttrAnd(GenerWorkerListAttr.WorkID, workid, GenerWorkFlowAttr.FK_Node, fk_node); WebUser.SignInOfGener(workerList.HisEmp); WorkNode firstwn = new WorkNode(workid, int.Parse(fk_node)); string sendIfo = firstwn.NodeSend().ToMsgOfText(); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送消息为:" + sendIfo; //输出消息. BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送异常:" + ex.Message; BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } } catch (Exception ex) { BP.DA.Log.DefaultLogWriteLine(LogType.Error, ex.ToString()); } } BP.DA.Log.DefaultLogWriteLine(LogType.Info, "结束扫描逾期流程数据."); }