/// <summary> /// 增加二级管理员. /// </summary> /// <param name="empID"></param> /// <returns></returns> public string DoAddAdminer(string empID) { BP.Port.Emp emp = new BP.Port.Emp(); emp.No = empID; if (emp.RetrieveFromDBSources() == 0) { return("err@管理员增加失败,ID=" + empID + "不存在用户表,您增加的管理员必须存在与Port_Emp用户表."); } AdminEmp adminEmp = new AdminEmp(); adminEmp.No = empID; if (adminEmp.RetrieveFromDBSources() == 1) { return("err@管理员【" + adminEmp.Name + "】已经存在,您不需要在增加."); } adminEmp.Copy(emp); adminEmp.FK_Dept = WebUser.FK_Dept; adminEmp.RootOfDept = WebUser.FK_Dept; adminEmp.UserType = 1; adminEmp.Insert(); return("增加成功,请关闭当前窗口查询到该管理员,设置他的权限。"); }
/// <summary> /// 增加二级子公司人员. /// </summary> /// <param name="empID"></param> /// <returns></returns> public string DoAddAdminer(string empID) { BP.Port.Emp emp = new BP.Port.Emp(); emp.No = empID; if (emp.RetrieveFromDBSources() == 0) { return("err@子公司人员增加失败,ID=" + empID + "不存在用户表,您增加的子公司人员必须存在与Port_Emp用户表."); } Emp Emp = new Emp(); Emp.No = empID; if (Emp.RetrieveFromDBSources() == 1) { return("err@子公司人员【" + Emp.Name + "】已经存在,您不需要在增加."); } Emp.Copy(emp); Emp.FK_Dept = WebUser.FK_Dept; Emp.RootOfDept = WebUser.FK_Dept; Emp.UserType = 1; Emp.Save(); return("增加成功,请关闭当前窗口查询到该子公司人员,设置他的权限。"); }
public string ReLoginSubmit() { string userNo = this.GetValFromFrmByKey("TB_No"); string password = this.GetValFromFrmByKey("TB_PW"); BP.Port.Emp emp = new BP.Port.Emp(); emp.No = userNo; if (emp.RetrieveFromDBSources() == 0) { return("err@用户名或密码错误."); } if (emp.CheckPass(password) == false) { return("err@用户名或密码错误."); } BP.Web.WebUser.SignInOfGener(emp); return("登录成功."); }
public void DTS_Flow(BP.WF.Flow fl) { #region 读取数据. BP.Sys.MapExt me = new MapExt(); me.MyPK = "ND" + int.Parse(fl.No) + "01" + "_" + MapExtXmlList.StartFlow; int i = me.RetrieveFromDBSources(); if (i == 0) { BP.DA.Log.DefaultLogWriteLineError("没有为流程(" + fl.Name + ")的开始节点设置发起数据,请参考说明书解决."); return; } if (string.IsNullOrEmpty(me.Tag)) { BP.DA.Log.DefaultLogWriteLineError("没有为流程(" + fl.Name + ")的开始节点设置发起数据,请参考说明书解决."); return; } // 获取从表数据. DataSet ds = new DataSet(); string[] dtlSQLs = me.Tag1.Split('*'); foreach (string sql in dtlSQLs) { if (string.IsNullOrEmpty(sql)) { continue; } string[] tempStrs = sql.Split('='); string dtlName = tempStrs[0]; DataTable dtlTable = BP.DA.DBAccess.RunSQLReturnTable(sql.Replace(dtlName + "=", "")); dtlTable.TableName = dtlName; ds.Tables.Add(dtlTable); } #endregion 读取数据. #region 检查数据源是否正确. string errMsg = ""; // 获取主表数据. DataTable dtMain = BP.DA.DBAccess.RunSQLReturnTable(me.Tag); if (dtMain.Rows.Count == 0) { BP.DA.Log.DefaultLogWriteLineError("流程(" + fl.Name + ")此时无任务."); this.SetText("流程(" + fl.Name + ")此时无任务."); return; } this.SetText("@查询到(" + dtMain.Rows.Count + ")条任务."); if (dtMain.Columns.Contains("Starter") == false) { errMsg += "@配值的主表中没有Starter列."; } if (dtMain.Columns.Contains("MainPK") == false) { errMsg += "@配值的主表中没有MainPK列."; } if (errMsg.Length > 2) { this.SetText(errMsg); BP.DA.Log.DefaultLogWriteLineError("流程(" + fl.Name + ")的开始节点设置发起数据,不完整." + errMsg); return; } #endregion 检查数据源是否正确. #region 处理流程发起. string nodeTable = "ND" + int.Parse(fl.No) + "01"; int idx = 0; foreach (DataRow dr in dtMain.Rows) { idx++; string mainPK = dr["MainPK"].ToString(); string sql = "SELECT OID FROM " + nodeTable + " WHERE MainPK='" + mainPK + "'"; if (DBAccess.RunSQLReturnTable(sql).Rows.Count != 0) { this.SetText("@" + fl.Name + ",第" + idx + "条,此任务在之前已经完成。"); continue; /*说明已经调度过了*/ } string starter = dr["Starter"].ToString(); if (WebUser.No != starter) { BP.Web.WebUser.Exit(); BP.Port.Emp emp = new BP.Port.Emp(); emp.No = starter; if (emp.RetrieveFromDBSources() == 0) { this.SetText("@" + fl.Name + ",第" + idx + "条,设置的发起人员:" + emp.No + "不存在."); BP.DA.Log.DefaultLogWriteLineInfo("@数据驱动方式发起流程(" + fl.Name + ")设置的发起人员:" + emp.No + "不存在。"); continue; } WebUser.SignInOfGener(emp); } #region 给值. //System.Collections.Hashtable ht = new Hashtable(); Work wk = fl.NewWork(); string err = ""; #region 检查用户拼写的sql是否正确? foreach (DataColumn dc in dtMain.Columns) { string f = dc.ColumnName.ToLower(); switch (f) { case "starter": case "mainpk": case "refmainpk": case "tonode": break; default: bool isHave = false; foreach (Attr attr in wk.EnMap.Attrs) { if (attr.Key.ToLower() == f) { isHave = true; break; } } if (isHave == false) { err += " " + f + " "; } break; } } if (string.IsNullOrEmpty(err) == false) { throw new Exception("您设置的字段:" + err + "不存在开始节点的表单中,设置的sql:" + me.Tag); } #endregion 检查用户拼写的sql是否正确? foreach (DataColumn dc in dtMain.Columns) { wk.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString()); } if (ds.Tables.Count != 0) { // MapData md = new MapData(nodeTable); MapDtls dtls = new MapDtls(nodeTable); foreach (MapDtl dtl in dtls) { foreach (DataTable dt in ds.Tables) { if (dt.TableName != dtl.No) { continue; } //删除原来的数据。 GEDtl dtlEn = dtl.HisGEDtl; dtlEn.Delete(GEDtlAttr.RefPK, wk.OID.ToString()); // 执行数据插入。 foreach (DataRow drDtl in dt.Rows) { if (drDtl["RefMainPK"].ToString() != mainPK) { continue; } dtlEn = dtl.HisGEDtl; foreach (DataColumn dc in dt.Columns) { dtlEn.SetValByKey(dc.ColumnName, drDtl[dc.ColumnName].ToString()); } dtlEn.RefPK = wk.OID.ToString(); dtlEn.OID = 0; dtlEn.Insert(); } } } } #endregion 给值. int toNodeID = 0; try { toNodeID = int.Parse(dr["ToNode"].ToString()); } catch { /*有可能在4.5以前的版本中没有tonode这个约定.*/ } // 处理发送信息. // Node nd =new Node(); string msg = ""; try { if (toNodeID == 0) { WorkNode wn = new WorkNode(wk, fl.HisStartNode); msg = wn.NodeSend().ToMsgOfText(); } if (toNodeID == fl.StartNodeID) { /* 发起后让它停留在开始节点上,就是为开始节点创建一个待办。*/ Int64 workID = BP.WF.Dev2Interface.Node_CreateStartNodeWork(fl.No, null, null, WebUser.No, null); if (workID != wk.OID) { throw new Exception("@异常信息:不应该不一致的workid."); } else { wk.Update(); } msg = "已经为(" + WebUser.No + ") 创建了开始工作节点. "; } BP.DA.Log.DefaultLogWriteLineInfo(msg); this.SetText("@" + fl.Name + ",第" + idx + "条,发起人员:" + WebUser.No + "-" + WebUser.Name + "已完成.\r\n" + msg); } catch (Exception ex) { this.SetText("@" + fl.Name + ",第" + idx + "条,发起人员:" + WebUser.No + "-" + WebUser.Name + "发起时出现错误.\r\n" + ex.Message); BP.DA.Log.DefaultLogWriteLineWarning(ex.Message); } } #endregion 处理流程发起. }
/// <summary> /// 定时任务 /// </summary> /// <param name="fls"></param> private void DoAutuFlows(BP.WF.Flows fls) { #region 自动启动流程 foreach (BP.WF.Flow fl in fls) { if (fl.IsOK == false || fl.HisFlowRunWay == BP.WF.FlowRunWay.HandWork) { continue; } if (DateTime.Now.ToString("HH:mm") == fl.Tag) { continue; } if (fl.RunObj == null || fl.RunObj == "") { string msg = "您设置自动运行流程错误,没有设置流程内容,流程编号:" + fl.No; this.SetText(msg); continue; } #region 判断当前时间是否可以运行它。 string nowStr = DateTime.Now.ToString("yyyy-MM-dd,HH:mm"); string[] strs = fl.RunObj.Split('@'); //破开时间串。 bool IsCanRun = false; foreach (string str in strs) { if (string.IsNullOrEmpty(str)) { continue; } if (nowStr.Contains(str)) { IsCanRun = true; } } if (IsCanRun == false) { continue; } // 设置时间. fl.Tag = DateTime.Now.ToString("HH:mm"); #endregion 判断当前时间是否可以运行它。 // 以此用户进入. switch (fl.HisFlowRunWay) { case BP.WF.FlowRunWay.SpecEmp: //指定人员按时运行。 string RunObj = fl.RunObj; string fk_emp = RunObj.Substring(0, RunObj.IndexOf('@')); BP.Port.Emp emp = new BP.Port.Emp(); emp.No = fk_emp; if (emp.RetrieveFromDBSources() == 0) { this.SetText("启动自动启动流程错误:发起人(" + fk_emp + ")不存在。"); continue; } BP.Web.WebUser.SignInOfGener(emp); #warning 尚未实现。 //string info_send= BP.WF.Dev2Interface.Node_StartWork(fl.No,); //this.SetText(info_send); continue; case BP.WF.FlowRunWay.DataModel: //按数据集合驱动的模式执行。 this.SetText("@开始执行数据驱动流程调度:" + fl.Name); this.DTS_Flow(fl); continue; default: break; } } if (BP.Web.WebUser.No != "admin") { BP.Port.Emp empadmin = new BP.Port.Emp("admin"); BP.Web.WebUser.SignInOfGener(empadmin); } #endregion 发送消息 }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { BP.WF.Flows fls = new Flows(); fls.RetrieveAll(); #region 自动启动流程 foreach (BP.WF.Flow fl in fls) { if (fl.HisFlowRunWay == BP.WF.FlowRunWay.HandWork) { continue; } if (DateTime.Now.ToString("HH:mm") == fl.Tag) { continue; } if (fl.RunObj == null || fl.RunObj == "") { string msg = "您设置自动运行流程错误,没有设置流程内容,流程编号:" + fl.No + ",流程名称:" + fl.Name; BP.DA.Log.DebugWriteError(msg); continue; } #region 判断当前时间是否可以运行它。 string nowStr = DateTime.Now.ToString("yyyy-MM-dd,HH:mm"); string[] strs = fl.RunObj.Split('@'); //破开时间串。 bool IsCanRun = false; foreach (string str in strs) { if (string.IsNullOrEmpty(str)) { continue; } if (nowStr.Contains(str)) { IsCanRun = true; } } if (IsCanRun == false) { continue; } // 设置时间. fl.Tag = DateTime.Now.ToString("HH:mm"); #endregion 判断当前时间是否可以运行它。 // 以此用户进入. switch (fl.HisFlowRunWay) { case BP.WF.FlowRunWay.SpecEmp: //指定人员按时运行。 string RunObj = fl.RunObj; string fk_emp = RunObj.Substring(0, RunObj.IndexOf('@')); BP.Port.Emp emp = new BP.Port.Emp(); emp.No = fk_emp; if (emp.RetrieveFromDBSources() == 0) { BP.DA.Log.DebugWriteError("启动自动启动流程错误:发起人(" + fk_emp + ")不存在。"); continue; } try { //让 userNo 登录. BP.WF.Dev2Interface.Port_Login(emp.No); //创建空白工作, 发起开始节点. Int64 workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fl.No); //执行发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fl.No, workID); //string info_send= BP.WF.Dev2Interface.Node_StartWork(fl.No,); BP.DA.Log.DefaultLogWriteLineInfo("流程:" + fl.No + fl.Name + "的定时任务\t\n -------------- \t\n" + objs.ToMsgOfText()); } catch (Exception ex) { BP.DA.Log.DebugWriteError("流程:" + fl.No + fl.Name + "自动发起错误:\t\n -------------- \t\n" + ex.Message); } continue; case BP.WF.FlowRunWay.DataModel: //按数据集合驱动的模式执行。 this.DTS_Flow(fl); continue; case BP.WF.FlowRunWay.InsertModel: //按数据集合驱动的模式执行。 this.InsertModel(fl); continue; default: break; } } if (BP.Web.WebUser.No != "admin") { BP.Port.Emp empadmin = new BP.Port.Emp("admin"); BP.Web.WebUser.SignInOfGener(empadmin); } #endregion 发送消息 return("调度完成.."); }
/// <summary> /// Entity 的基本应用. /// </summary> public void EntityBaseApp() { #region 直接插入一条数据. BP.Port.Emp emp = new BP.Port.Emp(); emp.CheckPhysicsTable(); /* 检查物理表是否与Map一致 * 1,如果没有这个物理表则创建。 * 2,如果缺少字段则创建。 * 3,如果字段类型不一直则删除创建,比如原来是int类型现在map修改成string类型。 * 4,map字段减少则不处理。 * 5,手工的向物理表中增加的字段则不处理。 * 6,数据源是视图字段不匹配则创建失败。 * */ emp.No = "zhangsan"; emp.Name = "张三"; emp.FK_Dept = "01"; emp.Pass = "******"; emp.Insert(); // 如果主键重复要抛异常。 #endregion 直接插入一条数据. #region 保存的方式插入一条数据. emp = new BP.Port.Emp(); emp.No = "zhangsan"; emp.Name = "张三"; emp.FK_Dept = "01"; emp.Pass = "******"; emp.Save(); // 如果主键重复直接更新,不会抛出异常。 #endregion 保存的方式插入一条数据. #region 其他方法. BP.Port.Emp myEmp2 = new BP.Port.Emp(); myEmp2.No = "zhangsan"; //检查主键数据是否存在 ? bool isExit = myEmp2.IsExits; if (myEmp2.RetrieveFromDBSources() == 0) { /*说明没有查询到数据。*/ } #endregion . #region 数据复制. /* * 如果一个实体与另外的一个实体两者的属性大致相同,就可以执行copy. * 比如:在创建人员时,张三与李四两者只是编号与名称不同,只是改变不同的属性就可以执行相关的业务操作。 */ Emp emp1 = new BP.Port.Emp("zhangsan"); emp = new BP.Port.Emp(); emp.Copy(emp1); // 同实体copy, 不同的实体也可以实现copy. emp.No = "lisi"; emp.Name = "李四"; emp.Insert(); // copy 在业务逻辑上会经常应用,比如: 在一个流程中A节点表单与B节点表单字段大致相同,ccflow就是采用的copy方式处理。 #endregion 数据复制. #region 单个实体查询. string msg = ""; // 查询这条数据. BP.Port.Emp myEmp = new BP.Port.Emp(); myEmp.No = "zhangsan"; if (myEmp.RetrieveFromDBSources() == 0) // RetrieveFromDBSources() 返回来的是查询数量. { this.Response.Write("没有查询到编号等于zhangsan的人员记录."); return; } else { msg = ""; msg += "<BR>编号:" + myEmp.No; msg += "<BR>名称:" + myEmp.Name; msg += "<BR>密码:" + myEmp.Pass; msg += "<BR>部门编号:" + myEmp.FK_Dept; msg += "<BR>部门名称:" + myEmp.FK_DeptText; this.Response.Write(msg); } myEmp = new BP.Port.Emp(); myEmp.No = "zhangsan"; myEmp.Retrieve(); // 执行查询,如果查询不到则要抛出异常。 msg = ""; msg += "<BR>编号:" + myEmp.No; msg += "<BR>名称:" + myEmp.Name; msg += "<BR>密码:" + myEmp.Pass; msg += "<BR>部门编号:" + myEmp.FK_Dept; msg += "<BR>部门名称:" + myEmp.FK_DeptText; this.Response.Write(msg); #endregion 查询. #region 两种方式的删除。 // 删除操作。 emp = new BP.Port.Emp(); emp.No = "zhangsan"; int delNum = emp.Delete(); // 执行删除。 if (delNum == 0) { this.Response.Write("删除 zhangsan 失败."); } if (delNum == 1) { this.Response.Write("删除 zhangsan 成功.."); } if (delNum > 1) { this.Response.Write("不应该出现的异常。"); } // 初试化实例后,执行删除,这种方式要执行两个sql. emp = new BP.Port.Emp("abc"); emp.Delete(); #endregion 两种方式的删除。 #region 更新。 emp = new BP.Port.Emp("zhangyifan"); // 事例化它. emp.Name = "张一帆123"; //改变属性. emp.Update(); // 更新它,这个时间BP将会把所有的属性都要执行更新,UPDATA 语句涉及到各个列。 emp = new BP.Port.Emp("fuhui"); // 事例化它. emp.Update("Name", "福慧123"); //仅仅更新这一个属性。.UPDATA 语句涉及到Name列。 #endregion 更新。 }
public string DoAdd(string empNo, string orgNo) { BP.Port.Emp emp = new BP.Port.Emp(); emp.No = empNo; if (emp.RetrieveFromDBSources() == 0) { return("err@管理员增加失败,ID=" + empNo + "不存在用户表,您增加的管理员必须存在与Port_Emp用户表."); } BP.Port.Dept dept = new BP.Port.Dept(); dept.No = orgNo; if (dept.RetrieveFromDBSources() == 0) { return("err@orgNo错误, 不存在 Port_Dept 里面。"); } BP.WF.Port.Inc inc = new BP.WF.Port.Inc(); inc.No = orgNo; if (inc.RetrieveFromDBSources() == 0) { return("err@orgNo错误, 不存在 Port_Inc 里面。"); } //求根目录流程树. BP.WF.Template.FlowSort fsRoot = new BP.WF.Template.FlowSort(); fsRoot.Retrieve(BP.WF.Template.FlowSortAttr.ParentNo, "0"); BP.WF.Template.FlowSort fs = new BP.WF.Template.FlowSort(); fs.No = "Inc" + orgNo; if (fs.RetrieveFromDBSources() == 1) { return("err@该组织已经初始化过流程树目录."); } fs.Name = dept.Name + "-流程树"; fs.ParentNo = fsRoot.No; fs.OrgNo = dept.No; fs.Insert(); //求根目录流程树. BP.Sys.FrmTree frmRoot = new BP.Sys.FrmTree(); frmRoot.Retrieve(BP.WF.Template.FlowSortAttr.ParentNo, "0"); BP.Sys.FrmTree frmTree = new BP.Sys.FrmTree(); frmTree.No = "Inc" + orgNo; if (frmTree.RetrieveFromDBSources() == 1) { return("err@该组织已经初始化过表单树目录."); } frmTree.ParentNo = frmRoot.No; frmTree.Name = dept.Name + "-表单树"; frmTree.OrgNo = dept.No; frmTree.Insert(); AdminEmp ae = new AdminEmp(); ae.No = empNo; if (ae.RetrieveFromDBSources() == 1) { if (ae.IsAdmin == true) { return("err@该管理员已经存在,请删除该管理员重新增加delete from wf_emp where no='" + empNo + "'"); } ae.Delete(); } ae.Copy(emp); ae.UserType = 1; ae.UseSta = 1; ae.RootOfDept = orgNo; ae.RootOfFlow = "Inc" + orgNo; ae.RootOfForm = "Inc" + orgNo; ae.Insert(); return("info@管理员增加成功."); }