public string DoSelfTestInfo() { GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.FK_Flow); #region 查看一下当前的节点是否开始工作节点。 Node nd = new Node(this.FK_Node); if (nd.IsStartNode) { /* 判断是否是退回的节点 */ Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); } #endregion #region 查看一下是否有当前的工作节点信息。 bool isHave = false; foreach (GenerWorkerList wl in wls) { if (wl.FK_Node == this.FK_Node) { isHave = true; } } if (isHave == false) { /* */ return("已经不存在当前的工作节点信息,造成此流程的原因可能是没有捕获的系统异常,建议删除此流程或者交给系统自动修复它。"); } #endregion return("没有发现异常。"); }
private void ReorderLog(Node fromND, Node toND) { /*开始遍历到达的节点集合*/ foreach (Node nd in fromND.HisToNodes) { Work wk = nd.HisWork; wk.OID = this.WorkID; if (wk.RetrieveFromDBSources() == 0) { wk.FID = this.WorkID; if (wk.Retrieve(WorkAttr.FID, this.WorkID) == 0) { continue; } } if (nd.IsFL) { /* 如果是分流 */ GenerWorkerLists wls = new GenerWorkerLists(); QueryObject qo = new QueryObject(wls); qo.AddWhere(GenerWorkerListAttr.FID, this.WorkID); qo.addAnd(); string[] ndsStrs = nd.HisToNDs.Split('@'); string inStr = ""; foreach (string s in ndsStrs) { if (s == "" || s == null) { continue; } inStr += "'" + s + "',"; } inStr = inStr.Substring(0, inStr.Length - 1); if (inStr.Contains(",") == true) { qo.AddWhere(GenerWorkerListAttr.FK_Node, int.Parse(inStr)); } else { qo.AddWhereIn(GenerWorkerListAttr.FK_Node, "(" + inStr + ")"); } qo.DoQuery(); foreach (GenerWorkerList wl in wls) { Node subNd = new Node(wl.FK_Node); Work subWK = subNd.GetWork(wl.WorkID); infoLog += "\r\n*****************************************************************************************"; infoLog += "\r\n节点ID:" + subNd.NodeID + " 工作名称:" + subWK.EnDesc; infoLog += "\r\n处理人:" + subWK.Rec + " , " + wk.RecOfEmp.Name; infoLog += "\r\n接收时间:" + subWK.RDT + " 处理时间:" + subWK.CDT; infoLog += "\r\n ------------------------------------------------- "; foreach (Attr attr in wk.EnMap.Attrs) { if (attr.UIVisible == false) { continue; } infoLog += "\r\n " + attr.Desc + ":" + subWK.GetValStrByKey(attr.Key); } //递归调用。 ReorderLog(subNd, toND); } } else { infoLog += "\r\n*****************************************************************************************"; infoLog += "\r\n节点ID:" + wk.NodeID + " 工作名称:" + wk.EnDesc; infoLog += "\r\n处理人:" + wk.Rec + " , " + wk.RecOfEmp.Name; infoLog += "\r\n接收时间:" + wk.RDT + " 处理时间:" + wk.CDT; infoLog += "\r\n ------------------------------------------------- "; foreach (Attr attr in wk.EnMap.Attrs) { if (attr.UIVisible == false) { continue; } infoLog += "\r\n" + attr.Desc + " : " + wk.GetValStrByKey(attr.Key); } } /* 如果到了当前的节点 */ if (nd.NodeID == toND.NodeID) { break; } //递归调用。 ReorderLog(nd, toND); } }
private void SingleAttach(HttpContext context, string attachPk, string workid, string fk_node, string ensName) { FrmAttachment frmAth = new FrmAttachment(); frmAth.MyPK = attachPk; frmAth.RetrieveFromDBSources(); string athDBPK = attachPk + "_" + workid; BP.WF.Node currND = new BP.WF.Node(fk_node); BP.WF.Work currWK = currND.HisWork; currWK.OID = long.Parse(workid); currWK.Retrieve(); //处理保存路径. string saveTo = frmAth.SaveTo; if (saveTo.Contains("*") || saveTo.Contains("@")) { /*如果路径里有变量.*/ saveTo = saveTo.Replace("*", "@"); saveTo = BP.WF.Glo.DealExp(saveTo, currWK, null); } try { saveTo = context.Server.MapPath("~/" + saveTo); } catch (Exception) { saveTo = saveTo; } if (System.IO.Directory.Exists(saveTo) == false) { System.IO.Directory.CreateDirectory(saveTo); } saveTo = saveTo + "\\" + athDBPK + "." + context.Request.Files[0].FileName.Substring(context.Request.Files[0].FileName.LastIndexOf('.') + 1); context.Request.Files[0].SaveAs(saveTo); FileInfo info = new FileInfo(saveTo); FrmAttachmentDB dbUpload = new FrmAttachmentDB(); dbUpload.MyPK = athDBPK; dbUpload.FK_FrmAttachment = attachPk; dbUpload.RefPKVal = workid; dbUpload.FK_MapData = ensName; dbUpload.FileExts = info.Extension; dbUpload.FileFullName = saveTo; dbUpload.FileName = context.Request.Files[0].FileName; dbUpload.FileSize = (float)info.Length; dbUpload.Rec = WebUser.No; dbUpload.RecName = WebUser.Name; dbUpload.RDT = BP.DA.DataType.CurrentDataTime; dbUpload.NodeID = fk_node; dbUpload.Save(); }
/// <summary> /// 逾期流程 /// </summary> private void DoOverDueFlow() { //特殊处理天津的需求. if (SystemConfig.CustomerNo == "") { DoTianJinSpecFunc(); } #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; BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',WorkID=" + workid + ",标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动跳转',跳转异常:" + ex.Message; 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 + "."; 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); } break; case OutTimeDeal.AutoTurntoNextStep: try { GenerWorkerList workerList = new GenerWorkerList(); workerList.RetrieveByAttrAnd(GenerWorkerListAttr.WorkID, workid, GenerWorkFlowAttr.FK_Node, fk_node); WebUser.SignInOfGener(workerList.HisEmp); WorkNode firstwn = new WorkNode(workid, 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); } break; case OutTimeDeal.DeleteFlow: info = BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(fk_flow, workid, true); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'删除流程'," + info; 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变量."; 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; 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 + "'"; } BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message; BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; default: msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'没有找到相应的超时处理规则."; BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); break; } } catch (Exception ex) { BP.DA.Log.DefaultLogWriteLine(LogType.Error, ex.ToString()); } } BP.DA.Log.DefaultLogWriteLine(LogType.Info, "结束扫描逾期流程数据."); }