using System; using System.Collections.Generic; using System.Collections; using System.Data; using System.Web; using System.IO; using BP.DA; using BP.Sys; using BP.Web; using BP.Port; using BP.En; using BP.WF.Data; using BP.WF.Template; using BP.WF.DTS; using BP.Difference; using BP.WF.Template.SFlow; using BP.WF.Template.Frm; using System.Text; using System.Threading; namespace BP.WF.HttpHandler { /// /// 页面功能实体 /// public class WF_WorkOpt : DirectoryPageBase { /// /// 最新的消息 /// /// public string GenerMsg_Init() { //生成消息的ID. string sql = ""; if (BP.Difference.SystemConfig.AppCenterDBType == DBType.Oracle) { sql = "SELECT RDT FROM WF_GenerWorkerlist WHERE IsPass=0 AND FK_Flow is not null AND FK_Emp='" + BP.Web.WebUser.No + "' ORDER BY RDT DESC "; } else { sql = "SELECT RDT FROM WF_GenerWorkerlist WHERE IsPass=0 AND FK_Flow !='' AND FK_Emp='" + BP.Web.WebUser.No + "' ORDER BY RDT DESC "; } DataTable dt = DBAccess.RunSQLReturnTable(sql); Hashtable ht = new Hashtable(); if (dt.Rows.Count == 0) { ht.Add("ID", 0); } else { ht.Add("ID", dt.Rows[0][0].ToString()); } ht.Add("Num", dt.Rows.Count); return BP.Tools.Json.ToJson(ht); } /** * 执行定时触发 * * @return * @throws Exception */ public string ccbpmServices() { //自动节点. AutoRun_WhoExeIt dts = new AutoRun_WhoExeIt(); string msg1 = dts.Do() as string; //发起流程. AutoRunStratFlows en = new AutoRunStratFlows(); string msg = en.Do() as string; ccbpmServices dts3 = new ccbpmServices(); string msg3 = dts3.Do() as string; return "执行完成。
" + msg + "
" + msg1 + "
" + msg3; } /// /// 删除子线程 /// /// public string ThreadDtl_DelSubThread() { BP.WF.Dev2Interface.Flow_DeleteSubThread(this.WorkID, "手工删除"); return "删除成功"; } #region 打印 rtf /// /// 初始化 /// /// public string PrintDoc_Init() { String billNo = this.GetRequestVal("FK_Bill"); FrmPrintTemplate templete = new FrmPrintTemplate(); if (DataType.IsNullOrEmpty(billNo) == false) { templete.setMyPK(billNo); int count = templete.RetrieveFromDBSources(); if (count == 0) return "err@表单模板的编号[" + billNo + "]数据不存在,请查看设计是否正确"; } String frmID = this.FrmID; Node nd = null; if (DataType.IsNullOrEmpty(frmID) == true && (this.NodeID != 0 && this.NodeID != 9999)) { nd = new Node(this.NodeID); if (nd.HisFormType == NodeFormType.SDKForm || nd.HisFormType == NodeFormType.SelfForm) return "err@SDK表单、嵌入式表单暂时不支持打印功能"; if (nd.HisFormType == NodeFormType.SheetTree) { //获取该节点绑定的表单 // 所有表单集合. MapDatas mds = new MapDatas(); mds.RetrieveInSQL("SELECT FK_Frm FROM WF_FrmNode WHERE FK_Node=" + this.NodeID + " AND FrmEnableRole !=5"); return "info@" + BP.Tools.Json.ToJson(mds.ToDataTableField("dt")); } frmID = "ND" + this.NodeID; if (nd.HisFormType == NodeFormType.FoolForm && DataType.IsNullOrEmpty(frmID) == false) { FrmPrintTemplates templetes = new FrmPrintTemplates(); templetes.Retrieve(FrmPrintTemplateAttr.FrmID, frmID); if (templetes.Count == 0) return "err@当前节点上没有绑定单据模板。"; if (templetes.Count > 1) return templetes.ToJson("dt"); templete = templetes[0] as FrmPrintTemplate; } if (nd.HisFormType == NodeFormType.RefOneFrmTree || nd.HisFlow.FlowDevModel == FlowDevModel.JiJian) { frmID = nd.NodeFrmID; MapData md = new MapData(frmID); FrmPrintTemplates templetes = new FrmPrintTemplates(); if (md.HisFrmType == FrmType.ChapterFrm) { //如果是章节表单,需要获取当前表单上关联的表单 String sql = "SELECT CtrlID From Sys_GroupField Where CtrlType='ChapterFrmLinkFrm' AND FrmID='" + frmID + "'"; DataTable dt = DBAccess.RunSQLReturnTable(sql); String val = "'" + frmID + "'"; foreach (DataRow dr in dt.Rows) { val += ",'" + dr[0] + "'"; } templetes.RetrieveIn(FrmPrintTemplateAttr.FrmID, val); } else { templetes.Retrieve(FrmPrintTemplateAttr.FrmID, frmID); } if (templetes.Count == 0) return "err@当前节点上没有绑定单据模板。"; if (templetes.Count > 1) return templetes.ToJson("dt"); templete = templetes[0] as FrmPrintTemplate; } } //单据的打印 if(DataType.IsNullOrEmpty(templete.MyPK) == true) { FrmPrintTemplates templetes = new FrmPrintTemplates(); templetes.Retrieve(FrmPrintTemplateAttr.FrmID, frmID); if(templetes.Count == 0) return "err@当前节点上没有绑定单据模板。"; templete = templetes[0] as FrmPrintTemplate; } String sourceType = this.GetRequestVal("SourceType"); if (DataType.IsNullOrEmpty(sourceType) == false && sourceType.Equals("Bill")) return PrintDoc_FormDoneIt(null, this.WorkID, this.FID, frmID, templete); if (nd != null && nd.HisFormType == NodeFormType.RefOneFrmTree) return PrintDoc_FormDoneIt(nd, this.WorkID, this.FID, templete.FrmID, templete); return PrintDoc_DoneIt(templete.MyPK); } /// /// 执行打印 /// /// public string PrintDoc_Done() { string FrmPrintTemplateNo = this.GetRequestVal("FK_Bill"); return PrintDoc_DoneIt(FrmPrintTemplateNo); } /// /// 打印pdf. /// /// /// public string PrintDoc_DoneIt(string FrmPrintTemplateNo = null) { Node nd = new Node(this.NodeID); if (FrmPrintTemplateNo == null) FrmPrintTemplateNo = this.GetRequestVal("FK_Bill"); FrmPrintTemplate func = new FrmPrintTemplate(FrmPrintTemplateNo); //如果不是 FrmPrintTemplateExcel 打印. if (func.TemplateFileModel == TemplateFileModel.VSTOForExcel) return "url@httpccword://-fromccflow,App=FrmPrintTemplateExcel,TemplateNo=" + func.MyPK + ",WorkID=" + this.WorkID + ",FK_Flow=" + this.FlowNo + ",FK_Node=" + this.NodeID + ",UserNo=" + BP.Web.WebUser.No + ",Token=" + BP.Web.WebUser.Token; //如果不是 FrmPrintTemplateWord 打印 if (func.TemplateFileModel == TemplateFileModel.VSTOForWord) return "url@httpccword://-fromccflow,App=FrmPrintTemplateWord,TemplateNo=" + func.MyPK + ",WorkID=" + this.WorkID + ",FK_Flow=" + this.FlowNo + ",FK_Node=" + this.NodeID + ",UserNo=" + BP.Web.WebUser.No + ",Token=" + BP.Web.WebUser.Token; if (func.TemplateFileModel == TemplateFileModel.WPS) return PrintDoc_WpsWord(nd, this.WorkID, this.FID, func.FrmID, func); string billInfo = ""; string ccformId = this.GetRequestVal("CCFormID"); if (DataType.IsNullOrEmpty(ccformId) == false) return PrintDoc_FormDoneIt(nd, this.WorkID, this.FID, ccformId, func); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); string file = DateTime.Now.Year + "_" + WebUser.DeptNo + "_" + func.MyPK + "_" + WorkID + ".doc"; string tempFilePath = func.TempFilePath; if (tempFilePath.Contains(".rtf") == false) tempFilePath = tempFilePath + ".rtf"; BP.Pub.RTFEngine rtf = new BP.Pub.RTFEngine(tempFilePath); string rtfStr = rtf._rtfStr; string[] paths; string path; Int64 newWorkID = 0; try { #region 生成单据 rtf.HisEns.Clear(); rtf.EnsDataDtls.Clear(); if (func.NodeID != 0) { //把流程主表数据放入里面去. GEEntity ndxxRpt = new GEEntity("ND" + int.Parse(nd.FlowNo) + "Rpt"); try { ndxxRpt.PKVal = this.WorkID; ndxxRpt.Retrieve(); newWorkID = this.WorkID; } catch (Exception ex) { if (FID > 0) { ndxxRpt.PKVal = this.FID; ndxxRpt.Retrieve(); newWorkID = this.FID; wk = null; wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); } else { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。@Err:" + ex.Message + " @File=" + file + " @Path:" + path; billInfo += "@" + msgErr + ""; throw new Exception(msgErr + "@其它信息:" + ex.Message); } } ndxxRpt.Copy(wk); //把数据赋值给wk. 有可能用户还没有执行流程检查,字段没有同步到 NDxxxRpt. if (ndxxRpt.Row.Count > wk.Row.Count) wk.Row = ndxxRpt.Row; rtf.HisGEEntity = wk; //加入他的明细表. List al = wk.GetDtlsDatasOfList(); foreach (Entities ens in al) rtf.AddDtlEns(ens); //增加多附件数据 FrmAttachments aths = wk.HisFrmAttachments; foreach (FrmAttachment athDesc in aths) { FrmAttachmentDBs athDBs = new FrmAttachmentDBs(); if (athDBs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athDesc.MyPK, FrmAttachmentDBAttr.RefPKVal, newWorkID, "RDT") == 0) continue; rtf.EnsDataAths.Add(athDesc.NoOfObj, athDBs); } //把审核日志表加入里面去. Paras ps = new Paras(); string trackTable = "ND" + int.Parse(nd.FlowNo) + "Track"; bool isHaveWriteDB = false; if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) isHaveWriteDB = true; if (isHaveWriteDB == true) ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg,WriteDB FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; else ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add(TrackAttr.ActionType, (int)ActionType.WorkCheck); ps.Add(TrackAttr.WorkID, newWorkID); DataTable dt = DBAccess.RunSQLReturnTable(ps); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dt.Columns[0].ColumnName = "MyPK"; dt.Columns[1].ColumnName = "NDFrom"; dt.Columns[2].ColumnName = "ActionType"; dt.Columns[3].ColumnName = "EmpFrom"; dt.Columns[4].ColumnName = "EmpFromT"; dt.Columns[5].ColumnName = "RDT"; dt.Columns[6].ColumnName = "Msg"; if (isHaveWriteDB == true) dt.Columns[7].ColumnName = "WriteDB"; } if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) { foreach (DataRow dr in dt.Rows) dr["WriteDB"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", dr[0].ToString(), "WriteDB"); } rtf.dtTrack = dt; //获取启用审核组件的节点 ps = new Paras(); ps.SQL = "SELECT NodeID FROM WF_Node WHERE FWCSta=1 AND FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow"; ps.Add(NodeAttr.FK_Flow, nd.FlowNo); rtf.wks = DBAccess.RunSQLReturnTable(ps); } paths = file.Split('_'); path = paths[0] + "/" + paths[1] + "/" + paths[2] + "/"; string fileModelT = "rtf"; if ((int)func.TemplateFileModel == 1) fileModelT = "word"; string billUrl = "file@" + fileModelT + "@" + BP.WF.Glo.CCFlowAppPath + "DataUser/Bill/" + path + file; if (func.HisPrintFileType == PrintFileType.PDF) billUrl = billUrl.Replace(".doc", ".pdf"); path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; if (System.IO.Directory.Exists(path) == false) System.IO.Directory.CreateDirectory(path); string tempFile = func.TempFilePath; if (tempFile.Contains(".rtf") == false) tempFile = tempFile + ".rtf"; //用于扫描打印. string qrUrl = SystemConfig.HostURL + "WF/WorkOpt/PrintDocQRGuide.htm?MyPK=" + func.MyPK; rtf.MakeDoc(tempFile, path, file, qrUrl); #endregion #region 转化成pdf. if (func.HisPrintFileType == PrintFileType.PDF) { string rtfPath = path + file; string pdfPath = rtfPath.Replace(".doc", ".pdf"); try { // BP.WF.Glo.Rtf2PDF(rtfPath, pdfPath); } catch (Exception ex) { return "err@" + ex.Message; } } #endregion //在线WebOffice打开 if (func.PrintOpenModel == PrintOpenModel.WebOffice) return "err@【/WF/WebOffice/PrintOffice.htm】该文件没有重构好,您可以找到旧版本解决,或者自己开发。"; return billUrl; } catch (Exception ex) { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。@Err:" + ex.Message + " @File=" + file + " @Path:" + path; return "err@" + msgErr + "" + ex.Message; } } #endregion public string PrintDoc_FormDoneIt(Node nd, long workID, long fid, string formID, FrmPrintTemplate func) { Int64 pkval = workID; Work wk = null; string billInfo = ""; MapData mapData = new MapData(formID); if (nd != null) { BP.WF.Template.FrmNode fn = new FrmNode(); fn = new FrmNode(nd.NodeID, formID); //先判断解决方案 if (fn != null && fn.WhoIsPK != WhoIsPK.OID) { if (fn.WhoIsPK == WhoIsPK.PWorkID) pkval = this.PWorkID; if (fn.WhoIsPK == WhoIsPK.FID) pkval = fid; } wk = nd.HisWork; wk.OID = pkval; wk.RetrieveFromDBSources(); } if (mapData.HisFrmType == FrmType.ChapterFrm) { return PrintDoc_ChapterFormDoneIt(nd, workID, pkval, formID, func, wk, mapData); } string file = DateTime.Now.Year + "_" + WebUser.DeptNo + "_" + func.MyPK + "_" + WorkID + ".doc"; string tempFile = func.TempFilePath; if (tempFile.Contains(".rtf") == false) tempFile = tempFile + ".rtf"; BP.Pub.RTFEngine rtf = new BP.Pub.RTFEngine(tempFile); string rtfStr = rtf._rtfStr; string[] paths; string path; Int64 newWorkID = 0; try { #region 生成单据 rtf.HisEns.Clear(); rtf.EnsDataDtls.Clear(); if (DataType.IsNullOrEmpty(func.FrmID) == false) { //把流程主表数据放入里面去. GEEntity ndxxRpt = new GEEntity(formID); try { ndxxRpt.PKVal = pkval; ndxxRpt.Retrieve(); newWorkID = pkval; } catch (Exception ex) { if (FID > 0) { ndxxRpt.PKVal = this.FID; ndxxRpt.Retrieve(); newWorkID = this.FID; wk = null; wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); } else { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。@Err:" + ex.Message + " @File=" + file + " @Path:" + path; billInfo += "@" + msgErr + ""; throw new Exception(msgErr + "@其它信息:" + ex.Message); } } //ndxxRpt.Copy(wk); //把数据赋值给wk. 有可能用户还没有执行流程检查,字段没有同步到 NDxxxRpt. //if (ndxxRpt.Row.Count > wk.Row.Count) // wk.Row = ndxxRpt.Row; rtf.HisGEEntity = ndxxRpt; //加入他的明细表. List al = new List(); MapDtls mapdtls = mapData.MapDtls; foreach (MapDtl dtl in mapdtls) { GEDtls dtls1 = new GEDtls(dtl.No); mapData.EnMap.AddDtl(dtls1, "RefPK"); } al = mapData.GetDtlsDatasOfList(pkval.ToString()); foreach (Entities ens in al) rtf.AddDtlEns(ens); //加入明细附件表 foreach (MapDtl dtl in mapdtls) { FrmAttachments athDtls = dtl.FrmAttachments; rtf.AddDtlOfAthEns(athDtls); } //增加多附件数据 FrmAttachments aths = mapData.FrmAttachments; foreach (FrmAttachment athDesc in aths) { FrmAttachmentDBs athDBs = new FrmAttachmentDBs(); if (athDBs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athDesc.MyPK, FrmAttachmentDBAttr.RefPKVal, newWorkID, "RDT") == 0) continue; rtf.EnsDataAths.Add(athDesc.NoOfObj, athDBs); } if (nd != null) { //把审核日志表加入里面去. Paras ps = new Paras(); string trackTable = "ND" + int.Parse(nd.FlowNo) + "Track"; bool isHaveWriteDB = false; if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) isHaveWriteDB = true; if (isHaveWriteDB == true) ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg,WriteDB FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; else ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add(TrackAttr.ActionType, (int)ActionType.WorkCheck); ps.Add(TrackAttr.WorkID, newWorkID); DataTable dt = DBAccess.RunSQLReturnTable(ps); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dt.Columns[0].ColumnName = "MyPK"; dt.Columns[1].ColumnName = "NDFrom"; dt.Columns[2].ColumnName = "ActionType"; dt.Columns[3].ColumnName = "EmpFrom"; dt.Columns[4].ColumnName = "EmpFromT"; dt.Columns[5].ColumnName = "RDT"; dt.Columns[6].ColumnName = "Msg"; if (isHaveWriteDB == true) dt.Columns[8].ColumnName = "WriteDB"; } if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) { foreach (DataRow dr in dt.Rows) dr["WriteDB"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", dr[0].ToString(), "WriteDB"); } rtf.dtTrack = dt; //获取启用审核组件的节点 ps = new Paras(); ps.SQL = "SELECT NodeID FROM WF_Node WHERE FWCSta=1 AND FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow"; ps.Add(NodeAttr.FK_Flow, nd.FlowNo); rtf.wks = DBAccess.RunSQLReturnTable(ps); } } paths = file.Split('_'); path = paths[0] + "/" + paths[1] + "/" + paths[2] + "/"; string fileModelT = "rtf"; if ((int)func.TemplateFileModel == 1) fileModelT = "word"; string billUrl = "file@" + fileModelT + "@" + BP.WF.Glo.CCFlowAppPath + "DataUser/Bill/" + path + file; if (func.HisPrintFileType == PrintFileType.PDF) billUrl = billUrl.Replace(".doc", ".pdf"); path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; // path = Server.MapPath(path); if (System.IO.Directory.Exists(path) == false) System.IO.Directory.CreateDirectory(path); //string tempFile = func.TempFilePath; //if (tempFile.Contains(".rtf") == false) // tempFile = tempFile + ".rtf"; //用于扫描打印. string qrUrl = SystemConfig.HostURL + "WF/WorkOpt/PrintDocQRGuide.htm?MyPK=" + func.MyPK; rtf.MakeDoc(tempFile, path, file, qrUrl); #endregion #region 转化成pdf. if (func.HisPrintFileType == PrintFileType.PDF) { string rtfPath = path + file; string pdfPath = rtfPath.Replace(".doc", ".pdf"); try { // BP.WF.Glo.Rtf2PDF(rtfPath, pdfPath); } catch (Exception ex) { return "err@" + ex.Message; } } #endregion //在线WebOffice打开 if (func.PrintOpenModel == PrintOpenModel.WebOffice) return "err@【/WF/WebOffice/PrintOffice.htm】该文件没有重构好,您可以找到旧版本解决,或者自己开发。"; return billUrl; } catch (Exception ex) { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。err@" + ex.Message + " @File=" + file + " @Path:" + path; return "err@" + msgErr + "" + ex.Message; } } public string PrintDoc_ChapterFormDoneIt(Node nd, long workID, long pkval, string formID, FrmPrintTemplate func, Work wk, MapData mapData) { string billInfo = ""; string file = DateTime.Now.Year + "_" + WebUser.DeptNo + "_" + func.MyPK + "_" + WorkID + ".doc"; string tempFile = func.TempFilePath; if (tempFile.Contains(".rtf") == false) tempFile = tempFile + ".rtf"; BP.Pub.RTFEngine rtf = new BP.Pub.RTFEngine(tempFile); string rtfStr = rtf._rtfStr; string hidegroup = wk.GetParaString("HideGroup", ""); string hideAttrs = wk.GetParaString("HideAttrs", ""); //章节表单且根据当前流程筛选的可显示的章节打印输出 GroupFields gfs = mapData.GroupFields; MapAttrs mapAttrs = mapData.MapAttrs; hidegroup = "," + hidegroup + ","; hideAttrs = "," + hideAttrs + ","; //按照分组处理 //递归层数 int recursionCount = 1; int idx = 0; Dictionary numberMap = new Dictionary(); numberMap.Add(1, "一"); numberMap.Add(2, "二"); numberMap.Add(3, "三"); numberMap.Add(4, "四"); numberMap.Add(5, "五"); numberMap.Add(6, "六"); numberMap.Add(7, "七"); numberMap.Add(8, "八"); numberMap.Add(9, "九"); numberMap.Add(10, "十"); numberMap.Add(11, "十一"); numberMap.Add(12, "十二"); numberMap.Add(13, "十三"); foreach (GroupField gf in gfs) { if (DataType.IsNullOrEmpty(gf.GetValStringByKey("ParentOID")) == true) { if (hidegroup.Contains("," + gf.OID + ",") == false) { if (gf.Lab.Equals("封面") == false) idx++; if (rtfStr.Contains("") == true) { rtfStr = rtfStr.Replace("", idx.ToString() + rtf.GetCode(gf.Lab)); //递归获取下面的子级 rtfStr = GetChildNodes(gf.OID, gfs, rtfStr, hidegroup, idx.ToString(), rtf); } } else { if (rtfStr.Contains("") == true) rtfStr = GetRtfStr(rtfStr, ""); //递归获取下面的子级 rtfStr = GetChildNodes(gf.OID, gfs, rtfStr, hidegroup, idx.ToString(), rtf); } } } rtfStr = GetAttrChildNodes(mapAttrs, rtfStr, hideAttrs, idx.ToString(), rtf); rtf._rtfStr = rtfStr; string[] paths; string path; Int64 newWorkID = 0; try { #region 生成单据 rtf.HisEns.Clear(); rtf.EnsDataDtls.Clear(); if (DataType.IsNullOrEmpty(func.FrmID) == false) { //把流程主表数据放入里面去. GEEntity ndxxRpt = new GEEntity(formID); try { ndxxRpt.PKVal = pkval; ndxxRpt.Retrieve(); newWorkID = pkval; } catch (Exception ex) { if (FID > 0) { ndxxRpt.PKVal = this.FID; ndxxRpt.Retrieve(); newWorkID = this.FID; wk = null; wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); } else { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。@Err:" + ex.Message + " @File=" + file + " @Path:" + path; billInfo += "@" + msgErr + ""; throw new Exception(msgErr + "@其它信息:" + ex.Message); } } rtf.HisGEEntity = ndxxRpt; //加入他的明细表. List al = new List(); MapDtls mapdtls = mapData.MapDtls; foreach (MapDtl dtl in mapdtls) { GEDtls dtls1 = new GEDtls(dtl.No); mapData.EnMap.AddDtl(dtls1, "RefPK"); } al = mapData.GetDtlsDatasOfList(pkval.ToString()); foreach (Entities ens in al) rtf.AddDtlEns(ens); //加入明细附件表 foreach (MapDtl dtl in mapdtls) { FrmAttachments athDtls = dtl.FrmAttachments; rtf.AddDtlOfAthEns(athDtls); } //增加多附件数据 FrmAttachments aths = mapData.FrmAttachments; foreach (FrmAttachment athDesc in aths) { FrmAttachmentDBs athDBs = new FrmAttachmentDBs(); if (athDBs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athDesc.MyPK, FrmAttachmentDBAttr.RefPKVal, newWorkID, "RDT") == 0) { rtfStr = GetRtfStr(rtfStr, ""); rtfStr = GetRtfStr(rtfStr, ""); continue; } rtf.EnsDataAths.Add(athDesc.NoOfObj, athDBs); } rtf._rtfStr = rtfStr; if (nd != null) { //把审核日志表加入里面去. Paras ps = new Paras(); string trackTable = "ND" + int.Parse(nd.FlowNo) + "Track"; bool isHaveWriteDB = false; if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) isHaveWriteDB = true; if (isHaveWriteDB == true) ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg,WriteDB FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; else ps.SQL = "SELECT MyPK,NDFrom,ActionType,EmpFrom,EmpFromT,RDT,Msg FROM " + trackTable + " WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add(TrackAttr.ActionType, (int)ActionType.WorkCheck); ps.Add(TrackAttr.WorkID, newWorkID); DataTable dt = DBAccess.RunSQLReturnTable(ps); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dt.Columns[0].ColumnName = "MyPK"; dt.Columns[1].ColumnName = "NDFrom"; dt.Columns[2].ColumnName = "ActionType"; dt.Columns[3].ColumnName = "EmpFrom"; dt.Columns[4].ColumnName = "EmpFromT"; dt.Columns[5].ColumnName = "RDT"; dt.Columns[6].ColumnName = "Msg"; if (isHaveWriteDB == true) dt.Columns[8].ColumnName = "WriteDB"; } if (DBAccess.IsExitsTableCol(trackTable, "WriteDB") == true) { foreach (DataRow dr in dt.Rows) dr["WriteDB"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", dr[0].ToString(), "WriteDB"); } rtf.dtTrack = dt; //获取启用审核组件的节点 ps = new Paras(); ps.SQL = "SELECT NodeID FROM WF_Node WHERE FWCSta=1 AND FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow"; ps.Add(NodeAttr.FK_Flow, nd.FlowNo); rtf.wks = DBAccess.RunSQLReturnTable(ps); } } paths = file.Split('_'); path = paths[0] + "/" + paths[1] + "/" + paths[2] + "/"; string fileModelT = "rtf"; if ((int)func.TemplateFileModel == 1) fileModelT = "word"; string billUrl = "url@" + fileModelT + "@" + BP.WF.Glo.CCFlowAppPath + "DataUser/Bill/" + path + file; if (func.HisPrintFileType == PrintFileType.PDF) billUrl = billUrl.Replace(".doc", ".pdf"); path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; if (System.IO.Directory.Exists(path) == false) System.IO.Directory.CreateDirectory(path); //用于扫描打印. string qrUrl = SystemConfig.HostURL + "WF/WorkOpt/PrintDocQRGuide.htm?MyPK=" + func.MyPK; rtf.MakeDoc(tempFile, path, file, qrUrl); #endregion #region 转化成pdf. if (func.HisPrintFileType == PrintFileType.PDF) { string rtfPath = path + file; string pdfPath = rtfPath.Replace(".doc", ".pdf"); try { // BP.WF.Glo.Rtf2PDF(rtfPath, pdfPath); } catch (Exception ex) { return "err@" + ex.Message; } } #endregion //在线WebOffice打开 if (func.PrintOpenModel == PrintOpenModel.WebOffice) return "err@【/WF/WebOffice/PrintOffice.htm】该文件没有重构好,您可以找到旧版本解决,或者自己开发。"; return billUrl; } catch (Exception ex) { path = BP.WF.Glo.FlowFileBill + DateTime.Now.Year + "/" + WebUser.DeptNo + "/" + func.MyPK + "/"; string msgErr = "@" + string.Format("生成单据失败,请让管理员检查目录设置") + "[" + BP.WF.Glo.FlowFileBill + "]。err@" + ex.Message + " @File=" + file + " @Path:" + path; return "err@" + msgErr + "" + ex.Message; } } /// /// Wps打印Word文档 /// /// /// /// /// /// /// public string PrintDoc_WpsWord(Node nd, long workID, long fid, string formID, FrmPrintTemplate func) { DataSet ds = new DataSet(); DataTable dt = func.ToDataTableField("Sys_FrmPrintTemplate"); ds.Tables.Add(dt); Int64 pkval = workID; Work wk = null; string billInfo = ""; if (nd != null) { BP.WF.Template.FrmNode fn = new FrmNode(nd.NodeID, formID); //先判断解决方案 if (fn != null && fn.WhoIsPK != WhoIsPK.OID) { if (fn.WhoIsPK == WhoIsPK.PWorkID) pkval = this.PWorkID; if (fn.WhoIsPK == WhoIsPK.FID) pkval = fid; } wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); } MapData mapData = new MapData(formID); Int64 newWorkID = 0; if (DataType.IsNullOrEmpty(func.FrmID) == false) { //把流程主表数据放入里面去. GEEntity ndxxRpt = new GEEntity(formID); try { ndxxRpt.PKVal = pkval; ndxxRpt.Retrieve(); newWorkID = pkval; } catch (Exception ex) { if (FID > 0) { ndxxRpt.PKVal = this.FID; ndxxRpt.Retrieve(); newWorkID = this.FID; wk = null; wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); } } //加入主表信息 dt = ndxxRpt.ToDataTableField("MainTable"); ds.Tables.Add(dt); dt = mapData.MapAttrs.ToDataTableField("Sys_MapAttr"); ds.Tables.Add(dt); //加入他的明细表. MapDtls dtls = mapData.MapDtls; dt = dtls.ToDataTableField("Sys_MapDtl"); ds.Tables.Add(dt); foreach (MapDtl dtl in dtls) { GEDtls dtls1 = new GEDtls(dtl.No); EnDtl endtl = new EnDtl(); endtl.Ens = dtls1; endtl.RefKey = "RefPK"; dt = dtl.GetDtlEnsDa(endtl, pkval.ToString()).ToDataTableField(dtl.No); ds.Tables.Add(dt); } //增加多附件数据 FrmAttachments aths = mapData.FrmAttachments; DataTable athdt = aths.ToDataTableField("Sys_FrmAttachment"); ds.Tables.Add(athdt); foreach (FrmAttachment athDesc in aths) { FrmAttachmentDBs athDBs = new FrmAttachmentDBs(); if (athDBs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athDesc.MyPK, FrmAttachmentDBAttr.RefPKVal, newWorkID, "RDT") == 0) continue; dt = athDBs.ToDataTableField(athDesc.MyPK); ds.Tables.Add(dt); } if (nd != null) { //把审核日志表加入里面去. Paras ps = new Paras(); ps.SQL = "SELECT * FROM ND" + int.Parse(nd.FlowNo) + "Track WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add(TrackAttr.ActionType, (int)ActionType.WorkCheck); ps.Add(TrackAttr.WorkID, newWorkID); dt = DBAccess.RunSQLReturnTable(ps); dt.TableName = "WF_Track"; ds.Tables.Add(dt); } } return BP.Tools.Json.ToJson(ds); } private string GetChildNodes(int parentID, GroupFields gfs, string rtfStr, string hidegroup, string parentIdx, BP.Pub.RTFEngine rtf) { int idx = 0; foreach (GroupField gf in gfs) { if (gf.GetValIntByKey("ParentOID") == parentID) { if (hidegroup.Contains("," + gf.OID + ",") == false) { idx++; if (rtfStr.Contains("") == true) { rtfStr = rtfStr.Replace("", parentIdx + "." + idx.ToString() + rtf.GetCode(gf.Lab)); //处理 rtfStr = GetChildNodes(gf.OID, gfs, rtfStr, hidegroup, parentIdx + "." + idx.ToString(), rtf); } } else { //移除这个分组标签 if (rtfStr.Contains("") == true) rtfStr = GetRtfStr(rtfStr, ""); //递归获取下面的子级 rtfStr = GetChildNodes(gf.OID, gfs, rtfStr, hidegroup, parentIdx + "." + idx, rtf); } //移除从表 if (gf.CtrlType.Equals("Dtl") == true && rtfStr.Contains("<" + gf.CtrlID + ".Begin>") == true) { if (hidegroup.Contains("," + gf.OID + ",") == true) { int pos_rowKey = rtfStr.IndexOf("<" + gf.CtrlID + ".Begin>") + 1; int row_start = -1, row_end = -1; row_start = rtfStr.Substring(0, pos_rowKey).LastIndexOf("\\pard"); pos_rowKey = rtfStr.IndexOf("<" + gf.CtrlID + ".End>") + 1; row_end = rtfStr.Substring(pos_rowKey).IndexOf("\\par") + 6; if (row_start != -1 && row_end != -1) rtfStr = rtfStr.Substring(0, row_start) + rtfStr.Substring(pos_rowKey).Substring(row_end); } else { //移除这个分组标签 rtfStr = GetRtfStr(rtfStr, "<" + gf.CtrlID + ".Begin>"); rtfStr = GetRtfStr(rtfStr, "<" + gf.CtrlID + ".End>"); } } //移除附件 if (gf.CtrlType.Equals("Ath") == true && hidegroup.Contains("," + gf.OID + ",") == true) { string athObj = gf.CtrlID.Replace(gf.FrmID + "_", ""); if (rtfStr.Contains(""); rtfStr = GetRtfStr(rtfStr, ""); } } } } return rtfStr; } private string GetRtfStr(string rtfStr, string tag) { //移除这个分组标签 if (tag.Contains(".End")) { return rtfStr.Replace(tag, ""); } int pos_rowKey = rtfStr.IndexOf(tag) + 1; int row_start = -1, row_end = -1; if (pos_rowKey > 0) { row_start = rtfStr.Substring(0, pos_rowKey).LastIndexOf("\\pard"); //int idx1 = rtfStr.Substring(pos_rowKey).IndexOf("\\par \\ltrrow"); int idx2 = rtfStr.Substring(pos_rowKey).IndexOf("\\par"); row_end = idx2 + 4; /*if (idx2 != -1) { if(idx1 == idx2) row_end = idx1 + 13; if(idx2") == true) { if (hideAttrs.Contains("," + mapAttr.KeyOfEn + ",") == true) { //移除这个分组标签 rtfStr = GetRtfStr(rtfStr, "<" + mapAttr.KeyOfEn + ">"); //rtfStr = rtfStr.Replace("<" + mapAttr.KeyOfEn + ">", ""); } } } return rtfStr; } /// /// 执行挂起 /// /// public string Hungup_Save() { int delayWay = this.GetRequestValInt("DelayWay"); string strRelDate = this.GetRequestVal("RelDate"); string relDate; if (delayWay == 1) { if (DataType.IsNullOrEmpty(strRelDate)) return "err@截止时间不可以为空"; DateTime dtimeRelDate = DateTime.Parse(strRelDate); if (dtimeRelDate < DateTime.Now) return "err@截止时间不可以小于当前时间"; relDate = DataType.SysDateTimeFormat(dtimeRelDate); } else relDate = ""; BP.WF.Dev2Interface.Node_HungupWork(this.WorkID, delayWay, relDate, this.GetRequestVal("Doc")); return "挂起成功."; } /// /// 构造函数 /// public WF_WorkOpt() { } /// /// 打包下载 /// /// public string Packup_Init() { try { string sourceType = this.GetRequestVal("SourceType"); //打印单据实体、单据表单 if (DataType.IsNullOrEmpty(sourceType) == false && sourceType.Equals("Bill")) { return MakeForm2Html.MakeBillToPDF(this.GetRequestVal("FrmID"), this.WorkID, null, null); } int nodeID = this.NodeID; if (this.NodeID == 0) { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); nodeID = gwf.NodeID; } Node nd = new Node(nodeID); //树形表单方案单独打印 if ((nd.HisFormType == NodeFormType.SheetTree && nd.HisPrintPDFModle == 1)) { //获取该节点绑定的表单 // 所有表单集合. MapDatas mds = new MapDatas(); mds.RetrieveInSQL("SELECT FK_Frm FROM WF_FrmNode WHERE FK_Node=" + this.NodeID + " AND FrmEnableRole != 5"); return "info@" + BP.Tools.Json.ToJson(mds.ToDataTableField()); } return BP.WF.MakeForm2Html.MakeCCFormToPDF(nd, this.WorkID, this.FlowNo, null, null); } catch (Exception ex) { return "err@" + ex.Message; } } /** * 独立表单PDF打印 * @return * @throws Exception */ public String Packup_FromInit() { try { int nodeID = this.NodeID; if (this.NodeID == 0) { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); nodeID = gwf.NodeID; } Node nd = new Node(nodeID); return BP.WF.MakeForm2Html.MakeFormToPDF(this.GetRequestVal("FrmID"), this.GetRequestVal("FrmName"), nd, this.WorkID, this.FlowNo, null, false, this.GetRequestVal("BasePath")); } catch (Exception ex) { return "err@" + ex.Message; } } /// /// 扫描二维码获得文件. /// /// public string PrintDocQRGuide_Init() { try { int nodeID = this.NodeID; if (this.NodeID == 0) { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); nodeID = gwf.NodeID; } Node nd = new Node(nodeID); Work wk = nd.HisWork; return BP.WF.MakeForm2Html.MakeCCFormToPDF(nd, this.WorkID, this.FlowNo, null, null); } catch (Exception ex) { return "err@" + ex.Message; } } /// /// 选择表单,发起前置导航. /// /// public string StartGuideFrms_Init() { string sql = "SELECT No,Name From Sys_MapData A,WF_FrmNode B WHERE A.No=B.FK_Frm AND B.FK_Node=" + SystemConfig.AppCenterDBVarStr + "FK_Node AND FrmEnableRole=" + (int)BP.WF.Template.FrmEnableRole.WhenHaveFrmPara; Paras ps = new Paras(); ps.SQL = sql; ps.Add(FrmNodeAttr.FK_Node, int.Parse(this.FlowNo + "01")); DataTable dt = DBAccess.RunSQLReturnTable(ps); dt.TableName = "Frms"; DataSet ds = new DataSet(); ds.Tables.Add(dt); Flow flow = new Flow(this.FlowNo); ds.Tables.Add(flow.ToDataTableField("WF_Flow")); return BP.Tools.Json.ToJson(ds); } #region 公文处理. /// /// 直接下载 /// /// public string DocWord_OpenByHttp() { string DocName = this.GetRequestVal("DocName");//获取上传的公文模板名称 //生成文件. GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); Flow fl = new Flow(this.FlowNo); string file = SystemConfig.PathOfTemp + "/" + DocName; DBAccess.GetFileFromDB(file, fl.PTable, "OID", this.WorkID.ToString(), "DocWordFile"); return "../../DataUser/Temp/" + DocName; } /// /// 重置公文文件. /// /// public string DocWord_ResetFile() { Flow fl = new Flow(this.FlowNo); string sql = "UPDATE " + fl.PTable + " SET DocWordFile=NULL WHERE OID=" + this.WorkID; DBAccess.RunSQL(sql); return "重新生成模版成功."; } /// /// 生成文件模版 /// /// public string DocWord_Init() { BtnLab lab = new BtnLab(this.NodeID); if (lab.OfficeBtnEnableInt == 0) return "err@当前节点没有启用公文."; //首先判断是否生成公文文件? todo. Flow fl = new Flow(this.FlowNo); byte[] val = DBAccess.GetByteFromDB(fl.PTable, "OID", this.WorkID.ToString(), "DocWordFile"); if (val != null) return "info@OfficeBtnEnable=" + lab.OfficeBtnEnableInt.ToString() + ";请下载文件"; //如果已经有这个模版了. DocTemplate en = new DocTemplate(); //求出要生成的模版. DocTemplates ens = new DocTemplates(); ens.Retrieve(DocTemplateAttr.FK_Node, this.NodeID); if (ens.Count > 1) return "url@DocWordSelectDocTemp.htm"; //如果没有模版就给他一个默认的模版. if (ens.Count == 0) en.FilePath = SystemConfig.PathOfDataUser + "DocTemplete/Default.docx"; if (ens.Count == 1) en = ens[0] as DocTemplate; #warning 替换变量. todo. DBAccess.SaveBytesToDB(en.FileBytes, fl.PTable, "OID", this.WorkID, "DocWordFile"); return "info@OfficeBtnEnable=" + lab.OfficeBtnEnableInt.ToString() + ";请下载文件"; //如果已经有这个模版了. } /// /// 上传 /// /// public string DocWord_Upload() { if (HttpContextHelper.RequestFilesCount == 0) return "err@请上传模版."; //上传附件 //HttpPostedFile file = HttpContextHelper.RequestFiles(0); string fileName = HttpContextHelper.GetNameByIdx(0); string path = SystemConfig.PathOfTemp + DBAccess.GenerGUID() + ".docx"; HttpContextHelper.UploadFile(HttpContextHelper.RequestFiles(0), path); //插入模版. DocTemplate dt = new DocTemplate(); dt.NodeID = this.NodeID; dt.No = DBAccess.GenerGUID(); dt.Name = fileName; dt.FilePath = path; //路径 dt.NodeID = this.NodeID; dt.Insert(); Flow fl = new Flow(this.FlowNo); DBAccess.SaveFileToDB(path, fl.PTable, "OID", this.WorkID.ToString(), "DocWordFile"); return "上传成功."; } /// /// 选择一个模版 /// /// public string DocWordSelectDocTemp_Imp() { Node node = new Node(this.NodeID); if (node.ItIsStartNode == false) return "err@不是开始节点不可以执行模板导入."; DocTemplate docTemplate = new DocTemplate(this.No); if (File.Exists(docTemplate.FilePath) == false) return "err@选择的模版文件不存在,请联系管理员."; byte[] bytes = DataType.ConvertFileToByte(docTemplate.FilePath); Flow fl = new Flow(this.FlowNo); DBAccess.SaveBytesToDB(bytes, fl.PTable, "OID", this.WorkID, "DocWordFile"); return "模板导入成功."; } #endregion #region 通用人员选择器. public string AccepterOfGener_Init() { Entities ens = AccepterOfGener_Init_Ext(); return ens.ToJson(); } public string AccepterOfGener_Init_TS() { Entities ens = AccepterOfGener_Init_Ext(); return ens.ToJson(); } /// /// 通用人员选择器Init /// /// public SelectAccpers AccepterOfGener_Init_Ext() { /* 获得上一次发送的人员列表. */ int toNodeID = this.GetRequestValInt("ToNode"); Selector selector = new Selector(toNodeID); //查询出来,已经选择的人员. SelectAccpers sas = new SelectAccpers(); int i = sas.Retrieve(SelectAccperAttr.FK_Node, toNodeID, SelectAccperAttr.WorkID, this.WorkID, SelectAccperAttr.Idx); if (selector.ItIsAutoLoadEmps == false) return sas; if (i == 0) { //获得最近的一个workid. string trackTable = "ND" + int.Parse(this.FlowNo) + "Track"; Paras ps = new Paras(); if (SystemConfig.AppCenterDBType == DBType.MSSQL) { ps.SQL = "SELECT TOP 1 Tag,EmpTo FROM " + trackTable + " WHERE NDTo=" + SystemConfig.AppCenterDBVarStr + "NDTo AND (ActionType=0 OR ActionType=1) AND EmpFrom=" + SystemConfig.AppCenterDBVarStr + "EmpFrom ORDER BY WorkID desc "; ps.Add("NDTo", toNodeID); ps.Add("EmpFrom", WebUser.No); } else if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) { ps.SQL = "SELECT * FROM (SELECT Tag,EmpTo,WorkID FROM " + trackTable + " A WHERE A.EmpFrom=" + SystemConfig.AppCenterDBVarStr + "EmpFrom AND A.NDFrom=" + SystemConfig.AppCenterDBVarStr + "NDFrom AND A.NDTo=" + SystemConfig.AppCenterDBVarStr + "NDTo AND (ActionType=0 OR ActionType=1) AND EmpFrom=" + SystemConfig.AppCenterDBVarStr + "EmpFrom ORDER BY WorkID DESC ) WHERE ROWNUM =1"; ps.Add("EmpFrom", BP.Web.WebUser.No); ps.Add("NDFrom", this.NodeID); ps.Add("NDTo", toNodeID); } else if (SystemConfig.AppCenterDBType == DBType.MySQL) { ps.SQL = "SELECT Tag,EmpTo FROM " + trackTable + " A WHERE A.NDFrom=" + SystemConfig.AppCenterDBVarStr + "NDFrom AND A.NDTo=" + SystemConfig.AppCenterDBVarStr + "NDTo AND (ActionType=0 OR ActionType=1) AND EmpFrom=" + SystemConfig.AppCenterDBVarStr + "EmpFrom ORDER BY WorkID DESC limit 1,1 "; ps.Add("NDFrom", this.NodeID); ps.Add("NDTo", toNodeID); ps.Add("EmpFrom", WebUser.No); } else if (SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) { ps.SQL = "SELECT Tag,EmpTo FROM " + trackTable + " A WHERE A.NDFrom=:NDFrom AND A.NDTo=:NDTo AND (ActionType=0 OR ActionType=1) AND EmpFrom=:EmpFrom ORDER BY WorkID DESC limit 1 "; ps.Add("NDFrom", this.NodeID); ps.Add("NDTo", toNodeID); ps.Add("EmpFrom", WebUser.No); } else { //ps.SQL = "SELECT Tag, EmpTo FROM " + trackTable + " WHERE NDTo=" + SystemConfig.AppCenterDBVarStr + "NDTo AND (ActionType=0 OR ActionType=1) AND EmpFrom=" + SystemConfig.AppCenterDBVarStr + "EmpFrom ORDER BY WorkID DESC "; //ps.Add("NDTo", toNodeID); //ps.Add("EmpFrom", WebUser.No); throw new Exception("err@没有判断的数据库类型...."); } DataTable dt = DBAccess.RunSQLReturnTable(ps); if (dt.Rows.Count != 0) { string tag = dt.Rows[0]["Tag"].ToString(); string emps = dt.Rows[0]["EmpTo"].ToString(); if (tag != null && tag.Contains("EmpsAccepter=") == true) { string[] strs = tag.Split('@'); foreach (string str in strs) { if (str == null || str == "" || str.Contains("EmpsAccepter=") == false) continue; string[] mystr = str.Split('='); if (mystr.Length == 2) { emps = mystr[1]; } } } if (emps.Contains(",") == true) { if (emps.Contains("'") == true) { string[] strs = emps.Split(';'); foreach (string str in strs) { string[] emp = str.Split(','); string empNo = emp[0]; BP.WF.Dev2Interface.Node_AddNextStepAccepters(this.WorkID, toNodeID, empNo, false); } } } else { BP.WF.Dev2Interface.Node_AddNextStepAccepters(this.WorkID, toNodeID, emps, false); } } if (dt.Rows.Count != 0) sas.Retrieve(SelectAccperAttr.FK_Node, toNodeID, SelectAccperAttr.WorkID, this.WorkID); } //判断人员是否已经删除 //if (sas.Count != 0) //{ // for (int k = sas.Count - 1; k >= 0; k--) // { // SelectAccper sa = sas[k] as SelectAccper; // Emp emp = new Emp(sa.FK_Emp); // if (emp.DeptNo == "") // { // sas.RemoveEn(sa); // sa.Delete(); // } // } //} List deleteItems = new List(); if (sas.Count > 0) { for (int k = sas.Count - 1; k >= 0; k--) { SelectAccper sa = sas[k] as SelectAccper; if (sa.DeptNo == "") { sas.RemoveEn(sa); deleteItems.Add(sa.DeptNo); } } } if (deleteItems.Count > 0) { new Thread(() => { SelectAccpers accepters = new SelectAccpers(); accepters.Delete("FK_Dept", ""); }).Start(); } return sas; } /// /// 增加接收人. /// /// public string AccepterOfGener_AddEmps() { try { //到达的节点ID. int toNodeID = this.GetRequestValInt("ToNode"); string emps = this.GetRequestVal("AddEmps"); //增加到里面去. BP.WF.Dev2Interface.Node_AddNextStepAccepters(this.WorkID, toNodeID, emps, false); //查询出来,已经选择的人员. SelectAccpers sas = new SelectAccpers(); sas.Retrieve(SelectAccperAttr.FK_Node, toNodeID, SelectAccperAttr.WorkID, this.WorkID, SelectAccperAttr.Idx); return sas.ToJson(); } catch (Exception ex) { if (ex.Message.Contains("INSERT") == true) return "err@人员名称重复,导致部分人员插入失败."; return "err@" + ex.Message; } } /// /// 执行发送. /// /// public string AccepterOfGener_Send() { try { int toNodeID = this.GetRequestValInt("ToNode"); if (toNodeID != 0) //排除协作模式下的会签 { Node nd = new Node(toNodeID); if (nd.HisDeliveryWay == DeliveryWay.BySelected) { /* 仅仅设置一个,检查压入的人员个数.*/ Paras ps = new Paras(); ps.SQL = "SELECT count(WorkID) as Num FROM WF_SelectAccper WHERE FK_Node=" + SystemConfig.AppCenterDBVarStr + "FK_Node AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID AND AccType=0"; ps.Add("FK_Node", toNodeID); ps.Add("WorkID", this.WorkID); int num = DBAccess.RunSQLReturnValInt(ps, 0); if (num == 0) return "err@请指定下一步工作的处理人."; Selector sr = new Selector(toNodeID); if (sr.ItIsSimpleSelector == true) { if (num != 1) return "err@您只能选择一个接受人,请移除其他的接受人然后执行发送."; } } } SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(this.FlowNo, this.WorkID, toNodeID, null); string strs = objs.ToMsgOfHtml(); strs = strs.Replace("@", "
@"); #region 处理发送后转向. //当前节点. Node currNode = new Node(this.NodeID); /*处理转向问题.*/ switch (currNode.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = currNode.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("?") == false) myurl += "?1=1"; Attrs myattrs = currNode.HisWork.EnMap.Attrs; Work hisWK = currNode.HisWork; foreach (Attr attr in myattrs) { if (myurl.Contains("@") == false) break; myurl = myurl.Replace("@" + attr.Key, hisWK.GetValStrByKey(attr.Key)); } myurl = myurl.Replace("@WebUser.No", BP.Web.WebUser.No); myurl = myurl.Replace("@WebUser.Name", BP.Web.WebUser.Name); myurl = myurl.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); if (myurl.Contains("@")) { BP.WF.Dev2Interface.Port_SendMsg("admin", currNode.Name + "在" + currNode.Name + "节点处,出现错误", "流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl, "Err" + currNode.No + "_" + this.WorkID, SMSMsgType.Err, this.FlowNo, this.NodeID, this.WorkID, this.FID); throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl); } if (myurl.Contains("PWorkID") == false) myurl += "&PWorkID=" + this.WorkID; myurl += "&FromFlow=" + this.FlowNo + "&FromNode=" + this.NodeID + "&UserNo=" + WebUser.No + "&Token=" + WebUser.Token; return "TurnUrl@" + myurl; case TurnToDeal.TurnToByCond: return strs; default: strs = strs.Replace("@WebUser.No", BP.Web.WebUser.No); strs = strs.Replace("@WebUser.Name", BP.Web.WebUser.Name); strs = strs.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); return strs; } #endregion return strs; } catch (Exception ex) { return "err@" + ex.Message; } } #endregion // 查询select集合 public string AccepterOfGener_SelectEmps() { string sql = ""; string emp = this.GetRequestVal("TB_Emps"); #region 保障查询语句的安全. emp = emp.ToLower(); emp = emp.Replace("'", ""); emp = emp.Replace("&", "&"); emp = emp.Replace("<", "<"); emp = emp.Replace(">", ">"); emp = emp.Replace("delete", ""); emp = emp.Replace("update", ""); emp = emp.Replace("insert", ""); #endregion 保障查询语句的安全. bool isPinYin = DBAccess.IsExitsTableCol("Port_Emp", "PinYin"); if (isPinYin == true) { //标识结束,不要like名字了. if (emp.Contains("/")) { //if (SystemConfig.CustomerNo == "TianYe") // 只改了oracle的 //{ // //string endSql = ""; // //if (BP.Web.WebUser.DeptNo.IndexOf("18099") == 0) // // endSql = " AND B.No LIKE '18099%' "; // //else // // endSql = " AND B.No NOT LIKE '18099%' "; // string specFlowNos = SystemConfig.AppSettings["SpecFlowNosForAccpter"]; // if (DataType.IsNullOrEmpty(specFlowNos) == true) // specFlowNos = ",001,"; // string specEmpNos = ""; // if (specFlowNos.Contains(this.NodeID.ToString() + ",") == false) // specEmpNos = " AND a.No!='00000001' "; // sql = "SELECT a." + Glo.UserNo + ",a.Name || '/' || b.FullName as Name FROM Port_Emp a, Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') AND rownum<=12 " + specEmpNos; //} //else //{ if (SystemConfig.AppCenterDBType == DBType.MSSQL) { if (SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS) sql = "SELECT TOP 12 a.No as No,a.Name +'/'+b.Name as Name FROM Port_Emp a,Port_Dept b WHERE a.OrgNo=" + WebUser.OrgNo + " AND (a.fk_dept=b.no) AND (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') "; else sql = "SELECT TOP 12 a.No,a.Name +'/'+b.Name as Name FROM Port_Emp a,Port_Dept b WHERE (a.FK_Dept=b.No) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') "; } if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) sql = "SELECT a.No,a.Name || '/' || b.name as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') AND rownum<=12 "; if (SystemConfig.AppCenterDBType == DBType.MySQL || SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) sql = "SELECT a.No,CONCAT(a.Name,'/',b.name) as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') LIMIT 12"; } else { if (SystemConfig.AppCenterDBType == DBType.MSSQL) { if (SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS) sql = "SELECT TOP 12 a.No as No,a.Name +'/'+b.name as Name FROM Port_Emp a,Port_Dept b WHERE A.OrgNo='" + WebUser.OrgNo + "' AND (a.fk_dept=b.no) and ( a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%')"; else sql = "SELECT TOP 12 a.No,a.Name +'/'+b.name as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%')"; } if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) sql = "SELECT a.No,a.Name || '/' || b.name as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and ( a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%') AND rownum<=12 "; if (SystemConfig.AppCenterDBType == DBType.MySQL || SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) if (SystemConfig.CCBPMRunModel != CCBPMRunModel.Single) sql = "SELECT a.No,CONCAT(a.Name,'/',b.name) as Name FROM Port_Emp a,Port_Dept b WHERE A.OrgNo='" + WebUser.OrgNo + "' AND (a.fk_dept=b.no) and ( a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%' ) LIMIT 12"; else sql = "SELECT a.No,CONCAT(a.Name,'/',b.name) as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and ( a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%' OR a.PinYin LIKE '%," + emp.ToLower() + "%' ) LIMIT 12"; } } else { if (SystemConfig.AppCenterDBType == DBType.MSSQL) { if (SystemConfig.CCBPMRunModel != CCBPMRunModel.Single) sql = "SELECT TOP 12 a.No,a.Name +'/'+b.Name as Name FROM Port_Emp a,Port_Dept b WHERE a.OrgNo='" + WebUser.OrgNo + "' AND (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%')"; else sql = "SELECT TOP 12 a.No,a.Name +'/'+b.Name as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%')"; } if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) sql = "SELECT a.No,a.Name || '/' || b.name as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%') and rownum<=12 "; if (SystemConfig.AppCenterDBType == DBType.MySQL || SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) { //@lyc if (SystemConfig.CCBPMRunModel == CCBPMRunModel.Single) sql = "SELECT a.No,CONCAT(a.Name,'/',b.name) as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%') LIMIT 12"; else sql = "SELECT a.No,CONCAT(a.Name,'/',b.name) as Name FROM Port_Emp a,Port_Dept b WHERE (a.fk_dept=b.no) and (a.No like '%" + emp + "%' OR a.NAME LIKE '%" + emp + "%') AND a.OrgNo='" + BP.Web.WebUser.OrgNo + "' LIMIT 12 "; } } DataTable dt = DBAccess.RunSQLReturnTable(sql); dt.Columns[0].ColumnName = "No"; dt.Columns[1].ColumnName = "Name"; return BP.Tools.Json.ToJson(dt); } /// /// 获取本组织之外的联络人员 /// /// public string AccepterOfOfficer_Init() { Paras paras = new Paras(); paras.SQL = "SELECT A.No,A.Name,FK_Dept, B.NameOfPath As DeptName,A.OrgNo From Port_Emp A,Port_Dept B WHERE A.DeptNo = B.No AND IsOfficer=1 AND A.OrgNo!=" + SystemConfig.AppCenterDBVarStr + "OrgNo"; paras.Add("OrgNo", WebUser.OrgNo); DataTable dt = DBAccess.RunSQLReturnTable(paras); foreach (DataRow dr in dt.Rows) { string deptNo = dr[2] as string; string deptName = dr[3] as string; if (deptName.Contains("/") == false) { string name = BP.WF.Dev2Interface.GetParentNameByCurrNo(deptNo, "Port_Dept", dr[4] as string); if (deptName.Equals(name) == false) { DBAccess.RunSQL("UPDATE Port_Dept SET NameOfPath='" + name + "' WHERE No='" + deptNo + "'"); dr[3] = name; } } } return BP.Tools.Json.ToJson(dt); } #region 会签. /// /// 会签 /// /// public string HuiQian_Init() { DataSet ds = BP.WF.Dev2Interface.Node_HuiQian_Init(this.WorkID); return BP.Tools.Json.ToJson(ds); } /// /// 移除 /// /// public string HuiQian_Delete() { BP.WF.Dev2Interface.Node_HuiQian_Delete(this.WorkID, this.GetRequestVal("FK_Emp")); return HuiQian_Init(); } /// /// 增加审核人员 /// /// public string HuiQian_AddEmps() { return BP.WF.Dev2Interface.Node_HuiQian_AddEmps(this.WorkID, this.GetRequestVal("HuiQianType"), this.GetRequestVal("AddEmps")); } #endregion #region 与会签相关的. // 查询select集合 public string HuiQian_SelectEmps() { return AccepterOfGener_SelectEmps(); } /// /// 增加主持人 /// /// public string HuiQian_AddLeader() { return BP.WF.Dev2Interface.Node_HuiQian_AddLeader(this.WorkID); } /// /// 保存并关闭 /// /// public string HuiQian_SaveAndClose() { return BP.WF.Dev2Interface.Node_HuiQianDone(this.WorkID, this.ToNodeID); } #endregion #region 审核组件. /// /// 校验密码 /// /// public string WorkCheck_CheckPass() { string sPass = this.GetRequestVal("SPass"); BP.WF.Port.WFEmp emp = new BP.WF.Port.WFEmp(WebUser.No); if (emp.SPass == sPass) return "签名成功"; return "err@密码错误"; } /// /// 修改密码 /// /// public string WorkCheck_ChangePass() { string sPass = this.GetRequestVal("SPass"); string sPass1 = this.GetRequestVal("SPass1"); string sPass2 = this.GetRequestVal("SPass2"); BP.WF.Port.WFEmp emp = new BP.WF.Port.WFEmp(WebUser.No); if (emp.SPass == sPass) return "旧密码错误"; if (sPass1.Equals(sPass2) == false) return "err@两次输入的密码不一致"; emp.SPass = sPass2; emp.Update(); return "密码修改成功"; } /// /// 初始化审核组件数据. /// /// public string WorkCheck_Init() { if (BP.Web.WebUser.No == null) return "err@登录信息丢失,请重新登录."; //表单库审核组件流程编号为null的异常处理 if (DataType.IsNullOrEmpty(this.FlowNo) == true) return "err@流程信息丢失,请联系管理员."; DataSet ds = new DataSet(); #region 定义变量. //查询审核意见的表名 string trackTable = "ND" + int.Parse(this.FlowNo) + "Track"; //当前节点的审核信息 NodeWorkCheck wcDesc = new NodeWorkCheck(this.NodeID); NodeWorkCheck frmWorkCheck = null; FrmAttachmentDBs athDBs = null; //上传附件集合 Nodes nds = new Nodes(this.FlowNo); Node nd = null; Track tkDoc = null; string nodes = ""; //可以审核的节点. bool isExitTb_doc = true; DataRow row = null; //是不是只读? bool isReadonly = this.GetRequestVal("IsReadonly") != null && this.GetRequestVal("IsReadonly").Equals("1") ? true : false; //是否可以编辑审核意见 bool isCanDo = false; if (isReadonly == true) isCanDo = false; else isCanDo = BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(this.WorkID, BP.Web.WebUser.No); NodeWorkCheck fwc = null; DataTable dt = null; //当前流程的审核组件的HuiQian NodeWorkChecks fwcs = new NodeWorkChecks(); fwcs.Retrieve(NodeAttr.FK_Flow, this.FlowNo, NodeAttr.Step); ds.Tables.Add(wcDesc.ToDataTableField("WF_FrmWorkCheck")); //审核意见存储集合 DataTable tkDt = new DataTable("Tracks"); tkDt.Columns.Add("MyPk", typeof(string)); tkDt.Columns.Add("NodeID", typeof(int)); tkDt.Columns.Add("NodeName", typeof(string)); tkDt.Columns.Add("Msg", typeof(string)); tkDt.Columns.Add("EmpFrom", typeof(string)); tkDt.Columns.Add("EmpFromT", typeof(string)); tkDt.Columns.Add("DeptName", typeof(string)); tkDt.Columns.Add("RDT", typeof(string)); tkDt.Columns.Add("IsDoc", typeof(bool)); tkDt.Columns.Add("ParentNode", typeof(int)); tkDt.Columns.Add("ActionType", typeof(int)); tkDt.Columns.Add("Tag", typeof(string)); tkDt.Columns.Add("FWCView", typeof(string)); tkDt.Columns.Add("WritImg", typeof(string)); tkDt.Columns.Add("WriteStamp", typeof(string)); //流程附件集合. DataTable athDt = new DataTable("Aths"); athDt.Columns.Add("NodeID", typeof(int)); athDt.Columns.Add("MyPK", typeof(string)); athDt.Columns.Add("FK_FrmAttachment", typeof(string)); athDt.Columns.Add("FK_MapData", typeof(string)); athDt.Columns.Add("FileName", typeof(string)); athDt.Columns.Add("FileExts", typeof(string)); athDt.Columns.Add("CanDelete", typeof(bool)); //当前节点的流程数据 FrmAttachmentDBs frmathdbs = new FrmAttachmentDBs(); frmathdbs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, "ND" + this.NodeID + "_FrmWorkCheck", FrmAttachmentDBAttr.RefPKVal, this.WorkID.ToString(), FrmAttachmentDBAttr.Rec, WebUser.No, FrmAttachmentDBAttr.RDT); foreach (FrmAttachmentDB athDB in frmathdbs) { row = athDt.NewRow(); row["NodeID"] = this.NodeID; row["MyPK"] = athDB.MyPK; row["FK_FrmAttachment"] = athDB.FK_FrmAttachment; row["FK_MapData"] = athDB.FrmID; row["FileName"] = athDB.FileName; row["FileExts"] = athDB.FileExts; row["CanDelete"] = athDB.Rec == WebUser.No && isReadonly == false ? 1 : 0; athDt.Rows.Add(row); } ds.Tables.Add(athDt); //审核组件的定义 WorkCheck wc = null; if (this.FID != 0) wc = new WorkCheck(this.FlowNo, this.NodeID, this.FID, 0); else wc = new WorkCheck(this.FlowNo, this.NodeID, this.WorkID, this.FID); //是否屏蔽正在审批的节点的审批意见(在在途,已完成等查看页面使用) bool isShowCurrNodeInfo = true; GenerWorkFlow gwf = new GenerWorkFlow(); if (this.WorkID != 0) { gwf.WorkID = this.WorkID; gwf.Retrieve(); } if (isReadonly == true && gwf.WFState == WFState.Runing && gwf.NodeID == this.NodeID) isShowCurrNodeInfo = false; /* * 获得当前节点已经审核通过的人员. * 比如:多人处理规则中的已经审核同意的人员,会签人员,组合成成一个字符串。 * 格式为: ,zhangsan,lisi, * 用于处理在审核列表中屏蔽临时的保存的审核信息. * 12 为芒果增加一个非正常完成状态. * */ string checkerPassed = ","; if (gwf.WFState != WFState.Complete && (int)gwf.WFState != 12) { Paras ps = new Paras(); ps.SQL = "SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID AND IsPass=1 AND FK_Node=" + SystemConfig.AppCenterDBVarStr + "FK_Node Order By RDT,CDT"; ps.Add("WorkID", this.WorkID); ps.Add("FK_Node", this.NodeID); DataTable checkerPassedDt = DBAccess.RunSQLReturnTable(ps); foreach (DataRow dr in checkerPassedDt.Rows) { checkerPassed += dr["FK_Emp"] + ","; } } #endregion 定义变量. #region 判断是否显示 - 历史审核信息显示 bool isDoc = false; Tracks tks = null; if (wcDesc.FWCListEnable == true) { tks = wc.HisWorkChecks; foreach (Track tk in tks) { //评论组件 if (tk.HisActionType == ActionType.FlowBBS) continue; //不是审核状态、启动子流程、退回状态就跳出循环 if (tk.HisActionType != ActionType.WorkCheck && tk.HisActionType != ActionType.StartChildenFlow && tk.HisActionType != ActionType.Return) continue; //当前节点只显示自己审核的意见时 if (wcDesc.FWCMsgShow == 1 && tk.EmpFrom.Equals(WebUser.No) == false) continue; //退回 if (tk.HisActionType == ActionType.Return || tk.HisActionType == ActionType.ReturnAndBackWay) { //1.不显示退回意见 2.显示退回意见但是不是退回给本节点的意见 if (wcDesc.FWCIsShowReturnMsg == 0) continue; if (wcDesc.FWCIsShowReturnMsg == 1 && tk.NDTo != this.NodeID) continue; } #region 多人处理(协作,会签,队列) //如果是多人处理,流程未运行完成,就让其显示已经审核过的意见. if (tk.NDFrom == this.NodeID && checkerPassed.Contains("," + tk.EmpFrom + ",") == false && (gwf.WFState != WFState.Complete && (int)gwf.WFState != 12)) continue; if (gwf.NodeID == tk.NDFrom && checkerPassed.Contains("," + tk.EmpFrom + ",") == false && (gwf.WFState != WFState.Complete && (int)gwf.WFState != 12)) continue; /* if (tk.NDFrom == this.NodeID && gwf.HuiQianTaskSta != HuiQianTaskSta.None) { //判断会签, 去掉正在审批的节点. if (tk.NDFrom == this.NodeID && isShowCurrNodeInfo == false) continue; } */ #endregion 多人处理(协作,会签,队列) //为false可能为子流程数据 if (tk.NDFrom.ToString().StartsWith(int.Parse(this.FlowNo) + "") == true) { //当前节点在后面设计被删除时也需要屏蔽 nd = nds.GetEntityByKey(tk.NDFrom) as Node; if (nd == null) continue; } row = tkDt.NewRow(); row["MyPk"] = tk.MyPK; row["NodeID"] = tk.NDFrom; row["NodeName"] = tk.NDFromT; fwc = fwcs.GetEntityByKey(tk.NDFrom) as NodeWorkCheck; // zhoupeng 增加了判断,在会签的时候最后会签人发送前不能填写意见. if (tk.NDFrom == this.NodeID && tk.EmpFrom == BP.Web.WebUser.No && isCanDo && isDoc == false) { isDoc = true; row["IsDoc"] = true; } else row["IsDoc"] = false; row["ParentNode"] = 0; row["RDT"] = DataType.IsNullOrEmpty(tk.RDT) ? "" : tk.NDFrom == tk.NDTo && DataType.IsNullOrEmpty(tk.Msg) ? "" : tk.RDT; if (isReadonly == false && tk.EmpFrom == WebUser.No && this.NodeID == tk.NDFrom && isExitTb_doc && (wcDesc.HisFrmWorkCheckType == FWCType.Check || ( (wcDesc.HisFrmWorkCheckType == FWCType.DailyLog || wcDesc.HisFrmWorkCheckType == FWCType.WeekLog) && DateTime.Parse(tk.RDT).ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")) || (wcDesc.HisFrmWorkCheckType == FWCType.MonthLog && DateTime.Parse(tk.RDT).ToString("yyyy-MM") == DateTime.Now.ToString("yyyy-MM")) )) { bool isLast = true; foreach (Track tk1 in tks) { if (tk1.HisActionType == tk.HisActionType && tk1.NDFrom == tk.NDFrom && tk1.RDT.CompareTo(tk.RDT) > 0) { isLast = false; break; } } if (isLast && isDoc == false && gwf.WFState != WFState.Complete) { isExitTb_doc = false; row["IsDoc"] = true; isDoc = true; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); tkDoc = tk; } else { row["Msg"] = tk.MsgHtml; } } else { row["Msg"] = tk.MsgHtml; } row["EmpFrom"] = tk.EmpFrom; row["EmpFromT"] = tk.EmpFromT; //获取部门 string DeptName = ""; string[] Arrays = tk.NodeData.Split('@'); foreach (string i in Arrays) { if (i.Contains("DeptName=")) { DeptName = i.Split('=')[1]; } } row["DeptName"] = DeptName; row["ActionType"] = tk.HisActionType; row["Tag"] = tk.Tag; row["FWCView"] = fwc != null ? fwc.FWCView : ""; if (wcDesc.SigantureEnabel != 2 && wcDesc.SigantureEnabel != 3 && wcDesc.SigantureEnabel != 5) row["WritImg"] = ""; else row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", tk.MyPK, "WriteDB"); if (wcDesc.SigantureEnabel != 4 && wcDesc.SigantureEnabel != 5) row["WriteStamp"] = ""; else row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", tk.MyPK, "FrmDB"); tkDt.Rows.Add(row); #region //审核组件附件数据 athDBs = new FrmAttachmentDBs(); QueryObject obj_Ath = new QueryObject(athDBs); obj_Ath.AddWhere(FrmAttachmentDBAttr.FK_FrmAttachment, "ND" + tk.NDFrom + "_FrmWorkCheck"); obj_Ath.addAnd(); obj_Ath.AddWhere(FrmAttachmentDBAttr.RefPKVal, this.WorkID.ToString()); obj_Ath.addAnd(); obj_Ath.AddWhere(FrmAttachmentDBAttr.Rec, tk.EmpFrom); obj_Ath.addOrderBy(FrmAttachmentDBAttr.RDT); obj_Ath.DoQuery(); foreach (FrmAttachmentDB athDB in athDBs) { row = athDt.NewRow(); row["NodeID"] = tk.NDFrom; row["MyPK"] = athDB.MyPK; row["FK_FrmAttachment"] = athDB.FK_FrmAttachment; row["FK_MapData"] = athDB.FrmID; row["FileName"] = athDB.FileName; row["FileExts"] = athDB.FileExts; row["CanDelete"] = athDB.FrmID == this.NodeID.ToString() && athDB.Rec == WebUser.No && isReadonly == false; athDt.Rows.Add(row); } #endregion #region //子流程的审核组件数据 if (tk.FID != 0 && tk.HisActionType == ActionType.StartChildenFlow && tkDt.Select("ParentNode=" + tk.NDFrom).Length == 0) { string[] paras = tk.Tag.Split('@'); string[] p1 = paras[1].Split('='); string fk_flow = p1[1]; //子流程编号 string[] p2 = paras[2].Split('='); string workId = p2[1]; //子流程ID. int biaoji = 0; WorkCheck subwc = new WorkCheck(fk_flow, int.Parse(fk_flow + "01"), Int64.Parse(workId), 0); string subtrackTable = "ND" + int.Parse(fk_flow) + "Track"; Tracks subtks = subwc.HisWorkChecks; //取出来子流程的所有的节点。 Nodes subNds = new Nodes(fk_flow); foreach (Node item in subNds) //主要按顺序显示 { foreach (Track mysubtk in subtks) { if (item.NodeID != mysubtk.NDFrom) continue; /*输出该子流程的审核信息,应该考虑子流程的子流程信息, 就不考虑那样复杂了.*/ if (mysubtk.HisActionType == ActionType.WorkCheck) { // 发起多个子流程时,发起人只显示一次 if (mysubtk.NDFrom == int.Parse(fk_flow + "01") && biaoji == 1) continue; NodeWorkCheck subFrmCheck = new NodeWorkCheck("ND" + mysubtk.NDFrom); row = tkDt.NewRow(); row["NodeID"] = mysubtk.NDFrom; row["NodeName"] = string.Format("(子流程){0}", mysubtk.NDFromT); row["Msg"] = mysubtk.MsgHtml; row["EmpFrom"] = mysubtk.EmpFrom; row["EmpFromT"] = mysubtk.EmpFromT; //获取部门 DeptName = ""; Arrays = tk.NodeData.Split('@'); foreach (string i in Arrays) { if (i.Contains("DeptName=")) { DeptName = i.Split('=')[1]; } } row["DeptName"] = DeptName; row["RDT"] = mysubtk.RDT; row["IsDoc"] = false; row["ParentNode"] = tk.NDFrom; row["ActionType"] = mysubtk.HisActionType; row["Tag"] = mysubtk.Tag; row["FWCView"] = subFrmCheck.FWCView; if (subFrmCheck.SigantureEnabel != 2 && subFrmCheck.SigantureEnabel != 3 && subFrmCheck.SigantureEnabel != 5) row["WritImg"] = ""; else row["WritImg"] = DBAccess.GetBigTextFromDB(subtrackTable, "MyPK", mysubtk.MyPK, "WriteDB"); if (subFrmCheck.SigantureEnabel != 4 && subFrmCheck.SigantureEnabel != 5) row["WriteStamp"] = ""; else row["WriteStamp"] = DBAccess.GetBigTextFromDB(subtrackTable, "MyPK", mysubtk.MyPK, "FrmDB"); tkDt.Rows.Add(row); if (mysubtk.NDFrom == int.Parse(fk_flow + "01")) { biaoji = 1; } } } } } #endregion } } #endregion 判断是否显示 - 历史审核信息显示 #region 审核意见默认填写 //首先判断当前是否有此意见? 如果是退回的该信息已经存在了. bool isHaveMyInfo = false; foreach (DataRow dr in tkDt.Rows) { string fk_node = dr["NodeID"].ToString(); string empFrom = dr["EmpFrom"].ToString(); if (int.Parse(fk_node) == this.NodeID && empFrom == BP.Web.WebUser.No) isHaveMyInfo = true; } // 增加默认的审核意见. if (isExitTb_doc && wcDesc.HisFrmWorkCheckSta == FrmWorkCheckSta.Enable && isCanDo && isReadonly == false && isHaveMyInfo == false) { DataRow[] rows = null; nd = nds.GetEntityByKey(this.NodeID) as Node; if (wcDesc.FWCOrderModel == FWCOrderModel.SqlAccepter) { rows = tkDt.Select("NodeID=" + this.NodeID + " AND Msg='' AND EmpFrom='" + WebUser.No + "'"); if (rows.Length == 0) rows = tkDt.Select("NodeID=" + this.NodeID + " AND EmpFrom='" + WebUser.No + "'", "RDT DESC"); if (rows.Length > 0) { row = rows[0]; row["IsDoc"] = true; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); if (row["Msg"].ToString().Equals("")) row["RDT"] = ""; } else { row = tkDt.NewRow(); row["NodeID"] = this.NodeID; row["NodeName"] = nd.FWCNodeName; row["IsDoc"] = true; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); row["EmpFrom"] = WebUser.No; row["EmpFromT"] = WebUser.Name; row["DeptName"] = WebUser.DeptName; row["ActionType"] = ActionType.Forward; row["Tag"] = Dev2Interface.GetCheckTag(this.FlowNo, this.WorkID, this.NodeID, WebUser.No); tkDt.Rows.Add(row); } } else { row = tkDt.NewRow(); row["NodeID"] = this.NodeID; row["NodeName"] = nd.FWCNodeName; row["IsDoc"] = true; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); row["EmpFrom"] = WebUser.No; row["EmpFromT"] = WebUser.Name; row["DeptName"] = WebUser.DeptName; row["ActionType"] = ActionType.Forward; row["Tag"] = Dev2Interface.GetCheckTag(this.FlowNo, this.WorkID, this.NodeID, WebUser.No); if (wcDesc.SigantureEnabel == 5) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) { row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "WriteDB"); row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "FrmDB"); } else { row["WritImg"] = ""; row["WriteStamp"] = ""; } } if (wcDesc.SigantureEnabel == 2 || wcDesc.SigantureEnabel == 3) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "WriteDB"); else row["WritImg"] = ""; row["WriteStamp"] = ""; } if (wcDesc.SigantureEnabel == 4) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "FrmDB"); else row["WriteStamp"] = ""; row["WritImg"] = ""; } if (wcDesc.SigantureEnabel == 0 || wcDesc.SigantureEnabel == 1) { row["WritImg"] = ""; row["WriteStamp"] = ""; } tkDt.Rows.Add(row); } } #endregion #region 显示有审核组件,但还未审核的节点. 包括退回后的. if (tks == null) tks = wc.HisWorkChecks; foreach (NodeWorkCheck item in fwcs) { if (item.FWCIsShowTruck == false) continue; //不需要显示历史记录. //是否已审核. bool isHave = false; foreach (BP.WF.Track tk in tks) { //翻译. if (tk.NDFrom == item.NodeID && tk.HisActionType == ActionType.WorkCheck) { isHave = true; //已经有了 break; } } if (isHave == true) continue; row = tkDt.NewRow(); row["NodeID"] = item.NodeID; Node mynd = (Node)nds.GetEntityByKey(item.NodeID); row["NodeName"] = mynd.FWCNodeName; row["IsDoc"] = false; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = " "; row["EmpFrom"] = ""; row["EmpFromT"] = ""; row["DeptName"] = ""; row["WritImg"] = ""; row["WriteStamp"] = ""; tkDt.Rows.Add(row); } #endregion 增加空白. ds.Tables.Add(tkDt); //如果有 SignType 列就获得签名信息. if (SystemConfig.CustomerNo == "TianYe") { string tTable = "ND" + int.Parse(this.FlowNo) + "Track"; string sql = "SELECT distinct a.No, a.SignType, a.EleID FROM Port_Emp a, " + tTable + " b WHERE (A.No='" + WebUser.No + "') OR B.ActionType=22 AND a.No=b.EmpFrom AND B.WorkID=" + this.WorkID; DataTable dtTrack = DBAccess.RunSQLReturnTable(sql); dtTrack.TableName = "SignType"; dtTrack.Columns["NO"].ColumnName = "No"; dtTrack.Columns["SIGNTYPE"].ColumnName = "SignType"; dtTrack.Columns["ELEID"].ColumnName = "EleID"; ds.Tables.Add(dtTrack); } string str = BP.Tools.Json.ToJson(ds); return str; } /// /// 初始化审核组件数据. /// /// public string WorkCheck_Init2019() { if (BP.Web.WebUser.No == null) return "err@登录信息丢失,请重新登录."; #region 定义变量. string trackTable = "ND" + int.Parse(this.FlowNo) + "Track"; NodeWorkCheck wcDesc = new NodeWorkCheck(this.NodeID); // 当前节点的审核组件 NodeWorkCheck frmWorkCheck = null; FrmAttachmentDBs athDBs = null; //附件数据 Nodes nds = new Nodes(this.FlowNo); //该流程的所有节点 NodeWorkChecks fwcs = new NodeWorkChecks(); Node nd = null; WorkCheck wc = null; Tracks tks = null; Track tkDoc = null; string nodes = ""; //已经审核过的节点. bool isCanDo = false;//是否可以审批 bool isExitTb_doc = true; DataSet ds = new DataSet(); DataRow row = null; //是不是只读? bool isReadonly = false; if (this.GetRequestVal("IsReadonly") != null && this.GetRequestVal("IsReadonly").Equals("1")) isReadonly = true; DataTable nodeEmps = new DataTable(); NodeWorkCheck fwc = null; DataTable dt = null; int idx = 0; int noneEmpIdx = 0; fwcs.Retrieve(NodeAttr.FK_Flow, this.FlowNo, NodeAttr.Step); ds.Tables.Add(wcDesc.ToDataTableField("WF_FrmWorkCheck")); //当前的节点审核组件定义,放入ds. //审核意见的存储集合 DataTable tkDt = new DataTable("Tracks"); tkDt.Columns.Add("MyPk", typeof(string)); tkDt.Columns.Add("NodeID", typeof(int)); tkDt.Columns.Add("NodeName", typeof(string)); tkDt.Columns.Add("Msg", typeof(string)); tkDt.Columns.Add("EmpFrom", typeof(string)); tkDt.Columns.Add("EmpFromT", typeof(string)); tkDt.Columns.Add("DeptName", typeof(string)); tkDt.Columns.Add("RDT", typeof(string)); tkDt.Columns.Add("IsDoc", typeof(bool)); tkDt.Columns.Add("ParentNode", typeof(int)); tkDt.Columns.Add("ActionType", typeof(int)); tkDt.Columns.Add("Tag", typeof(string)); tkDt.Columns.Add("FWCView", typeof(string)); tkDt.Columns.Add("WritImg", typeof(string)); tkDt.Columns.Add("WriteStamp", typeof(string)); //流程附件. DataTable athDt = new DataTable("Aths"); athDt.Columns.Add("NodeID", typeof(int)); athDt.Columns.Add("MyPK", typeof(string)); athDt.Columns.Add("FK_FrmAttachment", typeof(string)); athDt.Columns.Add("FK_MapData", typeof(string)); athDt.Columns.Add("FileName", typeof(string)); athDt.Columns.Add("FileExts", typeof(string)); athDt.Columns.Add("CanDelete", typeof(bool)); //当前节点的流程数据 FrmAttachmentDBs frmathdbs = new FrmAttachmentDBs(); frmathdbs.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, "ND" + this.NodeID + "_FrmWorkCheck", FrmAttachmentDBAttr.RefPKVal, this.WorkID.ToString(), "Rec", WebUser.No, FrmAttachmentDBAttr.RDT); foreach (FrmAttachmentDB athDB in frmathdbs) { row = athDt.NewRow(); row["NodeID"] = this.NodeID; row["MyPK"] = athDB.MyPK; row["FK_FrmAttachment"] = athDB.FK_FrmAttachment; row["FK_MapData"] = athDB.FrmID; row["FileName"] = athDB.FileName; row["FileExts"] = athDB.FileExts; row["CanDelete"] = athDB.Rec == WebUser.No && isReadonly == false; athDt.Rows.Add(row); } ds.Tables.Add(athDt); if (this.FID != 0) wc = new WorkCheck(this.FlowNo, this.NodeID, this.WorkID, this.FID); else wc = new WorkCheck(this.FlowNo, this.NodeID, this.WorkID, 0); //是否只读? if (isReadonly == true) isCanDo = false; else isCanDo = BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(this.WorkID, BP.Web.WebUser.No); //如果是查看状态, 为了屏蔽掉正在审批的节点, 在查看审批意见中. bool isShowCurrNodeInfo = true; GenerWorkFlow gwf = new GenerWorkFlow(); if (this.WorkID != 0) { gwf.WorkID = this.WorkID; gwf.Retrieve(); } if (isCanDo == false && isReadonly == true) { if (gwf.WFState == WFState.Runing && gwf.NodeID == this.NodeID) isShowCurrNodeInfo = false; } /* * 获得当前节点已经审核通过的人员. * 比如:多人处理规则中的已经审核同意的人员,会签人员,组合成成一个字符串。 * 格式为: ,zhangsan,lisi, * 用于处理在审核列表中屏蔽临时的保存的审核信息. * 12 为芒果增加一个非正常完成状态. * */ string checkerPassed = ","; if (gwf.WFState != WFState.Complete && (int)gwf.WFState != 12) { //Paras ps = new Paras(); //ps.SQL = "SELECT FK_Emp FROM WF_GenerWorkerlist WHERE WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID AND IsPass=1 AND FK_Node=" + SystemConfig.AppCenterDBVarStr + "FK_Node Order By RDT,CDT"; //ps.Add("WorkID", this.WorkID); //ps.Add("FK_Node", this.NodeID); string sql = "SELECT EmpFrom as FK_Emp FROM ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID =" + this.WorkID + " AND NDFrom = " + this.NodeID; DataTable checkerPassedDt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in checkerPassedDt.Rows) { checkerPassed += dr["FK_Emp"] + ","; } } #endregion 定义变量. #region 判断是否显示 - 历史审核信息显示 bool isDoc = false; if (wcDesc.FWCListEnable == true) { tks = wc.HisWorkChecks; foreach (BP.WF.Track tk in tks) { if (tk.HisActionType == ActionType.FlowBBS) continue; if (wcDesc.FWCMsgShow == 1 && tk.EmpFrom.Equals(WebUser.No) == false) continue; switch (tk.HisActionType) { case ActionType.WorkCheck: case ActionType.Forward: case ActionType.StartChildenFlow: case ActionType.ForwardHL: if (nodes.Contains(tk.NDFrom + ",") == false) nodes += tk.NDFrom + ","; break; case ActionType.Return: if (wcDesc.FWCIsShowReturnMsg == 1 && tk.NDTo == this.NodeID) { if (nodes.Contains(tk.NDFrom + ",") == false) nodes += tk.NDFrom + ","; } if (wcDesc.FWCIsShowReturnMsg == 2) { if (nodes.Contains(tk.NDFrom + ",") == false) nodes += tk.NDFrom + ","; } break; default: continue; } } foreach (Track tk in tks) { if (nodes.Contains(tk.NDFrom + ",") == false) continue; //退回 if (tk.HisActionType == ActionType.Return || tk.HisActionType == ActionType.ReturnAndBackWay) { //1.不显示退回意见 2.显示退回意见但是不是退回给本节点的意见 if (wcDesc.FWCIsShowReturnMsg == 0) continue; if (wcDesc.FWCIsShowReturnMsg == 1 && tk.NDTo != this.NodeID) continue; } // 此部分被zhoupeng注释, 在会签的时候显示不到意见。 // 如果是当前的节点.当前人员可以处理, 已经审批通过的人员. if (tk.NDFrom == this.NodeID && isCanDo == true && tk.EmpFrom.Equals(WebUser.No) == false && checkerPassed.Contains("," + tk.EmpFrom + ",") == false) continue; if (tk.NDFrom == this.NodeID && gwf.HuiQianTaskSta != HuiQianTaskSta.None) { //判断会签, 去掉正在审批的节点. if (tk.NDFrom == this.NodeID && isShowCurrNodeInfo == false) continue; } //如果是多人处理,就让其显示已经审核过的意见. //if (tk.NDFrom == this.NodeID&& checkerPassed.IndexOf("," + tk.EmpFrom + ",") < 0 && (gwf.WFState != WFState.Complete && (int)gwf.WFState != 12)) // continue; fwc = fwcs.GetEntityByKey(tk.NDFrom) as NodeWorkCheck; if (fwc == null || fwc.FWCSta != FrmWorkCheckSta.Enable) continue; //历史审核信息现在存放在流程前进的节点中 switch (tk.HisActionType) { case ActionType.Forward: case ActionType.ForwardAskfor: case ActionType.Start: //case ActionType.UnSend: // case ActionType.ForwardFL: case ActionType.ForwardHL: case ActionType.SubThreadForward: case ActionType.TeampUp: case ActionType.Return: case ActionType.ReturnAndBackWay: case ActionType.StartChildenFlow: case ActionType.FlowOver: row = tkDt.NewRow(); row["MyPk"] = tk.MyPK; row["NodeID"] = tk.NDFrom; row["NodeName"] = tk.NDFromT; // zhoupeng 增加了判断,在会签的时候最后会签人发送前不能填写意见. if (tk.NDFrom == this.NodeID && tk.EmpFrom == BP.Web.WebUser.No && isCanDo && isDoc == false) { //修改测试 isDoc = true; } row["IsDoc"] = false; row["ParentNode"] = 0; row["RDT"] = DataType.IsNullOrEmpty(tk.RDT) ? "" : tk.NDFrom == tk.NDTo && DataType.IsNullOrEmpty(tk.Msg) ? "" : tk.RDT; //row["T_NodeIndex"] = tk.Row["T_NodeIndex"]; //row["T_CheckIndex"] = tk.Row["T_CheckIndex"]; row["Msg"] = tk.MsgHtml; row["EmpFrom"] = tk.EmpFrom; row["EmpFromT"] = tk.EmpFromT; //获取部门 string DeptName = ""; string[] Arrays = tk.NodeData.Split('@'); foreach (string i in Arrays) { if (i.Contains("DeptName=")) { DeptName = i.Split('=')[1]; } } row["DeptName"] = DeptName; row["ActionType"] = tk.HisActionType; row["Tag"] = tk.Tag; if (wcDesc.SigantureEnabel != 2 && wcDesc.SigantureEnabel != 3 && wcDesc.SigantureEnabel != 5) row["WritImg"] = ""; else row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", tk.MyPK, "WriteDB"); if (wcDesc.SigantureEnabel != 4 && wcDesc.SigantureEnabel != 5) row["WriteStamp"] = ""; else row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", tk.MyPK, "FrmDB"); tkDt.Rows.Add(row); #region 审核组件附件数据 //athDBs = new FrmAttachmentDBs(); //QueryObject obj_Ath = new QueryObject(athDBs); //obj_Ath.AddWhere(FrmAttachmentDBAttr.FK_FrmAttachment, "ND" + tk.NDFrom + "_FrmWorkCheck"); //obj_Ath.addAnd(); //obj_Ath.AddWhere(FrmAttachmentDBAttr.RefPKVal, this.WorkID.ToString()); //obj_Ath.addAnd(); //obj_Ath.AddWhere(FrmAttachmentDBAttr.Rec, tk.EmpFrom); //obj_Ath.addOrderBy(FrmAttachmentDBAttr.RDT); //obj_Ath.DoQuery(); //foreach (FrmAttachmentDB athDB in athDBs) //{ // row = athDt.NewRow(); // row["NodeID"] = tk.NDFrom; // row["MyPK"] = athDB.MyPK; // row["FK_FrmAttachment"] = athDB.FK_FrmAttachment; // row["FK_MapData"] = athDB.FrmID; // row["FileName"] = athDB.FileName; // row["FileExts"] = athDB.FileExts; // row["CanDelete"] = athDB.FrmID == this.NodeID.ToString() && athDB.Rec == WebUser.No && isReadonly == false; // athDt.Rows.Add(row); //} #endregion #region //子流程的审核组件数据 if (tk.FID != 0 && tk.HisActionType == ActionType.StartChildenFlow && tkDt.Select("ParentNode=" + tk.NDFrom).Length == 0) { string[] paras = tk.Tag.Split('@'); string[] p1 = paras[1].Split('='); string fk_flow = p1[1]; //子流程编号 string[] p2 = paras[2].Split('='); string workId = p2[1]; //子流程ID. int biaoji = 0; WorkCheck subwc = new WorkCheck(fk_flow, int.Parse(fk_flow + "01"), Int64.Parse(workId), 0); string subtrackTable = "ND" + int.Parse(fk_flow) + "Track"; Tracks subtks = subwc.HisWorkChecks; //取出来子流程的所有的节点。 Nodes subNds = new Nodes(fk_flow); foreach (Node item in subNds) //主要按顺序显示 { foreach (Track mysubtk in subtks) { if (item.NodeID != mysubtk.NDFrom) continue; /*输出该子流程的审核信息,应该考虑子流程的子流程信息, 就不考虑那样复杂了.*/ if (mysubtk.HisActionType == ActionType.WorkCheck) { // 发起多个子流程时,发起人只显示一次 if (mysubtk.NDFrom == int.Parse(fk_flow + "01") && biaoji == 1) continue; NodeWorkCheck subFrmCheck = new NodeWorkCheck("ND" + mysubtk.NDFrom); row = tkDt.NewRow(); row["NodeID"] = mysubtk.NDFrom; row["NodeName"] = string.Format("(子流程){0}", mysubtk.NDFromT); row["Msg"] = mysubtk.MsgHtml; row["EmpFrom"] = mysubtk.EmpFrom; row["EmpFromT"] = mysubtk.EmpFromT; //获取部门 DeptName = ""; Arrays = mysubtk.NodeData.Split('@'); foreach (string i in Arrays) { if (i.Contains("DeptName=")) { DeptName = i.Split('=')[1]; } } row["DeptName"] = DeptName; row["RDT"] = mysubtk.RDT; row["IsDoc"] = false; row["ParentNode"] = tk.NDFrom; // row["T_NodeIndex"] = idx++; // row["T_CheckIndex"] = noneEmpIdx++; row["ActionType"] = mysubtk.HisActionType; row["Tag"] = mysubtk.Tag; if (subFrmCheck.SigantureEnabel != 2 && subFrmCheck.SigantureEnabel != 3 && subFrmCheck.SigantureEnabel != 5) row["WritImg"] = ""; else row["WritImg"] = DBAccess.GetBigTextFromDB(subtrackTable, "MyPK", mysubtk.MyPK, "WriteDB"); if (subFrmCheck.SigantureEnabel != 4 && subFrmCheck.SigantureEnabel != 5) row["WriteStamp"] = ""; else row["WriteStamp"] = DBAccess.GetBigTextFromDB(subtrackTable, "MyPK", mysubtk.MyPK, "FrmDB"); tkDt.Rows.Add(row); if (mysubtk.NDFrom == int.Parse(fk_flow + "01")) { biaoji = 1; } } } } } #endregion break; default: break; } } #warning 处理审核信息,删除掉他. if (tkDoc != null && 1 == 2) { //判断可编辑审核信息是否处于最后一条,不处于最后一条,则将其移到最后一条 DataRow rdoc = tkDt.Select("IsDoc=True")[0]; if (tkDt.Rows.IndexOf(rdoc) != tkDt.Rows.Count - 1) { tkDt.Rows.Add(rdoc.ItemArray)["RDT"] = ""; rdoc["IsDoc"] = false; rdoc["RDT"] = tkDoc.RDT; rdoc["Msg"] = tkDoc.MsgHtml; } } } #endregion 判断是否显示 - 历史审核信息显示 #region 审核意见默认填写 //首先判断当前是否有此意见? 如果是退回的该信息已经存在了. bool isHaveMyInfo = false; // 增加默认的审核意见. if (isExitTb_doc && wcDesc.HisFrmWorkCheckSta == FrmWorkCheckSta.Enable && isCanDo && isReadonly == false && isHaveMyInfo == false) { DataRow[] rows = null; nd = nds.GetEntityByKey(this.NodeID) as Node; if (wcDesc.FWCOrderModel == FWCOrderModel.SqlAccepter) { rows = tkDt.Select("NodeID=" + this.NodeID + " AND Msg='' AND EmpFrom='" + WebUser.No + "'"); if (rows.Length == 0) rows = tkDt.Select("NodeID=" + this.NodeID + " AND EmpFrom='" + WebUser.No + "'", "RDT DESC"); if (rows.Length > 0) { row = rows[0]; row["IsDoc"] = true; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); if (row["Msg"].ToString().Equals("")) row["RDT"] = ""; } else { row = tkDt.NewRow(); row["NodeID"] = this.NodeID; row["NodeName"] = nd.FWCNodeName; row["IsDoc"] = true; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); row["EmpFrom"] = WebUser.No; row["EmpFromT"] = WebUser.Name; row["DeptName"] = WebUser.DeptName; //row["T_NodeIndex"] = ++idx; //row["T_CheckIndex"] = ++noneEmpIdx; row["ActionType"] = ActionType.Forward; row["Tag"] = Dev2Interface.GetCheckTag(this.FlowNo, this.WorkID, this.NodeID, WebUser.No); if (wcDesc.SigantureEnabel == 5) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND NDTo=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) { row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "WriteDB"); row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "FrmDB"); } else { row["WritImg"] = ""; row["WriteStamp"] = ""; } } if (wcDesc.SigantureEnabel == 2 || wcDesc.SigantureEnabel == 3) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND NDTo=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "WriteDB"); else row["WritImg"] = ""; row["WriteStamp"] = ""; } if (wcDesc.SigantureEnabel == 4) { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND NDTo=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; string mypk = DBAccess.RunSQLReturnStringIsNull(sql, ""); if (DataType.IsNullOrEmpty(mypk) == false) row["WriteStamp"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", mypk, "FrmDB"); else row["WriteStamp"] = ""; row["WritImg"] = ""; } if (wcDesc.SigantureEnabel == 0 || wcDesc.SigantureEnabel == 1) { row["WritImg"] = ""; row["WriteStamp"] = ""; } tkDt.Rows.Add(row); } } else { row = tkDt.NewRow(); row["NodeID"] = this.NodeID; row["NodeName"] = nd.FWCNodeName; row["IsDoc"] = true; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = Dev2Interface.GetCheckInfo(this.FlowNo, this.WorkID, this.NodeID, wcDesc.FWCDefInfo); row["EmpFrom"] = WebUser.No; row["EmpFromT"] = WebUser.Name; row["DeptName"] = WebUser.DeptName; //row["T_NodeIndex"] = ++idx; //row["T_CheckIndex"] = ++noneEmpIdx; row["ActionType"] = ActionType.Forward; row["Tag"] = Dev2Interface.GetCheckTag(this.FlowNo, this.WorkID, this.NodeID, WebUser.No); if (wcDesc.SigantureEnabel != 2) row["WritImg"] = ""; else { string sql = "Select MyPK From " + trackTable + " WHERE ActionType=" + (int)ActionType.WorkCheck + " AND NDFrom=" + this.NodeID + " AND NDTo=" + this.NodeID + " AND WorkID=" + this.WorkID + " AND EmpFrom = '" + WebUser.No + "'"; row["WritImg"] = DBAccess.GetBigTextFromDB(trackTable, "MyPK", DBAccess.RunSQLReturnVal(sql) == null ? null : DBAccess.RunSQLReturnVal(sql).ToString(), "WriteDB"); } tkDt.Rows.Add(row); } } #endregion #region 显示有审核组件,但还未审核的节点. 包括退回后的. if (tks == null) tks = wc.HisWorkChecks; foreach (NodeWorkCheck item in fwcs) { if (item.FWCIsShowTruck == false) continue; //不需要显示历史记录. //是否已审核. bool isHave = false; foreach (BP.WF.Track tk in tks) { //翻译. if (tk.NDFrom == this.NodeID && tk.HisActionType == ActionType.WorkCheck) { isHave = true; //已经有了 break; } } if (isHave == true) continue; row = tkDt.NewRow(); row["NodeID"] = item.NodeID; Node mynd = (Node)nds.GetEntityByKey(item.NodeID); row["NodeName"] = mynd.FWCNodeName; row["IsDoc"] = false; row["ParentNode"] = 0; row["RDT"] = ""; row["Msg"] = " "; row["EmpFrom"] = ""; row["EmpFromT"] = ""; row["DeptName"] = ""; //row["T_NodeIndex"] = ++idx; //row["T_CheckIndex"] = ++noneEmpIdx; tkDt.Rows.Add(row); } #endregion 增加空白. ds.Tables.Add(tkDt); //如果有 SignType 列就获得签名信息. if (SystemConfig.CustomerNo == "TianYe") { string tTable = "ND" + int.Parse(this.FlowNo) + "Track"; string sql = "SELECT distinct a.No, a.SignType, a.EleID FROM Port_Emp a, " + tTable + " b WHERE (A.No='" + WebUser.No + "') OR B.ActionType=22 AND a.No=b.EmpFrom AND B.WorkID=" + this.WorkID; DataTable dtTrack = DBAccess.RunSQLReturnTable(sql); dtTrack.TableName = "SignType"; dtTrack.Columns["NO"].ColumnName = "No"; dtTrack.Columns["SIGNTYPE"].ColumnName = "SignType"; dtTrack.Columns["ELEID"].ColumnName = "EleID"; ds.Tables.Add(dtTrack); } string str = BP.Tools.Json.ToJson(ds); //用于jflow数据输出格式对比. // DataType.WriteFile("c:/WorkCheck_Init_ccflow.txt", str); return str; } /// /// 获取审核组件中刚上传的附件列表信息 /// /// public string WorkCheck_GetNewUploadedAths() { DataRow row = null; string athNames = GetRequestVal("Names"); string attachPK = GetRequestVal("AttachPK"); DataTable athDt = new DataTable("Aths"); athDt.Columns.Add("NodeID", typeof(int)); athDt.Columns.Add("MyPK", typeof(string)); athDt.Columns.Add("FK_FrmAttachment", typeof(string)); athDt.Columns.Add("FK_MapData", typeof(string)); athDt.Columns.Add("FileName", typeof(string)); athDt.Columns.Add("FileExts", typeof(string)); athDt.Columns.Add("CanDelete", typeof(string)); athDt.Columns.Add("Rec", typeof(string)); FrmAttachmentDBs athDBs = new FrmAttachmentDBs(); QueryObject obj_Ath = new QueryObject(athDBs); obj_Ath.AddWhere(FrmAttachmentDBAttr.FK_FrmAttachment, "ND" + this.NodeID + "_FrmWorkCheck"); obj_Ath.addAnd(); obj_Ath.AddWhere(FrmAttachmentDBAttr.RefPKVal, this.WorkID.ToString()); obj_Ath.addOrderBy(FrmAttachmentDBAttr.RDT); obj_Ath.DoQuery(); foreach (FrmAttachmentDB athDB in athDBs) { if (athNames != null && athNames.ToLower().IndexOf("|" + athDB.FileName.ToLower() + "|") == -1) continue; row = athDt.NewRow(); row["NodeID"] = this.NodeID; row["MyPK"] = athDB.MyPK; row["FK_FrmAttachment"] = athDB.FK_FrmAttachment; row["FK_MapData"] = athDB.FrmID; row["FileName"] = athDB.FileName; row["FileExts"] = athDB.FileExts; row["CanDelete"] = athDB.Rec == WebUser.No ? 1 : 0; row["Rec"] = athDB.Rec; athDt.Rows.Add(row); } return BP.Tools.Json.ToJson(athDt); } /// /// 获取附件链接 /// /// /// private string GetFileAction(FrmAttachmentDB athDB) { if (athDB == null || athDB.FileExts == "") return "#"; FrmAttachment athDesc = new FrmAttachment(athDB.FK_FrmAttachment); switch (athDB.FileExts) { case "doc": case "docx": case "xls": case "xlsx": return "javascript:AthOpenOfiice('" + athDB.FK_FrmAttachment + "','" + this.WorkID + "','" + athDB.MyPK + "','" + athDB.FrmID + "','" + athDB.FK_FrmAttachment + "','" + this.NodeID + "')"; case "txt": case "jpg": case "jpeg": case "gif": case "png": case "bmp": case "ceb": return "javascript:AthOpenView('" + athDB.RefPKVal + "','" + athDB.MyPK + "','" + athDB.FK_FrmAttachment + "','" + athDB.FileExts + "','" + this.FlowNo + "','" + athDB.FrmID + "','" + this.WorkID + "','false')"; case "pdf": return athDesc.SaveTo + this.WorkID + "/" + athDB.MyPK + "." + athDB.FileName; } return "javascript:AthDown('" + athDB.FK_FrmAttachment + "','" + this.WorkID + "','" + athDB.MyPK + "','" + athDB.FrmID + "','" + this.FlowNo + "','" + athDB.FK_FrmAttachment + "')"; } /// /// 审核信息保存. /// /// public string WorkCheck_Save() { //设计的时候,workid=0,不让其存储. if (this.WorkID == 0) return ""; // 审核信息. string msg = ""; string writeImg = GetRequestVal("WriteImg"); string handlerName = GetRequestVal("HandlerName"); //if (DataType.IsNullOrEmpty(writeImg) == false) // writeImg = HttpUtility.UrlDecode(writeImg, Encoding.UTF8);//writeImg.Replace('~', '+'); string writeStamp = GetRequestVal("WriteStamp"); string dotype = GetRequestVal("ShowType"); string doc = GetRequestVal("Doc"); bool isCC = GetRequestVal("IsCC") == "1"; string fwcView = null; if (DataType.IsNullOrEmpty(GetRequestVal("FWCView")) == false) fwcView = "@FWCView=" + GetRequestVal("FWCView").Trim(); //查看时取消保存 if (dotype != null && dotype == "View") return ""; //内容为空,取消保存,20170727取消此处限制 //if (DataType.IsNullOrEmpty(doc.Trim())) // return ""; string val = string.Empty; NodeWorkCheck wcDesc = new NodeWorkCheck(this.NodeID); if (DataType.IsNullOrEmpty(wcDesc.FWCFields) == false) { //循环属性获取值 Attrs fwcAttrs = new Attrs(); // Attrs fwcAttrs = new Attrs(wcDesc.FWCFields); foreach (Attr attr in fwcAttrs) { if (attr.UIContralType == UIContralType.TB) { val = GetRequestVal("TB_" + attr.Key); msg += attr.Key + "=" + val + ";"; } else if (attr.UIContralType == UIContralType.CheckBok) { val = GetRequestVal("CB_" + attr.Key); msg += attr.Key + "=" + Convert.ToInt32(val) + ";"; } else if (attr.UIContralType == UIContralType.DDL) { val = GetRequestVal("DDL_" + attr.Key); msg += attr.Key + "=" + val + ";"; } } } else { // 加入审核信息. msg = doc; } //在审核人打开后,申请人撤销,就不不能让其保存.(在途页面不做判断) string sql = "SELECT FK_Node FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID; if (DBAccess.RunSQLReturnValInt(sql) != this.NodeID && handlerName.IndexOf("WF_MyView") == -1) return "err@当前工作已经被撤销或者已经移动到下一个节点您不能在执行审核."; // 处理人大的需求,需要把审核意见写入到FlowNote里面去. sql = "UPDATE WF_GenerWorkFlow SET FlowNote='" + msg + "' WHERE WorkID=" + this.WorkID; DBAccess.RunSQL(sql); // 判断是否是抄送? if (isCC) { // 写入审核信息,有可能是update数据。 Dev2Interface.Node_WriteWorkCheck(this.WorkID, msg, wcDesc.FWCOpLabel, wcDesc.SigantureEnabel == 2 ? writeImg : ""); //设置抄送状态 - 已经审核完毕. Dev2Interface.Node_CC_SetSta(this.NodeID, this.WorkID, WebUser.No, CCSta.CheckOver); sql = "SELECT MyPK,RDT FROM ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID=" + this.WorkID + " AND NDFrom = " + this.NodeID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND EmpFrom = '" + WebUser.No + "'"; DataTable dtt = DBAccess.RunSQLReturnTable(sql, 1, 1, "MyPK", "RDT", "DESC"); //判断是不是签章 if (DataType.IsNullOrEmpty(writeStamp) == false) { //writeStamp = HttpUtility.UrlDecode(writeStamp, Encoding.UTF8);// writeStamp.Replace('~', '+'); string mypk = dtt.Rows.Count > 0 ? dtt.Rows[0]["MyPK"].ToString() : ""; if (DataType.IsNullOrEmpty(mypk) == false) { DBAccess.SaveBigTextToDB(writeStamp, "ND" + int.Parse(this.FlowNo) + "Track", "MyPK", mypk, "FrmDB"); } } return dtt.Rows.Count > 0 ? dtt.Rows[0]["RDT"].ToString() : ""; ; } #region 根据类型写入数据 qin if (wcDesc.HisFrmWorkCheckType == FWCType.Check) //审核组件 { //判断是否审核组件中“协作模式下操作员显示顺序”设置为“按照接受人员列表先后顺序(官职大小)”,删除原有的空审核信息 if (wcDesc.FWCOrderModel == FWCOrderModel.SqlAccepter) { sql = "DELETE FROM ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID = " + this.WorkID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND NDFrom = " + this.NodeID + " AND NDTo = " + this.NodeID + " AND EmpFrom = '" + WebUser.No + "'"; DBAccess.RunSQL(sql); } Dev2Interface.Node_WriteWorkCheck(this.WorkID, msg, wcDesc.FWCOpLabel, wcDesc.SigantureEnabel == 2 || wcDesc.SigantureEnabel == 3 || wcDesc.SigantureEnabel == 5 ? writeImg : "", fwcView); } if (wcDesc.HisFrmWorkCheckType == FWCType.DailyLog)//日志组件 { Dev2Interface.WriteTrackDailyLog(this.FlowNo, this.NodeID, wcDesc.Name, this.WorkID, this.FID, msg, wcDesc.FWCOpLabel); } if (wcDesc.HisFrmWorkCheckType == FWCType.WeekLog)//周报 { Dev2Interface.WriteTrackWeekLog(this.FlowNo, this.NodeID, wcDesc.Name, this.WorkID, this.FID, msg, wcDesc.FWCOpLabel); } if (wcDesc.HisFrmWorkCheckType == FWCType.MonthLog)//月报 { Dev2Interface.WriteTrackMonthLog(this.FlowNo, this.NodeID, wcDesc.Name, this.WorkID, this.FID, msg, wcDesc.FWCOpLabel); } #endregion sql = "SELECT MyPK,RDT FROM ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID=" + this.WorkID + " AND NDFrom = " + this.NodeID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND EmpFrom = '" + WebUser.No + "'"; DataTable dt = DBAccess.RunSQLReturnTable(sql, 1, 1, "MyPK", "RDT", "DESC"); //判断是不是签章 if (DataType.IsNullOrEmpty(writeStamp) == false) { //writeStamp = HttpUtility.UrlDecode(writeStamp, Encoding.UTF8);// writeStamp.Replace('~', '+'); string mypk = dt.Rows.Count > 0 ? dt.Rows[0]["MyPK"].ToString() : ""; if (DataType.IsNullOrEmpty(mypk) == false) { DBAccess.SaveBigTextToDB(writeStamp, "ND" + int.Parse(this.FlowNo) + "Track", "MyPK", mypk, "FrmDB"); } } return dt.Rows.Count > 0 ? dt.Rows[0]["RDT"].ToString() : ""; } #endregion #region 工作分配. /// /// 分配工作 /// /// public string AllotTask_Init() { GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.NodeID, true); return wls.ToJson(); } /// /// 分配工作 /// /// public string AllotTask_Save() { return ""; } #endregion #region 执行跳转. /// /// 返回可以跳转的节点. /// /// public string FlowSkip_Init() { Node nd = new Node(this.NodeID); BP.WF.Template.BtnLab lab = new BtnLab(this.NodeID); string sql = "SELECT NodeID,Name FROM WF_Node WHERE FK_Flow='" + this.FlowNo + "'"; switch (lab.JumpWayEnum) { case JumpWay.Previous: sql = "SELECT NodeID,Name FROM WF_Node WHERE NodeID IN (SELECT FK_Node FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " )"; break; case JumpWay.Next: sql = "SELECT NodeID,Name FROM WF_Node WHERE NodeID NOT IN (SELECT FK_Node FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " ) AND FK_Flow='" + this.FlowNo + "'"; break; case JumpWay.AnyNode: sql = "SELECT NodeID,Name FROM WF_Node WHERE FK_Flow='" + this.FlowNo + "' ORDER BY STEP"; break; case JumpWay.JumpSpecifiedNodes: sql = nd.JumpToNodes; sql = sql.Replace("@WebUser.No", WebUser.No); sql = sql.Replace("@WebUser.Name", WebUser.Name); sql = sql.Replace("@WebUser.FK_Dept", WebUser.DeptNo); if (sql.Contains("@")) { Work wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); foreach (Attr attr in wk.EnMap.Attrs) { if (sql.Contains("@") == false) break; sql = sql.Replace("@" + attr.Key, wk.GetValStrByKey(attr.Key)); } } break; case JumpWay.CanNotJump: return "err@此节点不允许跳转."; default: return "err@未判断"; } sql = sql.Replace("~", "'"); DataTable dt = DBAccess.RunSQLReturnTable(sql); //如果是oracle,就转成小写. if (SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.UpperCase) { dt.Columns["NODEID"].ColumnName = "NodeID"; dt.Columns["NAME"].ColumnName = "Name"; } if (SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.Lowercase) { dt.Columns["nodeid"].ColumnName = "NodeID"; dt.Columns["name"].ColumnName = "Name"; } return BP.Tools.Json.ToJson(dt); } /// /// 执行跳转 /// /// public string FlowSkip_Do() { try { Node ndJump = new Node(this.GetRequestValInt("GoNode")); BP.WF.WorkNode wn = new BP.WF.WorkNode(this.WorkID, this.NodeID); string msg = wn.NodeSend(ndJump, null).ToMsgOfHtml(); return msg; } catch (Exception ex) { return "err@" + ex.Message; } } #endregion 执行跳转. #region 执行父类的重写方法. /// /// 默认执行的方法 /// /// protected override string DoDefaultMethod() { switch (this.DoType) { case "DtlFieldUp": //字段上移 return "执行成功."; default: break; } //找不不到标记就抛出异常. throw new Exception("@标记[" + this.DoType + "],没有找到."); } #endregion 执行父类的重写方法. #region 抄送Adv. /// /// 选择权限组 /// /// public string CCAdv_SelectGroups() { string sql = "SELECT NO,NAME FROM GPM_Group ORDER BY IDX"; DataTable dt = DBAccess.RunSQLReturnTable(sql); return BP.Tools.Json.ToJson(dt); } /// /// 抄送初始化. /// /// public string CCAdv_Init() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); Hashtable ht = new Hashtable(); ht.Add("Title", gwf.Title); //计算出来曾经抄送过的人. Paras ps = new Paras(); ps.SQL = "SELECT CCToName FROM WF_CCList WHERE FK_Node=" + SystemConfig.AppCenterDBVarStr + "FK_Node AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("FK_Node", this.NodeID); ps.Add("WorkID", this.WorkID); DataTable mydt = DBAccess.RunSQLReturnTable(ps); string toAllEmps = ""; foreach (DataRow dr in mydt.Rows) toAllEmps += dr[0].ToString() + ","; ht.Add("CCTo", toAllEmps); // 根据他判断是否显示权限组。 if (DBAccess.IsExitsObject("GPM_Group") == true) ht.Add("IsGroup", "1"); else ht.Add("IsGroup", "0"); //返回流程标题. return BP.Tools.Json.ToJsonEntityModel(ht); } /// /// 选择部门呈现信息. /// /// public string CCAdv_SelectDepts() { BP.Port.Depts depts = new BP.Port.Depts(); depts.RetrieveAll(); return depts.ToJson(); } /// /// 选择部门呈现信息. /// /// public string CCAdv_SelectStations() { //角色类型. string sql = "SELECT NO,NAME FROM Port_StationType ORDER BY NO"; DataSet ds = new DataSet(); DataTable dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "Port_StationType"; ds.Tables.Add(dt); //角色. string sqlStas = "SELECT NO,NAME,FK_STATIONTYPE FROM Port_Station ORDER BY FK_STATIONTYPE,NO"; DataTable dtSta = DBAccess.RunSQLReturnTable(sqlStas); dtSta.TableName = "Port_Station"; ds.Tables.Add(dtSta); return BP.Tools.Json.ToJson(ds); } /// /// 抄送发送. /// /// public string CCAdv_Send() { //人员信息. 格式 zhangsan,张三;lisi,李四; string emps = this.GetRequestVal("Emps"); //角色信息. 格式: 001,002,003, string stations = this.GetRequestVal("Stations"); stations = stations.Replace(";", ","); //权限组. 格式: 001,002,003, string groups = this.GetRequestVal("Groups"); if (groups == null) groups = ""; groups = groups.Replace(";", ","); //部门信息. 格式: 001,002,003, string depts = this.GetRequestVal("Depts"); //标题. string title = this.GetRequestVal("TB_Title"); //内容. string doc = this.GetRequestVal("TB_Doc"); //调用抄送接口执行抄送. string ccRec = BP.WF.Dev2Interface.Node_CC_WriteTo_CClist(this.NodeID, this.WorkID, title, doc, emps, depts, stations, groups); if (ccRec == "") return "没有抄送到任何人。"; else return "本次抄送给如下人员:" + ccRec; //return "执行抄送成功.emps=(" + emps + ") depts=(" + depts + ") stas=(" + stations + ") 标题:" + title + " ,抄送内容:" + doc; } #endregion 抄送Adv. #region 抄送普通的抄送. public string CC_AddEmps() { string toEmpStrs = this.GetRequestVal("AddEmps"); toEmpStrs = toEmpStrs.Replace(",", ";"); string[] toEmps = toEmpStrs.Split(';'); string infos = ""; foreach (string empStr in toEmps) { if (DataType.IsNullOrEmpty(empStr) == true) continue; BP.Port.Emp emp = new BP.Port.Emp(empStr); CCList cc = new CCList(); cc.FlowNo = this.FlowNo; cc.NodeIDWork = this.NodeID; cc.WorkID = this.WorkID; cc.RecEmpNo = emp.No; cc.RecEmpName = emp.Name; cc.Insert(); } return ""; } /// /// 抄送发送. /// /// public string CC_Send() { //人员信息. 格式 zhangsan,张三;lisi,李四; string emps = this.GetRequestVal("Emps"); //角色信息. 格式: 001,002,003, string stations = this.GetRequestVal("Stations"); if (DataType.IsNullOrEmpty(stations) == false) stations = stations.Replace(";", ","); //权限组. 格式: 001,002,003, string groups = this.GetRequestVal("Groups"); if (groups == null) groups = ""; groups = groups.Replace(";", ","); //部门信息. 格式: 001,002,003, string depts = this.GetRequestVal("Depts"); //标题. string title = this.GetRequestVal("TB_Title"); //内容. string doc = this.GetRequestVal("TB_Doc"); //调用抄送接口执行抄送. string ccRec = BP.WF.Dev2Interface.Node_CC_WriteTo_CClist(this.NodeID, this.WorkID, title, doc, emps, depts, stations, groups); //该节点上设置为未启动. DBAccess.RunSQL("UPDATE WF_CCList SET Sta=-1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + this.NodeID); if (ccRec == "") return "没有抄送到任何人。"; else return "本次抄送给如下人员:" + ccRec; //return "执行抄送成功.emps=(" + emps + ") depts=(" + depts + ") stas=(" + stations + ") 标题:" + title + " ,抄送内容:" + doc; } #endregion 抄送普通的抄送. public string DeleteFlowInstance_Init() { if (BP.WF.Dev2Interface.Flow_IsCanDeleteFlowInstance(this.FlowNo, this.WorkID, BP.Web.WebUser.No) == false) return "err@您没有删除该流程的权限"; //获取节点中配置的流程删除规则 if (this.NodeID != 0) { Paras ps = new Paras(); ps.SQL = "SELECT wn.DelEnable FROM WF_Node wn WHERE wn.NodeID = " + SystemConfig.AppCenterDBVarStr + "NodeID"; ps.Add("NodeID", this.NodeID); return DBAccess.RunSQLReturnValInt(ps) + ""; } return "删除成功."; } public string DeleteFlowInstance_DoDelete() { if (BP.WF.Dev2Interface.Flow_IsCanDeleteFlowInstance(this.FlowNo, this.WorkID, BP.Web.WebUser.No) == false) return "err@您没有删除该流程的权限."; string deleteWay = this.GetRequestVal("RB_DeleteWay"); string doc = this.GetRequestVal("TB_Doc"); //是否要删除子流程? 这里注意变量的获取方式,你可以自己定义. string isDeleteSubFlow = this.GetRequestVal("CB_IsDeleteSubFlow"); bool isDelSubFlow = false; if (isDeleteSubFlow == "1") isDelSubFlow = true; //按照标记删除. if (deleteWay == "1") BP.WF.Dev2Interface.Flow_DoDeleteFlowByFlag(this.WorkID, doc, isDelSubFlow); //彻底删除. if (deleteWay == "3") BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(this.WorkID, isDelSubFlow); //彻底并放入到删除轨迹里. if (deleteWay == "2") BP.WF.Dev2Interface.Flow_DoDeleteFlowByWriteLog(this.FlowNo, this.WorkID, doc, isDelSubFlow); return "流程删除成功."; } /// /// 获得节点表单数据. /// /// //public string ViewWorkNodeFrm() //{ // Node nd = new Node(this.NodeID); // nd.WorkID = this.WorkID; //为获取表单ID ( NodeFrmID )提供参数. // Hashtable ht = new Hashtable(); // ht.Add("FormType", nd.FormType.ToString()); // ht.Add("Url", nd.FormUrl + "&WorkID=" + this.WorkID + "&FK_Flow=" + this.FlowNo + "&FK_Node=" + this.NodeID); // if (nd.FormType == NodeFormType.SDKForm) // return BP.Tools.Json.ToJsonEntityModel(ht); // if (nd.FormType == NodeFormType.SelfForm) // return BP.Tools.Json.ToJsonEntityModel(ht); // //表单模版. // DataSet myds = BP.Sys.CCFormAPI.GenerHisDataSet(nd.NodeFrmID); // string json = BP.WF.Dev2Interface.CCFrom_GetFrmDBJson(this.FlowNo, this.MyPK); // DataTable mainTable = BP.Tools.Json.ToDataTableOneRow(json); // mainTable.TableName = "MainTable"; // myds.Tables.Add(mainTable); // //MapExts exts = new MapExts(nd.HisWork.ToString()); // //DataTable dtMapExt = exts.ToDataTableDescField(); // //dtMapExt.TableName = "Sys_MapExt"; // //myds.Tables.Add(dtMapExt); // return BP.Tools.Json.ToJson(myds); //} /// /// 回复加签信息. /// /// public string AskForRe() { string note = this.GetRequestVal("Note"); //原因. return BP.WF.Dev2Interface.Node_AskforReply(this.WorkID, note); } /// /// 执行加签 /// /// 执行信息 public string Askfor() { Int64 workID = int.Parse(this.GetRequestVal("WorkID")); //工作ID string toEmp = this.GetRequestVal("ToEmp"); //让谁加签? string note = this.GetRequestVal("Note"); //原因. string model = this.GetRequestVal("Model"); //模式. BP.WF.AskforHelpSta sta = BP.WF.AskforHelpSta.AfterDealSend; if (model == "1") sta = BP.WF.AskforHelpSta.AfterDealSendByWorker; return BP.WF.Dev2Interface.Node_Askfor(workID, sta, toEmp, note); } /// /// 人员选择器 /// /// public string SelectEmps_Init() { string fk_dept = this.DeptNo; if (DataType.IsNullOrEmpty(fk_dept) == true || fk_dept.Equals("undefined") == true) fk_dept = BP.Web.WebUser.DeptNo; DataSet ds = new DataSet(); string sql = ""; sql = "SELECT No,Name,ParentNo FROM Port_Dept WHERE No='" + fk_dept + "' OR ParentNo='" + fk_dept + "' ORDER BY Idx"; //如果是节水公司的. //if (SystemConfig.CustomerNo == "TianYe" && WebUser.FK_Dept.IndexOf("18099") == -1) // sql = "SELECT No,Name,ParentNo FROM Port_Dept WHERE No='" + fk_dept + "' OR (ParentNo='" + fk_dept + "' AND No!='18099') ORDER BY Idx "; DataTable dtDept = DBAccess.RunSQLReturnTable(sql); if (dtDept.Rows.Count == 0) { fk_dept = BP.Web.WebUser.DeptNo; sql = "SELECT No,Name,ParentNo FROM Port_Dept WHERE No='" + fk_dept + "' OR ParentNo='" + fk_dept + "' ORDER BY Idx "; dtDept = DBAccess.RunSQLReturnTable(sql); } dtDept.TableName = "Depts"; ds.Tables.Add(dtDept); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtDept.Columns[0].ColumnName = "No"; dtDept.Columns[1].ColumnName = "Name"; dtDept.Columns[2].ColumnName = "ParentNo"; } if (SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS) { sql = "SELECT distinct CONCAT('Emp_',A.No ) AS No, A.Name, '" + fk_dept + "' as FK_Dept, a.Idx FROM Port_Emp A LEFT JOIN Port_DeptEmp B ON A.No=B.FK_Emp WHERE A.FK_Dept='" + fk_dept + "' OR B.FK_Dept='" + fk_dept + "' "; if (SystemConfig.AppCenterDBType == DBType.MSSQL) sql = "SELECT distinct 'Emp_'+A.No AS No, A.Name, '" + fk_dept + "' as FK_Dept, a.Idx FROM Port_Emp A LEFT JOIN Port_DeptEmp B ON A.No=B.FK_Emp WHERE A.FK_Dept='" + fk_dept + "' OR B.FK_Dept='" + fk_dept + "' "; sql += " ORDER BY A.Idx "; } else { // 原来的SQL sql = "SELECT distinct CONCAT('Emp_', A.No) AS No,A.Name, '" + fk_dept + "' as FK_Dept, a.Idx FROM Port_Emp A LEFT JOIN Port_DeptEmp B ON A.No=B.FK_Emp WHERE A.FK_Dept='" + fk_dept + "' OR B.FK_Dept='" + fk_dept + "' "; sql = "SELECT CONCAT('Emp_',No) AS No, Name, FK_Dept,Idx FROM Port_Emp WHERE FK_Dept='" + fk_dept + "'"; sql += " UNION "; sql += "SELECT CONCAT('Emp_',A.No) AS No,A.Name, A.FK_Dept,A.Idx FROM Port_Emp A, Port_DeptEmp B WHERE A.No=B.FK_Emp AND B.FK_Dept='" + fk_dept + "'"; if (SystemConfig.AppCenterDBType == DBType.MSSQL) { sql = "SELECT 'Emp_'+ No AS No, Name, FK_Dept,Idx FROM Port_Emp WHERE FK_Dept='" + fk_dept + "'"; sql += " UNION "; sql += "SELECT 'Emp_'+ A.No AS No,A.Name, '" + fk_dept + "' as FK_Dept, a.Idx FROM Port_Emp A ,Port_DeptEmp B WHERE A.No=B.FK_Emp AND B.FK_Dept='" + fk_dept + "' "; } sql = "SELECT Distinct * FROM (" + sql + ")A Order By Idx"; } DataTable dtEmps = DBAccess.RunSQLReturnTable(sql); dtEmps.TableName = "Emps"; ds.Tables.Add(dtEmps); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtEmps.Columns[0].ColumnName = "No"; dtEmps.Columns[1].ColumnName = "Name"; dtEmps.Columns[2].ColumnName = "FK_Dept"; } //转化为 json return BP.Tools.Json.DataSetToJson(ds, false); } /// /// 处理发送初始化已经选择的人员信息. /// /// public string SendWorkOpt_Init() { string sql = ""; switch (SystemConfig.AppCenterDBType) { case DBType.MSSQL: sql = "SELECT top 1 MyPK FROM WF_WorkOpt WHERE NodeID=" + this.NodeID + " AND ToNodeID=" + this.ToNodeID + " AND EmpNo='" + BP.Web.WebUser.No + "' AND WorkID!=" + this.WorkID + " ORDER BY StartRDT DESC "; break; case DBType.MySQL: case DBType.UX: case DBType.PostgreSQL: case DBType.HGDB: sql = "SELECT MyPK FROM WF_WorkOpt WHERE NodeID=" + this.NodeID + " AND ToNodeID=" + this.ToNodeID + " AND EmpNo='" + BP.Web.WebUser.No + "' AND WorkID!=" + this.WorkID + " ORDER BY StartRDT DESC limit 1"; break; case DBType.Oracle: case DBType.KingBaseR3: case DBType.KingBaseR6: sql = "SELECT MyPK FROM WF_WorkOpt WHERE NodeID=" + this.NodeID + " AND ToNodeID=" + this.ToNodeID + " AND EmpNo='" + BP.Web.WebUser.No + "' AND WorkID!=" + this.WorkID + " AND ROWNUM = 1 ORDER BY StartRDT DESC "; break; default: throw new Exception("err@没有判断的数据库类型"); } GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); NodeSimple toND = new NodeSimple(this.ToNodeID); WorkOpt en = new WorkOpt(); string val = BP.DA.DBAccess.RunSQLReturnStringIsNull(sql, null); if (val == null) { en.WorkID = this.WorkID; en.FlowNo = this.FlowNo; string[] strs = this.MyPK.Split('_'); en.EmpNo = BP.Web.WebUser.No; en.NodeID = this.NodeID; en.ToNodeID = this.ToNodeID; en.FlowNo = this.FlowNo; en.WorkID = this.WorkID; en.MyPK = this.MyPK; //流程信息. en.SetValByKey(WorkOptAttr.SendRDT, gwf.SendDT);//发送日期. en.SetValByKey(WorkOptAttr.SendSDT, gwf.SDTOfNode); //节点应完成时间. en.SetValByKey(WorkOptAttr.SenderName, gwf.Sender); //发送人. en.SetValByKey(WorkOptAttr.Title, gwf.Title); en.SetValByKey(WorkOptAttr.NodeName, gwf.NodeName); en.SetValByKey(WorkOptAttr.ToNodeName, toND.Name); en.SetValByKey(WorkOptAttr.ToNodeName, toND.Name); //到达的节点名称. //如果是开始节点. if (en.NodeID.ToString().EndsWith("01") == true) { en.SetValByKey(WorkOptAttr.SendSDT, "无"); //节点应完成时间. en.SetValByKey(WorkOptAttr.SendRDT, "无");//发送日期. } en.Save(); return "info@执行成功."; } //加载上一笔数据,让其可以自动记录上一次的处理人。 WorkOpt opt = new WorkOpt(val); en = new WorkOpt(this.MyPK); en.Copy(opt); en.WorkID = this.WorkID; en.FlowNo = this.FlowNo; en.MyPK = this.MyPK; //流程信息. en.SetValByKey(WorkOptAttr.SendRDT, gwf.SendDT); en.SetValByKey(WorkOptAttr.SendSDT, gwf.SDTOfNode); en.SetValByKey(WorkOptAttr.SenderName, gwf.Sender); en.SetValByKey(WorkOptAttr.Title, gwf.Title); en.SetValByKey(WorkOptAttr.NodeName, gwf.NodeName); en.SetValByKey(WorkOptAttr.ToNodeName, toND.Name); //如果是开始节点. if (en.NodeID.ToString().EndsWith("01") == true) { en.SetValByKey(WorkOptAttr.SendSDT, "无"); //节点应完成时间. en.SetValByKey(WorkOptAttr.SendRDT, "无");//发送日期. } en.Update(); return "info@执行成功."; } #region 选择接受人. /// /// 初始化接受人. /// /// public string Accepter_Init() { /*如果是协作模式, 就要检查当前是否主持人, 当前是否是会签模式. */ GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.NodeID != this.NodeID && this.NodeID != 0) return "err@当前流程已经运动到[" + gwf.NodeName + "]上,当前处理人员为[" + gwf.TodoEmps + "],this.NodeID=" + this.NodeID; //当前节点ID. Node nd = new Node(gwf.NodeID); //判断当前是否是协作模式. if (nd.TodolistModel == TodolistModel.Teamup && nd.ItIsStartNode == false) { if (gwf.TodoEmps.Contains(WebUser.No + ",")) { /* 说明我是主持人之一, 我就可以选择接受人,发送到下一个节点上去. */ } else { // string err= "err@流程配置逻辑错误,当前节点是协作模式,当前节点的方向条件不允许[发送按钮旁下拉框选择(默认模式)]."; // err += ",如果需要手工选择,请使用[节点属性]-[设置方向条件]-[按照用户执行发送后手工选择计算]模式计算."; // return err; /* 不是主持人就执行发送,返回发送结果. */ //判断是否有不发送标记? if (this.GetRequestValBoolen("IsSend") == true) { SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(gwf.FlowNo, this.WorkID); return "info@" + objs.ToMsgOfHtml(); } } } int toNodeID = this.GetRequestValInt("ToNode"); if (toNodeID == 0) { Nodes nds = nd.HisToNodes; if (nds.Count == 1) toNodeID = nds[0].GetValIntByKey("NodeID"); else return "err@参数错误,必须传递来到达的节点ID ToNode ."; } Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); Selector select = new Selector(toNodeID); if (select.SelectorModel == SelectorModel.GenerUserSelecter) return "url@AccepterOfGener.htm?WorkID=" + this.WorkID + "&FK_Node=" + gwf.NodeID + "&FK_Flow=" + nd.FlowNo + "&ToNode=" + toNodeID + "&PWorkID=" + gwf.PWorkID + "&PageName=AccepterOfGener"; if (select.SelectorModel == SelectorModel.AccepterOfDeptStationEmp) return "url@AccepterOfDeptStationEmp.htm?WorkID=" + this.WorkID + "&FK_Node=" + gwf.NodeID + "&FK_Flow=" + nd.FlowNo + "&ToNode=" + toNodeID + "&PWorkID=" + gwf.PWorkID + "&PageName=AccepterOfDeptStationEmp"; if (select.SelectorModel == SelectorModel.Url) return "BySelfUrl@" + select.SelectorP1 + "?WorkID=" + this.WorkID + "&FK_Node=" + gwf.NodeID + "&FK_Flow=" + nd.FlowNo + "&ToNode=" + toNodeID + "&PWorkID=" + gwf.PWorkID + "&PageName=" + select.SelectorP1; //获得 部门与人员. DataSet ds = select.GenerDataSet(toNodeID, wk); if (SystemConfig.CustomerNo == "TianYe") //天业集团,去掉00000001董事长 { } //增加判断. if (ds.Tables["Emps"].Rows.Count == 0) return "err@配置接受人范围为空,请联系管理员."; ////只有一个人,就让其发送下去. //if (ds.Tables["Emps"].Rows.Count == 1) //{ // string emp = ds.Tables["Emps"].Rows[0][0].ToString(); // SendReturnObjs objs= BP.WF.Dev2Interface.Node_SendWork(this.FlowNo, this.WorkID, toNodeID, emp); // return "info@"+objs.ToMsgOfText(); //} #region 计算上一次选择的结果, 并把结果返回过去. string sql = ""; DataTable dt = new DataTable(); dt.Columns.Add("No", typeof(string)); dt.Columns.Add("Name", typeof(string)); dt.TableName = "Selected"; if (select.ItIsAutoLoadEmps == true) { // WorkOpt en = new WorkOpt(); // en.GetValFloatByKey // en.Insert(); //获取当前节点的SelectAccper的值 SelectAccpers selectAccpers = new SelectAccpers(); selectAccpers.Retrieve(SelectAccperAttr.WorkID, this.WorkID, SelectAccperAttr.FK_Node, toNodeID); if (selectAccpers.Count != 0) { foreach (SelectAccper sa in selectAccpers) { DataRow dr = dt.NewRow(); dr[0] = sa.EmpNo; dt.Rows.Add(dr); } } else { if (SystemConfig.AppCenterDBType == DBType.MSSQL) sql = "SELECT top 1 Tag,EmpTo FROM ND" + int.Parse(nd.FlowNo) + "Track A WHERE A.NDFrom=" + this.NodeID + " AND A.NDTo=" + toNodeID + " AND ActionType=1 ORDER BY WorkID DESC"; else if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) sql = "SELECT * FROM (SELECT Tag,EmpTo,WorkID FROM ND" + int.Parse(nd.FlowNo) + "Track A WHERE A.NDFrom=" + this.NodeID + " AND A.NDTo=" + toNodeID + " AND ActionType=1 ORDER BY WorkID DESC ) WHERE ROWNUM =1"; else if (SystemConfig.AppCenterDBType == DBType.MySQL) sql = "SELECT Tag,EmpTo FROM ND" + int.Parse(nd.FlowNo) + "Track A WHERE A.NDFrom=" + this.NodeID + " AND A.NDTo=" + toNodeID + " AND ActionType=1 ORDER BY WorkID DESC limit 1,1 "; else if (SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) sql = "SELECT Tag,EmpTo FROM ND" + int.Parse(nd.FlowNo) + "Track A WHERE A.NDFrom=" + this.NodeID + " AND A.NDTo=" + toNodeID + " AND ActionType=1 ORDER BY WorkID DESC limit 1 "; DataTable mydt = DBAccess.RunSQLReturnTable(sql); string emps = ""; if (mydt.Rows.Count != 0) { emps = mydt.Rows[0]["Tag"].ToString(); if (emps == "" || emps == null) { emps = mydt.Rows[0]["EmpTo"].ToString(); emps = emps + "," + emps; } } string[] strs = emps.Split(';'); foreach (string str in strs) { if (DataType.IsNullOrEmpty(str) == true) continue; string[] emp = str.Split(','); if (emp.Length != 2) continue; DataRow dr = dt.NewRow(); dr[0] = emp[0]; dr[1] = DBAccess.RunSQLReturnString("SELECT Name FROM Port_Emp WHERE No='" + emp[0] + "'"); dt.Rows.Add(dr); } } } //增加一个table. ds.Tables.Add(dt); #endregion 计算上一次选择的结果, 并把结果返回过去. //返回json. return BP.Tools.Json.DataSetToJson(ds, false); } /// /// 保存. /// /// public string Accepter_Save() { try { //求到达的节点. int toNodeID = 0; if (this.GetRequestVal("ToNode") != "0") toNodeID = int.Parse(this.GetRequestVal("ToNode")); if (toNodeID == 0) { //没有就获得第一个节点. Node nd = new Node(this.NodeID); Nodes nds = nd.HisToNodes; toNodeID = nds[0].GetValIntByKey("NodeID"); } //求发送到的人员. // string selectEmps = this.GetValFromFrmByKey("SelectEmps"); string selectEmps = this.GetRequestVal("SelectEmps"); selectEmps = selectEmps.Replace(";", ","); //保存接受人. BP.WF.Dev2Interface.Node_AddNextStepAccepters(this.WorkID, toNodeID, selectEmps, true); return "SaveOK@" + selectEmps; } catch (Exception ex) { return "err@" + ex.Message; } } public string Accepter_Send() { //求到达的节点. int toNodeID = 0; if (this.GetRequestVal("ToNode") != "0") toNodeID = int.Parse(this.GetRequestVal("ToNode")); string emps = this.GetRequestVal("SelectEmps"); string ahther = this.GetRequestVal("Auther"); return Accepter_SendExt(this.WorkID, toNodeID, emps, ahther); } /// /// 执行保存并发送. /// /// 返回发送的结果. private string Accepter_SendExt(Int64 workid, int toNodeID, string selectEmps, string Auther) { try { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); int currNodeID = gwf.NodeID; if (toNodeID == 0) { //没有就获得第一个节点. Node nd = new Node(gwf.NodeID); Nodes nds = nd.HisToNodes; toNodeID = nds[0].GetValIntByKey("NodeID"); } selectEmps = selectEmps.Replace(";", ","); #region 处理授权人. //授权人 string auther = this.GetRequestVal("Auther"); if (DataType.IsNullOrEmpty(auther) == false) { // BP.Web.WebUser.IsAuthorize = true; BP.Web.WebUser.Auth = auther; BP.Web.WebUser.AuthName = BP.DA.DBAccess.RunSQLReturnString("SELECT Name FROM Port_Emp WHERE No='" + auther + "'"); } else { // BP.Web.WebUser.IsAuthorize = true; BP.Web.WebUser.Auth = ""; BP.Web.WebUser.AuthName = ""; // BP.DA.DBAccess.RunSQLReturnString("SELECT Name FROM Port_Emp WHERE No='" + auther + "'"); } #endregion 处理授权人. //执行发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(gwf.FlowNo, workid, toNodeID, selectEmps); string msg = objs.ToMsgOfHtml(); #region 处理授权 gwf = new GenerWorkFlow(workid); if (DataType.IsNullOrEmpty(auther) == false) { gwf.SetPara("Auth", BP.Web.WebUser.AuthName + "授权"); gwf.Update(); } #endregion 处理授权 //当前节点. Node currNode = new Node(currNodeID); #region 处理发送后转向. /*处理转向问题.*/ switch (currNode.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = currNode.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("?") == false) myurl += "?1=1"; Attrs myattrs = currNode.HisWork.EnMap.Attrs; Work hisWK = currNode.HisWork; foreach (Attr attr in myattrs) { if (myurl.Contains("@") == false) break; myurl = myurl.Replace("@" + attr.Key, hisWK.GetValStrByKey(attr.Key)); } myurl = myurl.Replace("@WebUser.No", BP.Web.WebUser.No); myurl = myurl.Replace("@WebUser.Name", BP.Web.WebUser.Name); myurl = myurl.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); if (myurl.Contains("@")) { BP.WF.Dev2Interface.Port_SendMsg("admin", currNode.FlowName + "在" + currNode.Name + "节点处,出现错误", "流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl, "Err" + currNode.No + "_" + gwf.WorkID, SMSMsgType.Err, gwf.FlowNo, gwf.NodeID, gwf.WorkID, gwf.FID); throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl); } if (myurl.Contains("PWorkID") == false) myurl += "&PWorkID=" + gwf.PWorkID; if (myurl.Contains("WorkID") == false) myurl += "&WorkID=" + gwf.WorkID; myurl += "&FromFlow=" + gwf.FlowNo + "&FromNode=" + gwf.NodeID + "&UserNo=" + WebUser.No + "&Token=" + WebUser.Token; return "TurnUrl@" + myurl; case TurnToDeal.TurnToByCond: return msg; default: msg = msg.Replace("@WebUser.No", BP.Web.WebUser.No); msg = msg.Replace("@WebUser.Name", BP.Web.WebUser.Name); msg = msg.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); return msg; } #endregion 处理发送后转向. return msg; } catch (Exception ex) { return "err@" + ex.Message; } } #endregion #region 回滚. /// /// 回滚操作. /// /// public string Rollback_Init() { string andsql = " "; andsql += " ActionType=" + (int)ActionType.Start; andsql += " OR ActionType=" + (int)ActionType.TeampUp; andsql += " OR ActionType=" + (int)ActionType.Forward; andsql += " OR ActionType=" + (int)ActionType.HuiQian; andsql += " OR ActionType=" + (int)ActionType.ForwardFL; andsql += " OR ActionType=" + (int)ActionType.FlowOver; string sql = "SELECT RDT,NDFrom, NDFromT,EmpFrom,EmpFromT FROM ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID=" + this.WorkID + " AND(" + andsql + ") Order By RDT DESC"; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dt.Columns[0].ColumnName = "RDT"; dt.Columns[1].ColumnName = "NDFrom"; dt.Columns[2].ColumnName = "NDFromT"; dt.Columns[3].ColumnName = "EmpFrom"; dt.Columns[4].ColumnName = "EmpFromT"; } return BP.Tools.Json.ToJson(dt); } /// /// 执行回滚操作 /// /// public string Rollback_Done() { FlowExt flow = new FlowExt(this.FlowNo); return flow.DoRebackFlowData(this.WorkID, this.NodeID, this.GetRequestVal("Msg")); } #endregion 回滚. #region 工作退回. /// /// 获得可以退回的节点. /// /// 退回信息 public string Return_Init() { try { DataTable dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(this.WorkID); //如果只有一个退回节点,就需要判断是否启用了单节点退回规则. if (dt.Rows.Count == 1) { Node nd = new Node(this.NodeID); if (nd.ReturnOneNodeRole != 0) { /* 如果:启用了单节点退回规则. */ string returnMsg = ""; if (nd.ReturnOneNodeRole == 1 && DataType.IsNullOrEmpty(nd.ReturnField) == false) { /*从表单字段里取意见.*/ Work wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); if (wk.EnMap.Attrs.Contains(nd.ReturnField) == false) return "err@系统设置错误,您设置的单节点退回,退回信息字段拼写错误或者不存在" + nd.ReturnField; returnMsg = wk.GetValStrByKey(nd.ReturnField); // DBAccess.RunSQLReturnStringIsNull(sql, "未填写意见"); } if (nd.ReturnOneNodeRole == 2) { /*从审核组件里取意见.*/ string sql = "SELECT Msg FROM ND" + int.Parse(nd.FlowNo) + "Track WHERE WorkID=" + this.WorkID + " AND NDFrom=" + this.NodeID + " AND EmpFrom='" + WebUser.No + "' AND ActionType=" + (int)ActionType.WorkCheck; returnMsg = DBAccess.RunSQLReturnStringIsNull(sql, "未填写意见"); } int toNodeID = int.Parse(dt.Rows[0][0].ToString()); string info = BP.WF.Dev2Interface.Node_ReturnWork(this.FlowNo, this.WorkID, 0, this.NodeID, toNodeID, returnMsg, false); return "info@" + info; } } return BP.Tools.Json.ToJson(dt); } catch (Exception ex) { return "err@" + ex.Message; } } /// /// 执行退回,返回退回信息. /// /// public string DoReturnWork() { string[] vals = this.GetRequestVal("ReturnToNode").Split('@'); int toNodeID = int.Parse(vals[0]); string toEmp = vals[1]; string reMesage = this.GetRequestVal("ReturnInfo"); bool isBackBoolen = false; if (this.GetRequestVal("IsBack").Equals("1") == true) isBackBoolen = true; bool isKill = false; //是否全部退回. string isKillEtcThread = this.GetRequestVal("IsKillEtcThread"); if (DataType.IsNullOrEmpty(isKillEtcThread) == false && isKillEtcThread.Equals("1") == true) isKill = true; string pageData = this.GetRequestVal("PageData"); return BP.WF.Dev2Interface.Node_ReturnWork(this.WorkID, toNodeID, toEmp, reMesage, isBackBoolen, pageData, isKill); } #endregion /// /// 执行移交. /// /// public string Shift_Save() { string msg = this.GetRequestVal("Message"); string toEmp = this.GetRequestVal("ToEmp"); return BP.WF.Dev2Interface.Node_Shift(this.WorkID, toEmp, msg); } /// /// 撤销移交 /// /// public string UnShift() { return BP.WF.Dev2Interface.Node_ShiftUn(this.WorkID); } /// /// 执行催办 /// /// public string Press() { string msg = this.GetRequestVal("Msg"); //调用API. return BP.WF.Dev2Interface.Flow_DoPress(this.WorkID, msg, true); } #region 流程数据模版. for 浙商银行 by zhoupeng. /// /// 流程数据模版 /// /// public string DBTemplate_Init() { DataSet ds = new DataSet(); //获取模版. Paras ps = new Paras(); //按关键字查询模板的Title string SeachType = this.GetRequestVal("SeachType"); string SearchKey = this.GetRequestVal("SearchKey"); string SQL = ""; if (SeachType == "2") { string[] SearchKeys = SearchKey.Split(','); SQL = "SELECT WorkID,Title,AtPara FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND("; for (int i = 0; i < SearchKeys.Length; i++) { if (SearchKeys[i] != "") SQL += " Title like '%" + SearchKeys[i] + "%' OR"; } if (SQL.Substring(SQL.Length - 2, 2) == "OR") SQL = SQL.Remove(SQL.Length - 2, 2); SQL += " )AND WFState = 3 AND ATPARA LIKE '%@DBTemplate=1%'"; } if (SeachType == "1") { SQL = "SELECT WorkID,Title,AtPara FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND Title like '%" + SearchKey + "%' AND WFState=3 AND ATPARA LIKE '%@DBTemplate=1%'"; } else if (SeachType == "0") { SQL = "SELECT WorkID,Title,AtPara FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND WFState=3 AND ATPARA LIKE '%@DBTemplate=1%' "; } if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) { SQL += " AND rownum<=15 ORDER BY RDT"; } if (SystemConfig.AppCenterDBType == DBType.MySQL || SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) { SQL += " ORDER BY RDT LIMIT 15"; } if (SystemConfig.AppCenterDBType == DBType.MSSQL) { SQL.Replace("SELECT ", " "); SQL = "SELECT TOP 15 " + SQL; } ps.SQL = SQL; ps.Add("FK_Flow", this.FlowNo); //ps.Add("Starter", WebUser.No); DataTable dtTemplate = DBAccess.RunSQLReturnTable(ps); dtTemplate.TableName = "DBTemplate"; if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtTemplate.Columns[0].ColumnName = "WorkID"; dtTemplate.Columns[1].ColumnName = "Title"; } //把模版名称替换 title. foreach (DataRow dr in dtTemplate.Rows) { string str = dr[2].ToString(); AtPara ap = new AtPara(str); string dbtemplateName = ap.GetValStrByKey("DBTemplateName"); if (DataType.IsNullOrEmpty(dbtemplateName) == false) dr["Title"] = dbtemplateName; } ds.Tables.Add(dtTemplate); // 获取历史发起数据. ps = new Paras(); if (SystemConfig.AppCenterDBType == DBType.MSSQL) { ps.SQL = "SELECT TOP 30 WorkID,Title FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND WFState=3 AND FK_Dept=" + SystemConfig.AppCenterDBVarStr + "Starter AND ATPARA NOT LIKE '%@DBTemplate=1%' ORDER BY RDT "; ps.Add("FK_Flow", this.FlowNo); ps.Add("FK_Dept", WebUser.DeptNo); } if (SystemConfig.AppCenterDBType == DBType.Oracle || SystemConfig.AppCenterDBType == DBType.KingBaseR3 || SystemConfig.AppCenterDBType == DBType.KingBaseR6) { ps.SQL = "SELECT WorkID,Title FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND WFState=3 AND FK_Dept=" + SystemConfig.AppCenterDBVarStr + "Starter AND ATPARA NOT LIKE '%@DBTemplate=1%' AND rownum<=30 ORDER BY RDT "; ps.Add("FK_Flow", this.FlowNo); ps.Add("FK_Dept", WebUser.DeptNo); } if (SystemConfig.AppCenterDBType == DBType.MySQL || SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || SystemConfig.AppCenterDBType == DBType.UX) { ps.SQL = "SELECT WorkID,Title FROM WF_GenerWorkFlow WHERE FK_Flow=" + SystemConfig.AppCenterDBVarStr + "FK_Flow AND WFState=3 AND FK_Dept=" + SystemConfig.AppCenterDBVarStr + "Starter AND ATPARA NOT LIKE '%@DBTemplate=1%' ORDER BY RDT LIMIT 30"; ps.Add("FK_Flow", this.FlowNo); ps.Add("FK_Dept", WebUser.DeptNo); } DataTable dtHistroy = DBAccess.RunSQLReturnTable(ps); dtHistroy.TableName = "History"; if (SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtHistroy.Columns[0].ColumnName = "WorkID"; dtHistroy.Columns[1].ColumnName = "Title"; } ds.Tables.Add(dtHistroy); //转化为 json. return BP.Tools.Json.ToJson(ds); } public string DBTemplate_SaveAsDBTemplate() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); gwf.Paras_DBTemplate = true; gwf.Paras_DBTemplateName = HttpUtility.UrlDecode(this.GetRequestVal("Title"), System.Text.Encoding.UTF8);//this.GetRequestVal("Title"); gwf.Update(); return "设置成功"; } public string DBTemplate_DeleteDBTemplate() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); gwf.Paras_DBTemplate = false; gwf.Update(); return "设置成功"; } public string DBTemplate_StartFlowAsWorkID() { return "设置成功"; } #endregion 流程数据模版. #region tonodes /// /// 初始化. /// /// public string ToNodes_Init() { //获取到下一个节点的节点Nodes //获得当前节点到达的节点. Nodes nds = new Nodes(); string toNodes = this.GetRequestVal("ToNodes"); if (DataType.IsNullOrEmpty(toNodes) == false) { /*解决跳转问题.*/ string[] mytoNodes = 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.FlowNo, this.NodeID, this.WorkID, this.FID); } //获得上次默认选择的节点 int lastSelectNodeID = BP.WF.Dev2Interface.WorkOpt_ToNodes_GetLasterSelectNodeID(this.FlowNo, this.NodeID); if (lastSelectNodeID == 0 && nds.Count != 0) lastSelectNodeID = int.Parse(nds[0].PKVal.ToString()); DataSet ds = new DataSet(); ds.Tables.Add(nds.ToDataTableField("Nodes")); DataTable dt = new DataTable("SelectNode"); dt.Columns.Add("NodeID"); DataRow dr = dt.NewRow(); dr["NodeID"] = lastSelectNodeID; dt.Rows.Add(dr); ds.Tables.Add(dt); return BP.Tools.Json.ToJson(ds); } /// /// 发送 /// /// public string ToNodes_Send() { string toNodes = this.GetRequestVal("ToNodes"); // 执行发送. string msg = ""; Node nd = new Node(this.NodeID); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); try { string toNodeStr = int.Parse(this.FlowNo) + "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.FlowNo, this.NodeID, this.WorkID, this.FID, toNodes).ToMsgOfHtml(); } } catch (Exception ex) { return ex.Message; } GenerWorkFlow gwfw = new GenerWorkFlow(); gwfw.WorkID = this.WorkID; gwfw.RetrieveFromDBSources(); if (nd.ItIsRememberMe == true) gwfw.Paras_ToNodes = toNodes; else gwfw.Paras_ToNodes = ""; gwfw.Save(); //当前节点. Node currNode = new Node(this.NodeID); Flow currFlow = new Flow(this.FlowNo); #region 处理发送后转向. try { /*处理转向问题.*/ switch (currNode.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = currNode.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("?") == false) myurl += "?1=1"; Attrs myattrs = currNode.HisWork.EnMap.Attrs; Work hisWK = currNode.HisWork; foreach (Attr attr in myattrs) { if (myurl.Contains("@") == false) break; myurl = myurl.Replace("@" + attr.Key, hisWK.GetValStrByKey(attr.Key)); } myurl = myurl.Replace("@WebUser.No", BP.Web.WebUser.No); myurl = myurl.Replace("@WebUser.Name", BP.Web.WebUser.Name); myurl = myurl.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); if (myurl.Contains("@")) { BP.WF.Dev2Interface.Port_SendMsg("admin", currFlow.Name + "在" + currNode.Name + "节点处,出现错误", "流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl, "Err" + currNode.No + "_" + this.WorkID, SMSMsgType.Err, this.FlowNo, this.NodeID, this.WorkID, this.FID); throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl); } if (myurl.Contains("PWorkID") == false) myurl += "&PWorkID=" + this.WorkID; myurl += "&FromFlow=" + this.FlowNo + "&FromNode=" + this.NodeID + "&UserNo=" + WebUser.No + "&Token=" + WebUser.Token; return "TurnUrl@" + myurl; case TurnToDeal.TurnToByCond: return msg; default: msg = msg.Replace("@WebUser.No", BP.Web.WebUser.No); msg = msg.Replace("@WebUser.Name", BP.Web.WebUser.Name); msg = msg.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); return msg; } #endregion } catch (Exception ex) { if (ex.Message.Contains("请选择下一步骤工作") == true || ex.Message.Contains("用户没有选择发送到的节点") == true) { if (currNode.CondModel == DirCondModel.ByLineCond) return "url@./WorkOpt/ToNodes.htm?FK_Flow=" + this.FlowNo + "&FK_Node=" + this.NodeID + "&WorkID=" + this.WorkID + "&FID=" + this.FID; return "err@下一个节点的接收人规则是,当前节点选择来选择,在当前节点属性里您没有启动接受人按钮,系统自动帮助您启动了,请关闭窗口重新打开。" + ex.Message; } GenerWorkFlow HisGenerWorkFlow = new GenerWorkFlow(this.WorkID); //防止发送失败丢失接受人,导致不能出现下拉方向选择框. @杜. if (HisGenerWorkFlow != null) { //如果是会签状态. if (HisGenerWorkFlow.HuiQianTaskSta == HuiQianTaskSta.HuiQianing) { //如果是主持人. if (HisGenerWorkFlow.HuiQianZhuChiRen == WebUser.No) { string empStrSepc = BP.Web.WebUser.No + "," + BP.Web.WebUser.Name + ";"; if (HisGenerWorkFlow.TodoEmps.Contains(empStrSepc) == false) { HisGenerWorkFlow.TodoEmps += empStrSepc; HisGenerWorkFlow.Update(); } } else { //非主持人. string empStrSepc = BP.Web.WebUser.No + "," + BP.Web.WebUser.Name + ";"; if (HisGenerWorkFlow.TodoEmps.Contains(empStrSepc) == false) { HisGenerWorkFlow.TodoEmps += empStrSepc; HisGenerWorkFlow.Update(); } } } if (HisGenerWorkFlow.HuiQianTaskSta != HuiQianTaskSta.HuiQianing) { if (HisGenerWorkFlow.TodoEmps.Contains(BP.Web.WebUser.No + ",") == false) { HisGenerWorkFlow.TodoEmps += WebUser.No + "," + BP.Web.WebUser.Name + ";"; HisGenerWorkFlow.Update(); } } } return ex.Message; } } #endregion tonodes #region 自定义. public string TZWorkerRole_Init() { DataSet ds = new DataSet(); GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.TransferCustomType != TransferCustomType.ByWorkerSet) { gwf.TransferCustomType = TransferCustomType.ByWorkerSet; gwf.Update(); } ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); //当前运行到的节点 Node currNode = new Node(gwf.NodeID); //所有的节点s. BtnLabs nds = new BtnLabs(); nds.Retrieve("FK_Flow", this.FlowNo, "NodeID"); ds.Tables.Add(nds.ToDataTableField("WF_Node")); //工作人员列表.已经走完的节点与人员. GenerWorkerLists gwls = new GenerWorkerLists(this.WorkID); GenerWorkerList gwln = (GenerWorkerList)gwls.GetEntityByKey(GenerWorkerListAttr.FK_Node, this.NodeID); if (gwln == null) { gwln = new GenerWorkerList(); gwln.NodeID = currNode.NodeID; gwln.NodeName = currNode.Name; gwln.EmpNo = WebUser.No; gwln.EmpName = WebUser.Name; gwls.AddEntity(gwln); } ds.Tables.Add(gwls.ToDataTableField("WF_GenerWorkerlist")); SelectAccpers accpers = new SelectAccpers(); accpers.Retrieve("WorkID", this.WorkID, "FK_Node"); ds.Tables.Add(accpers.ToDataTableField("WF_SelectAccpers")); if (ds.Tables["WF_SelectAccpers"].Rows.Count > 0) { // 创建一个用于存储匹配行的列表 List matchedRows = new List(); // 遍历第一个DataTable的行 foreach (DataRow row1 in ds.Tables["WF_GenerWorkFlow"].Rows) { long fkNodeValue1 = Convert.ToInt64(row1["FK_Node"]); // 遍历第二个DataTable的行 foreach (DataRow row2 in ds.Tables["WF_SelectAccpers"].Rows) { long fkNodeValue2 = Convert.ToInt64(row2["FK_Node"]); // 检查FK_Node字段值是否相同 if (fkNodeValue1 != fkNodeValue2) { // 将匹配的行添加到列表中 matchedRows.Add(row2); } } } if (matchedRows.Count > 0) { return BP.Tools.Json.ToJson(ds); } } #region 执行计算未来处理人. Work wk = currNode.HisWork; wk.OID = this.WorkID; wk.Retrieve(); WorkNode wn = new WorkNode(wk, currNode); wn.HisFlow.ItIsFullSA = true; //执行计算未来处理人. FullSA fsa = new FullSA(); fsa.DoIt2023(wn); #endregion 执行计算未来处理人. accpers.Retrieve("WorkID", this.WorkID, "FK_Node"); ds.Tables.Add(accpers.ToDataTableField("WF_SelectAccpers")); return BP.Tools.Json.ToJson(ds); } /// /// 重置未来计算人 /// /// public string TZWorkerRole_Reset() { DataSet ds = new DataSet(); GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.TransferCustomType != TransferCustomType.ByWorkerSet) { gwf.TransferCustomType = TransferCustomType.ByWorkerSet; gwf.Update(); } ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); //当前运行到的节点 Node currNode = new Node(gwf.NodeID); //所有的节点s. BtnLabs nds = new BtnLabs(); nds.Retrieve("FK_Flow", this.FlowNo, "NodeID"); ds.Tables.Add(nds.ToDataTableField("WF_Node")); //工作人员列表.已经走完的节点与人员. GenerWorkerLists gwls = new GenerWorkerLists(this.WorkID); GenerWorkerList gwln = (GenerWorkerList)gwls.GetEntityByKey(GenerWorkerListAttr.FK_Node, this.NodeID); if (gwln == null) { gwln = new GenerWorkerList(); gwln.NodeID = currNode.NodeID; gwln.NodeName = currNode.Name; gwln.EmpNo = WebUser.No; gwln.EmpName = WebUser.Name; gwls.AddEntity(gwln); } ds.Tables.Add(gwls.ToDataTableField("WF_GenerWorkerlist")); #region 执行计算未来处理人. Work wk = currNode.HisWork; wk.OID = this.WorkID; wk.Retrieve(); WorkNode wn = new WorkNode(wk, currNode); wn.HisFlow.ItIsFullSA = true; //执行计算未来处理人. FullSA fsa = new FullSA(); fsa.DoIt2023(wn); #endregion 执行计算未来处理人. SelectAccpers accpers = new SelectAccpers(); accpers.Retrieve("WorkID", this.WorkID, "FK_Node"); ds.Tables.Add(accpers.ToDataTableField("WF_SelectAccpers")); return BP.Tools.Json.ToJson(ds); } /// /// 初始化 /// /// public string TransferCustom_Init() { DataSet ds = new DataSet(); GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.TransferCustomType != TransferCustomType.ByWorkerSet) { gwf.TransferCustomType = TransferCustomType.ByWorkerSet; gwf.Update(); } ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); //当前运行到的节点 Node currNode = new Node(gwf.NodeID); //所有的节点s. Nodes nds = new Nodes(this.FlowNo); //ds.Tables.Add(nds.ToDataTableField("WF_Node")); //工作人员列表.已经走完的节点与人员. GenerWorkerLists gwls = new GenerWorkerLists(this.WorkID); GenerWorkerList gwln = (GenerWorkerList)gwls.GetEntityByKey(GenerWorkerListAttr.FK_Node, this.NodeID); if (gwln == null) { gwln = new GenerWorkerList(); gwln.NodeID = currNode.NodeID; gwln.NodeName = currNode.Name; gwln.EmpNo = WebUser.No; gwln.EmpName = WebUser.Name; gwls.AddEntity(gwln); } ds.Tables.Add(gwls.ToDataTableField("WF_GenerWorkerlist")); //设置的手工运行的流转信息. TransferCustoms tcs = new TransferCustoms(this.WorkID); if (tcs.Count == 0) { #region 执行计算未来处理人. Work wk = currNode.HisWork; wk.OID = this.WorkID; wk.Retrieve(); WorkNode wn = new WorkNode(wk, currNode); wn.HisFlow.ItIsFullSA = true; //执行计算未来处理人. FullSA fsa = new FullSA(); fsa.DoIt2023(wn); #endregion 执行计算未来处理人. foreach (Node nd in nds) { if (nd.NodeID == this.NodeID) continue; if (nd.GetParaBoolen(NodeAttr.IsYouLiTai) == false) continue; Entity gwl = gwls.GetEntityByKey(GenerWorkerListAttr.FK_Node, nd.NodeID); if (gwl == null) { /*说明没有 */ TransferCustom tc = new TransferCustom(); tc.WorkID = this.WorkID; tc.NodeID = nd.NodeID; tc.NodeName = nd.Name; #region 计算出来当前节点的工作人员. SelectAccpers sas = new SelectAccpers(); sas.Retrieve(SelectAccperAttr.WorkID, this.WorkID, SelectAccperAttr.FK_Node, nd.NodeID); string workerID = ""; string workerName = ""; foreach (SelectAccper sa in sas) { workerID += sa.EmpNo + ","; workerName += sa.EmpName + ","; } #endregion 计算出来当前节点的工作人员. tc.Worker = workerID; tc.WorkerName = workerName; tc.Idx = nd.Step; tc.ItIsEnable = true; if (nd.HisCHWay == CHWay.ByTime && nd.GetParaInt("CHWayOfTimeRole") == 2) { tc.PlanDT = DataType.SysDateTimeFormat(DateTime.Now.AddDays(1)); } tc.Insert(); } } tcs = new TransferCustoms(this.WorkID); } ds.Tables.Add(tcs.ToDataTableField("WF_TransferCustoms")); return BP.Tools.Json.ToJson(ds); } #endregion 自定义. #region 时限初始化数据 public string CH_Init() { DataSet ds = new DataSet(); //获取处理信息的列表 GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FK_Flow, this.FlowNo, GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.RDT); DataTable dt = gwls.ToDataTableField("WF_GenerWorkerlist"); ds.Tables.Add(dt); //获取流程信息 GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); Flow flow = new Flow(this.FlowNo); ds.Tables.Add(flow.ToDataTableField("WF_Flow")); //获取流程流转自定义的数据 string sql = "SELECT FK_Node AS NodeID,NodeName AS Name From WF_TransferCustom WHERE WorkID=" + WorkID + " AND IsEnable=1 Order By Idx"; DataTable dtYL = DBAccess.RunSQLReturnTable(sql); //删除不启用的游离态节点时限设置 sql = "DELETE FROM WF_CHNode WHERE WorkID=" + WorkID + " AND FK_Node IN(SELECT FK_Node FROM WF_TransferCustom WHERE WorkID=" + WorkID + " AND IsEnable=0 )"; DBAccess.RunSQL(sql); //节点时限表 CHNodes chNodes = new CHNodes(this.WorkID); #region 获取流程节点信息的列表 Nodes nds = new Nodes(this.FlowNo); //如果是游离态的节点有可能调整顺序 dt = new DataTable(); dt.TableName = "WF_Node"; dt.Columns.Add("NodeID"); dt.Columns.Add("Name"); dt.Columns.Add("SDTOfNode");//节点应完成时间 dt.Columns.Add("PlantStartDt");//节点计划开始时间 dt.Columns.Add("GS");//工时 DataRow dr; bool isFirstY = true; //上一个节点的时间 string beforeSDTOfNode = ""; //先排序运行过的节点 CHNode chNode = null; foreach (GenerWorkerList gwl in gwls) { chNode = chNodes.GetEntityByKey(CHNodeAttr.FK_Node, gwl.NodeID) as CHNode; if (chNode != null) { chNode.SetPara("RDT", gwl.RDT); chNode.SetPara("CDT", gwl.CDT); chNode.SetPara("IsPass", gwl.ItIsPass); chNode.StartDT = gwl.RDT; chNode.EndDT = gwl.CDT; chNode.EmpNo = gwl.EmpNo; chNode.EmpT = gwl.EmpName; continue; } chNode = new CHNode(); chNode.WorkID = this.WorkID; chNode.NodeID = gwl.NodeID; chNode.NodeName = gwl.NodeName; chNode.StartDT = gwl.RDT; chNode.EndDT = gwl.CDT; chNode.EmpNo = gwl.EmpNo; chNode.EmpT = gwl.EmpName; chNode.SetPara("RDT", gwl.RDT); chNode.SetPara("CDT", gwl.CDT); chNode.SetPara("IsPass", gwl.ItIsPass); chNodes.AddEntity(chNode); beforeSDTOfNode = gwl.CDT; } foreach (Node node in nds) { GenerWorkerList gwl = gwls.GetEntityByKey(GenerWorkerListAttr.FK_Node, node.NodeID) as GenerWorkerList; if (gwl != null) continue; //已经设定 chNode = chNodes.GetEntityByKey(CHNodeAttr.FK_Node, node.NodeID) as CHNode; if (chNode != null) continue; string sdtOfNode = ""; string plantStartDt = ""; if (node.GetParaBoolen("IsYouLiTai") == true) { if (isFirstY == true) { foreach (DataRow drYL in dtYL.Rows) { chNode = chNodes.GetEntityByKey(CHNodeAttr.FK_Node, int.Parse(drYL["NodeID"].ToString())) as CHNode; if (chNode != null) continue; chNode = new CHNode(); chNode.WorkID = this.WorkID; chNode.NodeID = int.Parse(drYL["NodeID"].ToString()); chNode.NodeName = drYL["Name"].ToString(); //计划开始时间 plantStartDt = beforeSDTOfNode; chNode.StartDT = plantStartDt; //计划完成时间 sdtOfNode = sdtOfNode = getSDTOfNode(node, beforeSDTOfNode, gwf); chNode.EndDT = sdtOfNode; //工时 int gty = 0; if (DataType.IsNullOrEmpty(plantStartDt) == false && DataType.IsNullOrEmpty(sdtOfNode) == false) gty = DataType.SpanDays(plantStartDt, sdtOfNode, false); chNode.GT = gty; beforeSDTOfNode = sdtOfNode; chNodes.AddEntity(chNode); } isFirstY = false; } continue; } chNode = new CHNode(); chNode.WorkID = this.WorkID; chNode.NodeID = node.NodeID; chNode.NodeName = node.Name; //计划开始时间 plantStartDt = beforeSDTOfNode; chNode.StartDT = plantStartDt; //计划完成时间 sdtOfNode = getSDTOfNode(node, beforeSDTOfNode, gwf); chNode.EndDT = sdtOfNode; //计算初始值工天 int gs = 0; if (DataType.IsNullOrEmpty(plantStartDt) == false && DataType.IsNullOrEmpty(sdtOfNode) == false) gs = DataType.SpanDays(plantStartDt, sdtOfNode, false); chNode.GT = gs; beforeSDTOfNode = sdtOfNode; chNodes.AddEntity(chNode); } #endregion 流程节点信息 ds.Tables.Add(chNodes.ToDataTableField("WF_CHNode")); //获取当前节点信息 Node nd = new Node(this.NodeID); ds.Tables.Add(nd.ToDataTableField("WF_CurrNode")); #region 获取剩余天数 Part part = new Part(); part.setMyPK(nd.FlowNo + "_0_DeadLineRole"); int count = part.RetrieveFromDBSources(); int day = 0; //含假期的天数 DateTime dateT = DateTime.Now; if (count > 0) { //判断是否包含假期 if (int.Parse(part.Tag4) == 0) { string holidays = BP.Sys.GloVar.Holidays; while (true) { if (dateT.CompareTo(DataType.ParseSysDate2DateTime(gwf.SDTOfFlow)) >= 0) break; if (holidays.Contains(dateT.ToString("MM-dd"))) { dateT = dateT.AddDays(1); day++; continue; } dateT = dateT.AddDays(1); } } } string spanTime = GetSpanTime(DateTime.Now, DataType.ParseSysDate2DateTime(gwf.SDTOfFlow), day); dt = new DataTable(); dt.TableName = "SpanTime"; dt.Columns.Add("SpanTime"); dr = dt.NewRow(); dr["SpanTime"] = spanTime; dt.Rows.Add(dr); ds.Tables.Add(dt); #endregion 获取剩余天数 return BP.Tools.Json.ToJson(ds); } private string getSDTOfNode(Node node, string beforeSDTOfNode, GenerWorkFlow gwf) { DateTime SDTOfNode = DateTime.Now; if (beforeSDTOfNode == "") beforeSDTOfNode = gwf.SDTOfNode; //按天、小时考核 if (node.GetParaInt("CHWayOfTimeRole") == 0) { //增加天数. 考虑到了节假日. int timeLimit = node.TimeLimit; SDTOfNode = Glo.AddDayHoursSpan(DateTime.Parse(beforeSDTOfNode), node.TimeLimit, node.TimeLimitHH, node.TimeLimitMM, node.TWay); } //按照节点字段设置 if (node.GetParaInt("CHWayOfTimeRole") == 1) { //获取设置的字段、 string keyOfEn = node.GetParaString("CHWayOfTimeRoleField"); if (DataType.IsNullOrEmpty(keyOfEn) == true) node.HisCHWay = CHWay.None; else SDTOfNode = DataType.ParseSysDateTime2DateTime(node.HisWork.GetValByKey(keyOfEn).ToString()); } return DataType.SysDateTimeFormat(SDTOfNode); } #endregion 时限初始化数据 #region 节点时限重新设置 public string CH_Save() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); //获取流程应完成时间 string sdtOfFow = this.GetRequestVal("GWF"); if (DataType.IsNullOrEmpty(sdtOfFow) == false && gwf.SDTOfFlow != sdtOfFow) gwf.SDTOfFlow = sdtOfFow; //获取节点的时限设置 Nodes nds = new Nodes(this.FlowNo); CHNode chNode = null; foreach (Node nd in nds) { chNode = new CHNode(); string startDT = this.GetRequestVal("StartDT_" + nd.NodeID); string endDT = this.GetRequestVal("EndDT_" + nd.NodeID); int gt = this.GetRequestValInt("GT_" + nd.NodeID); float scale = this.GetRequestValFloat("Scale_" + nd.NodeID); float totalScale = this.GetRequestValFloat("TotalScale_" + nd.NodeID); chNode.WorkID = this.WorkID; chNode.NodeID = nd.NodeID; chNode.NodeName = nd.Name; if (DataType.IsNullOrEmpty(startDT) == false) chNode.StartDT = startDT; if (DataType.IsNullOrEmpty(endDT) == false) chNode.EndDT = endDT; chNode.GT = gt; chNode.Scale = scale; chNode.TotalScale = totalScale; chNode.Save(); } gwf.Update(); return "保存成功"; } #endregion 节点时限重新设置 #region 节点备注的设置 public string Note_Init() { Paras ps = new Paras(); ps.SQL = "SELECT * FROM ND" + int.Parse(this.FlowNo) + "Track WHERE ActionType=" + SystemConfig.AppCenterDBVarStr + "ActionType AND WorkID=" + SystemConfig.AppCenterDBVarStr + "WorkID"; ps.Add("ActionType", (int)BP.WF.ActionType.FlowBBS); ps.Add("WorkID", this.WorkID); //转化成json return BP.Tools.Json.ToJson(DBAccess.RunSQLReturnTable(ps)); } /// /// 保存备注. /// /// public string Note_Save() { string msg = this.GetRequestVal("Msg"); //需要删除track表中的数据是否存在备注 string sql = "DELETE From ND" + int.Parse(this.FlowNo) + "Track WHERE WorkID=" + WorkID + " AND NDFrom=" + this.NodeID + " AND EmpFrom='" + WebUser.No + "' And ActionType=" + (int)ActionType.FlowBBS; DBAccess.RunSQL(sql); //增加track Node nd = new Node(this.NodeID); Glo.AddToTrack(ActionType.FlowBBS, this.FlowNo, this.WorkID, this.FID, nd.NodeID, nd.Name, WebUser.No, WebUser.Name, nd.NodeID, nd.Name, WebUser.No, WebUser.Name, msg, null); //发送消息 string empsStrs = DBAccess.RunSQLReturnStringIsNull("SELECT Emps FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID, ""); string[] myEmpStrs = empsStrs.Split('@'); //标题 GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); string title = "流程名称为" + gwf.FlowName + "标题为" + gwf.Title + "在节点增加备注说明" + msg; foreach (string emp in myEmpStrs) { if (DataType.IsNullOrEmpty(emp)) continue; //获得当前人的邮件. BP.WF.Port.WFEmp empEn = new BP.WF.Port.WFEmp(emp); BP.WF.Dev2Interface.Port_SendMsg(empEn.No, title, msg, null, "NoteMessage", this.FlowNo, this.NodeID, this.WorkID, this.FID); } return "保存成功"; } #endregion 节点备注的设置 private static string GetSpanTime(DateTime t1, DateTime t2, int day) { TimeSpan span = t2 - t1; int days = span.Days; int hours = span.Hours; int minutes = span.Minutes; if (days == 0 && hours == 0 && minutes == 0) minutes = span.Seconds > 0 ? 1 : 0; string spanStr = string.Empty; if (days > 0) spanStr += (days - day) + "天"; if (hours > 0) spanStr += hours + "时"; if (minutes > 0) spanStr += minutes + "分"; if (spanStr.Length == 0) spanStr = "0分"; return spanStr; } /// /// 流程的常用语 /// /// public string UsefulExpresFlow_Init() { //AttrKey =WorkCheck, FlowBBS, WorkReturn string attrKey = this.GetRequestVal("AttrKey"); FastInputs ens = new FastInputs(); ens.Retrieve(FastInputAttr.CfgKey, "Flow", FastInputAttr.EnsName, "Flow", FastInputAttr.AttrKey, attrKey, FastInputAttr.FK_Emp, WebUser.No); if (ens.Count > 0) return ens.ToJson(); if (attrKey.Equals("Comment")) { FastInput en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "已阅"; en.EmpNo = WebUser.No; en.Insert(); } if (attrKey.Equals("CYY")) { FastInput en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "同意"; en.EmpNo = WebUser.No; en.Insert(); en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "不同意"; en.EmpNo = WebUser.No; en.Insert(); en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "同意,请领导批示"; en.EmpNo = WebUser.No; en.Insert(); en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "同意办理"; en.EmpNo = WebUser.No; en.Insert(); en = new FastInput(); en.setMyPK(DBAccess.GenerGUID()); en.EnsName = "Flow"; en.CfgKey = "Flow"; en.AttrKey = attrKey; en.Vals = "情况属实报领导批准"; en.EmpNo = WebUser.No; en.Insert(); } ens.Retrieve(FastInputAttr.CfgKey, "Flow", FastInputAttr.EnsName, "Flow", FastInputAttr.AttrKey, attrKey, FastInputAttr.FK_Emp, WebUser.No); return ens.ToJson(); } #region /// /// 批量发起子流程. /// /// public string SubFlowGuid_Send() { //获得选择的实体信息. 格式为: 001@运输司,002@法制司 Log.DebugWriteInfo("开始时间:" + DataType.CurrentDateTimeCNOfLong); string selectNos = GetRequestVal("SelectNos"); if (DataType.IsNullOrEmpty(selectNos) == true) return "err@没有选择需要启动子流程的信息"; string subFlowMyPK = GetRequestVal("SubFlowMyPK"); //前置导航的子流程的配置. SubFlowHandGuide subFlow = new SubFlowHandGuide(subFlowMyPK); SubFlowHand subFlowH = new SubFlowHand(subFlowMyPK); //选择的编号. selectNos格式为 001@开发司,002@运输司, string[] strs = selectNos.Split(','); GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); try { List manualEvents = new List(); HttpContext ctx = HttpContextHelper.Current; // 设置最大线程 ThreadPool.SetMaxThreads(16, 16); // 设置最小线程 ThreadPool.SetMinThreads(8, 8); int count = 0; foreach (string str in strs) { if (DataType.IsNullOrEmpty(str) == true) continue; // str的格式为:002@运输司 string[] enNoName = str.Split('@'); if (enNoName.Length < 2) return "err@" + enNoName[0] + "不存在名称"; count++; //实例化同步工具 ManualResetEvent mre = new ManualResetEvent(false); manualEvents.Add(mre); //将任务放入线程池中,让线程池中的线程执行该任务 ThreadPool.QueueUserWorkItem(o => { HttpContext.Current = ctx; SendSingleSubFlow(subFlowH, ht, gwf); mre.Set();//告诉主线程子线程执行完了,如果不给ManualResetEvent实例调用这个方法,主线程会一直等待子线程调用ManualResetEvent实例的Set方法 }); //mre.WaitOne(); } WaitHandle.WaitAll(manualEvents.ToArray()); } catch (Exception ex) { Log.DebugWriteError("发送子流程部分失败:" + ex.Message); return "err@发送子流程部分失败"; } if (subFlow.SubFlowHidTodolist == true) { //发送子流程后不显示父流程待办,设置父流程已经的待办已经处理 100 DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=100 Where WorkID=" + this.WorkID + " AND FK_Node=" + this.NodeID); } Log.DebugWriteInfo("结束时间:" + DataType.CurrentDateTimeCNOfLong); return "发起子流程成功"; } public void SendSingleSubFlow(SubFlowHand subFlowH, Hashtable ht, GenerWorkFlow gwf) { //创建WORKID Log.DebugWriteInfo("线程开始:" + DataType.CurrentDateTimeCNOfLong); Thread.Sleep(1000); long workidSubFlow = 0; if (subFlowH.SubFlowModel == SubFlowModel.SubLevel) workidSubFlow = BP.WF.Dev2Interface.Node_CreateBlankWork(subFlowH.SubFlowNo, null, null, WebUser.No, null, this.WorkID, this.FID, this.FlowNo, this.NodeID); if (subFlowH.SubFlowModel == SubFlowModel.SameLevel) workidSubFlow = BP.WF.Dev2Interface.Node_CreateBlankWork(subFlowH.SubFlowNo, null, null, WebUser.No, null, gwf.PWorkID, gwf.PFID, gwf.PFlowNo, gwf.PNodeID); //设置父子关系 if (subFlowH.SubFlowModel == SubFlowModel.SubLevel) BP.WF.Dev2Interface.SetParentInfo(subFlowH.SubFlowNo, workidSubFlow, this.WorkID, WebUser.No, this.NodeID); if (subFlowH.SubFlowModel == SubFlowModel.SameLevel) { BP.WF.Dev2Interface.SetParentInfo(subFlowH.SubFlowNo, workidSubFlow, gwf.PWorkID, WebUser.No, gwf.PNodeID); //父子关系 //设置同级关系 GenerWorkFlow subgwf = new GenerWorkFlow(workidSubFlow); subgwf.SetPara("SLFlowNo", this.FlowNo); subgwf.SetPara("SLNodeID", this.NodeID); subgwf.SetPara("SLWorkID", this.WorkID); subgwf.SetPara("SLEmp", BP.Web.WebUser.No); subgwf.Update(); } //发送子流程 BP.WF.Dev2Interface.Node_SendWork(subFlowH.SubFlowNo, workidSubFlow); Log.DebugWriteInfo("线程结束:" + DataType.CurrentDateTimeCNOfLong); } /// /// 会签子流程-删除草稿 /// /// public string SubFlowGuid_DeleteSubFlowDraf() { Node nd = new Node(int.Parse(this.FlowNo + "01")); string sql = "SELECT PTable FROM Sys_MapData WHERE No='" + nd.NodeFrmID + "'"; string pTableOfSubFlow = DBAccess.RunSQLReturnString(sql); DBAccess.RunSQL("DELETE FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM " + pTableOfSubFlow + " WHERE OID=" + this.WorkID); return "删除成功"; } #endregion 会签. public string JumpWay_Init() { Node node = new Node(this.NodeID); string sql = ""; switch (node.JumpWay) { case JumpWay.CanNotJump://不跳转 break; case JumpWay.Previous://向前跳转 sql = "SELECT NodeID,Name FROM WF_Node WHERE NodeID IN (SELECT FK_Node FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " )"; break; case JumpWay.Next://向后跳转 sql = "SELECT NodeID,Name FROM WF_Node WHERE NodeID NOT IN (SELECT FK_Node FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " ) AND FK_Flow='" + this.FlowNo + "'"; break; case JumpWay.AnyNode://任意节点 sql = "SELECT NodeID,Name FROM WF_Node WHERE FK_Flow='" + this.FlowNo + "' ORDER BY STEP"; break; case JumpWay.JumpSpecifiedNodes://指定节点 sql = node.JumpToNodes; sql = sql.Replace("@WebUser.No", WebUser.No); sql = sql.Replace("@WebUser.Name", WebUser.Name); sql = sql.Replace("@WebUser.FK_Dept", WebUser.DeptNo); if (sql.Contains("@")) { Work wk = node.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); foreach (Attr attr in wk.EnMap.Attrs) { if (sql.Contains("@") == false) break; sql = sql.Replace("@" + attr.Key, wk.GetValStrByKey(attr.Key)); } } break; default: throw new Exception(node.JumpWay + "还未增加改类型的判断."); } sql = sql.Replace("~", "'"); if (DataType.IsNullOrEmpty(sql) == false) { DataTable dt = DBAccess.RunSQLReturnTable(sql); if (SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.UpperCase || SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.Lowercase) { foreach (DataColumn col in dt.Columns) { string colName = col.ColumnName.ToLower(); switch (colName) { case "nodeid": col.ColumnName = "NodeID"; break; case "name": col.ColumnName = "Name"; break; default: break; } } } return BP.Tools.Json.ToJson(dt); } return ""; } public string JumpWay_Send() { try { int toNodeID = this.GetRequestValInt("ToNode"); SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(this.FlowNo, this.WorkID, toNodeID, null); string strs = objs.ToMsgOfHtml(); strs = strs.Replace("@", "
@"); #region 处理发送后转向. //当前节点. Node currNode = new Node(this.NodeID); /*处理转向问题.*/ switch (currNode.HisTurnToDeal) { case TurnToDeal.SpecUrl: string myurl = currNode.TurnToDealDoc.Clone().ToString(); if (myurl.Contains("?") == false) myurl += "?1=1"; Attrs myattrs = currNode.HisWork.EnMap.Attrs; Work hisWK = currNode.HisWork; foreach (Attr attr in myattrs) { if (myurl.Contains("@") == false) break; myurl = myurl.Replace("@" + attr.Key, hisWK.GetValStrByKey(attr.Key)); } myurl = myurl.Replace("@WebUser.No", BP.Web.WebUser.No); myurl = myurl.Replace("@WebUser.Name", BP.Web.WebUser.Name); myurl = myurl.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); if (myurl.Contains("@")) { BP.WF.Dev2Interface.Port_SendMsg("admin", currNode.Name + "在" + currNode.Name + "节点处,出现错误", "流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl, "Err" + currNode.No + "_" + this.WorkID, SMSMsgType.Err, this.FlowNo, this.NodeID, this.WorkID, this.FID); throw new Exception("流程设计错误,在节点转向url中参数没有被替换下来。Url:" + myurl); } if (myurl.Contains("PWorkID") == false) myurl += "&PWorkID=" + this.WorkID; myurl += "&FromFlow=" + this.FlowNo + "&FromNode=" + this.NodeID + "&UserNo=" + WebUser.No + "&Token=" + WebUser.Token; return "TurnUrl@" + myurl; case TurnToDeal.TurnToByCond: return strs; default: strs = strs.Replace("@WebUser.No", BP.Web.WebUser.No); strs = strs.Replace("@WebUser.Name", BP.Web.WebUser.Name); strs = strs.Replace("@WebUser.FK_Dept", BP.Web.WebUser.DeptNo); return strs; } #endregion return strs; } catch (Exception ex) { if (ex.Message.IndexOf("url@") != -1) return ex.Message.Replace("/WorkOpt/", "/"); return "err@" + ex.Message; } } /// /// 发送抄送审核处理 /// /// public string TS_Send() { //操作类型 发送,抄送(不做处理),发送+审核,发送+抄送+审核 string operType = this.GetRequestVal("OperType"); WorkOpt workOpt = new WorkOpt(this.MyPK); if (DataType.IsNullOrEmpty(operType) == true) return "err@不可能存在的错误,没有获取到参数:" + operType; #region 执行发送. //组合要发送到的人员编号:把部门人员,三者相加进来. string emps = workOpt.SendEmps; emps += ","+BP.Port.Glo.GenerEmpNosByDeptNos(workOpt.SendDepts); emps += BP.Port.Glo.GenerEmpNosByStationNos(workOpt.SendStas); if (DataType.IsNullOrEmpty(emps) == true) return "err@接受人不能为空."; //执行发送: string sendStr = this.Accepter_SendExt(workOpt.WorkID, workOpt.ToNodeID, emps, ""); //写入小纸条. if (DataType.IsNullOrEmpty(workOpt.SendNote) == false) { GenerWorkFlow gwf = new GenerWorkFlow(workOpt.WorkID); gwf.SetPara("ScripNodeID", workOpt.NodeID); gwf.SetPara("ScripMsg", workOpt.SendNote); gwf.Update(); } #endregion 执行发送. /* #region 执行抄送. //组合要发送到的人员编号:把部门人员,三者相加进来. emps = workOpt.CCEmps; emps += BP.Port.Glo.GenerEmpNosByDeptNos(workOpt.CCDepts); emps += BP.Port.Glo.GenerEmpNosByStationNos(workOpt.CCStations); string ccMsg = BP.WF.Dev2Interface.Node_CCToEmps(workOpt.NodeID, workOpt.WorkID, emps, "来自" + BP.Web.WebUser.Name + "的抄送", workOpt.CCNote); #endregion 执行抄送.*/ return sendStr; } private void SaveWorkCheck(WorkOpt workOpt) { //暂时未处理 } private void SendWork(WorkOpt workOpt) { //执行发送. } } }