using System; using System.Collections; using System.Data; using System.Text; using BP.DA; using BP.Web; using BP.WF.Template; using BP.WF.XML; using BP.WF.Port.Admin2Group; using BP.Difference; namespace BP.WF.HttpHandler { /// /// 初始化函数 /// public class WF_Admin_CCBPMDesigner : DirectoryPageBase { /// /// 选择器 /// /// public string SelectFlows_Init() { string fk_flowsort = this.GetRequestVal("FK_FlowSort").Substring(1); if (DataType.IsNullOrEmpty(fk_flowsort) == true || fk_flowsort.Equals("undefined") == true) fk_flowsort = "99"; DataSet ds = new DataSet(); string sql = ""; if (DBAccess.AppCenterDBType == DBType.MySQL) sql = "SELECT CONCAT('F' , No) as No,Name, CONCAT('F' ,ParentNo) as ParentNo FROM WF_FlowSort WHERE No='" + fk_flowsort + "' OR ParentNo='" + fk_flowsort + "' ORDER BY Idx"; else sql = "SELECT 'F' + No as No,Name, 'F' + ParentNo as ParentNo FROM WF_FlowSort WHERE No='" + fk_flowsort + "' OR ParentNo='" + fk_flowsort + "' ORDER BY Idx"; DataTable dtFlowSorts = DBAccess.RunSQLReturnTable(sql); //if (dtFlowSort.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); //} dtFlowSorts.TableName = "FlowSorts"; ds.Tables.Add(dtFlowSorts); if (BP.Difference.SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtFlowSorts.Columns[0].ColumnName = "No"; dtFlowSorts.Columns[1].ColumnName = "Name"; dtFlowSorts.Columns[2].ColumnName = "ParentNo"; } //sql = "SELECT No,Name, FK_Dept FROM Port_Emp WHERE FK_Dept='" + fk_dept + "' "; if (DBAccess.AppCenterDBType == DBType.MySQL) sql = "SELECT No,CONCAT(NO ,'.',NAME) as Name, CONCAT('F',FK_FlowSort) as ParentNo, Idx FROM WF_Flow where FK_FlowSort='" + fk_flowsort + "' "; else sql = "SELECT No,(NO + '.' + NAME) as Name, 'F' + FK_FlowSort as ParentNo, Idx FROM WF_Flow where FK_FlowSort='" + fk_flowsort + "' "; sql += " ORDER BY Idx "; DataTable dtFlows = DBAccess.RunSQLReturnTable(sql); dtFlows.TableName = "Flows"; ds.Tables.Add(dtFlows); if (BP.Difference.SystemConfig.AppCenterDBFieldCaseModel != FieldCaseModel.None) { dtFlows.Columns[0].ColumnName = "No"; dtFlows.Columns[1].ColumnName = "Name"; dtFlows.Columns[2].ColumnName = "FK_FlowSort"; } //转化为 json return BP.Tools.Json.DataSetToJson(ds, false); } /// /// 按照管理员登录. /// /// 管理员编号 /// 登录信息 public string AdminerChang_LoginAs() { string orgNo = this.GetRequestVal("OrgNo"); WebUser.OrgNo = this.OrgNo; return "info@登录成功, 如果系统不能自动刷新,请手工刷新。"; } public string Flows_Init() { DataTable dt = new DataTable(); dt.Columns.Add("FlowNo"); dt.Columns.Add("FlowName"); dt.Columns.Add("NumOfRuning"); //运行中的. dt.Columns.Add("NumOfOK"); //已经完成的. dt.Columns.Add("NumOfEtc"); //其他. Flows fls = new Flows(); fls.RetrieveAll(); foreach (Flow fl in fls) { DataRow dr = dt.NewRow(); dr["FlowNo"] = fl.No; dr["FlowName"] = fl.Name; dr["NumOfRuning"] = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM WF_GenerWorkFlow WHERE FK_Flow='" + fl.No + "' AND WFState in (2,5)", 0); dr["NumOfOK"] = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM WF_GenerWorkFlow WHERE FK_Flow='" + fl.No + "' AND WFState = 3 ", 0); dr["NumOfEtc"] = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM WF_GenerWorkFlow WHERE FK_Flow='" + fl.No + "' AND WFState in (4,5,6,7,8) ", 0); dt.Rows.Add(dr); } return BP.Tools.Json.ToJson(dt); } /// /// 构造函数 /// public WF_Admin_CCBPMDesigner() { } /// /// 执行流程设计图的保存. /// /// public string Designer_Save() { if (BP.Web.WebUser.IsAdmin == false) return "err@当前您【" + WebUser.No + "," + WebUser.Name + "】不是管理员,请重新登录.造成这种原因是您在测试容器没有正常退回造成的."; string sql = ""; try { Flow flow = new Flow(this.FlowNo); StringBuilder sBuilder = new StringBuilder(); //保存方向. sBuilder = new StringBuilder(); string[] dirs = this.GetRequestVal("Dirs").Split('@'); Direction mydir = new Direction(); foreach (string item in dirs) { if (item == "" || item == null) continue; string[] strs = item.Split(','); mydir.setMyPK(strs[0]); if (mydir.IsExits == true) continue; sBuilder.Append("DELETE FROM WF_Direction WHERE MyPK='" + strs[0] + "';"); sBuilder.Append("INSERT INTO WF_Direction (MyPK,FK_Flow,Node,ToNode) VALUES ('" + strs[0] + "','" + strs[1] + "','" + strs[2] + "','" + strs[3] + "');"); } DBAccess.RunSQLs(sBuilder.ToString()); //保存label位置. sBuilder = new StringBuilder(); string[] labs = this.GetRequestVal("Labs").Split('@'); foreach (string item in labs) { if (DataType.IsNullOrEmpty(item) == true) continue; string[] strs = item.Split(','); sBuilder.Append("UPDATE WF_LabNote SET X=" + strs[1] + ",Y=" + strs[2] + " WHERE MyPK='" + strs[0] + "';"); } string sqls = sBuilder.ToString(); DBAccess.RunSQLs(sqls); //更新节点 HisToNDs,不然就需要检查一遍. BP.WF.Nodes nds = new Nodes(); nds.Retrieve(BP.WF.Template.NodeAttr.FK_Flow, this.FlowNo); //获得方向集合处理toNodes Directions mydirs = new Directions(this.FlowNo); string mystrs = ""; foreach (Node item in nds) { string strs = ""; foreach (Direction dir in mydirs) { if (dir.Node != item.NodeID) continue; strs += "@" + dir.ToNode; } int nodePosType = 0; if (item.ItIsStartNode == true) nodePosType = 0; else if (DataType.IsNullOrEmpty(strs) == true) nodePosType = 2; else nodePosType = 1; DBAccess.RunSQL("UPDATE WF_Node SET HisToNDs='" + strs + "',NodePosType=" + nodePosType + " WHERE NodeID=" + item.NodeID); DBAccess.RunSQL("UPDATE Sys_MapData SET Name='"+item.Name+"' WHERE No='ND"+item.NodeID+"'"); } //获取所有子流程 string subs = this.GetRequestVal("SubFlows"); int subFlowShowType = flow.GetValIntByKey(FlowAttr.SubFlowShowType); if (DataType.IsNullOrEmpty(subs) == false && subFlowShowType == 0) { string[] subFlows = subs.Split('@'); foreach (string item in subFlows) { if (DataType.IsNullOrEmpty(item) == true) continue; String[] strs = item.Split(','); sBuilder.Append("UPDATE WF_NodeSubFlow SET X=" + strs[1] + ",Y=" + strs[2] + " WHERE MyPK='" + strs[0] + "';"); } } //保存节点位置. @101,2,30@102,3,1 string[] nodes = this.GetRequestVal("Nodes").Split('@'); foreach (string item in nodes) { if (DataType.IsNullOrEmpty(item) == true) continue; string[] strs = item.Split(','); string nodeID = strs[0]; //获得nodeID. if (subFlowShowType == 1 && subs.IndexOf(nodeID) != -1) { string sub = subs.Substring(subs.IndexOf("@\"" + nodeID) + 1); if (sub.Contains("@") == true) sub = sub.Substring(0, sub.IndexOf("@")); string[] subInfo = sub.Split(','); sBuilder.Append("UPDATE WF_Node SET X=" + strs[1] + ",Y=" + strs[2] + ",Name='" + strs[3] + "',SubFlowX=" + subInfo[1] + ", SubFlowY=" + subInfo[2] + " WHERE NodeID=" + strs[0] + ";"); } else { sBuilder.Append("UPDATE WF_Node SET X=" + strs[1] + ",Y=" + strs[2] + ",Name='" + strs[3] + "' WHERE NodeID=" + strs[0] + ";"); } } DBAccess.RunSQLs(sBuilder.ToString()); // DBAccess.RunSQL("update WF_Direction set ToNodeName=WF_Node.Name from WF_Node where //WF_Direction.ToNode=WF_Node.NodeID AND WF_Direction.FK_FlOW='" + this.FlowNo+"'"); #region 更新节点名称. switch (SystemConfig.AppCenterDBType) { case DBType.MSSQL: case DBType.KingBaseR3: case DBType.KingBaseR6: case DBType.PostgreSQL: case DBType.HGDB: sql = " UPDATE WF_Direction SET ToNodeName = WF_Node.Name,WF_Direction.NodeType=WF_Node.NodeType FROM WF_Node "; sql += " WHERE WF_Direction.ToNode = WF_Node.NodeID AND WF_Direction.FK_Flow='" + this.FlowNo + "'"; break; case DBType.Oracle: sql = "UPDATE WF_Direction E SET ToNodeName=(SELECT U.Name FROM WF_Node U WHERE E.ToNode=U.NodeID AND U.FK_Flow='" + this.FlowNo + "'), NodeType=(SELECT U.NodeType FROM WF_Node U WHERE E.ToNode=U.NodeID AND U.FK_Flow='" + this.FlowNo + "') WHERE EXISTS (SELECT 1 FROM WF_Node U WHERE E.ToNode=U.NodeID AND U.FK_Flow='" + this.FlowNo + "')"; break; default: sql = "UPDATE WF_Direction A, WF_Node B SET A.ToNodeName=B.Name,A.NodeType=B.NodeType WHERE A.ToNode=B.NodeID AND A.FK_Flow='" + this.FlowNo + "' "; break; } DBAccess.RunSQL(sql); #endregion 更新节点名称. //清楚缓存. Cache.ClearCache(); // Node nd = new Node(102); // throw new Exception(nd.Name); return "保存成功."; } catch (Exception ex) { return "err@" + ex.Message; } } /// /// 下载流程模版 /// /// public string ExpFlowTemplete() { Flow flow = new Flow(this.FlowNo); string fileXml = flow.GenerFlowXmlTemplete(); string docs = DataType.ReadTextFile(fileXml); return docs; } /// /// 返回临时文件. /// /// public string DownFormTemplete() { DataSet ds = BP.Sys.CCFormAPI.GenerHisDataSet_AllEleInfo(this.FrmID); string file = BP.Difference.SystemConfig.PathOfTemp + this.FrmID + ".xml"; ds.WriteXml(file); string docs = DataType.ReadTextFile(file); return docs; } /// /// 使管理员登录使管理员登录 /// /// public string LetLogin() { LetAdminLogin(this.GetRequestVal("UserNo"), true); return "登录成功."; } /// /// 获得枚举列表的JSON. /// /// public string Logout() { BP.WF.Dev2Interface.Port_SigOut(); return "您已经安全退出,欢迎使用ccbpm."; } #region 主页. /// /// 初始化登录界面. /// /// public string Default_Init() { try { //如果登录信息丢失了,就让其重新登录一次. if (DataType.IsNullOrEmpty(BP.Web.WebUser.NoOfRel) == true) { string userNo = this.GetRequestVal("UserNo"); string sid = this.GetRequestVal("Token"); BP.WF.Dev2Interface.Port_LoginByToken(sid); } if (BP.Web.WebUser.IsAdmin == false) return "url@Login.htm?DoType=Logout&Err=NoAdminUsers"; //如果没有流程表,就执行安装. if (DBAccess.IsExitsObject("WF_Flow") == false) return "url@../DBInstall.htm"; Hashtable ht = new Hashtable(); ht.Add("OSModel", "1"); //把系统信息加入里面去. ht.Add("SysNo", BP.Difference.SystemConfig.SysNo); ht.Add("SysName", BP.Difference.SystemConfig.SysName); ht.Add("CustomerNo", BP.Difference.SystemConfig.CustomerNo); ht.Add("CustomerName", BP.Difference.SystemConfig.CustomerName); //集成的平台. ht.Add("RunOnPlant", BP.Difference.SystemConfig.RunOnPlant); try { // 执行升级 string str = BP.WF.Glo.UpdataCCFlowVer(); if (str == null) str = ""; ht.Add("Msg", str); } catch (Exception ex) { return "err@" + ex.Message; } //生成Json. return BP.Tools.Json.ToJsonEntityModel(ht); } catch (Exception ex) { return "err@初始化界面期间出现如下错误:" + ex.Message; } } #endregion #region 登录窗口. public string Login_InitInfo() { Hashtable ht = new Hashtable(); ht.Add("SysNo", BP.Difference.SystemConfig.SysNo); ht.Add("SysName", BP.Difference.SystemConfig.SysName); return BP.Tools.Json.ToJson(ht); } /// /// 初始化登录界面. /// /// public string Login_Init() { //检查数据库连接. try { DBAccess.TestIsConnection(); } catch (Exception ex) { return "err@异常信息:" + ex.Message; } //检查是否缺少Port_Emp 表,如果没有就是没有安装. if (DBAccess.IsExitsObject("Port_Emp") == false && DBAccess.IsExitsObject("WF_Flow") == false) return "url@../DBInstall.htm"; ////让admin登录 //if (DataType.IsNullOrEmpty(BP.Web.WebUser.No) || BP.Web.WebUser.IsAdmin == false) // return "url@Login.htm?DoType=Logout"; //如果没有流程表,就执行安装. if (DBAccess.IsExitsObject("WF_Flow") == false) return "url@../DBInstall.htm"; //是否需要自动登录。 这里都把cookeis的数据获取来了. string userNo = this.GetRequestVal("UserNo"); string sid = this.GetRequestVal("Token"); if (String.IsNullOrEmpty(sid) == false && String.IsNullOrEmpty(userNo) == false) { /* 如果都有值,就需要他登录。 */ try { string str = BP.WF.Glo.UpdataCCFlowVer(); BP.WF.Dev2Interface.Port_LoginByToken(sid); if (this.FlowNo == null) return "url@Default.htm?UserNo=" + userNo + "&OrgNo=" + WebUser.OrgNo + "&Key=" + DateTime.Now.ToBinary() + "&Token=" + sid; else return "url@Designer.htm?UserNo=" + userNo + "&OrgNo=" + WebUser.OrgNo + "&FK_Flow=" + this.FlowNo + "&Key=" + DateTime.Now.ToBinary() + "&Token=" + sid; } catch (Exception ex) { return "err@登录失败" + ex.Message; } } try { // 执行升级 string str = BP.WF.Glo.UpdataCCFlowVer(); if (str == null) str = "准备完毕,欢迎登录,当前小版本号为:" + BP.WF.Glo.Ver; return str; } catch (Exception ex) { string msg = "err@升级失败(ccbpm有自动修复功能,您可以刷新一下系统会自动创建字段,刷新多次扔解决不了问题,请反馈给我们)"; msg += "@系统信息:" + ex.Message; return msg; } } //流程设计器登陆前台,转向规则,判断是否为天业BPM public string Login_Redirect() { if (BP.Difference.SystemConfig.CustomerNo == "TianYe") return "url@../../../BPM/pages/login.html"; return "url@../../AppClassic/Login.htm?DoType=Logout"; } /// ///初始化当前登录人的下的所有组织 /// /// public string SelectOneOrg_Init() { BP.WF.Port.Admin2Group.Orgs orgs = new BP.WF.Port.Admin2Group.Orgs(); orgs.RetrieveInSQL("SELECT OrgNo FROM Port_OrgAdminer WHERE FK_Emp='" + WebUser.No + "'"); return orgs.ToJson(); } /// ///选择一个组织 /// /// public string SelectOneOrg_Selected() { WebUser.OrgNo = this.OrgNo; //找到管理员所在的部门. string sql = "SELECT a.No FROM Port_Dept A,Port_DeptEmp B WHERE A.No=B.FK_Dept AND B.FK_Emp='" + WebUser.No + "' AND A.OrgNo='" + this.OrgNo + "'"; string deptNo = DBAccess.RunSQLReturnStringIsNull(sql, this.OrgNo); WebUser.DeptNo = deptNo; //执行更新到用户表信息. WebUser.UpdateSIDAndOrgNoSQL(); return "url@Default.htm?Token=" + WebUser.Token + "&UserNo=" + WebUser.No + "&OrgNo=" + WebUser.OrgNo; // return "登录成功."; } #endregion 登录窗口. #region 节点相关 Nodes /// /// 根据节点编号删除流程节点 /// /// 执行结果 public string DeleteNode() { try { BP.WF.Node node = new BP.WF.Node(); node.NodeID = this.NodeID; if (node.RetrieveFromDBSources() == 0) return "err@删除失败,没有删除到数据,估计该节点已经别删除了."; if (node.ItIsStartNode == true) return "err@开始节点不允许被删除。"; node.Delete(); return "删除成功."; } catch (Exception ex) { return "err@" + ex.Message; } } /// /// 修改节点名称 /// /// public string Node_EditNodeName() { string FK_Node = this.GetValFromFrmByKey("NodeID"); //string NodeName = System.Web.HttpContext.Current.Server.UrlDecode(this.GetValFromFrmByKey("NodeName")); string NodeName = HttpContextHelper.UrlDecode(this.GetValFromFrmByKey("NodeName")); BP.WF.Node node = new BP.WF.Node(); node.NodeID = int.Parse(FK_Node); int iResult = node.RetrieveFromDBSources(); if (iResult > 0) { node.Name = NodeName; node.Update(); return "@修改成功."; } return "err@修改节点失败,请确认该节点是否存在?"; } #endregion end Node #region CCBPMDesigner StringBuilder sbJson = new StringBuilder(); public void GenerChildRows(DataTable dt, DataTable newDt, DataRow parentRow) { DataRow[] rows = dt.Select("ParentNo='" + parentRow["NO"] + "'"); foreach (DataRow r in rows) { newDt.Rows.Add(r.ItemArray); GenerChildRows(dt, newDt, r); } } /// /// 上移流程类别 /// /// public String MoveUpFlowSort() { String fk_flowSort = this.GetRequestVal("FK_FlowSort").Replace("F", ""); FlowSort fsSub = new FlowSort(fk_flowSort); //传入的编号多出F符号,需要替换掉 fsSub.DoUp(); return "F" + fsSub.No; } /// /// 下移流程类别 /// /// public String MoveDownFlowSort() { String fk_flowSort = this.GetRequestVal("FK_FlowSort").Replace("F", ""); FlowSort fsSub = new FlowSort(fk_flowSort); //传入的编号多出F符号,需要替换掉 fsSub.DoDown(); return "F" + fsSub.No; } /// /// 上移流程 /// /// public string MoveUpFlow() { Flow flow = new Flow(this.FlowNo); flow.DoUp(); return flow.No; } /// /// 下移流程 /// /// public string MoveDownFlow() { Flow flow = new Flow(this.FlowNo); flow.DoDown(); return flow.No; } /// /// 删除流程类别. /// /// public string DelFlowSort() { string fk_flowSort = this.GetRequestVal("FK_FlowSort").Replace("F", ""); FlowSort fs = new FlowSort(); fs.No = fk_flowSort; //检查是否有流程? Paras ps = new Paras(); ps.SQL = "SELECT COUNT(*) FROM WF_Flow WHERE FK_FlowSort=" + BP.Difference.SystemConfig.AppCenterDBVarStr + "fk_flowSort"; ps.Add("fk_flowSort", fk_flowSort); //string sql = "SELECT COUNT(*) FROM WF_Flow WHERE FK_FlowSort='" + fk_flowSort + "'"; if (DBAccess.RunSQLReturnValInt(ps) != 0) return "err@该目录下有流程,您不能删除。"; //检查是否有子目录? ps = new Paras(); ps.SQL = "SELECT COUNT(*) FROM WF_FlowSort WHERE ParentNo=" + BP.Difference.SystemConfig.AppCenterDBVarStr + "ParentNo"; ps.Add("ParentNo", fk_flowSort); //sql = "SELECT COUNT(*) FROM WF_FlowSort WHERE ParentNo='" + fk_flowSort + "'"; if (DBAccess.RunSQLReturnValInt(ps) != 0) return "err@该目录下有子目录,您不能删除。"; fs.Delete(); return "删除成功."; } /// /// 新建同级流程类别 对照需要翻译 /// /// public string NewSameLevelFlowSort() { FlowSort fs = null; fs = new FlowSort(this.No.Replace("F", "")); //传入的编号多出F符号,需要替换掉. string orgNo = fs.OrgNo; //记录原来的组织结构编号. 对照需要翻译 string sameNodeNo = fs.DoCreateSameLevelNode().No; fs = new FlowSort(sameNodeNo); fs.Name = this.Name; fs.OrgNo = orgNo; // 组织结构编号. 对照需要翻译 fs.Update(); return "F" + fs.No; } /// /// 新建下级类别. /// /// public string NewSubFlowSort() { FlowSort fsSub = new FlowSort(this.No.Replace("F", ""));//传入的编号多出F符号,需要替换掉. string orgNo = fsSub.OrgNo; //记录原来的组织结构编号. 对照需要翻译 string subNodeNo = fsSub.DoCreateSubNode().No; FlowSort subFlowSort = new FlowSort(subNodeNo); subFlowSort.Name = this.Name; subFlowSort.OrgNo = orgNo; // 组织结构编号. 对照需要翻译. subFlowSort.Update(); return "F" + subFlowSort.No; } /// /// 表单树 - 删除表单类别 /// /// public string CCForm_DelFormSort() { SysFormTree formTree = new SysFormTree(this.No); //检查是否有子类别? Paras ps = new Paras(); ps.SQL = "SELECT COUNT(*) FROM Sys_FormTree WHERE ParentNo=" + BP.Difference.SystemConfig.AppCenterDBVarStr + "ParentNo"; ps.Add("ParentNo", this.No); //string sql = "SELECT COUNT(*) FROM Sys_FormTree WHERE ParentNo='" + this.No + "'"; if (DBAccess.RunSQLReturnValInt(ps) != 0) return "err@该目录下有子类别,您不能删除。"; //检查是否有表单? ps = new Paras(); ps.SQL = "SELECT COUNT(*) FROM Sys_MapData WHERE FK_FormTree=" + BP.Difference.SystemConfig.AppCenterDBVarStr + "FK_FormTree"; ps.Add("FK_FormTree", this.No); //sql = "SELECT COUNT(*) FROM Sys_MapData WHERE FK_FormTree='" + this.No + "'"; if (DBAccess.RunSQLReturnValInt(ps) != 0) return "err@该目录下有表单,您不能删除。"; formTree.Delete(); return "删除成功"; } /// /// 让admin登录 /// /// public string LetAdminLoginByToken() { try { string userNo = this.GetRequestVal("UserNo"); string sid = this.GetRequestVal("Token"); BP.WF.Dev2Interface.Port_LoginByToken(sid); return "info@登录成功"; } catch (Exception ex) { return "err@登录失败:" + ex.Message; } } /// /// 让admin 登陆 /// /// 当前的语言 /// 成功则为空,有异常时返回异常信息 public string LetAdminLogin(string empNo, bool islogin) { try { if (islogin) { BP.Port.Emp emp = new BP.Port.Emp(empNo); WebUser.SignInOfGener(emp); } } catch (Exception ex) { return "err@" + ex.Message; } return "@登录成功."; } public string AdminerChange() { string mysql = "SELECT "; mysql += "No as \"No\", "; mysql += "Name as \"Name\", "; mysql += "UseSta as \"UseSta\", "; mysql += "RootOfDept as \"RootOfDept\" "; mysql += " FROM WF_Emp WHERE No LIKE '" + this.GetRequestVal("UserNo") + "@%' "; DataTable dt = DBAccess.RunSQLReturnTable(mysql); return BP.Tools.Json.ToJson(dt); } #endregion } }