/// <summary> /// 运行完一个流程,并返回它的workid. /// </summary> /// <returns></returns> public Int64 RunCompeleteOneWork() { string fk_flow = "024"; string startUser = "******"; BP.Port.Emp starterEmp = new Port.Emp(startUser); Flow fl = new Flow(fk_flow); //让zhanghaicheng登录, 在以后,就可以访问WebUser.No, WebUser.Name 。 BP.WF.Dev2Interface.Port_Login(startUser); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); //执行发送,并获取发送对象,. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //执行第二步 : . BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //执行第三步完成: . BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); return(workid); }
/// <summary> /// 创建一个测试场景,让他跑到结束节点. /// </summary> public Int64 CreateTastCase() { string fk_flow = "088"; string startUser = "******"; BP.Port.Emp starterEmp = new Port.Emp(startUser); Flow fl = new Flow(fk_flow); //让周天娇登录, 在以后,就可以访问WebUser.No, WebUser.Name 。 BP.WF.Dev2Interface.Port_Login(startUser); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); //执行向 分流点 发送, qifenglin接受. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); if (objs.VarAcceptersID != "qifenglin") { throw new Exception("@接受人错误,应当是qifenglin,现在是:" + objs.VarAcceptersID); } //让分流点的发起人登录. BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); //执行向下发送. objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); if (objs.VarAcceptersID != "zhangyifan,zhoushengyu,") { throw new Exception("@接受人错误,应当是zhangyifan,zhoushengyu,现在是:" + objs.VarAcceptersID); } string sql = "SELECT WorkID,FK_Emp FROM WF_GenerWorkerlist WHERE FID=" + workid; DataTable dt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dt.Rows) { Int64 id = Int64.Parse(dr["WorkID"].ToString()); string emp = dr[1].ToString(); BP.WF.Dev2Interface.Port_Login(emp); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, id); } //让qifenglin登录,发到最后一个节点,完成tastcase. BP.WF.Dev2Interface.Port_Login("zhanghaicheng"); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); if (objs.VarAcceptersID != "zhoupeng") { throw new Exception("@接受人错误,应当是zhoupeng,现在是:" + objs.VarAcceptersID); } return(workid); }
public void Test1() { string fk_flow = "024"; string startUser = "******"; BP.Port.Emp starterEmp = new Port.Emp(startUser); Flow fl = new Flow(fk_flow); //让zhanghaicheng登录, 在以后,就可以访问WebUser.No, WebUser.Name 。 BP.WF.Dev2Interface.Port_Login(startUser); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); //执行发送,并获取发送对象,. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //下一个工作者. string nextUser = objs.VarAcceptersID; // 下一个发送的节点ID int nextNodeID = objs.VarToNodeID; // 让 nextUser = zhoupeng 登录. BP.WF.Dev2Interface.Port_Login(nextUser); //获取第二个节点上的退回集合. DataTable dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(objs.VarToNodeID, workid, 0); #region 检查获取第二步退回的节点数据是否符合预期. if (dt.Rows.Count != 1) { throw new Exception("@在第二个节点是获取退回节点集合时,不符合数据预期,应该只能获取一个退回节点,现在是:" + dt.Rows.Count); } int nodeID = int.Parse(dt.Rows[0]["No"].ToString()); if (nodeID != 2401) { throw new Exception("@在第二个节点是获取退回节点集合时,被退回的点应该是2401"); } string RecNo = dt.Rows[0]["Rec"].ToString(); if (RecNo != startUser) { throw new Exception("@在第二个节点是获取退回节点集合时,被退回人应该是" + startUser + ",现在是" + RecNo); } #endregion 检查获取第二步退回的节点数据是否符合预期. //在第二个节点执行退回. BP.WF.Dev2Interface.Node_ReturnWork(fk_flow, workid, 0, objs.VarToNodeID, 2401, "退回测试", false); #region 检查退回后的数据完整性. GenerWorkFlow gwf = new GenerWorkFlow(workid); if (gwf.WFState != WFState.ReturnSta) { throw new Exception("@执行退回,流程状态应该是退回,现在是:" + gwf.WFState.ToString()); } if (gwf.FK_Node != 2401) { throw new Exception("@执行退回,当前节点应该是2401, 现在是" + gwf.FK_Node.ToString()); } //检查流程报表是否符合需求。 sql = "SELECT * FROM " + fl.PTable + " WHERE oid=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@流程报表数据被删除了."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.Title: if (DataType.IsNullOrEmpty(val)) { throw new Exception("@退回后流程标题丢失了"); } break; case GERptAttr.FID: if (val != "0") { throw new Exception("@应当是0"); } break; case GERptAttr.FK_Dept: if (val != starterEmp.FK_Dept) { throw new Exception("@发起人的部门发生了变化,应当是(" + starterEmp.FK_Dept + "),现在是:" + val); } break; case GERptAttr.FK_NY: if (val != DataType.CurrentYearMonth) { throw new Exception("@应当是" + DataType.CurrentYearMonth + ", 现在是:" + val); } break; case GERptAttr.FlowDaySpan: if (val != "0") { throw new Exception("@应当是 0 , 现在是:" + val); } break; //case GERptAttr.FlowEmps: // if (val.Contains("zhanghaicheng") == false || val.Contains("zhoupeng") == false) // throw new Exception("@应当包含的人员,现在不存在, 现在是:" + val); // break; //case GERptAttr.FlowEnder: // if (val != "zhanghaicheng") // throw new Exception("@应当是 zhanghaicheng , 现在是:" + val); // break; case GERptAttr.FlowEnderRDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("@应当是 当前日期, 现在是:" + val); } break; case GERptAttr.FlowEndNode: if (val != "2401") { throw new Exception("@应当是 2401, 现在是:" + val); } break; case GERptAttr.FlowStarter: if (val != startUser) { throw new Exception("@应当是 " + startUser + ", 现在是:" + val); } break; case GERptAttr.FlowStartRDT: if (DataType.IsNullOrEmpty(val)) { throw new Exception("@应当不能为空,现在是:" + val); } break; case GERptAttr.WFState: if (int.Parse(val) != (int)WFState.ReturnSta) { throw new Exception("@应当是 WFState.Complete 现在是" + val); } break; default: break; } } #endregion 检查退回后的数据完整性. }
/// <summary> /// 说明 :此测试针对于演示环境中的 001 流程编写的单元测试代码。 /// 涉及到了: 创建,发送,撤销,方向条件、退回等功能。 /// </summary> public override void Do() { string fk_flow = "001"; string startUser = "******"; BP.Port.Emp starterEmp = new Port.Emp(startUser); Flow fl = new Flow(fk_flow); //让周天娇登录, 在以后,就可以访问WebUser.No, WebUser.Name 。 BP.WF.Dev2Interface.Port_Login(startUser); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, WebUser.No, null, 0, null); //执行发送,并获取发送对象,. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //下一个工作者. string nextUser = objs.VarAcceptersID; // 下一个发送的节点ID int nextNodeID = objs.VarToNodeID; // 让 nextUser = qifenglin 登录. BP.WF.Dev2Interface.Port_Login(nextUser); //获取第二个节点上的退回集合. DataTable dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(objs.VarToNodeID, workid, 0); #region 检查获取第二步退回的节点数据是否符合预期. if (dt.Rows.Count != 1) throw new Exception("@在第二个节点是获取退回节点集合时,不符合数据预期,应该只能获取一个退回节点,现在是:" + dt.Rows.Count); int nodeID = int.Parse(dt.Rows[0]["No"].ToString()); if (nodeID != 101) throw new Exception("@在第二个节点是获取退回节点集合时,被退回的点应该是101"); string RecNo = dt.Rows[0]["Rec"].ToString(); if (RecNo != startUser) throw new Exception("@在第二个节点是获取退回节点集合时,被退回人应该是" + startUser + ",现在是" + RecNo); #endregion 检查获取第二步退回的节点数据是否符合预期. //在第二个节点执行退回. BP.WF.Dev2Interface.Node_ReturnWork(fk_flow, workid,0,objs.VarToNodeID, 101, "退回测试", false); #region 检查退回后的数据完整性. GenerWorkFlow gwf = new GenerWorkFlow(workid); if (gwf.WFState != WFState.ReturnSta) throw new Exception("@执行退回,流程状态应该是退回,现在是:" + gwf.WFState.ToString()); if (gwf.FK_Node != 101) throw new Exception("@执行退回,当前节点应该是101, 现在是" + gwf.FK_Node.ToString()); sql = "SELECT WFState from nd1rpt where oid=" + workid; int wfstate = DBAccess.RunSQLReturnValInt(sql, -1); if (wfstate != (int)WFState.ReturnSta) throw new Exception("@在第二个节点退回后rpt数据不正确,流程状态应该是退回,现在是:" + wfstate); //检查流程报表是否符合需求。 sql = "SELECT * FROM "+fl.PTable+" WHERE oid=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) throw new Exception("@流程报表数据被删除了."); foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.Title: if (string.IsNullOrEmpty(val)) throw new Exception("@退回后流程标题丢失了"); break; case GERptAttr.FID: if (val != "0") throw new Exception("@应当是0"); break; case GERptAttr.FK_Dept: if (val != starterEmp.FK_Dept) throw new Exception("@发起人的部门发生了变化,应当是(" + starterEmp.FK_Dept + "),现在是:" + val); break; case GERptAttr.FK_NY: if (val != DataType.CurrentYearMonth) throw new Exception("@应当是" + DataType.CurrentYearMonth + ", 现在是:" + val); break; case GERptAttr.FlowDaySpan: if (val != "0") throw new Exception("@应当是 0 , 现在是:" + val); break; //case GERptAttr.FlowEmps: // if (val.Contains("zhanghaicheng") == false || val.Contains("zhoupeng") == false) // throw new Exception("@应当包含的人员,现在不存在, 现在是:" + val); // break; //case GERptAttr.FlowEnder: // if (val != "zhanghaicheng") // throw new Exception("@应当是 zhanghaicheng , 现在是:" + val); // break; case GERptAttr.FlowEnderRDT: if (val.Contains(DataType.CurrentData) == false) throw new Exception("@应当是 当前日期, 现在是:" + val); break; case GERptAttr.FlowEndNode: if (val != "101") throw new Exception("@应当是 101, 现在是:" + val); break; case GERptAttr.FlowStarter: if (val != startUser) throw new Exception("@应当是 " + startUser + ", 现在是:" + val); break; case GERptAttr.FlowStartRDT: if (string.IsNullOrEmpty(val)) throw new Exception("@应当不能为空,现在是:" + val); break; case GERptAttr.WFState: if (int.Parse(val) != (int)WFState.ReturnSta) throw new Exception("@应当是 WFState.Complete 现在是" + val); break; default: break; } } #endregion 检查退回后的数据完整性. //让发起人登录,并发送到部门经理审批. BP.WF.Dev2Interface.Port_Login(startUser); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //让第二步骤的qifengin登录并处理它,发送到总经理审批。 BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); Hashtable ht = new Hashtable(); ht.Add("HeJiFeiYong", 999999); //金额大于1w 就让它发送到总经理审批节点上去. objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, ht); // 让zhoupeng登录, 并执行退回. BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); //获取第三个节点上的退回集合. dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(objs.VarToNodeID, workid, 0); #region 检查获取第二步退回的节点数据是否符合预期. if (dt.Rows.Count != 2) throw new Exception("@在第三个节点是获取退回节点集合时,不符合数据预期,应该 获取2个退回节点,现在是:" + dt.Rows.Count); if (dt.Rows[0][0].ToString() != "101") throw new Exception("@应该是101,现在是:" + dt.Rows[0][0].ToString()); if (dt.Rows[1][0].ToString() != "102") throw new Exception("@应该是102,现在是:" + dt.Rows[0][0].ToString()); #endregion 检查获取第二步退回的节点数据是否符合预期. //在第3个节点执行退回. BP.WF.Dev2Interface.Node_ReturnWork(fk_flow, workid, 0, objs.VarToNodeID, 101, "总经理-退回测试", false); #region 检查总经理-退回后的数据完整性. gwf = new GenerWorkFlow(workid); if (gwf.WFState != WFState.ReturnSta) throw new Exception("@执行退回,流程状态应该是退回,现在是:" + gwf.WFState.ToString()); if (gwf.FK_Node != 101) throw new Exception("@执行退回,当前节点应该是101, 现在是" + gwf.FK_Node.ToString()); #endregion 检查退回后的数据完整性. // 让发起人登录, 并执行发送. BP.WF.Dev2Interface.Port_Login(startUser); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); // 让部门经理登录登录, 并执行发送. BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); ht = new Hashtable(); ht.Add("HeJiFeiYong", 999999); objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, ht); //让总经理登录. BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); //执行退回并原路返回. BP.WF.Dev2Interface.Node_ReturnWork(fk_flow, workid,0, objs.VarToNodeID, 101, "总经理-退回并原路返回-测试", true); //让发起人登录, 此人在发起时,应该直接发送给第三个节点的退回人,就是zhoupeng才正确. BP.WF.Dev2Interface.Port_Login(startUser); objs=BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); #region 开始检查数据是否完整. if (objs.VarAcceptersID != "zhoupeng") throw new Exception("@退回并原路返回错误,应该发送给zhoupeng,但是目前发送到了:"+objs.VarAcceptersID); #endregion }
/// <summary> /// 步骤1 让zhoupeng 登录去处理. /// </summary> public void Step2() { //让 zhouepng 登录. BP.WF.Dev2Interface.Port_Login("zhoupeng"); //让他向下发送. objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workID); #region 第1步: 检查发送对象. //从获取的发送对象里获取到下一个工作者. zhangyifan(张一帆)、zhoushengyu(周升雨). if (objs.VarAcceptersID != "zhanghaicheng") { throw new Exception("@下一步的接受人不正确, 应当是: zhanghaicheng.现在是:" + objs.VarAcceptersID); } if (objs.VarToNodeID != 2399) { throw new Exception("@应该是 2399 节点. 现在是:" + objs.VarToNodeID); } if (objs.VarWorkID != workID) { throw new Exception("@主线程的workid不应该变化:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 2302) { throw new Exception("@当前节点的编号不能变化,现在是:" + objs.VarCurrNodeID); } if (objs.VarTreadWorkIDs != null) { throw new Exception("@不应当获得子线程WorkID."); } #endregion 第1步: 检查发送对象. #region 第2步: 检查流程引擎表. //检查待办是否存在。 sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workID + " AND FK_Emp='" + objs.VarAcceptersID + "'"; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@不应该找不到当前人员的待办."); } gwf = new GenerWorkFlow(workID); if (gwf.FK_Dept != starterEmp.FK_Dept) { throw new Exception("@发起人的部门有变化,应当是" + starterEmp.FK_Dept + ",现在是:" + gwf.FK_Dept); } if (gwf.Starter != starterEmp.No) { throw new Exception("@发起人的 No 有变化,应当是" + starterEmp.No + ",现在是:" + gwf.Starter); } //判断当前点. if (gwf.FK_Node != 2399) { throw new Exception("@当前点应该是 2399 现在是:" + gwf.FK_Node); } //判断当前点. if (gwf.FID != 0) { throw new Exception("@当前点应该是 FID=0 现在是:" + gwf.FID); } //判断PWorkID,没有谁调用它,应当是 0. if (gwf.PWorkID != 0) { throw new Exception("@没有谁调用它, 当前点应该是 PWorkID=0 现在是:" + gwf.PWorkID); } //判断 WFState . if (gwf.WFState != WFState.Runing) { throw new Exception("@应当是 WFState=Runing 现在是:" + gwf.WFState.ToString()); } //检查开始节点 发送人的WF_GenerWorkerList 的. gwl = new GenerWorkerList(); gwl.FK_Emp = Web.WebUser.No; gwl.FK_Node = 2302; gwl.WorkID = workID; gwl.Retrieve(); // 没有分合流应当是 0 . if (gwl.FID != 0) { throw new Exception("@没有分合流应当是 0."); } if (gwl.IsEnable == false) { throw new Exception("@应该是启用的状态 "); } if (gwl.IsPass == false) { throw new Exception("@应该是通过的状态 "); } if (gwl.Sender.Contains("zhanghaicheng") == false) { throw new Exception("@应该是 包含当前状态 . "); } //检查接受人的 WF_GenerWorkerList 的. gwl = new GenerWorkerList(); gwl.FK_Emp = objs.VarAcceptersID; gwl.FK_Node = 2399; gwl.WorkID = workID; gwl.Retrieve(); // 没有分合流应当是 0 . if (gwl.FID != 0) { throw new Exception("@没有分合流应当是 0."); } if (gwl.IsEnable == false) { throw new Exception("@应该是启用的状态 "); } if (gwl.IsPass == true) { throw new Exception("@应该是未通过的状态 "); } if (gwl.Sender.Contains(WebUser.No) == false) { throw new Exception("@应该是 当前人发送的,现在是: " + gwl.Sender); } #endregion 第2步: 检查流程引擎表. #region 第3步: 检查节点数据表. sql = "SELECT * FROM ND2301 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到开始节点的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains("zhanghaicheng") == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; case WorkAttr.Rec: if (val != objs.VarAcceptersID) { throw new Exception("应当 Rec=zhanghaicheng,现在是:" + val); } break; //case WorkAttr.Sender: // if (val != "zhanghaicheng") // throw new Exception("应当 Sender= zhanghaicheng,现在是:" + val); // break; default: break; } } //检查节点2的数据. sql = "SELECT * FROM ND2302 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到 ND2302 的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains(WebUser.No) == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; case WorkAttr.Rec: if (val != "zhoupeng") { throw new Exception("应当 Rec= zhoupeng,现在是:" + val); } break; default: break; } } //检查节点3的数据. sql = "SELECT * FROM ND2399 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到 ND2399 的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains("zhanghaicheng") == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; case WorkAttr.Rec: if (val != objs.VarAcceptersID) { throw new Exception("应当 Rec= " + objs.VarAcceptersID + ",现在是:" + val); } break; //case WorkAttr.Sender: // if (val != WebUser.No) // throw new Exception("应当 Sender= " + WebUser.No + ",现在是:" + val); // break; default: break; } } //检查流程表的数据. sql = "SELECT * FROM " + fl.PTable + " WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@流程报表数据被删除了."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.FID: if (val != "0") { throw new Exception("@应当是0"); } break; case GERptAttr.FK_Dept: BP.Port.Emp emp = new Port.Emp("zhanghaicheng"); if (val != emp.FK_Dept) { throw new Exception("@应当是" + emp.FK_Dept + ", 现在是:" + val); } break; case GERptAttr.FK_NY: if (val != DataType.CurrentYearMonth) { throw new Exception("@应当是" + DataType.CurrentYearMonth + ", 现在是:" + val); } break; case GERptAttr.FlowDaySpan: if (val != "0") { throw new Exception("@应当是 0 , 现在是:" + val); } break; case GERptAttr.FlowEmps: if (val.Contains(WebUser.No) == false) { throw new Exception("@应当是包含当前人员, 现在是:" + val); } break; case GERptAttr.FlowEnder: if (val != WebUser.No) { throw new Exception("@应当是 当前人员, 现在是:" + val); } break; case GERptAttr.FlowEnderRDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("@应当是 当前日期, 现在是:" + val); } break; case GERptAttr.FlowEndNode: if (val != "2399") { throw new Exception("@应当是 2399, 现在是:" + val); } break; case GERptAttr.FlowStarter: if (val == WebUser.No) { throw new Exception("@应当是 WebUser.No, 现在是:" + val); } break; case GERptAttr.FlowStartRDT: if (string.IsNullOrEmpty(val)) { throw new Exception("@应当不能为空,现在是:" + val); } break; case GERptAttr.Title: if (string.IsNullOrEmpty(val)) { throw new Exception("@不能为空title" + val); } break; case GERptAttr.WFState: if (int.Parse(val) != (int)WFState.Runing) { throw new Exception("@应当是 WFState.Runing 现在是" + val); } break; default: break; } } #endregion 第3步: 检查节点数据表. }
/// <summary> /// 步骤3 让zhanghaicheng 结束流程. /// </summary> public void Step3() { //让 zhanghaicheng 登录. BP.WF.Dev2Interface.Port_Login("zhanghaicheng"); //让他向下发送. objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workID); #region 第1步: 检查发送对象. //从获取的发送对象里获取到下一个工作者. zhangyifan(张一帆)、zhoushengyu(周升雨). if (objs.VarAcceptersID != null) { throw new Exception("@接受人员应当为空." + objs.VarAcceptersID); } if (objs.VarToNodeID != 0) { throw new Exception("@应当是 0 现在是:" + objs.VarToNodeID); } if (objs.VarWorkID != workID) { throw new Exception("@主线程的workid不应该变化:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 2399) { throw new Exception("@当前节点的编号不能变化,现在是:" + objs.VarCurrNodeID); } if (objs.VarTreadWorkIDs != null) { throw new Exception("@不应当获得子线程WorkID."); } #endregion 第1步: 检查发送对象. #region 第2步: 检查流程引擎表. //检查待办是否存在。 sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@不应该有待办."); } sql = "SELECT * FROM WF_GenerWorkFlow WHERE WorkID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@流程信息未删除."); } sql = "SELECT * FROM WF_GenerWorkerList WHERE WorkID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@工作人员信息未删除.."); } #endregion 第2步: 检查流程引擎表. #region 第3步: 检查节点数据表. sql = "SELECT * FROM ND2301 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到开始节点的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.Title: if (string.IsNullOrEmpty(val)) { throw new Exception("@流程走完后标题丢失了"); } break; case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains(WebUser.No) == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; case WorkAttr.Rec: if (val != "zhanghaicheng") { throw new Exception("应当 Rec=zhanghaicheng,现在是:" + val); } break; //case WorkAttr.Sender: // if (val != "zhanghaicheng") // throw new Exception("应当 Sender= zhanghaicheng,现在是:" + val); // break; default: break; } } //检查节点2的数据. sql = "SELECT * FROM ND2302 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到 ND2302 的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains("zhoupeng") == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.Rec: if (val != "zhoupeng") { throw new Exception("应当 Rec= zhoupeng,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; default: break; } } //检查节点3的数据. sql = "SELECT * FROM ND2399 WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@发起流程出错误,不应该找不到 ND2399 的数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case WorkAttr.CDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("CDT,日期错误."); } break; case WorkAttr.RDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("RDT,日期错误."); } break; case WorkAttr.Emps: if (val.Contains(WebUser.No) == false) { throw new Exception("应当包含当前人员,现在是:" + val); } break; case WorkAttr.FID: if (val != "0") { throw new Exception("应当 = 0,现在是:" + val); } break; case WorkAttr.MyNum: if (val != "1") { throw new Exception("应当 = 1,现在是:" + val); } break; case WorkAttr.Rec: if (val != "zhanghaicheng") { throw new Exception("应当 Rec= zhanghaicheng,现在是:" + val); } break; default: break; } } BP.Port.Emp emp = new Port.Emp("zhanghaicheng"); //检查流程表的数据. sql = "SELECT * FROM " + fl.PTable + " WHERE OID=" + workID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@流程报表数据被删除了."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.FID: if (val != "0") { throw new Exception("@应当是0"); } break; case GERptAttr.FK_Dept: if (val != emp.FK_Dept) { throw new Exception("@发起人的部门发生了变化,应当是(" + emp.FK_Dept + "),现在是:" + val); } break; case GERptAttr.FK_NY: if (val != DataType.CurrentYearMonth) { throw new Exception("@应当是" + DataType.CurrentYearMonth + ", 现在是:" + val); } break; case GERptAttr.FlowDaySpan: if (val != "0") { throw new Exception("@应当是 0 , 现在是:" + val); } break; case GERptAttr.FlowEmps: if (val.Contains("zhanghaicheng") == false || val.Contains("zhoupeng") == false) { throw new Exception("@应当包含的人员,现在不存在, 现在是:" + val); } break; case GERptAttr.FlowEnder: if (val != "zhanghaicheng") { throw new Exception("@应当是 zhanghaicheng , 现在是:" + val); } break; case GERptAttr.FlowEnderRDT: if (val.Contains(DataType.CurrentData) == false) { throw new Exception("@应当是 当前日期, 现在是:" + val); } break; case GERptAttr.FlowEndNode: if (val != "2399") { throw new Exception("@应当是 2399, 现在是:" + val); } break; case GERptAttr.FlowStarter: if (val != "zhanghaicheng") { throw new Exception("@应当是 zhanghaicheng, 现在是:" + val); } break; case GERptAttr.FlowStartRDT: if (string.IsNullOrEmpty(val)) { throw new Exception("@应当不能为空,现在是:" + val); } break; case GERptAttr.Title: if (string.IsNullOrEmpty(val)) { throw new Exception("@不能为空title" + val); } break; case GERptAttr.WFState: if (int.Parse(val) != (int)WFState.Complete) { throw new Exception("@应当是 WFState.Complete 现在是" + val); } break; default: break; } } #endregion 第3步: 检查节点数据表. }
/// <summary> /// 发送测试 /// </summary> public override void Do() { //初始化变量. fk_flow = "023"; userNo = "zhanghaicheng"; fl = new Flow(fk_flow); //执行登录. BP.WF.Dev2Interface.Port_Login(userNo); //执行第1步检查,创建工作与发送. this.workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, userNo, null); //下一步骤的接受人员定义多个. string toEmps = "zhoushengyu,zhangyifan,"; //向发送多个人. objs = BP.WF.Dev2Interface.Node_SendWork(this.fk_flow, this.workid, null, null, 0, toEmps); #region 检查发送变量是否正确? if (objs.VarAcceptersID != toEmps) { throw new Exception("@应该是接受者ID多人,现在是:" + objs.VarAcceptersID); } if (objs.VarAcceptersName != "周升雨,张一帆,") { throw new Exception("@应该是接受者Name多人,现在是:" + objs.VarAcceptersID); } if (objs.VarCurrNodeID != 2301) { throw new Exception("@当前节点应该是 2301 ,现在是:" + objs.VarCurrNodeID); } if (objs.VarToNodeID != 2302) { throw new Exception("@到达节点应该是 2302 ,现在是:" + objs.VarToNodeID); } #endregion 检查发送变量是否正确? #region 检查流程引擎表是否正确? GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = this.workid; if (gwf.RetrieveFromDBSources() != 1) { throw new Exception("@丢失了流程引擎注册表数据"); } if (gwf.FK_Dept != WebUser.FK_Dept) { throw new Exception("@隶属部门错误应当是:" + WebUser.FK_Dept + ",现在是:" + gwf.FK_Dept); } if (gwf.FK_Flow != fk_flow) { throw new Exception("@流程编号错误应当是:" + fk_flow + ",现在是:" + gwf.FK_Flow); } if (gwf.FK_Node != 2302) { throw new Exception("@当前节点错误应当是:" + 2302 + ",现在是:" + gwf.FK_Node); } if (gwf.Starter != userNo) { throw new Exception("@当前 Starter 错误应当是:" + userNo + ",现在是:" + gwf.Starter); } if (gwf.StarterName != WebUser.Name) { throw new Exception("@当前 StarterName 错误应当是:" + WebUser.Name + ",现在是:" + gwf.StarterName); } if (string.IsNullOrEmpty(gwf.Title)) { throw new Exception("@ Title 错误, 不能为空. "); } GenerWorkerLists wls = new GenerWorkerLists(); wls.Retrieve(GenerWorkerListAttr.WorkID, this.workid); if (wls.Count != 3) { throw new Exception("@应当有三个数据,现在是:" + wls.Count); } foreach (GenerWorkerList wl in wls) { if (wl.FID != 0) { throw new Exception("@ FID 错误,应该是" + 0 + ",现在是:" + wl.FID); } if (wl.FK_Emp == "zhanghaicheng") { if (wl.FK_Dept1 != WebUser.FK_Dept) { throw new Exception("@部门错误,应该是" + WebUser.FK_Dept + ",现在是:" + wl.FK_Dept1); } if (wl.FK_Flow != fk_flow) { throw new Exception("@ FK_Flow 错误,应该是" + fk_flow + ",现在是:" + wl.FK_Flow); } if (wl.FK_Node != 2301) { throw new Exception("@ FK_Node 错误,应该是" + 2301 + ",现在是:" + wl.FK_Node); } if (wl.IsEnable == false) { throw new Exception("@ IsEnable 错误,应该是true,现在是:" + wl.IsEnable); } if (wl.IsRead == true) { throw new Exception("@ IsRead 错误,应该是false,现在是:" + wl.IsEnable); } if (wl.IsPass == false) { throw new Exception("@ IsPass 错误,应该是true,现在是:" + wl.IsEnable); } if (wl.Sender != WebUser.No + ",张海成") { throw new Exception("@ Sender 错误,应该是" + WebUser.No + ",张海成 ,现在是:" + wl.Sender); } } if (wl.FK_Emp == "zhoushengyu" || wl.FK_Emp == "zhangyifan") { BP.Port.Emp emp = new Port.Emp(wl.FK_Emp); if (wl.FK_Dept1 != emp.FK_Dept) { throw new Exception("@部门错误,应该是" + emp.FK_Dept + ",现在是:" + wl.FK_Dept1); } if (wl.FK_Flow != fk_flow) { throw new Exception("@ FK_Flow 错误,应该是" + fk_flow + ",现在是:" + wl.FK_Flow); } if (wl.FK_Node != 2302) { throw new Exception("@ FK_Node 错误,应该是" + 2302 + ",现在是:" + wl.FK_Node); } if (wl.IsEnable == false) { throw new Exception("@ IsEnable 错误,应该是true,现在是:" + wl.IsEnable); } if (wl.IsRead == true) { throw new Exception("@ IsRead 错误,应该是false,现在是:" + wl.IsEnable); } if (wl.IsPass == true) { throw new Exception("@ IsPass 错误,应该是false,现在是:" + wl.IsEnable); } if (wl.Sender != "zhanghaicheng") { throw new Exception("@ Sender 错误,应该是" + WebUser.No + ",现在是:" + wl.Sender); } } } string sql = "SELECT COUNT(*) FROM WF_EmpWorks WHERE WorkID=" + this.workid + " AND FK_Emp='zhoushengyu'"; if (DBAccess.RunSQLReturnValInt(sql) != 1) { throw new Exception("@不应该查询不到 zhoushengyu 的待办."); } sql = "SELECT COUNT(*) FROM WF_EmpWorks WHERE WorkID=" + this.workid + " AND FK_Emp='zhangyifan'"; if (DBAccess.RunSQLReturnValInt(sql) != 1) { throw new Exception("@不应该查询不到 zhangyifan 的待办."); } #endregion 检查流程引擎表是否正确? // 让其中的一个人登录. BP.WF.Dev2Interface.Port_Login("zhoushengyu"); //让他发送. BP.WF.Dev2Interface.Node_SendWork(this.fk_flow, this.workid); #region 检查流程引擎表是否正确? sql = "SELECT COUNT(*) FROM WF_EmpWorks WHERE WorkID=" + this.workid + " AND FK_Emp='zhoushengyu'"; if (DBAccess.RunSQLReturnValInt(sql) != 0) { throw new Exception("@不应该在查询到 zhoushengyu 的待办."); } sql = "SELECT COUNT(*) FROM WF_EmpWorks WHERE WorkID=" + this.workid + " AND FK_Emp='zhangyifan'"; if (DBAccess.RunSQLReturnValInt(sql) != 0) { throw new Exception("@不应该在查询到 zhangyifan 的待办."); } #endregion 检查流程引擎表是否正确? //删除该测试数据. BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(this.fk_flow, workid, true); }
/// <summary> /// 执行. /// </summary> public override void Do() { #region 发送 string fk_flow = "005"; string startUser = "******"; BP.Port.Emp starterEmp = new Port.Emp(startUser); Flow fl = new Flow(fk_flow); //让 zhanghaicheng 登录, 在以后,就可以访问WebUser.No, WebUser.Name 。 BP.WF.Dev2Interface.Port_Login(startUser); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); //执行向 分流点 发送, qifenglin接受. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); if (objs.VarAcceptersID != "zhangyifan,zhoushengyu,") { throw new Exception("@接受人错误,应当是zhangyifan,zhoushengyu现在是:" + objs.VarAcceptersID); } #endregion //获得workid. string[] workids = objs.VarTreadWorkIDs.Split(','); Int64 workID1 = Int64.Parse(workids[0]); Int64 workID2 = Int64.Parse(workids[1]); //让一个子线程登录. BP.WF.Dev2Interface.Port_Login("zhangyifan"); //执行退回. string info = BP.WF.Dev2Interface.Node_ReturnWork("005", workID1, workid, 502, 501, startUser, false); #region 检查执行退回是否符合要求。 GenerWorkFlow gwf = new GenerWorkFlow(workID1); if (gwf.WFState != WFState.ReturnSta) { throw new Exception("@子线程的状态应该是退回,现在是:" + gwf.WFStateText); } if (gwf.Starter != "zhanghaicheng") { throw new Exception("@子线程的流程发起人应该是,zhanghaicheng,现在是:" + gwf.Starter); } if (gwf.FK_Node != 501) { throw new Exception("@子线程的当前节点应该是 501,现在是:" + gwf.FK_Node); } //检查是否有待办。 DataTable dt = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable("zhanghaicheng", "005"); bool isHave = false; foreach (DataRow dr in dt.Rows) { if (dr[GenerWorkerListAttr.WorkID].ToString() != workID1.ToString()) { continue; } if (dr[GenerWorkerListAttr.FK_Node].ToString() != "501") { continue; } isHave = true; } if (isHave == false) { throw new Exception("@没有找到合流节点的待办..."); } #endregion 检查执行退回是否符合要求。 }