public string GenerWorkNode(string fk_flow, int fk_node, Int64 workID, Int64 fid, string userNo) { try { Emp emp = new Emp(userNo); BP.Web.WebUser.SignInOfGener(emp); MapData md = new MapData(); md.No = "ND" + fk_node; if (md.RetrieveFromDBSources() == 0) { throw new Exception("装载错误,该表单ID=" + md.No + "丢失,请修复一次流程重新加载一次."); } DataSet myds = md.GenerHisDataSet(); // 节点数据. Node nd = new Node(fk_node); myds.Tables.Add(nd.ToDataTableField("WF_Node")); //节点标签数据. BtnLab btnLab = new BtnLab(fk_node); myds.Tables.Add(btnLab.ToDataTableField("WF_BtnLab")); // 流程数据. Flow fl = new Flow(fk_flow); myds.Tables.Add(fl.ToDataTableField("WF_Flow")); //.工作数据放里面去, 放进去前执行一次装载前填充事件. BP.WF.Work wk = nd.HisWork; wk.OID = workID; wk.RetrieveFromDBSources(); wk.ResetDefaultVal(); // 执行一次装载前填充. string msg = md.FrmEvents.DoEventNode(FrmEventList.FrmLoadBefore, wk); if (string.IsNullOrEmpty(msg) == false) { return(msg); } myds.Tables.Add(wk.ToDataTableField("Main")); #region 获取明细表数据,并把它加入dataset里. if (md.MapDtls.Count > 0) { foreach (MapDtl dtl in md.MapDtls) { GEDtls dtls = new GEDtls(dtl.No); QueryObject qo = null; try { qo = new QueryObject(dtl); switch (dtl.DtlOpenType) { case DtlOpenType.ForEmp: // 按人员来控制. qo.AddWhere(GEDtlAttr.RefPK, workID); qo.addAnd(); qo.AddWhere(GEDtlAttr.Rec, WebUser.No); break; case DtlOpenType.ForWorkID: // 按工作ID来控制 qo.AddWhere(GEDtlAttr.RefPK, workID); break; case DtlOpenType.ForFID: // 按流程ID来控制. qo.AddWhere(GEDtlAttr.FID, workID); break; } } catch { dtls.GetNewEntity.CheckPhysicsTable(); } DataTable dtDtl = qo.DoQueryToTable(); dtDtl.TableName = dtl.No; //修改明细表的名称. myds.Tables.Add(dtDtl); //加入这个明细表. } } #endregion //把流程信息表发送过去. GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = workID; myds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); if (gwf.WFState == WFState.Forward) { //如果是转发. BP.WF.ForwardWorks fws = new ForwardWorks(); fws.Retrieve(ForwardWorkAttr.WorkID, workID, ForwardWorkAttr.FK_Node, fk_node); myds.Tables.Add(fws.ToDataTableField("WF_ForwardWork")); } if (gwf.WFState == WFState.ReturnSta) { //如果是退回. ReturnWorks rts = new ReturnWorks(); rts.Retrieve(ReturnWorkAttr.WorkID, workID, ReturnWorkAttr.ReturnToNode, fk_node); myds.Tables.Add(rts.ToDataTableField("WF_ForwardWork")); } if (gwf.WFState == WFState.HungUp) { //如果是挂起. HungUps hups = new HungUps(); hups.Retrieve(HungUpAttr.WorkID, workID, HungUpAttr.FK_Node, fk_node); myds.Tables.Add(hups.ToDataTableField("WF_HungUp")); } //放入track信息. Paras ps = new Paras(); ps.SQL = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + BP.SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("WorkID", workID); DataTable dt = DBAccess.RunSQLReturnTable(ps); dt.TableName = "Track"; myds.Tables.Add(dt); //写入数据. myds.WriteXml("c:\\sss.xml"); //转化成它所能识别的格式. return(Silverlight.DataSetConnector.Connector.ToXml(myds)); } catch (Exception ex) { Log.DebugWriteError(ex.StackTrace); return("@生成工作FK_Flow=" + fk_flow + ",FK_Node=" + fk_node + ",WorkID=" + workID + ",FID=" + fid + "错误,错误信息:" + ex.Message); } }
/// <summary> /// 产生一个WorkNode /// </summary> /// <param name="fk_flow">流程编号</param> /// <param name="fk_node">节点ID</param> /// <param name="workID">工作ID</param> /// <param name="fid">FID</param> /// <param name="userNo">用户编号</param> /// <returns>返回dataset</returns> public static DataSet GenerWorkNodeForAndroid(string fk_flow, int fk_node, Int64 workID, Int64 fid, string userNo) { if (fk_node == 0) { fk_node = int.Parse(fk_flow + "01"); } if (workID == 0) { workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, userNo, null); } try { Emp emp = new Emp(userNo); BP.Web.WebUser.SignInOfGener(emp); MapData md = new MapData(); md.No = "ND" + fk_node; if (md.RetrieveFromDBSources() == 0) { throw new Exception("装载错误,该表单ID=" + md.No + "丢失,请修复一次流程重新加载一次."); } //表单模版. DataSet myds = BP.Sys.CCFormAPI.GenerHisDataSet(md.No); return(myds); #region 流程设置信息. Node nd = new Node(fk_node); if (nd.IsStartNode == false) { BP.WF.Dev2Interface.Node_SetWorkRead(fk_node, workID); } // 节点数据. string sql = "SELECT * FROM WF_Node WHERE NodeID=" + fk_node; DataTable dt = BP.DA.DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_NodeBar"; myds.Tables.Add(dt); // 流程数据. Flow fl = new Flow(fk_flow); myds.Tables.Add(fl.ToDataTableField("WF_Flow")); #endregion 流程设置信息. #region 把主从表数据放入里面. //.工作数据放里面去, 放进去前执行一次装载前填充事件. BP.WF.Work wk = nd.HisWork; wk.OID = workID; wk.RetrieveFromDBSources(); // 处理传递过来的参数。 foreach (string k in System.Web.HttpContext.Current.Request.QueryString.AllKeys) { wk.SetValByKey(k, System.Web.HttpContext.Current.Request.QueryString[k]); } // 执行一次装载前填充. string msg = md.DoEvent(FrmEventList.FrmLoadBefore, wk); if (DataType.IsNullOrEmpty(msg) == false) { throw new Exception("错误:" + msg); } wk.ResetDefaultVal(); myds.Tables.Add(wk.ToDataTableField(md.No)); //把附件的数据放入. if (md.FrmAttachments.Count > 0) { sql = "SELECT * FROM Sys_FrmAttachmentDB where RefPKVal=" + workID + " AND FK_MapData='ND" + fk_node + "'"; dt = BP.DA.DBAccess.RunSQLReturnTable(sql); dt.TableName = "Sys_FrmAttachmentDB"; myds.Tables.Add(dt); } // 图片附件数据放入 if (md.FrmImgAths.Count > 0) { sql = "SELECT * FROM Sys_FrmImgAthDB where RefPKVal=" + workID + " AND FK_MapData='ND" + fk_node + "'"; dt = BP.DA.DBAccess.RunSQLReturnTable(sql); dt.TableName = "Sys_FrmImgAthDB"; myds.Tables.Add(dt); } //把从表的数据放入. if (md.MapDtls.Count > 0) { foreach (MapDtl dtl in md.MapDtls) { GEDtls dtls = new GEDtls(dtl.No); QueryObject qo = null; try { qo = new QueryObject(dtls); switch (dtl.DtlOpenType) { case DtlOpenType.ForEmp: // 按人员来控制. qo.AddWhere(GEDtlAttr.RefPK, workID); qo.addAnd(); qo.AddWhere(GEDtlAttr.Rec, WebUser.No); break; case DtlOpenType.ForWorkID: // 按工作ID来控制 qo.AddWhere(GEDtlAttr.RefPK, workID); break; case DtlOpenType.ForFID: // 按流程ID来控制. qo.AddWhere(GEDtlAttr.FID, workID); break; } } catch { dtls.GetNewEntity.CheckPhysicsTable(); } DataTable dtDtl = qo.DoQueryToTable(); // 为明细表设置默认值. MapAttrs dtlAttrs = new MapAttrs(dtl.No); foreach (MapAttr attr in dtlAttrs) { //处理它的默认值. if (attr.DefValReal.Contains("@") == false) { continue; } foreach (DataRow dr in dtDtl.Rows) { dr[attr.KeyOfEn] = attr.DefVal; } } dtDtl.TableName = dtl.No; //修改明细表的名称. myds.Tables.Add(dtDtl); //加入这个明细表, 如果没有数据,xml体现为空. } } #endregion #region 把外键表加入DataSet DataTable dtMapAttr = myds.Tables["Sys_MapAttr"]; foreach (DataRow dr in dtMapAttr.Rows) { string lgType = dr["LGType"].ToString(); if (lgType.Equals("2") == false) { continue; } string UIIsEnable = dr["UIIsEnable"].ToString(); if (UIIsEnable.Equals("0") == true) { continue; } string uiBindKey = dr["UIBindKey"].ToString(); if (DataType.IsNullOrEmpty(uiBindKey) == true) { string myPK = dr["MyPK"].ToString(); /*如果是空的*/ throw new Exception("@属性字段数据不完整,流程:" + fl.No + fl.Name + ",节点:" + nd.NodeID + nd.Name + ",属性:" + myPK + ",的UIBindKey IsNull "); } // 判断是否存在. if (myds.Tables.Contains(uiBindKey) == true) { continue; } myds.Tables.Add(BP.Sys.PubClass.GetDataTableByUIBineKey(uiBindKey)); } #endregion End把外键表加入DataSet #region 把流程信息放入里面. //把流程信息表发送过去. GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = workID; gwf.RetrieveFromDBSources(); myds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); if (gwf.WFState == WFState.Shift) { //如果是转发. BP.WF.ShiftWorks fws = new ShiftWorks(); fws.Retrieve(ShiftWorkAttr.WorkID, workID, ShiftWorkAttr.FK_Node, fk_node); myds.Tables.Add(fws.ToDataTableField("WF_ShiftWork")); } if (gwf.WFState == WFState.ReturnSta) { //如果是退回. ReturnWorks rts = new ReturnWorks(); rts.Retrieve(ReturnWorkAttr.WorkID, workID, ReturnWorkAttr.ReturnToNode, fk_node, ReturnWorkAttr.RDT); myds.Tables.Add(rts.ToDataTableField("WF_ReturnWork")); } if (gwf.WFState == WFState.HungUp) { //如果是挂起. HungUps hups = new HungUps(); hups.Retrieve(HungUpAttr.WorkID, workID, HungUpAttr.FK_Node, fk_node); myds.Tables.Add(hups.ToDataTableField("WF_HungUp")); } //if (gwf.WFState == WFState.Askfor) //{ // //如果是加签. // BP.WF.ShiftWorks fws = new ShiftWorks(); // fws.Retrieve(ShiftWorkAttr.WorkID, workID, ShiftWorkAttr.FK_Node, fk_node); // myds.Tables.Add(fws.ToDataTableField("WF_ShiftWork")); //} Int64 wfid = workID; if (fid != 0) { wfid = fid; } //放入track信息. Paras ps = new Paras(); ps.SQL = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("WorkID", wfid); DataTable dtNode = DBAccess.RunSQLReturnTable(ps); dtNode.TableName = "Track"; myds.Tables.Add(dtNode); //工作人员列表,用于审核组件. ps = new Paras(); ps.SQL = "SELECT * FROM WF_GenerWorkerlist WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("WorkID", wfid); DataTable dtGenerWorkerlist = DBAccess.RunSQLReturnTable(ps); dtGenerWorkerlist.TableName = "WF_GenerWorkerlist"; myds.Tables.Add(dtGenerWorkerlist); //放入CCList信息. 用于审核组件. ps = new Paras(); ps.SQL = "SELECT * FROM WF_CCList WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("WorkID", wfid); DataTable dtCCList = DBAccess.RunSQLReturnTable(ps); dtCCList.TableName = "WF_CCList"; myds.Tables.Add(dtCCList); //放入WF_SelectAccper信息. 用于审核组件. ps = new Paras(); ps.SQL = "SELECT * FROM WF_SelectAccper WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("WorkID", wfid); DataTable dtSelectAccper = DBAccess.RunSQLReturnTable(ps); dtSelectAccper.TableName = "WF_SelectAccper"; myds.Tables.Add(dtSelectAccper); //放入所有的节点信息. 用于审核组件. ps = new Paras(); ps.SQL = "SELECT * FROM WF_Node WHERE FK_Flow=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "FK_Flow ORDER BY " + NodeAttr.Step; ps.Add("FK_Flow", fk_flow); DataTable dtNodes = DBAccess.RunSQLReturnTable(ps); dtNodes.TableName = "Nodes"; myds.Tables.Add(dtNodes); #endregion 把流程信息放入里面. return(myds); } catch (Exception ex) { Log.DebugWriteError(ex.StackTrace); throw new Exception(ex.Message); } }
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, "结束扫描逾期流程数据."); }
/// <summary> /// 创建WorkID /// </summary> /// <param name="flowNo">流程编号</param> /// <param name="ht">表单参数,可以为null。</param> /// <param name="workDtls">明细表参数,可以为null。</param> /// <param name="starter">流程的发起人</param> /// <param name="title">创建工作时的标题,如果为null,就按设置的规则生成。</param> /// <param name="parentWorkID">父流程的WorkID,如果没有父流程就传入为0.</param> /// <param name="parentFlowNo">父流程的流程编号,如果没有父流程就传入为null.</param> /// <returns>为开始节点创建工作后产生的WorkID.</returns> public static Int64 Node_CreateBlankWork(string flowNo, Hashtable ht, DataSet workDtls, string guestNo, string title, Int64 parentWorkID, string parentFlowNo, int parentNodeID, string parentEmp) { //if (BP.Web.WebUser.No != "Guest") // throw new Exception("@必须是Guest登陆才能发起."); string dbstr = SystemConfig.AppCenterDBVarStr; Flow fl = new Flow(flowNo); Node nd = new Node(fl.StartNodeID); //把一些其他的参数也增加里面去,传递给ccflow. Hashtable htPara = new Hashtable(); if (parentWorkID != 0) { htPara.Add(StartFlowParaNameList.PWorkID, parentWorkID); } if (parentFlowNo != null) { htPara.Add(StartFlowParaNameList.PFlowNo, parentFlowNo); } if (parentNodeID != 0) { htPara.Add(StartFlowParaNameList.PNodeID, parentNodeID); } if (parentEmp != null) { htPara.Add(StartFlowParaNameList.PEmp, parentEmp); } Emp empStarter = new Emp(BP.Web.WebUser.No); Work wk = fl.NewWork(empStarter, htPara); Int64 workID = wk.OID; #region 给各个属性-赋值 if (ht != null) { foreach (string str in ht.Keys) { wk.SetValByKey(str, ht[str]); } } wk.OID = workID; if (workDtls != null) { //保存从表 foreach (DataTable dt in workDtls.Tables) { foreach (MapDtl dtl in wk.HisMapDtls) { if (dt.TableName != dtl.No) { continue; } //获取dtls GEDtls daDtls = new GEDtls(dtl.No); daDtls.Delete(GEDtlAttr.RefPK, wk.OID); // 清除现有的数据. GEDtl daDtl = daDtls.GetNewEntity as GEDtl; daDtl.RefPK = wk.OID.ToString(); // 为从表复制数据. foreach (DataRow dr in dt.Rows) { daDtl.ResetDefaultVal(); daDtl.RefPK = wk.OID.ToString(); //明细列. foreach (DataColumn dc in dt.Columns) { //设置属性. daDtl.SetValByKey(dc.ColumnName, dr[dc.ColumnName]); } daDtl.InsertAsOID(DBAccess.GenerOID("Dtl")); //插入数据. } } } } #endregion 赋值 Paras ps = new Paras(); // 执行对报表的数据表WFState状态的更新,让它为runing的状态. if (DataType.IsNullOrEmpty(title) == false) { ps = new Paras(); ps.SQL = "UPDATE " + fl.PTable + " SET WFState=" + dbstr + "WFState,Title=" + dbstr + "Title WHERE OID=" + dbstr + "OID"; ps.Add(GERptAttr.WFState, (int)WFState.Blank); ps.Add(GERptAttr.Title, title); ps.Add(GERptAttr.OID, wk.OID); DBAccess.RunSQL(ps); } else { ps = new Paras(); ps.SQL = "UPDATE " + fl.PTable + " SET WFState=" + dbstr + "WFState,FK_Dept=" + dbstr + "FK_Dept,Title=" + dbstr + "Title WHERE OID=" + dbstr + "OID"; ps.Add(GERptAttr.WFState, (int)WFState.Blank); ps.Add(GERptAttr.FK_Dept, empStarter.FK_Dept); ps.Add(GERptAttr.Title, BP.WF.WorkFlowBuessRole.GenerTitle(fl, wk)); ps.Add(GERptAttr.OID, wk.OID); DBAccess.RunSQL(ps); } // 删除有可能产生的垃圾数据,比如上一次没有发送成功,导致数据没有清除. ps = new Paras(); ps.SQL = "DELETE FROM WF_GenerWorkFlow WHERE WorkID=" + dbstr + "WorkID1 OR FID=" + dbstr + "WorkID2"; ps.Add("WorkID1", wk.OID); ps.Add("WorkID2", wk.OID); DBAccess.RunSQL(ps); ps = new Paras(); ps.SQL = "DELETE FROM WF_GenerWorkerList WHERE WorkID=" + dbstr + "WorkID1 OR FID=" + dbstr + "WorkID2"; ps.Add("WorkID1", wk.OID); ps.Add("WorkID2", wk.OID); DBAccess.RunSQL(ps); // 设置流程信息 if (parentWorkID != 0) { BP.WF.Dev2Interface.SetParentInfo(flowNo, workID, parentFlowNo, parentWorkID, parentNodeID, parentEmp); } #region 处理generworkid // 设置父流程信息. GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = wk.OID; int i = gwf.RetrieveFromDBSources(); //将流程信息提前写入wf_GenerWorkFlow,避免查询不到 gwf.FlowName = fl.Name; gwf.FK_Flow = flowNo; gwf.FK_FlowSort = fl.FK_FlowSort; gwf.SysType = fl.SysType; gwf.FK_Dept = WebUser.FK_Dept; gwf.DeptName = WebUser.FK_DeptName; gwf.FK_Node = fl.StartNodeID; gwf.NodeName = nd.Name; gwf.WFState = WFState.Runing; if (DataType.IsNullOrEmpty(title)) { gwf.Title = BP.WF.WorkFlowBuessRole.GenerTitle(fl, wk); } else { gwf.Title = title; } gwf.Starter = WebUser.No; gwf.StarterName = WebUser.Name; gwf.RDT = DataType.CurrentDataTime; gwf.PWorkID = parentWorkID; // gwf.PFID = parentFID; gwf.PFlowNo = parentFlowNo; gwf.PNodeID = parentNodeID; if (i == 0) { gwf.Insert(); } else { gwf.Update(); } //插入待办. GenerWorkerList gwl = new GenerWorkerList(); gwl.WorkID = wk.OID; gwl.FK_Node = nd.NodeID; gwl.FK_Emp = WebUser.No; i = gwl.RetrieveFromDBSources(); gwl.FK_EmpText = WebUser.Name; gwl.FK_NodeText = nd.Name; gwl.FID = 0; gwl.FK_Flow = fl.No; gwl.FK_Dept = WebUser.FK_Dept; gwl.FK_DeptT = WebUser.FK_DeptName; gwl.SDT = "无"; gwl.DTOfWarning = DataType.CurrentDataTime; gwl.IsEnable = true; gwl.IsPass = false; gwl.PRI = gwf.PRI; if (i == 0) { gwl.Insert(); } else { gwl.Update(); } #endregion return(wk.OID); }
/// <summary> /// 分合流的撤销发送. /// </summary> /// <param name="gwf"></param> /// <returns></returns> private string DoUnSendInFeiLiuHeiliu(GenerWorkFlow gwf) { //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。 GenerWorkerList gwl = new GenerWorkerList(); //删除合流节点的处理人. gwl.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); //查询已经走得分流节点待办. int i = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, this.UnSendToNode, GenerWorkerListAttr.FK_Emp, WebUser.No); if (i == 0) { throw new Exception("@您不能执行撤消发送,因为当前分流工作不是您发送的。"); } // 更新分流节点,让其出现待办. gwl.IsPassInt = 0; gwl.IsRead = false; gwl.SDT = BP.DA.DataType.CurrentDataTime; //这里计算时间有问题. gwl.Update(); // 把设置当前流程运行到分流流程上. gwf.FK_Node = this.UnSendToNode; Node nd = new Node(this.UnSendToNode); gwf.NodeName = nd.Name; gwf.Sender = BP.Web.WebUser.No; gwf.SendDT = BP.DA.DataType.CurrentDataTime; gwf.Update(); Work wk = nd.HisWork; wk.OID = gwf.WorkID; wk.RetrieveFromDBSources(); string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wk, null); // 记录日志.. WorkNode wn = new WorkNode(wk, nd); wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, gwf.FK_Node, gwf.NodeName, ""); //删除上一个节点的数据。 foreach (Node ndNext in nd.HisToNodes) { i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID); if (i == 0) { continue; } if (ndNext.HisRunModel == RunModel.SubThread) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) { BP.WF.Dev2Interface.Flow_DeleteSubThread(gwf.FK_Flow, en.WorkID, "合流节点撤销发送前,删除子线程."); } continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow) { wks.Delete(GenerWorkerListAttr.FID, this.WorkID); } } // 设置当前节点的状态. Node cNode = new Node(gwf.FK_Node); Work cWork = cNode.HisWork; cWork.OID = this.WorkID; msg += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wk, null); if (cNode.IsStartNode) { return("@撤消执行成功." + msg); } else { return("@撤消执行成功." + msg); } }
/// <summary> /// 撤消分流点 /// 1, 把分流节点的人员设置成待办。 /// 2,删除所有该分流点发起的子线程。 /// </summary> /// <param name="gwf"></param> /// <returns></returns> private string DoUnSendFeiLiu(GenerWorkFlow gwf) { //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。 GenerWorkerList gwl = new GenerWorkerList(); int i = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node, GenerWorkerListAttr.FK_Emp, WebUser.No); if (i == 0) { throw new Exception("@您不能执行撤消发送,因为当前工作不是您发送的。"); } //处理事件. Node nd = new Node(gwf.FK_Node); Work wk = nd.HisWork; wk.OID = gwf.WorkID; wk.RetrieveFromDBSources(); string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wk, null); // 记录日志.. WorkNode wn = new WorkNode(wk, nd); wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, gwf.FK_Node, gwf.NodeName, ""); //删除上一个节点的数据。 foreach (Node ndNext in nd.HisToNodes) { i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID); if (i == 0) { continue; } if (ndNext.HisRunModel == RunModel.SubThread) { /*如果到达的节点是子线程,就查询出来发起的子线程。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkFlow en in gwfs) { BP.WF.Dev2Interface.Flow_DeleteSubThread(gwf.FK_Flow, en.WorkID, "合流节点撤销发送前,删除子线程."); } continue; } // 删除工作记录。 Works wks = ndNext.HisWorks; if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow) { wks.Delete(GenerWorkerListAttr.FID, this.WorkID); } } //设置当前节点。 BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND IsPass=1"); // 设置当前节点的状态. Node cNode = new Node(gwf.FK_Node); Work cWork = cNode.HisWork; cWork.OID = this.WorkID; msg += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wk, null); return("@撤消执行成功." + msg); }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { if (Web.WebUser.No != "admin") { return("非法的用户执行。"); } //DA.DBAccess.RunSQL("DELETE FROM WF_CHOfFlow"); DA.DBAccess.RunSQL("DELETE FROM WF_Bill"); DA.DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist"); DA.DBAccess.RunSQL("DELETE FROM WF_GENERWORKFLOW"); DA.DBAccess.RunSQL("DELETE FROM WF_ReturnWork"); DA.DBAccess.RunSQL("DELETE FROM WF_GenerFH"); DA.DBAccess.RunSQL("DELETE FROM WF_SelectAccper"); DA.DBAccess.RunSQL("DELETE FROM WF_RememberMe"); DA.DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB"); Flows fls = new Flows(); fls.RetrieveAll(); foreach (Flow item in fls) { DA.DBAccess.RunSQL("DELETE FROM ND" + int.Parse(item.No) + "Track"); } Nodes nds = new Nodes(); foreach (Node nd in nds) { try { Work wk = nd.HisWork; DA.DBAccess.RunSQL("DELETE FROM " + wk.EnMap.PhysicsTable); } catch { } } MapDatas mds = new MapDatas(); mds.RetrieveAll(); foreach (MapData nd in mds) { try { DA.DBAccess.RunSQL("DELETE FROM " + nd.PTable); } catch { } } MapDtls dtls = new MapDtls(); dtls.RetrieveAll(); foreach (MapDtl dtl in dtls) { try { DA.DBAccess.RunSQL("DELETE FROM " + dtl.PTable); } catch { } } return("执行成功..."); }