public void DealWithFHLFlow(ArrayList al, GenerWorkerLists wlSeles) { GenerWorkerLists wls = new GenerWorkerLists(); wls.Retrieve(GenerWorkerListAttr.FID, this.FID); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsEnable=0 WHERE FID=" + this.FID); string emps = ""; string myemp = ""; foreach (Object obj in al) { emps += obj.ToString() + ","; myemp = obj.ToString(); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsEnable=1 WHERE FID=" + this.FID + " AND FK_Emp='" + obj + "'"); } //BP.WF.Node nd = new BP.WF.Node(NodeID); //Work wk = nd.HisWork; //wk.OID = this.WorkID; //wk.Retrieve(); //wk.Emps = emps; //wk.Update(); }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { string sql = "SELECT * FROM WF_GENERWORKFLOW WHERE WFState=2 "; DataTable dt = DBAccess.RunSQLReturnTable(sql); string msg = ""; foreach (DataRow dr in dt.Rows) { Int64 workid = Int64.Parse(dr["WorkID"].ToString()); string todoEmps = dr["TODOEMPS"].ToString(); string nodeID = dr["FK_NODE"].ToString(); GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, workid, GenerWorkerListAttr.IsPass, 0); foreach (GenerWorkerList gwl in gwls) { if (todoEmps.Contains(gwl.FK_Emp + ",") == false) { if (nodeID.ToString().EndsWith("01") == true) { continue; } GenerWorkFlow gwf = new GenerWorkFlow(workid); msg += "<br>@流程:" + gwf.FlowName + "节点:" + gwf.FK_Node + "," + gwf.NodeName + " workid: " + workid + "title:" + gwf.Title + " todoEmps:" + gwf.TodoEmps; msg += "不包含:" + gwl.FK_Emp + "," + gwl.FK_EmpText; gwf.TodoEmps += gwl.FK_Emp + "," + gwl.FK_EmpText + ";"; gwf.Update(); } } } return(msg); }
/// <summary> /// 撤销发送 /// </summary> public void UnSend() { /*撤销发送*/ this.Pub2.AddEasyUiPanelInfoBegin("撤销发送"); //查询是否有权限撤销发送 GenerWorkerLists workerlists = new GenerWorkerLists(); QueryObject info = new QueryObject(workerlists); info.AddWhere(GenerWorkerListAttr.FK_Emp, WebUser.No); info.addAnd(); info.AddWhere(GenerWorkerListAttr.IsPass, "1"); info.addAnd(); info.AddWhere(GenerWorkerListAttr.IsEnable, "1"); info.addAnd(); info.AddWhere(GenerWorkerListAttr.WorkID, this.WorkID); int count = info.DoQuery(); if (count > 0) { this.Pub2.Add("<a href =\"javascript:UnSend('" + this.FK_Flow + "','" + this.WorkID + "','" + FID + "')\" >撤销发送</a>"); } else { this.Pub2.Add("您没有此权限."); } this.Pub2.AddEasyUiPanelInfoEnd(); Pub2.AddBR(); }
public string DoSelfTestInfo() { GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.FK_Flow); #region 查看一下当前的节点是否开始工作节点。 Node nd = new Node(this.FK_Node); if (nd.IsStartNode) { /* 判断是否是退回的节点 */ Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); } #endregion #region 查看一下是否有当前的工作节点信息。 bool isHave = false; foreach (GenerWorkerList wl in wls) { if (wl.FK_Node == this.FK_Node) { isHave = true; } } if (isHave == false) { /* */ return("已经不存在当前的工作节点信息,造成此流程的原因可能是没有捕获的系统异常,建议删除此流程或者交给系统自动修复它。"); } #endregion return("没有发现异常。"); }
public void DealWithPanelFlow(ArrayList al, GenerWorkerLists wlSeles) { // 删除当前非配的工作。 // 已经非配或者自动分配的任务。 GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); int NodeID = gwf.FK_Node; Int64 workId = this.WorkID; //GenerWorkerLists wls = new GenerWorkerLists(this.WorkID,NodeID); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsEnable=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + NodeID); // string vals = ""; string emps = ""; string myemp = ""; foreach (Object obj in al) { emps += obj.ToString() + ","; myemp = obj.ToString(); DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsEnable=1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + NodeID + " AND fk_emp='" + obj + "'"); } BP.WF.Node nd = new BP.WF.Node(NodeID); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); wk.Emps = emps; wk.Update(); }
/// <summary> /// 执行修复 /// </summary> /// <returns></returns> public string DoRepare() { if (this.DoSelfTestInfo() == "没有发现异常。") { return("没有发现异常。"); } string sql = "SELECT FK_Node FROM WF_GenerWorkerlist WHERE WORKID='" + this.WorkID + "' ORDER BY FK_Node desc"; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { /*如果是开始工作节点,就删除它。*/ WorkFlow wf = new WorkFlow(new Flow(this.FK_Flow), this.WorkID, this.FID); wf.DoDeleteWorkFlowByReal(true); return("此流程是因为发起工作失败被系统删除。"); } int FK_Node = int.Parse(dt.Rows[0][0].ToString()); Node nd = new Node(FK_Node); if (nd.IsStartNode) { /*如果是开始工作节点,就删除它。*/ WorkFlow wf = new WorkFlow(new Flow(this.FK_Flow), this.WorkID, this.FID); wf.DoDeleteWorkFlowByReal(true); return("此流程是因为发起工作失败被系统删除。"); } this.FK_Node = nd.NodeID; this.NodeName = nd.Name; this.Update(); string str = ""; GenerWorkerLists wls = new GenerWorkerLists(); wls.Retrieve(GenerWorkerListAttr.FK_Node, FK_Node, GenerWorkerListAttr.WorkID, this.WorkID); foreach (GenerWorkerList wl in wls) { str += wl.FK_Emp + wl.FK_EmpText + ","; } return("此流程是因为[" + nd.Name + "]工作发送失败被回滚到当前位置,请转告[" + str + "]流程修复成功。"); }
protected void Page_Load(object sender, EventArgs e) { this.Pub2.AddFieldSet("流程概况"); Node nd12 = new Node(this.FK_Node); GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, nd12.FK_Flow); Flow fl = new Flow(nd12.FK_Flow); this.Pub2.Add("<Table border=0 wdith=100% align=left>"); this.Pub2.AddTR(); this.Pub2.Add("<TD colspan=1 class=ToolBar >流程名称:" + fl.Name + "</TD>"); this.Pub2.AddTREnd(); Nodes nds = fl.HisNodes; this.Pub2.AddTR(); this.Pub2.Add("<TD colspan=1 class=BigDoc align=left >"); foreach (BP.WF.Node nd in nds) { bool isHave = false; foreach (GenerWorkerList wl in wls) { if (wl.FK_Node == nd.NodeID) { this.Pub2.Add("<font color=green>Step:" + nd.Step + nd.Name); //this.Pub2.Add("<BR>执行人:" + wl.FK_EmpText); this.Pub2.Add("<BR>: <img src='/DataUser/Siganture/" + wl.FK_Emp + ".jpg' border=0 onerror=\"this.src='/DataUser/Siganture/UnName.jpg'\"/>"); this.Pub2.Add("<br>" + wl.RDT + "</font><hr>"); //this.Pub2.Add("<a href='WFRpt.aspx?WorkID=" + wl.WorkID + "&FID=0&FK_Flow=" + this.FK_Flow + "' target=_blank >详细..</a><hr>"); isHave = true; break; } } if (isHave) { continue; } } this.Pub2.AddTDEnd(); this.Pub2.AddTREnd(); this.Pub2.AddTableEnd(); this.Pub2.AddFieldSetEnd(); }
/// <summary> /// 获取节点 /// </summary> /// <returns></returns> private string GetDeliveryNodes() { BP.WF.Node nd = new BP.WF.Node(this.FK_Node); string sql = "SELECT NodeID,Name FROM WF_Node WHERE FK_Flow='" + nd.FK_Flow + "' AND DeliveryWay=" + (int)DeliveryWay.BySelected + " AND DeliveryParas LIKE '%" + nd.NodeID + "%' order by Step"; DataTable dt = DBAccess.RunSQLReturnTable(sql); GenerWorkerLists gwls = new GenerWorkerLists(this.WorkID); //Flow fl = new Flow(nd.FK_Flow); //GERpt rpt = fl.HisGERpt; //rpt.OID = this.WorkID; //rpt.RetrieveFromDBSources(); StringBuilder append = new StringBuilder(); append.Append("["); foreach (DataRow dr in dt.Rows) { BP.WF.Node mynd = new BP.WF.Node(int.Parse(dr["NodeID"].ToString())); if (mynd.IsStartNode) { continue; } if (gwls.IsExits(GenerWorkerListAttr.FK_Node, mynd.NodeID) == true) { continue; } if (append.Length > 1) { append.Append(","); } append.Append("{NodeID:'" + dr["NodeID"] + "',Name:'" + dr["Name"] + "'}"); if (mynd.HisCCRole != CCRole.UnCC) { /*是可以抄送的*/ append.Append(",{NodeID:'" + dr["NodeID"] + "_CC',Name:'阅办'}"); } } append.Append("]"); return(append.ToString()); }
/// <summary> /// 测试案例说明: /// 1, . /// 2, . /// 3,. /// </summary> public override void Do() { //初始化变量. fk_flow = "023"; userNo = "zhanghaicheng"; fl = new Flow(fk_flow); BP.WF.Dev2Interface.Port_Login(userNo); //创建一个工作。 this.workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, userNo, null); Hashtable ht = new Hashtable(); ht.Add(BP.WF.WorkSysFieldAttr.SysSDTOfNode, "2020-12-01 08:00"); //下一个节点完成时间。 ht.Add(BP.WF.WorkSysFieldAttr.SysSDTOfFlow, "2020-12-31 08:00"); //整体流程需要完成的时间。。 objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, this.workID, ht, null, 0, null); #region 检查发送结果是否符合预期. //sql = "SELECT "+GenerWorkFlowAttr.SDTOfFlow+","+GenerWorkFlowAttr.SDTOfNode+" FROM WF_GenerWorkFlow WHERE WorkID="+this.workID; GenerWorkFlow gwf = new GenerWorkFlow(this.workID); if (gwf.SDTOfFlow != "2020-12-31 08:00") { throw new Exception("@没有写入流程应完成时间,现在的应完成时间是:" + gwf.SDTOfFlow); } if (gwf.SDTOfNode != "2020-12-01 08:00") { throw new Exception("@没有写入节点应该完成时间,现在的应完成时间是:" + gwf.SDTOfNode); } GenerWorkerLists gwls = new GenerWorkerLists(this.workID, 2302); foreach (GenerWorkerList gwl in gwls) { if (gwl.SDT != "2020-12-01 08:00") { throw new Exception("@没有写入节点应该应该完成时间."); } } #endregion 检查发送结果是否符合预期. }
/// <summary> /// 每个子线程向下发送 /// </summary> public void Step2_2() { // 让子线程中的一个人 zhoushengyu 登录, 然后执行向下发起, BP.WF.Dev2Interface.Port_Login("zhangyifan"); //获得此人的 005 的待办工作. dt = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable(WebUser.No, WFState.Runing, "005"); if (dt.Rows.Count == 0) { throw new Exception("@不应该获取不到它的待办数据."); } //获取子线程的workID. int threahWorkID = 0; foreach (DataRow dr in dt.Rows) { if (int.Parse(dr["FID"].ToString()) == workid) { threahWorkID = int.Parse(dr["WorkID"].ToString()); break; } } if (threahWorkID == 0) { throw new Exception("@不应当找不到它的待办。"); } // 执行 子线程向合流点发送. Hashtable ht = new Hashtable(); ht.Add("FuWuQi", 100); ht.Add("ShuMaXiangJi", 30);//把数据放里面去,让它保存到子线程的主表,以检查数据是否汇总到合流节点上。 // 执行 子线程向合流点发送. objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, threahWorkID, ht); #region 第1步: 检查发送后的变量. if (objs.VarWorkID != threahWorkID) { throw new Exception("@应当是 VarWorkID=" + threahWorkID + " ,现在是:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 502) { throw new Exception("@应当是 VarCurrNodeID=502 是,现在是:" + objs.VarCurrNodeID); } if (objs.VarToNodeID != 599) { throw new Exception("@应当是 VarToNodeID= 599 是,现在是:" + objs.VarToNodeID); } if (objs.VarAcceptersID != "zhanghaicheng") { throw new Exception("@应当是 VarAcceptersID= zhanghaicheng 是,现在是:" + objs.VarAcceptersID); } #endregion 第1步: 检查发送后的变量. #region 第2步: 检查引擎控制系统表. //先检查干流数据. gwf = new GenerWorkFlow(workid); if (gwf.WFState != WFState.Runing) { throw new Exception("@应当是 Runing, 现在是:" + gwf.WFState); } if (gwf.FID != 0) { throw new Exception("@应当是 0, 现在是:" + gwf.FID); } if (gwf.FK_Node != 599) { throw new Exception("@应当是 599, 现在是:" + gwf.FK_Node); } if (gwf.Starter != "zhanghaicheng") { throw new Exception("@应当是 zhanghaicheng, 现在是:" + gwf.Starter); } // 干流的工作人员表是否有变化? GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, workid); foreach (GenerWorkerList item in gwls) { if (item.FK_Emp != "zhanghaicheng") { throw new Exception("@应当是 zhanghaicheng, 现在是:" + item.FK_Emp); } //如果是开始节点. if (item.FK_Node == 501) { if (item.IsPass == false) { throw new Exception("@pass状态错误了,应该是已通过。"); } } //如果是结束节点. if (item.FK_Node == 599) { //检查子线程完成率. Node nd = new Node(599); if (nd.PassRate > 50) { if (item.IsPassInt != 0) { throw new Exception("@因为完成率大于 50, 现在两个都通过了,所以这合流点上也应该是通过的状态。"); } } else { if (item.IsPassInt != 0) { throw new Exception("@因为小于50,所以只要有一个通过了,主线程的zhanghaicheng 工作人员应该可以看到待办,但是没有查到。 "); } } } } //检查子线程的工作人员列表表。 gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FID, workid); if (gwls.Count != 2) { throw new Exception("@不是期望的两条子线程上的工作人员列表数据."); } foreach (GenerWorkerList item in gwls) { if (item.FK_Emp == "zhoushengyu") { if (item.IsPass == false) { throw new Exception("@此人应该是处理通过了,现在没有通过。"); } } if (item.FK_Emp == "zhangyifan") { if (item.IsPass == false) { throw new Exception("@此人应该是处理通过了,现在没有通过。"); } } } #endregion 第2步: 检查引擎控制系统表. #region 第3步: 检查 节点表单表数据. sql = "SELECT * FROM ND501 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows[0]["Rec"].ToString() != "zhanghaicheng") { throw new Exception("@开始节点的Rec 字段写入错误。"); } //检查节点表单表是否有数据,以及数据是否正确? sql = "SELECT * FROM ND502 WHERE FID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 2) { throw new Exception("@应该在第一个子线程节点上找到两个数据。"); } foreach (DataRow dr in dt.Rows) { if (dr["Rec"].ToString() == "zhangyifan") { continue; } if (dr["Rec"].ToString() == "zhoushengyu") { continue; } throw new Exception("@子线程表单数据没有正确的写入Rec字段."); } //检查参数是否存储到子线程的主表上了? sql = "SELECT * FROM ND502 WHERE OID=" + threahWorkID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@没有找到子线程期望的数据。"); } if (dt.Rows[0]["FuWuQi"].ToString() != "100") { throw new Exception("没有存储到指定的位置."); } if (dt.Rows[0]["ShuMaXiangJi"].ToString() != "30") { throw new Exception("没有存储到指定的位置."); } // 检查汇总的明细表数据是否copy正确? sql = "SELECT * FROM ND599Dtl1 WHERE OID=" + threahWorkID; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@子线程的数据没有copy到汇总的明细表里."); } dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@没有找到子线程期望的数据。"); } if (dt.Rows[0]["FuWuQi"].ToString() != "100") { throw new Exception("没有存储到指定的位置."); } if (dt.Rows[0]["ShuMaXiangJi"].ToString() != "30") { throw new Exception("没有存储到指定的位置."); } //检查报表数据是否正确? sql = "SELECT * FROM ND5Rpt WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows[0][GERptAttr.FlowEnder].ToString() != "zhanghaicheng") { throw new Exception("@应该是 zhanghaicheng 是 FlowEnder ."); } if (dt.Rows[0][GERptAttr.FlowStarter].ToString() != "zhanghaicheng") { throw new Exception("@应该是 zhanghaicheng 是 FlowStarter ."); } if (dt.Rows[0][GERptAttr.FlowEndNode].ToString() != "502") { throw new Exception("@应该是 502 是 FlowEndNode ."); } if (int.Parse(dt.Rows[0][GERptAttr.WFState].ToString()) != (int)WFState.Runing) { throw new Exception("@应该是 WFState.Runing 是 WFState ."); } if (int.Parse(dt.Rows[0][GERptAttr.FID].ToString()) != 0) { throw new Exception("@应该是 FID =0 "); } if (dt.Rows[0]["FK_NY"].ToString() != DataType.CurrentYearMonth) { throw new Exception("@ FK_NY 字段填充错误. "); } #endregion 第3步: 检查 节点表单表数据. }
/// <summary> /// 创建流程,发送分流点第1步. /// </summary> public void Step1() { // 让zhanghaicheng 登录. BP.WF.Dev2Interface.Port_Login(userNo); //创建空白工作, 发起开始节点. workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); #region 检查 创建流程后的数据是否完整 ? // "检查创建这个空白是否有数据完整?; sql = "SELECT * FROM " + fl.PTable + " WHERE OID=" + workid; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@发起流程出错误,不应该找不到报表数据."); } // 检查节点表单表是否有数据?; sql = "SELECT * FROM ND501 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@不应该在开始节点表单表中找不到数据,"); } if (dt.Rows[0]["Rec"].ToString() != WebUser.No) { throw new Exception("@记录人应该是当前人员."); } // 检查创建这个空白是否有数据完整?; sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workid + " AND FK_Emp='" + WebUser.No + "'"; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@找到当前人员的待办就是错误的."); } #endregion 检查发起流程后的数据是否完整? //开始节点:执行发送,并获取发送对象. 主线程向子线程发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); #region 第1步: 检查【开始节点】发送对象返回的信息是否完整? //从获取的发送对象里获取到下一个工作者. zhangyifan(张一帆)、zhoushengyu(周升雨). if (objs.VarAcceptersID != "zhangyifan,zhoushengyu,") { throw new Exception("@下一步的接受人不正确, zhangyifan,zhoushengyu, 现在是:" + objs.VarAcceptersID); } if (objs.VarToNodeID != 502) { throw new Exception("@应该是 502节点. 现在是:" + objs.VarToNodeID); } if (objs.VarWorkID != workid) { throw new Exception("@主线程的workid不应该变化:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 501) { throw new Exception("@当前节点的编号不能变化:" + objs.VarCurrNodeID); } if (objs.VarTreadWorkIDs == null) { throw new Exception("@没有获取到两条子线程ID."); } if (objs.VarTreadWorkIDs.Contains(",") == false) { throw new Exception("@没有获取到两条子线程的WorkID:" + objs.VarTreadWorkIDs); } #endregion 检查【开始节点】发送对象返回的信息是否完整? #region 第2步: 检查流程引擎控制系统表是否符合预期. gwf = new GenerWorkFlow(workid); if (gwf.FK_Node != 501) { throw new Exception("@主线程向子线程发送时,主线程的FK_Node应该不变化,现在:" + gwf.FK_Node); } if (gwf.WFState != WFState.Runing) { throw new Exception("@主线程向子线程发送时,主线程的 WFState 应该 WFState.Runing :" + gwf.WFState.ToString()); } if (gwf.Starter != WebUser.No) { throw new Exception("@应该是发起人员,现在是:" + gwf.Starter); } //找出发起人的工作列表. gwl = new GenerWorkerList(workid, 501, WebUser.No); if (gwl.IsPass == true) { throw new Exception("@干流上的pass状态应该是通过,此人已经没有他的待办工作了."); } //找出子线程上的工作人员. GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkerListAttr.FID, workid); if (gwfs.Count != 2) { throw new Exception("@应该有两个流程注册,现在是:" + gwfs.Count + "个."); } //检查它们的注册数据是否完整. foreach (GenerWorkFlow item in gwfs) { if (item.Starter != WebUser.No) { throw new Exception("@当前的人员应当是发起人,现在是:" + item.Starter); } if (item.FK_Node != 502) { throw new Exception("@当前节点应当是 502 ,现在是:" + item.FK_Node); } if (item.WFState != WFState.Runing) { throw new Exception("@当前 WFState 应当是 Runing ,现在是:" + item.WFState.ToString()); } } //找出子线程工作处理人员的工作列表. GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FID, workid); if (gwls.Count != 2) { throw new Exception("@应该在子线程上查询出来两个待办,现在只有(" + gwls.Count + ")个。"); } //检查子线程的待办完整性. foreach (GenerWorkerList item in gwls) { if (item.IsPass) { throw new Exception("@不应该是已经通过,因为他们没有处理。"); } if (item.IsEnable == false) { throw new Exception("@应该是:IsEnable "); } //if (item.Sender.Contains(WebUser.No) == false) // throw new Exception("@发送人,应该是当前人员。现在是:" + item.Sender); if (item.FK_Flow != "005") { throw new Exception("@应该是 005 现在是:" + item.FK_Flow); } if (item.FK_Node != 502) { throw new Exception("@应该是 502 现在是:" + item.FK_Node); } } //取主线程的待办工作. sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@不应当出现主线程的待办在 WF_EmpWorks 视图中. " + sql); } //取待办子线程的待办工作. sql = "SELECT * FROM WF_EmpWorks WHERE FID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 2) { throw new Exception("@应该取出来两个子线程的 WF_EmpWorks 视图中. " + sql); } #endregion end 检查流程引擎控制系统表是否符合预期. #region 第3步: 检查【开始节点】发送节点表单-数据信息否完整? //检查节点表单表是否有数据? sql = "SELECT * FROM ND501 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@应该找到开始节点表单数据,但是没有。"); } if (dt.Rows[0]["Rec"].ToString() != WebUser.No) { throw new Exception("@没有向主线程开始节点表里写入Rec字段,现在是:" + dt.Rows[0]["Rec"].ToString() + "应当是:" + WebUser.No); } //检查节点表单表是否有数据,以及数据是否正确? sql = "SELECT * FROM ND502 WHERE FID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 2) { throw new Exception("@应该在第一个子线程节点上找到两个数据。"); } foreach (DataRow dr in dt.Rows) { if (dr["Rec"].ToString() == "zhangyifan") { continue; } if (dr["Rec"].ToString() == "zhoushengyu") { continue; } throw new Exception("@子线程表单数据没有正确的写入Rec字段."); } sql = "SELECT * FROM ND5Rpt WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows[0][GERptAttr.FlowEnder].ToString() != "zhanghaicheng") { throw new Exception("@应该是 zhanghaicheng 是 FlowEnder ."); } if (dt.Rows[0][GERptAttr.FlowStarter].ToString() != "zhanghaicheng") { throw new Exception("@应该是 zhanghaicheng 是 FlowStarter ."); } if (dt.Rows[0][GERptAttr.FlowEndNode].ToString() != "502") { throw new Exception("@应该是 502 是 FlowEndNode ."); } if (int.Parse(dt.Rows[0][GERptAttr.WFState].ToString()) != (int)WFState.Runing) { throw new Exception("@应该是 WFState.Runing 是当前的状态。"); } if (int.Parse(dt.Rows[0][GERptAttr.FID].ToString()) != 0) { throw new Exception("@应该是 FID =0 "); } if (dt.Rows[0]["FK_NY"].ToString() != DataType.CurrentYearMonth) { throw new Exception("@ FK_NY 字段填充错误. "); } #endregion 检查【开始节点】发送数据信息否完整? }
/// <summary> /// 时间轴 /// </summary> /// <returns></returns> public string TimeBase_Init() { DataSet ds = new DataSet(); //获取track. DataTable dt = BP.WF.Dev2Interface.DB_GenerTrackTable(this.FK_Flow, this.WorkID, this.FID); ds.Tables.Add(dt); #region 父子流程数据存储到这里. Hashtable ht = new Hashtable(); foreach (DataRow dr in dt.Rows) { ActionType at = (ActionType)int.Parse(dr[TrackAttr.ActionType].ToString()); string tag = dr[TrackAttr.Tag].ToString(); //标识. string mypk = dr[TrackAttr.MyPK].ToString(); //主键. string msg = ""; if (at == ActionType.CallChildenFlow) { //被调用父流程吊起。 if (DataType.IsNullOrEmpty(tag) == false) { AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("PWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程{" + mygwf.FlowName + "},<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a></p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程调用{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } msg = "<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a>"; } //放入到ht里面. ht.Add(mypk, msg); } if (at == ActionType.StartChildenFlow) { if (DataType.IsNullOrEmpty(tag) == false) { if (tag.Contains("Sub")) { tag = tag.Replace("Sub", "C"); } AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("CWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "}, <a target=b" + ap.GetValStrByKey("CWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("CWorkID") + "&FK_Flow=" + ap.GetValStrByKey("CFlowNo") + "' >" + msg + "</a></p>"; msg += "<p>当前子流程状态:{" + mygwf.WFStateText + "},运转到:{" + mygwf.NodeName + "},最后处理人{" + mygwf.TodoEmps + "},最后处理时间{" + mygwf.RDT + "}。</p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } } //放入到ht里面. ht.Add(mypk, msg); } } #endregion //获取 WF_GenerWorkFlow GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = this.WorkID; gwf.RetrieveFromDBSources(); ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); if (gwf.WFState != WFState.Complete) { GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID); ds.Tables.Add(gwls.ToDataTableField("WF_GenerWorkerList")); } //把节点审核配置信息. FrmWorkCheck fwc = new FrmWorkCheck(gwf.FK_Node); ds.Tables.Add(fwc.ToDataTableField("FrmWorkCheck")); //返回结果. return(BP.Tools.Json.DataSetToJson(ds, false)); }
/// <summary> /// 获取流程的JSON数据,以供显示工作轨迹/流程设计 /// </summary> /// <param name="fk_flow">流程编号</param> /// <param name="workid">工作编号</param> /// <param name="fid">父流程编号</param> /// <returns></returns> public string Chart_Init() { string fk_flow = this.FK_Flow; Int64 workid = this.WorkID; Int64 fid = this.FID; DataSet ds = new DataSet(); DataTable dt = null; string json = string.Empty; try { //获取流程信息 var sql = "SELECT No \"No\", Name \"Name\", Paras \"Paras\", ChartType \"ChartType\" FROM WF_Flow WHERE No='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Flow"; ds.Tables.Add(dt); //获取流程中的节点信息 sql = "SELECT NodeID \"ID\", Name \"Name\", ICON \"Icon\", X \"X\", Y \"Y\", NodePosType \"NodePosType\",RunModel \"RunModel\",HisToNDs \"HisToNDs\",TodolistModel \"TodolistModel\" FROM WF_Node WHERE FK_Flow='" + fk_flow + "' ORDER BY Step"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Node"; ds.Tables.Add(dt); //获取流程中的标签信息 sql = "SELECT MyPK \"MyPK\", Name \"Name\", X \"X\", Y \"Y\" FROM WF_LabNote WHERE FK_Flow='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_LabNote"; ds.Tables.Add(dt); //获取流程中的线段方向信息 sql = "SELECT Node \"Node\", ToNode \"ToNode\", 0 as \"DirType\", 0 as \"IsCanBack\",Dots \"Dots\" FROM WF_Direction WHERE FK_Flow='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Direction"; ds.Tables.Add(dt); if (workid != 0) { //获取流程信息,added by liuxc,2016-10-26 //sql = // "SELECT wgwf.Starter,wgwf.StarterName,wgwf.RDT,wgwf.WFSta,wgwf.WFState FROM WF_GenerWorkFlow wgwf WHERE wgwf.WorkID = " + // workid; sql = "SELECT wgwf.Starter as \"Starter\"," + " wgwf.StarterName as \"StarterName\"," + " wgwf.RDT as \"RDT\"," + " wgwf.WFSta as \"WFSta\"," + " se.Lab as \"WFStaText\"," + " wgwf.WFState as \"WFState\"," + " wgwf.FID as \"FID\"," + " wgwf.PWorkID as \"PWorkID\"," + " wgwf.PFlowNo as \"PFlowNo\"," + " wgwf.PNodeID as \"PNodeID\"," + " wgwf.FK_Flow as \"FK_Flow\"," + " wgwf.FK_Node as \"FK_Node\"," + " wgwf.Title as \"Title\"," + " wgwf.WorkID as \"WorkID\"," + " wgwf.NodeName as \"NodeName\"," + " wf.Name as \"FlowName\"" + " FROM WF_GenerWorkFlow wgwf" + " INNER JOIN WF_Flow wf" + " ON wf.No = wgwf.FK_Flow" + " INNER JOIN Sys_Enum se" + " ON se.IntKey = wgwf.WFSta" + " AND se.EnumKey = 'WFSta'" + " WHERE wgwf.WorkID = {0}" + " OR wgwf.FID = {0}" + " OR wgwf.PWorkID = {0}" + " ORDER BY" + " wgwf.RDT DESC"; dt = DBAccess.RunSQLReturnTable(string.Format(sql, workid)); dt.TableName = "FlowInfo"; ds.Tables.Add(dt); //获得流程状态. WFState wfState = (WFState)int.Parse(dt.Rows[0]["WFState"].ToString()); String fk_Node = dt.Rows[0]["FK_Node"].ToString(); //把节点审核配置信息. FrmWorkCheck fwc = new FrmWorkCheck(fk_Node); ds.Tables.Add(fwc.ToDataTableField("FrmWorkCheck")); //获取工作轨迹信息 var trackTable = "ND" + int.Parse(fk_flow) + "Track"; sql = "SELECT FID \"FID\",NDFrom \"NDFrom\",NDFromT \"NDFromT\",NDTo \"NDTo\", NDToT \"NDToT\", ActionType \"ActionType\",ActionTypeText \"ActionTypeText\",Msg \"Msg\",RDT \"RDT\",EmpFrom \"EmpFrom\",EmpFromT \"EmpFromT\", EmpToT \"EmpToT\",EmpTo \"EmpTo\" FROM " + trackTable + " WHERE WorkID=" + workid + (fid == 0 ? (" OR FID=" + workid) : (" OR WorkID=" + fid + " OR FID=" + fid)) + " ORDER BY RDT ASC"; dt = DBAccess.RunSQLReturnTable(sql); //判断轨迹数据中,最后一步是否是撤销或退回状态的,如果是,则删除最后2条数据 if (dt.Rows.Count > 0) { if (Equals(dt.Rows[0]["ACTIONTYPE"], (int)ActionType.Return) || Equals(dt.Rows[0]["ACTIONTYPE"], (int)ActionType.UnSend)) { if (dt.Rows.Count > 1) { dt.Rows.RemoveAt(0); dt.Rows.RemoveAt(0); } else { dt.Rows.RemoveAt(0); } } } dt.TableName = "Track"; ds.Tables.Add(dt); //获取预先计算的节点处理人,以及处理时间,added by liuxc,2016-4-15 sql = "SELECT wsa.FK_Node as \"FK_Node\",wsa.FK_Emp as \"FK_Emp\",wsa.EmpName as \"EmpName\",wsa.TimeLimit as \"TimeLimit\",wsa.TSpanHour as \"TSpanHour\",wsa.ADT as \"ADT\",wsa.SDT as \"SDT\" FROM WF_SelectAccper wsa WHERE wsa.WorkID = " + workid; dt = DBAccess.RunSQLReturnTable(sql); // dt.TableName = "POSSIBLE"; dt.TableName = "Possible"; ds.Tables.Add(dt); //获取节点处理人数据,及处理/查看信息 sql = "SELECT wgw.FK_Emp as \"FK_Emp\",wgw.FK_Node as \"FK_Node\",wgw.FK_EmpText as \"FK_EmpText\",wgw.RDT as \"RDT\",wgw.IsRead as \"IsRead\",wgw.IsPass as \"IsPass\" FROM WF_GenerWorkerlist wgw WHERE wgw.WorkID = " + workid + (fid == 0 ? (" OR FID=" + workid) : (" OR WorkID=" + fid + " OR FID=" + fid)); dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "DISPOSE"; ds.Tables.Add(dt); //如果流程没有完成. if (wfState != WFState.Complete) { GenerWorkerLists gwls = new GenerWorkerLists(); Int64 id = this.FID; if (id == 0) { id = this.WorkID; } QueryObject qo = new QueryObject(gwls); qo.AddWhere(GenerWorkerListAttr.FID, id); qo.addOr(); qo.AddWhere(GenerWorkerListAttr.WorkID, id); qo.DoQuery(); DataTable dtGwls = gwls.ToDataTableField("WF_GenerWorkerList"); ds.Tables.Add(dtGwls); } } else { var trackTable = "ND" + int.Parse(fk_flow) + "Track"; sql = "SELECT NDFrom \"NDFrom\", NDTo \"NDTo\",ActionType \"ActionType\",ActionTypeText \"ActionTypeText\",Msg \"Msg\",RDT \"RDT\",EmpFrom \"EmpFrom\",EmpFromT \"EmpFromT\",EmpToT \"EmpToT\",EmpTo \"EmpTo\" FROM " + trackTable + " WHERE WorkID=0 ORDER BY RDT ASC"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "TRACK"; ds.Tables.Add(dt); } //for (int i = 0; i < ds.Tables.Count; i++) //{ // dt = ds.Tables[i]; // dt.TableName = dt.TableName.ToUpper(); // for (int j = 0; j < dt.Columns.Count; j++) // { // dt.Columns[j].ColumnName = dt.Columns[j].ColumnName.ToUpper(); // } //} string str = BP.Tools.Json.DataSetToJson(ds); // DataType.WriteFile("c:\\GetFlowTrackJsonData_CCflow.txt", str); return(str); } catch (Exception ex) { return("err@" + ex.Message); } return(json); }
/// <summary> /// 测试子流程只有一个人 /// </summary> private void Test1() { string fk_flow = "023"; string userNo = "zhanghaicheng"; Flow fl = new Flow(fk_flow); // zhanghaicheng 登录. BP.WF.Dev2Interface.Port_Login(userNo); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); //创建第一个子流程,调用只有一个人的接口. Emp empSubFlowStarter = new Emp("zhoupeng"); Int64 subFlowWorkID = BP.WF.Dev2Interface.Node_CreateStartNodeWork("024", null, null, empSubFlowStarter.No, "子流程发起测试", workid, "023", 0); #region 检查发起的子流程 流程引擎表 是否完整? GenerWorkFlow gwf = new GenerWorkFlow(subFlowWorkID); if (gwf.PFlowNo != "023") { throw new Exception("@父流程编号错误,应当是023现在是" + gwf.PFlowNo); } if (gwf.PWorkID != workid) { throw new Exception("@父流程WorkID错误,应当是" + workid + "现在是" + gwf.PWorkID); } if (gwf.Starter != empSubFlowStarter.No) { throw new Exception("@流程发起人编号错误,应当是" + empSubFlowStarter.No + "现在是" + gwf.Starter); } if (gwf.StarterName != empSubFlowStarter.Name) { throw new Exception("@流程发起人 Name 错误,应当是" + empSubFlowStarter.Name + "现在是" + gwf.StarterName); } if (gwf.FK_Dept != empSubFlowStarter.FK_Dept) { throw new Exception("@流程隶属部门错误,应当是" + empSubFlowStarter.FK_Dept + "现在是" + gwf.FK_Dept); } if (gwf.Title != "子流程发起测试") { throw new Exception("@流程标题 子流程发起测试 错误,应当是 子流程发起测试 现在是" + gwf.Title); } if (gwf.WFState != WFState.Runing) { throw new Exception("@流程 WFState 错误,应当是 Runing 现在是" + gwf.WFState); } if (gwf.FID != 0) { throw new Exception("@FID错误,应当是0现在是" + gwf.FID); } if (gwf.FK_Flow != "024") { throw new Exception("@FK_Flow错误,应当是024现在是" + gwf.FK_Flow); } if (gwf.FK_Node != 2401) { throw new Exception("@停留的当前节点错误,应当是2401现在是" + gwf.FK_Flow); } GenerWorkerLists gwls = new GenerWorkerLists(subFlowWorkID, 2401); if (gwls.Count != 1) { throw new Exception("@待办列表个数应当1,现在是" + gwls.Count); } // 检查发起人列表是否完整? GenerWorkerList gwl = (GenerWorkerList)gwls[0]; if (gwl.FK_Emp != empSubFlowStarter.No) { throw new Exception("@处理人错误,现在是:" + empSubFlowStarter.No); } if (gwl.IsPassInt != 0) { throw new Exception("@通过状态应当是未通过,现在是:" + gwl.IsPassInt); } if (gwl.FID != 0) { throw new Exception("@流程ID 应当是0 ,现在是:" + gwl.FID); } if (gwl.FK_EmpText != empSubFlowStarter.Name) { throw new Exception("@FK_EmpText 错误, 现在是:" + gwl.FK_EmpText); } #endregion 检查发起的子流程 流程引擎表 是否完整? #region 检查发起的子流程数据是否完整? //检查报表数据是否完整? sql = "SELECT * FROM ND24Rpt WHERE OID=" + subFlowWorkID; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { 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 != empSubFlowStarter.FK_Dept) { throw new Exception("@应当是" + empSubFlowStarter.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(empSubFlowStarter.No) == false) { throw new Exception("@应当是包含当前人员, 现在是:" + val); } break; case GERptAttr.FlowEnder: if (val != empSubFlowStarter.No) { throw new Exception("@应当是 empSubFlowStarter.No, 现在是:" + 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 != empSubFlowStarter.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: WFState sta = (WFState)int.Parse(val); if (sta != WFState.Runing) { throw new Exception("@应当是 WFState.Runing 现在是" + sta.ToString()); } break; default: break; } } #endregion 检查是否完整? // 测试以子流程向下发送,是否成功? BP.WF.Dev2Interface.Port_Login(empSubFlowStarter.No); objs = BP.WF.Dev2Interface.Node_SendWork("024", subFlowWorkID); if (objs.VarToNodeID != 2402) { throw new Exception("@子流程向下发送时不成功."); } }
/// <summary> /// 获取可操作状态信息 /// </summary> /// <returns></returns> public string OP_GetStatus() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); Hashtable ht = new Hashtable(); string json = "{"; bool isCan; #region 文件打印的权限判断,这里为天业集团做的特殊判断,现实的应用中,都可以打印. bool CanPackUp = false; if (SystemConfig.CustomerNo == "TianYe") { bool isAdmin = false; if (BP.Web.WebUser.No == "admin") { isAdmin = true; } // if (BP.Web.WebUser.No == "admin" || BP.Web.WebUser.IsAdmin == true) // 判断是否可以打印. //string sql = "SELECT NDFrom,NDFromT,EmpFrom FROM ND" + int.Parse(this.FK_Flow) + "Track WHERE WorkID=" + this.WorkID + " AND (EmpFrom='" + BP.Web.WebUser.No + "' OR EmpTo='" + BP.Web.WebUser.No + "') "; string sql = "SELECT Distinct NDFrom, EmpFrom FROM ND" + int.Parse(this.FK_Flow) + "Track WHERE WorkID=" + this.WorkID; DataTable dt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dt.Rows) { //判断节点是否启用了按钮? int nodeid = int.Parse(dr[0].ToString()); BtnLab btn = new BtnLab(nodeid); if (btn.PrintPDFEnable == true || btn.PrintZipEnable == true) { string empFrom = dr[1].ToString(); if (isAdmin == true || BP.Web.WebUser.No == empFrom || gwf.Starter == WebUser.No) { CanPackUp = true; break; } } } } else { CanPackUp = true; } #endregion 文件打印的权限判断,这里为天业集团做的特殊判断,现实的应用中,都可以打印. ht.Add("CanPackUp", CanPackUp.ToString().ToLower()); //是否可以打印. switch (gwf.WFState) { case WFState.Runing: /* 运行时*/ /*删除流程.*/ isCan = BP.WF.Dev2Interface.Flow_IsCanDeleteFlowInstance(this.FK_Flow, this.WorkID, WebUser.No); ht.Add("CanFlowOverByCoercion", isCan.ToString().ToLower()); /*取回审批*/ isCan = false; string para = ""; string sql = "SELECT NodeID FROM WF_Node WHERE CheckNodes LIKE '%" + gwf.FK_Node + "%'"; int myNode = DBAccess.RunSQLReturnValInt(sql, 0); if (myNode != 0) { GetTask gt = new GetTask(myNode); if (gt.Can_I_Do_It()) { isCan = true; ht.Add("TackBackFromNode", gwf.FK_Node); ht.Add("TackBackToNode", myNode); } } ht.Add("CanTackBack", isCan.ToString().ToLower()); /*撤销发送*/ GenerWorkerLists workerlists = new GenerWorkerLists(); QueryObject info = new QueryObject(workerlists); info.AddWhere(GenerWorkerListAttr.FK_Emp, WebUser.No); info.addAnd(); info.AddWhere(GenerWorkerListAttr.IsPass, "1"); info.addAnd(); info.AddWhere(GenerWorkerListAttr.IsEnable, "1"); info.addAnd(); info.AddWhere(GenerWorkerListAttr.WorkID, this.WorkID); isCan = info.DoQuery() > 0; ht.Add("CanUnSend", isCan.ToString().ToLower()); break; case WFState.Complete: // 完成. case WFState.Delete: // 逻辑删除.. /*恢复使用流程*/ isCan = WebUser.No == "admin"; ht.Add("CanRollBack", isCan.ToString().ToLower()); //判断是否可以打印. break; case WFState.HungUp: // 挂起. /*撤销挂起*/ isCan = BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(FK_Flow, FK_Node, WorkID, WebUser.No); ht.Add("CanUnHungUp", isCan.ToString().ToLower()); break; default: break; } return(BP.Tools.Json.ToJson(ht)); //return json + "}"; }
/// <summary> /// 创建流程,发送分流点第1步. /// </summary> public void Step1() { // 让zhoupeng 登录. BP.WF.Dev2Interface.Port_Login(userNo); //创建空白工作, 发起开始节点. workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, WebUser.No, null, 0, null); #region 检查 创建流程后的数据是否完整 ? // "检查创建这个空白是否有数据完整?; sql = "SELECT * FROM " + fl.PTable + " WHERE OID=" + workid; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@发起流程出错误,不应该找不到报表数据."); } // 检查节点表单表是否有数据?; sql = "SELECT * FROM ND901 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@不应该在开始节点表单表中找不到数据,"); } if (dt.Rows[0]["Rec"].ToString() != WebUser.No) { throw new Exception("@记录人应该是当前人员."); } // 检查创建这个空白是否有数据完整?; sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workid + " AND FK_Emp='" + WebUser.No + "'"; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@找到当前人员的待办就是错误的."); } #endregion 检查发起流程后的数据是否完整? //组织参数. Hashtable ht = new Hashtable(); ht.Add("KeFuBu", 1); ht.Add("ShiChangBu", 1); ht.Add("YanFaBu", 1); //开始节点:执行发送,并获取发送对象. 主线程向子线程发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, ht); #region 第1步: 检查【开始节点】发送对象返回的信息是否完整? //从获取的发送对象里获取到下一个工作者: zhanghaicheng,qifenglin,guoxiangbin . if (objs.VarAcceptersID != "zhanghaicheng,qifenglin,guoxiangbin,") { throw new Exception("@下一步的接受人不正确, zhanghaicheng,qifenglin,guoxiangbin, .现在是:" + objs.VarAcceptersID); } if (objs.VarToNodeID != 901) { throw new Exception("@应该是 901节点. 现在是:" + objs.VarToNodeID); } if (objs.VarWorkID != workid) { throw new Exception("@主线程的workid不应该变化:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 901) { throw new Exception("@当前节点的编号不能变化:" + objs.VarCurrNodeID); } if (objs.VarTreadWorkIDs == null) { throw new Exception("@没有获取到三条子线程ID."); } if (objs.VarTreadWorkIDs.Contains(",") == false) { throw new Exception("@没有获取到三条子线程的WorkID:" + objs.VarTreadWorkIDs); } #endregion 检查【开始节点】发送对象返回的信息是否完整? #region 第2步: 检查流程引擎控制系统表是否符合预期. gwf = new GenerWorkFlow(workid); if (gwf.FK_Node != 901) { throw new Exception("@主线程向子线程发送时,主线程的FK_Node应该不变化,现在:" + gwf.FK_Node); } if (gwf.WFState != WFState.Runing) { throw new Exception("@主线程向子线程发送时,主线程的 WFState 应该 WFState.Runing :" + gwf.WFState.ToString()); } if (gwf.Starter != WebUser.No) { throw new Exception("@应该是发起人员,现在是:" + gwf.Starter); } //找出发起人的工作列表. gwl = new GenerWorkerList(workid, 901, WebUser.No); if (gwl.IsPass == true) { throw new Exception("@干流上的pass状态应该是通过,此人已经没有他的待办工作了."); } //找出子线程上的工作人员. GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkerListAttr.FID, workid); if (gwfs.Count != 3) { throw new Exception("@应该有两个流程注册,现在是:" + gwfs.Count + "个."); } //检查它们的注册数据是否完整. foreach (GenerWorkFlow item in gwfs) { if (item.Starter != WebUser.No) { throw new Exception("@当前的人员应当是发起人,现在是:" + item.Starter); } //Node nd = new Node(item.FK_Node); //if (nd.iss //if (item.FK_Node == 901) // throw new Exception("@当前节点应当是 902 ,现在是:" + item.FK_Node); if (item.WFState != WFState.Runing) { throw new Exception("@当前 WFState 应当是 Runing ,现在是:" + item.WFState.ToString()); } } //找出子线程工作处理人员的工作列表. GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FID, workid); if (gwls.Count != 3) { throw new Exception("@应该在子线程上查询出来 3 个待办,现在只有(" + gwls.Count + ")个。"); } //检查子线程的待办完整性. foreach (GenerWorkerList item in gwls) { if (item.IsPass) { throw new Exception("@不应该是已经通过,因为他们没有处理。"); } if (item.IsEnable == false) { throw new Exception("@应该是:IsEnable "); } if (item.Sender.Contains(WebUser.No) == false) { throw new Exception("@发送人,应该是当前人员。现在是:" + item.Sender); } if (item.FK_Flow != "009") { throw new Exception("@应该是 009 现在是:" + item.FK_Flow); } //if (item.FK_Node != 902) // throw new Exception("@应该是 902 现在是:" + item.FK_Node); } //取主线程的待办工作. sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@不应当出现主线程的待办在 WF_EmpWorks 视图中. " + sql); } //取待办子线程的待办工作. sql = "SELECT * FROM WF_EmpWorks WHERE FID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 3) { throw new Exception("@应该取出来两个子线程的 WF_EmpWorks 视图中. " + sql); } #endregion end 检查流程引擎控制系统表是否符合预期. #region 第3步: 检查【开始节点】发送节点表单-数据信息否完整? //检查节点表单表是否有数据? sql = "SELECT * FROM ND901 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@应该找到开始节点表单数据,但是没有。"); } if (dt.Rows[0]["Rec"].ToString() != WebUser.No) { throw new Exception("@没有向主线程开始节点表里写入Rec字段,现在是:" + dt.Rows[0]["Rec"].ToString() + "应当是:" + WebUser.No); } //找出子线程工作处理人员的工作列表. gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FID, workid); //检查子线程节点数据表是否正确。 foreach (GenerWorkerList item in gwls) { sql = "SELECT * FROM ND" + item.FK_Node + " WHERE OID=" + item.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.FID: if (val != workid.ToString()) { throw new Exception("@不应当不等于workid."); } break; case WorkAttr.Rec: if (val != item.FK_Emp) { throw new Exception("@不应当不等于:" + item.FK_Emp); } break; case WorkAttr.MyNum: if (string.IsNullOrEmpty(val)) { throw new Exception("@不应当为空:" + dc.ColumnName); } break; case WorkAttr.RDT: if (string.IsNullOrEmpty(val)) { throw new Exception("@ RDT 不应当为空:" + dc.ColumnName); } break; case WorkAttr.CDT: if (string.IsNullOrEmpty(val)) { throw new Exception("@ CDT 不应当为空:" + dc.ColumnName); } break; case WorkAttr.Emps: if (string.IsNullOrEmpty(val) || val.Contains(WebUser.No) == false) { throw new Exception("@ Emps 不应当为空,或者不包含发起人。"); } break; default: break; } //结束列的col判断。 } } // 检查报表数据是否完整。 sql = "SELECT * FROM ND9Rpt WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); foreach (DataColumn dc in dt.Rows) { string val = (string)dt.Rows[0][dc.ColumnName]; switch (dc.ColumnName) { case GERptAttr.FID: if (int.Parse(val) != 0) { throw new Exception("@应该是 FID =0 "); } break; case GERptAttr.FK_Dept: if (val != WebUser.FK_Dept) { throw new Exception("@ FK_Dept 字段填充错误,应当是:" + WebUser.FK_Dept + ",现在是:" + val); } break; case GERptAttr.FK_NY: if (val != DataType.CurrentYearMonth) { throw new Exception("@ FK_NY 字段填充错误. "); } break; case GERptAttr.FlowDaySpan: if (val != "0") { throw new Exception("@ FlowDaySpan 应当是 0 . "); } break; case GERptAttr.FlowEmps: if (val.Contains(WebUser.No) == false) { throw new Exception("@ 应该包含 zhoupeng , 现在是: " + val); } break; case GERptAttr.FlowEnder: if (val != "zhoupeng") { throw new Exception("@应该是 zhoupeng 是 FlowEnder ."); } break; case GERptAttr.FlowEnderRDT: break; case GERptAttr.FlowEndNode: if (val != "901") { throw new Exception("@应该是 901 是 FlowEndNode ."); } break; case GERptAttr.FlowStarter: if (val != "zhoupeng") { throw new Exception("@应该是 zhoupeng 是 FlowStarter ."); } break; case GERptAttr.MyNum: if (val != "1") { throw new Exception("@ MyNum 应当是1 . "); } break; case GERptAttr.PFlowNo: if (val != "") { throw new Exception("@ PFlowNo 应当是 '' 现在是:" + val); } break; case GERptAttr.PWorkID: if (val != "0") { throw new Exception("@ PWorkID 应当是 '0' 现在是:" + 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 是当前的状态。"); } break; default: break; } } #endregion 检查【开始节点】发送数据信息否完整? }
/// <summary> /// 让子线程中的一个人 zhoushengyu 登录, 然后执行向下发起. /// 检查业务逻辑是否正确? /// </summary> public void Step2_1() { //子线程中的接受人员, 分别是 zhanghaicheng,qifenglin,guoxiangbin // 让子线程中的一个人 zhanghaicheng 登录, 然后执行向下发起, BP.WF.Dev2Interface.Port_Login("zhanghaicheng"); //获得此人的 009 的待办工作. dt = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable(WebUser.No, WFState.Runing, "009"); if (dt.Rows.Count == 0) { throw new Exception("@不应该获取不到它的待办数据."); } //获取子线程的workID. int threahWorkID = 0; foreach (DataRow dr in dt.Rows) { if (int.Parse(dr["FID"].ToString()) == workid) { threahWorkID = int.Parse(dr["WorkID"].ToString()); break; } } if (threahWorkID == 0) { throw new Exception("@不应当找不到它的待办。"); } // 执行 子线程向合流点发送. Hashtable ht = new Hashtable(); ht.Add("XianYouRenShu", 90); ht.Add("XinZengRenShu", 20);//把数据放里面去,让它保存到子线程的主表,以检查数据是否汇总到合流节点上。 objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, threahWorkID, ht); #region 第1步: 检查发送后的变量. if (objs.VarWorkID != threahWorkID) { throw new Exception("@应当是 VarWorkID=" + threahWorkID + " ,现在是:" + objs.VarWorkID); } if (objs.VarCurrNodeID != 902) { throw new Exception("@应当是 VarCurrNodeID=902 是,现在是:" + objs.VarCurrNodeID); } if (objs.VarToNodeID != 999) { throw new Exception("@应当是 VarToNodeID= 999 是,现在是:" + objs.VarToNodeID); } if (objs.VarAcceptersID != "zhoupeng") { throw new Exception("@应当是 VarAcceptersID= zhoupeng 是,现在是:" + objs.VarAcceptersID); } #endregion 第1步: 检查发送后的变量. #region 第2步: 检查引擎控制系统表. //先检查干流数据. gwf = new GenerWorkFlow(workid); if (gwf.WFState != WFState.Runing) { throw new Exception("@应当是 Runing, 现在是:" + gwf.WFState); } if (gwf.FID != 0) { throw new Exception("@应当是 0, 现在是:" + gwf.FID); } if (gwf.FK_Node != 901) { throw new Exception("@应当是 901, 现在是:" + gwf.FK_Node); } if (gwf.Starter != "zhoupeng") { throw new Exception("@应当是 zhoupeng, 现在是:" + gwf.Starter); } // 干流的工作人员表是否有变化? GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, workid); foreach (GenerWorkerList item in gwls) { if (item.FK_Emp != "zhoupeng") { throw new Exception("@应当是 zhoupeng, 现在是:" + item.FK_Emp); } //如果是开始节点. if (item.FK_Node == 901) { if (item.IsPass == false) { throw new Exception("@pass状态错误了,应该是已通过。"); } } //如果是结束节点. if (item.FK_Node == 999) { //检查子线程完成率. Node nd = new Node(999); if (nd.PassRate > 50) { // 检查主线程数据是否正确. sql = "SELECT COUNT(*) FROM WF_EmpWorks WHERE WorkID=" + workid; if (DBAccess.RunSQLReturnValInt(sql) != 0) { throw new Exception("@因为完成率大于 50, 所以一个通过了,主线程的工作人员不能看到."); } //if (item.IsPassInt != 3) // throw new Exception("@因为完成率大于 50, 所以一个通过了,主线程的工作人员不能看到,现在是:"+item.IsPassInt); } else { if (item.IsPassInt != 0) { throw new Exception("@因为小于50,所以只要有一个通过了,主线程的zhoupeng 工作人员应该可以看到待办,但是没有查到。 "); } } } } //检查子线程的工作人员列表表 。 gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.FID, workid); if (gwls.Count != 3) { throw new Exception("@不是期望的两条子线程上的工作人员列表数据."); } foreach (GenerWorkerList item in gwls) { if (item.FK_Emp == "zhanghaicheng") { if (item.IsPass == false) { throw new Exception("@此人应该是处理通过了,现在没有通过。"); } } if (item.FK_Emp == "qifenglin") { if (item.IsPass == true) { throw new Exception("@此人应该有待办,结果不符合预期。"); } } if (item.FK_Emp == "guoxiangbin") { if (item.IsPass == true) { throw new Exception("@此人应该有待办,结果不符合预期。"); } } } #endregion 第2步: 检查引擎控制系统表. #region 第3步: 检查 节点表单表数据. sql = "SELECT * FROM ND901 WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows[0]["Rec"].ToString() != "zhoupeng") { throw new Exception("@开始节点的Rec 字段写入错误。"); } ////检查节点表单表是否有数据,以及数据是否正确? //sql = "SELECT * FROM ND902 WHERE FID=" + workid; //dt = DBAccess.RunSQLReturnTable(sql); //if (dt.Rows.Count != 2) // throw new Exception("@应该在第一个子线程节点上找到两个数据"); //foreach (DataRow dr in dt.Rows) //{ // if (dr["Rec"].ToString() == "zhangyifan") // continue; // if (dr["Rec"].ToString() == "zhoushengyu") // continue; // throw new Exception("@子线程表单数据没有正确的写入Rec字段."); //} ////检查参数是否存储到子线程的主表上了? //sql = "SELECT * FROM ND902 WHERE OID=" + threahWorkID; //dt = DBAccess.RunSQLReturnTable(sql); //if (dt.Rows.Count != 1) // throw new Exception("@没有找到子线程期望的数据。"); //if (dt.Rows[0]["FuWuQi"].ToString() != "90") // throw new Exception("没有存储到指定的位置."); //if (dt.Rows[0]["ShuMaXiangJi"].ToString() != "20") // throw new Exception("没有存储到指定的位置."); //// 检查汇总的明细表数据是否copy正确? // sql = "SELECT * FROM ND999Dtl1 WHERE OID=" + threahWorkID; // dt = DBAccess.RunSQLReturnTable(sql); // if (dt.Rows.Count != 1) // throw new Exception("@子线程的数据没有copy到汇总的明细表里."); // dt = DBAccess.RunSQLReturnTable(sql); // if (dt.Rows.Count != 1) // throw new Exception("@没有找到子线程期望的数据。"); // if (dt.Rows[0]["FuWuQi"].ToString() != "90") // throw new Exception("没有存储到指定的位置."); // if (dt.Rows[0]["ShuMaXiangJi"].ToString() != "20") // throw new Exception("没有存储到指定的位置."); //检查报表数据是否正确? sql = "SELECT * FROM ND9Rpt WHERE OID=" + workid; dt = DBAccess.RunSQLReturnTable(sql); string val = dt.Rows[0][GERptAttr.FlowEnder].ToString(); //if (dt.Rows[0][GERptAttr.FlowEnder].ToString() != "zhoupeng") // throw new Exception("@应该是 zhoupeng 是 FlowEnder, 现在是:"+val); if (dt.Rows[0][GERptAttr.FlowStarter].ToString() != "zhoupeng") { throw new Exception("@应该是 zhoupeng 是 FlowStarter ."); } if (dt.Rows[0][GERptAttr.FlowEndNode].ToString() != "999") { throw new Exception("@应该是 999 是 FlowEndNode,而现在是:" + dt.Rows[0][GERptAttr.FlowEndNode].ToString()); } if (int.Parse(dt.Rows[0][GERptAttr.WFState].ToString()) != (int)WFState.Runing) { throw new Exception("@应该是 WFState.Runing 是 WFState ."); } if (int.Parse(dt.Rows[0][GERptAttr.FID].ToString()) != 0) { throw new Exception("@应该是 FID =0 "); } if (dt.Rows[0]["FK_NY"].ToString() != DataType.CurrentYearMonth) { throw new Exception("@ FK_NY 字段填充错误. "); } #endregion 第3步: 检查 节点表单表数据. }
/// <summary> /// 确定窗口 /// </summary> public void Confirm() { GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.NodeID, true); try { #region 检查选择的人员是否为 0 . bool isHave0 = true; foreach (GenerWorkerList wl in wls) { CheckBox cb = this.Pub1.GetCBByID("CB_" + wl.FK_Emp); if (cb.Checked) { isHave0 = false; break; } } if (isHave0 == true) { this.Alert("当前工作中你没有分配给任何人,此工作将不能被其他人所执行!"); return; } #endregion 检查选择的人员是否为 0 . #region 执行分配工作 - 更新选择的状态. foreach (GenerWorkerList wl in wls) { CheckBox cb = this.Pub1.GetCBByID("CB_" + wl.FK_Emp); if (wl.IsEnable != cb.Checked) { wl.IsEnable = cb.Checked; wl.Update(); } } #endregion 执行分配工作 - 更新选择的状态. // 保存记忆功能,让下次发送可以记忆住他。 RememberMe rm = new RememberMe(); rm.FK_Emp = BP.Web.WebUser.No; rm.FK_Node = NodeID; rm.Objs = "@"; rm.ObjsExt = ""; foreach (GenerWorkerList wl in wls) { if (wl.IsEnable == false) { continue; } rm.Objs += wl.FK_Emp + "@"; rm.ObjsExt += wl.FK_EmpText + " "; } rm.Emps = "@"; rm.EmpsExt = ""; foreach (GenerWorkerList wl in wls) { rm.Emps += wl.FK_Emp + "@"; string empInfo = BP.WF.Glo.DealUserInfoShowModel(wl.FK_Emp, wl.FK_EmpText); if (rm.Objs.IndexOf(wl.FK_Emp) != -1) { rm.EmpsExt += "<font color=green>" + BP.WF.Glo.DealUserInfoShowModel(wl.FK_Emp, wl.FK_EmpText) + "</font> "; } else { rm.EmpsExt += "<strike><font color=red>(" + BP.WF.Glo.DealUserInfoShowModel(wl.FK_Emp, wl.FK_EmpText) + "</font></strike> "; } } rm.Save(); if (WebUser.IsWap) { this.Pub1.Clear(); this.Pub1.AddFieldSet("提示信息"); this.Pub1.Add("<br> 任务分配成功,特别提示:当下一次流程发送时系统会按照您设置的路径进行智能投递。"); this.Pub1.AddUL(); this.Pub1.AddLi("<a href='./WAP/Home.aspx' ><img src='/WF/Img/Home.gif' border=0/>主页</a>"); this.Pub1.AddLi("<a href='./WAP/Start.aspx' ><img src='/WF/Img/Start.gif' border=0/>发起</a>"); this.Pub1.AddLi("<a href='./WAP/Runing.aspx' ><img src='/WF/Img/Runing.gif' border=0/>待办</a>"); this.Pub1.AddULEnd(); this.Pub1.AddFieldSetEnd(); } else { this.ToMsg("任务分配成功!!!", "Info"); //this.WinCloseWithMsg("任务分配成功。"); } } catch (Exception ex) { this.Response.Write(ex.Message); Log.DebugWriteWarning(ex.Message); this.Alert("任务分配出错:" + ex.Message); } }
void ReturnWork_Click(object sender, EventArgs e) { Button btn = sender as Button; switch (btn.ID) { case "Btn_Cancel": BP.WF.Node curNd = new BP.WF.Node(this.FK_Node); if (curNd.FormType == NodeFormType.SheetTree) { this.WinClose(); } else { if (this.FID == 0) { this.Response.Redirect("../MyFlow.aspx?FK_Flow=" + this.FK_Flow + "&WorkID=" + this.WorkID + "&FK_Node=" + this.FK_Node + "&FID=" + this.FID, true); } else { string from = this.Request.QueryString["FromUrl"]; if (from == "FHLFlow") { this.Response.Redirect("FHLFlow.aspx?FK_Flow=" + this.FK_Flow + "&WorkID=" + this.WorkID + "&FK_Node=" + this.FK_Node + "&FID=" + this.FID, true); } else { this.Response.Redirect("../MyFlow.aspx?FK_Flow=" + this.FK_Flow + "&WorkID=" + this.WorkID + "&FK_Node=" + this.FK_Node + "&FID=" + this.FID, true); } } } return; default: break; } try { string returnInfo = this.TB1.Text; string reNodeEmp = this.DDL1.SelectedItemStringVal; bool IsBackTracking = false; try { IsBackTracking = this.ToolBar1.GetCBByID("CB_IsBackTracking").Checked; } catch { } string[] strs = reNodeEmp.Split('@'); //执行退回api. string rInfo = BP.WF.Dev2Interface.Node_ReturnWork(this.FK_Flow, this.WorkID, this.FID, this.FK_Node, int.Parse(strs[0]), strs[1], returnInfo, IsBackTracking); //删除其他子线程中的待办信息 GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkFlowAttr.FID, this.WorkID); foreach (GenerWorkerList item in gwls) { /* 删除 子线程数据 */ DBAccess.RunSQL("DELETE FROM ND" + item.FK_Node + " WHERE OID=" + item.WorkID); } //删除流程控制数据。 DBAccess.RunSQL("DELETE FROM WF_GenerWorkFlow WHERE FID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerFH WHERE FID=" + this.WorkID); this.ToMsg(rInfo, "info"); return; } catch (Exception ex) { this.ToMsg(ex.Message, "info"); } }
public void Mode0() { this.fk_flow = "023"; fl = new Flow("023"); string sUser = "******"; BP.WF.Dev2Interface.Port_Login(sUser); //创建. workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fl.No); //执行发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fl.No, workID); //让他登陆。 BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); //执行加签,并且直接向下发送。 BP.WF.Dev2Interface.Node_Askfor(workID, AskforHelpSta.AfterDealSend, "liping", "askforhelp test"); #region 检查执行挂起的预期结果. GenerWorkFlow gwf = new GenerWorkFlow(this.workID); if (gwf.WFState != WFState.Askfor) { throw new Exception("@应当是加签的状态,现在是:" + gwf.WFStateText); } if (gwf.FK_Node != objs.VarToNodeID) { throw new Exception("@流程的待办节点应当是(" + objs.VarToNodeID + "),现在是:" + gwf.FK_Node); } // 获取当前工作列表. GenerWorkerLists gwls = new GenerWorkerLists(objs.VarWorkID, objs.VarToNodeID); if (gwls.Count != 2) { throw new Exception("@应当有两个人员的列表,加签人与被加签人,现在是:" + gwls.Count + "个"); } string sql = "SELECT * FROM WF_GenerWorkerList WHERE FK_Emp='liping' AND WorkID=" + workID + " AND FK_Node=" + gwf.FK_Node; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@没有找到被加签人的工作."); } // 检查被加签人的状态. string var = dt.Rows[0][GenerWorkerListAttr.IsPass].ToString(); if (var != "0") { throw new Exception("@被加签人的isPass状态应该是0,显示到待办。,现在是:" + var); } // 检查被加签人的待办工作. sql = "SELECT * FROM WF_EmpWorks WHERE FK_Emp='liping' AND WorkID=" + workID + " AND FK_Node=" + gwf.FK_Node; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@没有找到被加签人的待办工作."); } #endregion 检查执行挂起的预期结果 #region 检查加签人 sql = "SELECT * FROM WF_GenerWorkerList WHERE FK_Emp='" + objs.VarAcceptersID + "' AND WorkID=" + workID + " AND FK_Node=" + gwf.FK_Node; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 1) { throw new Exception("@没有找到加签人的工作."); } var = dt.Rows[0][GenerWorkerListAttr.IsPass].ToString(); if (var != "5") { throw new Exception("@被加签人的isPass状态应该是0,显示到待办。,现在是:" + var); } #endregion 检查加签人 //让加签人登录. BP.WF.Dev2Interface.Port_Login("liping"); // 让加签人执行登录. SendReturnObjs objsAskFor = BP.WF.Dev2Interface.Node_SendWork(fl.No, workID); #region 检查加签人执行的结果. gwf = new GenerWorkFlow(this.workID); if (gwf.WFState != WFState.Runing) { throw new Exception("@应当是的运行状态,现在是:" + gwf.WFStateText); } if (gwf.FK_Node == objs.VarCurrNodeID) { throw new Exception("@应当运行到下一个节点,但是现在是仍然停留在当前节点上:" + gwf.FK_Node); } // 检查加签订人的工作. sql = "SELECT * FROM WF_EmpWorks WHERE FK_Emp='" + objs.VarAcceptersID + "' AND WorkID=" + workID + " AND FK_Node=" + gwf.FK_Node; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@不应该找到,加签人的待办工作." + objs.VarAcceptersID); } #endregion 检查加签人执行的结果. }
/// <summary> /// 绑定 /// </summary> public void BindLB() { // 当前用的员工权限。 string sql = ""; // sql = " SELECT No,Name FROM Port_Emp WHERE NO IN (SELECT FK_EMP FROM Port_EmpDept WHERE FK_Dept IN (SELECT FK_Dept FROM Port_EmpDept WHERE fk_emp='" + BP.Web.WebUser.No + "') ) or FK_Dept Like '" + BP.Web.WebUser.FK_Dept + "%'"; sql = " SELECT No,Name FROM Port_Emp WHERE FK_Dept='" + this.FK_Dept + "'"; DataTable dt = DBAccess.RunSQLReturnTable(sql); int colIdx = -1; this.Top.AddTable("style='border:0px;'"); foreach (DataRow dr in dt.Rows) { if (dr["No"].ToString() == WebUser.No) { continue; } colIdx++; if (colIdx == 0) { this.Top.AddTR(); } string no = dr["No"].ToString(); string name = dr["Name"].ToString(); RadioButton rb = new RadioButton(); rb.ID = "RB_" + no; rb.Text = no + " " + name; rb.GroupName = "s"; this.Top.AddTD("style='border:0px;'", rb); if (colIdx == 2) { colIdx = -1; this.Top.AddTREnd(); } } this.Top.AddTableEnd(); // 已经非配或者自动分配的任务。 GenerWorkerLists wls = new GenerWorkerLists(); wls.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.IsEnable, 1, GenerWorkerListAttr.IsPass, 0); int nodeID = 0; foreach (GenerWorkerList wl in wls) { RadioButton cb = this.Top.GetRadioButtonByID("RB_" + wl.FK_Emp); if (cb != null) { cb.Checked = true; } nodeID = wl.FK_Node; } TextBox tb = new TextBox(); tb.TextMode = TextBoxMode.MultiLine; tb.Rows = 10; tb.Columns = 70; tb.ID = "TB_Doc"; BP.WF.Node nd = new BP.WF.Node(nodeID); if (nd.FocusField != "") { tb.Text = this.Request.QueryString["Info"]; //Work wk = nd.HisWork; //wk.OID = this.WorkID; //wk.RetrieveFromDBSources(); //tb.Text = wk.GetValStringByKey(nd.FocusField); } this.Top.Add(tb); //新增 Label lb = new Label(); lb.Text = "<div style='float:left;display:block;width:100%'><a href=javascript:TBHelp('Forward_Doc','" + "ND" + FK_Node + "'" + ")><img src='" + BP.WF.Glo.CCFlowAppPath + "WF/Img/Emps.gif' align='middle' border=0 />选择词汇</a> </div>"; this.Top.Add(lb); }
/// <summary> /// 测试案例说明: /// 1, 此流程针对于最简单的分合流程进行, zhanghaicheng发起,zhoushengyu,zhangyifan,两个人处理子线程, /// zhanghaicheng 接受子线程汇总数据. /// 2, 测试方法体分成三大部分. 发起,子线程处理,合流点执行,分别对应: Step1(), Step2_1(), Step2_2(),Step3() 方法。 /// 3,针对发送测试,不涉及到其它的功能. /// </summary> public override void Do() { HungUp huEn = new HungUp(); huEn.CheckPhysicsTable(); this.fk_flow = "023"; fl = new Flow("023"); string sUser = "******"; BP.WF.Dev2Interface.Port_Login(sUser); //创建. workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fl.No); //执行发送. SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fl.No, workID); //让他登陆。 BP.WF.Dev2Interface.Port_Login(objs.VarAcceptersID); //执行挂起。 BP.WF.Dev2Interface.Node_HungUpWork(fl.No, workID, 0, null, "hungup test"); #region 检查执行挂起的预期结果. GenerWorkFlow gwf = new GenerWorkFlow(this.workID); if (gwf.WFState != WFState.HungUp) { throw new Exception("@应当是挂起的状态,现在是:" + gwf.WFStateText); } GenerWorkerLists gwls = new GenerWorkerLists(workID, this.fk_flow); foreach (GenerWorkerList gwl in gwls) { if (gwl.FK_Node == fl.StartNodeID) { continue; } if (gwl.DTOfHungUp.Length < 10) { throw new Exception("@挂起日期没有写入"); } if (DataType.IsNullOrEmpty(gwl.DTOfUnHungUp) == false) { throw new Exception("@解除挂起日期应当为空,现在是:" + gwl.DTOfUnHungUp); } if (gwl.HungUpTimes != 1) { throw new Exception("@挂起次数应当为1"); } } HungUp hu = new HungUp(); hu.MyPK = "2302_" + this.workID; if (hu.RetrieveFromDBSources() == 0) { throw new Exception("@没有找到 HungUp 数据。"); } #endregion 检查执行挂起的预期结果 //解除挂起。 BP.WF.Dev2Interface.Node_UnHungUpWork(fl.No, workID, "un hungup test"); #region 检查接触执行挂起的预期结果. gwf = new GenerWorkFlow(this.workID); if (gwf.WFState != WFState.Runing) { throw new Exception("@应当是挂起的状态,现在是:" + gwf.WFStateText); } #endregion 检查接触执行挂起的预期结果 //执行多次挂起于解除挂起. BP.WF.Dev2Interface.Node_HungUpWork(fl.No, workID, 0, null, "hungup test"); BP.WF.Dev2Interface.Node_UnHungUpWork(fl.No, workID, "un hungup test"); }
/// <summary> /// 绑定 /// </summary> public void BindLB() { // 当前用的员工权限。 string sql = ""; // sql = " SELECT No,Name FROM Port_Emp WHERE NO IN (SELECT FK_EMP FROM Port_EmpDept WHERE FK_Dept IN (SELECT FK_Dept FROM Port_EmpDept WHERE fk_emp='" + BP.Web.WebUser.No + "') ) or FK_Dept Like '" + BP.Web.WebUser.FK_Dept + "%'"; sql = " SELECT No,Name FROM Port_Emp WHERE FK_Dept='" + this.FK_Dept + "'"; DataTable dt = DBAccess.RunSQLReturnTable(sql); int colIdx = -1; this.Top.AddTable(); foreach (DataRow dr in dt.Rows) { if (dr["No"].ToString() == WebUser.No) { continue; } colIdx++; if (colIdx == 0) { this.Top.AddTR(); } string no = dr["No"].ToString(); string name = dr["Name"].ToString(); RadioButton rb = new RadioButton(); rb.ID = "RB_" + no; rb.Text = no + " " + name; rb.GroupName = "s"; this.Top.AddTD(rb); if (colIdx == 2) { colIdx = -1; this.Top.AddTREnd(); } } this.Top.AddTableEnd(); // 已经非配或者自动分配的任务。 GenerWorkerLists wls = new GenerWorkerLists(); wls.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.IsEnable, 1, GenerWorkerListAttr.IsPass, 0); int nodeID = 0; foreach (GenerWorkerList wl in wls) { RadioButton cb = this.Top.GetRadioButtonByID("RB_" + wl.FK_Emp); if (cb != null) { cb.Checked = true; } nodeID = wl.FK_Node; } TextBox tb = new TextBox(); tb.TextMode = TextBoxMode.MultiLine; tb.Rows = 10; tb.Columns = 70; tb.ID = "TB_Doc"; BP.WF.Node nd = new BP.WF.Node(nodeID); if (nd.FocusField != "") { Work wk = nd.HisWork; wk.OID = this.WorkID; wk.RetrieveFromDBSources(); tb.Text = wk.GetValStringByKey(nd.FocusField); } this.Pub1.Add(tb); }
/// <summary> /// 测试子流程只有一个人 /// </summary> private void Test2() { string fk_flow = "023"; string userNo = "zhanghaicheng"; Flow fl = new Flow(fk_flow); // zhanghaicheng 登录. BP.WF.Dev2Interface.Port_Login(userNo); //创建空白工作, 发起开始节点. Int64 workid = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow); SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid); /*发送到第二个节点上去*/ /*创建子流程. 指定可以处理子流程的处理人员是一个集合。 * * 此api多了两个参数: * 1,该流程隶属于那个部门. * 2,该流程的参与人集合,用逗号分开. */ Emp flowStarter = new Emp(WebUser.No); Int64 subFlowWorkID = 0; // = new Emp(WebUser.No); //Int64 subFlowWorkID = BP.WF.Dev2Interface.Node_CreateStartNodeWork("024", null, null, "zhanghaicheng", // "1", "zhoupeng,zhoushengyu", "子流程发起测试(为开始节点创建多人的工作处理)", "023", workid); #region 检查发起的子流程 流程引擎表 是否完整? GenerWorkFlow gwf = new GenerWorkFlow(subFlowWorkID); if (gwf.PFlowNo != "023") { throw new Exception("@父流程编号错误,应当是023现在是" + gwf.PFlowNo); } if (gwf.PWorkID != workid) { throw new Exception("@父流程WorkID错误,应当是" + workid + "现在是" + gwf.PWorkID); } if (gwf.Starter != flowStarter.No) { throw new Exception("@流程发起人编号错误,应当是" + flowStarter.No + "现在是" + gwf.Starter); } if (gwf.StarterName != flowStarter.Name) { throw new Exception("@流程发起人 Name 错误,应当是" + flowStarter.Name + "现在是" + gwf.StarterName); } if (gwf.FK_Dept != "1") { throw new Exception("@流程隶属部门错误,应当是 1 现在是" + gwf.FK_Dept); } if (gwf.Title != "子流程发起测试(为开始节点创建多人的工作处理)") { throw new Exception("@流程标题 子流程发起测试 错误,应当是 子流程发起测试 现在是" + gwf.Title); } if (gwf.WFState != WFState.Runing) { throw new Exception("@流程 WFState 错误,应当是 Runing 现在是" + gwf.WFState); } if (gwf.FID != 0) { throw new Exception("@FID错误,应当是0现在是" + gwf.FID); } if (gwf.FK_Flow != "024") { throw new Exception("@FK_Flow错误,应当是024现在是" + gwf.FK_Flow); } if (gwf.FK_Node != 2401) { throw new Exception("@停留的当前节点错误,应当是2401现在是" + gwf.FK_Flow); } GenerWorkerLists gwls = new GenerWorkerLists(subFlowWorkID, 2401); if (gwls.Count != 2) { throw new Exception("@待办列表个数应当2,现在是" + gwls.Count); } // 检查发起人列表是否完整? foreach (GenerWorkerList gwl in gwls) { if (gwl.IsPassInt != 0) { throw new Exception("@通过状态应当是未通过,现在是:" + gwl.IsPassInt); } if (gwl.FID != 0) { throw new Exception("@流程ID 应当是0 ,现在是:" + gwl.FID); } if (gwl.FK_Emp == "zhoupeng") { Emp tempEmp = new Emp(gwl.FK_Emp); if (gwl.FK_Dept != tempEmp.FK_Dept) { throw new Exception("@FK_Dept 错误, 现在是:" + gwl.FK_Dept); } } } #endregion 检查发起的子流程 流程引擎表 是否完整? #region 检查发起的子流程数据是否完整? //检查报表数据是否完整? sql = "SELECT * FROM ND24Rpt WHERE OID=" + subFlowWorkID; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("@发起流程出错误,不应该找不到子流程的报表数据."); } foreach (DataColumn dc in dt.Columns) { string val = dt.Rows[0][dc.ColumnName].ToString(); switch (dc.ColumnName) { case GERptAttr.PWorkID: if (val != gwf.PWorkID.ToString()) { throw new Exception("@应当是父流程的workid,现是在:" + val); } break; case GERptAttr.PFlowNo: if (val != "023") { throw new Exception("@应当是023"); } break; case GERptAttr.FID: if (val != "0") { throw new Exception("@应当是0"); } break; case GERptAttr.FK_Dept: if (val != "1") { throw new Exception("@应当是 1, 现在是:" + 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(empSubFlowStarter.No) == false) // throw new Exception("@应当是包含当前人员, 现在是:" + val); // break; //case GERptAttr.FlowEnder: // if (val != empSubFlowStarter.No) // throw new Exception("@应当是 empSubFlowStarter.No, 现在是:" + 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 != empSubFlowStarter.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: WFState sta = (WFState)int.Parse(val); if (sta != WFState.Runing) { throw new Exception("@应当是 WFState.Runing 现在是" + sta.ToString()); } break; default: break; } } #endregion 检查是否完整? // 测试以子流程向下发送,是否成功? BP.WF.Dev2Interface.Port_Login("zhoupeng"); objs = BP.WF.Dev2Interface.Node_SendWork("024", subFlowWorkID); #region 检查返回来的变量数据完整性。 if (objs.VarToNodeID != 2402) { throw new Exception("@子流程向下发送时不成功."); } #endregion 检查数据完整性。 #region 检查其它的人在开始节点上是否还有待办工作? //检查报表数据是否完整? sql = "SELECT * FROM WF_EmpWorks WHERE WorkID=" + subFlowWorkID + " AND FK_Emp='zhoushengyu'"; dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count != 0) { throw new Exception("@在开始节点一个人处理完成后,其它人还有待办."); } #endregion 检查其它的人在开始节点上是否还有待办工作。 }
protected void Page_Load(object sender, EventArgs e) { Node nd = new Node(this.FK_Node); Work wk = nd.HisWork; wk.OID = this.WorkID; wk.Retrieve(); if (nd.HisNodeWorkType == NodeWorkType.WorkHL || nd.HisNodeWorkType == NodeWorkType.WorkFHL) { } else { this.AddFieldSetRed("err", "当前的节点(" + nd.Name + ")非合流点,您不能查看子线程."); return; } GenerWorkerLists wls = new GenerWorkerLists(); QueryObject qo = new QueryObject(wls); qo.AddWhere(GenerWorkerListAttr.FID, wk.OID); qo.addAnd(); qo.AddWhere(GenerWorkerListAttr.IsEnable, 1); qo.addAnd(); qo.AddWhere(GenerWorkerListAttr.IsPass, "!=", -2); int i = qo.DoQuery(); if (i == 1) { wls.Clear(); qo.clear(); qo.AddWhere(GenerWorkerListAttr.FID, wk.OID); qo.addAnd(); qo.AddWhere(GenerWorkerListAttr.IsEnable, 1); qo.addAnd(); qo.AddWhere(GenerWorkerListAttr.IsPass, "!=", -2); qo.DoQuery(); } //如果没有子流程就不让它显示 if (wls.Count > 0) { this.AddTable("border=0"); this.AddTR(); this.AddTDTitle("IDX"); this.AddTDTitle("节点"); this.AddTDTitle("处理人"); this.AddTDTitle("名称"); this.AddTDTitle("部门"); this.AddTDTitle("状态"); this.AddTDTitle("应完成日期"); this.AddTDTitle("实际完成日期"); this.AddTDTitle(""); this.AddTREnd(); bool is1 = false; int idx = 0; foreach (GenerWorkerList wl in wls) { idx++; is1 = this.AddTR(is1); this.AddTDIdx(idx); this.AddTD(wl.FK_NodeText); this.AddTD(wl.FK_Emp); this.AddTD(wl.FK_EmpText); this.AddTD(wl.FK_DeptT); if (wl.IsPass) { this.AddTD("已完成"); this.AddTD(wl.SDT); this.AddTD(wl.RDT); } else { this.AddTD("<font color=red>未完成</font>"); this.AddTD(wl.SDT); this.AddTD(); } if (wl.IsPass == false) { if (nd.ThreadKillRole == ThreadKillRole.ByHand) { this.AddTD("<a href=\"javascript:DoDelSubFlow('" + wl.FK_Flow + "','" + wl.WorkID + "')\"><img src='" + BP.WF.Glo.CCFlowAppPath + "WF/Img/Btn/Delete.gif' border=0/>终止</a>"); } else { this.AddTD(); } } else { this.AddTD("<a href=\"javascript:WinOpen('" + BP.WF.Glo.CCFlowAppPath + "WF/FHLFlow.aspx?WorkID=" + wl.WorkID + "&FID=" + wl.FID + "&FK_Flow=" + nd.FK_Flow + "&FK_Node=" + this.FK_Node + "','po9')\">打开</a>"); } this.AddTREnd(); } this.AddTableEnd(); } }
/// <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); }
protected void Page_Load(object sender, EventArgs e) { //以下判断没发现起到什么作用 if (BP.WF.Dev2Interface.Flow_IsCanViewTruck(this.FK_Flow, this.WorkID, this.FID) == false) { //string url = this.Request.RawUrl; ////url=url.Replace ////this.Response.Redirect(url,true); //string errorStr = "您没有权限查看该工作"; //errorStr += "<br>1,您非该流程的处理人."; //errorStr += "<br>2, 您不与该流程发起人是同一个部门。"; //return ; } if (this.DoType == "View") { this.BindTrack_ViewWork(); return; } if (this.DoType == "ViewSpecialWork") { this.BindTrack_ViewSpecialWork(); return; } //this.AddTable("class='Table' cellpadding='0' cellspacing='0' border='0' style='width: 100%'"); //this.AddTR(); //this.AddTDGroupTitle("style='text-align:center'", "序"); //this.AddTDGroupTitle("操作时间"); //this.AddTDGroupTitle("表单"); //moved by liuxc,2014-12-18,应zhangqingpeng要求将此列提前 //this.AddTDGroupTitle("从节点"); //this.AddTDGroupTitle("人员"); //this.AddTDGroupTitle("到节点"); //this.AddTDGroupTitle("人员"); //this.AddTDGroupTitle("到达时间"); //this.AddTDGroupTitle("用时"); //this.AddTDGroupTitle("活动"); //this.AddTDGroupTitle("信息"); //this.AddTDGroupTitle("执行人"); //this.AddTREnd(); //获取track. DataTable dt = BP.WF.Dev2Interface.DB_GenerTrack(this.FK_Flow, this.WorkID, this.FID).Tables["Track"]; DataView dv = dt.DefaultView; dv.Sort = "RDT"; GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = this.WorkID; gwf.RetrieveFromDBSources(); string currNodeID = "0"; if (gwf.WFState != WFState.Complete) { currNodeID = gwf.FK_Node.ToString(); //获得当前运行到的节点如果流程完成则为O. } int idx = 1; string checkStr = ""; #region qin 改成时间轴的显示方式 15/7/15 如果不需要这种显示方式 string str = "";//拼接字符串 str += "<div style='width: 100%;height:400px;'><div class='content'>"; str += "<div class='wrapper'>"; str += "<div class='main'>"; str += "<h1 class='title'>"; str += "流程日志</h1>"; str += "<div class='year'>"; str += "<h2>"; str += "<a href='#'> 时间轴<i></i></a></h2>"; str += "<div class='list'>"; str += "<ul>"; #endregion qin 改成时间轴的显示方式 15/7/15 #region 开始循环添加数据 foreach (DataRowView dr in dv) { Int64 fid = int.Parse(dr["FID"].ToString()); if (fid != 0) { continue; } ActionType at = (ActionType)int.Parse(dr[TrackAttr.ActionType].ToString()); //如果是协作发送,就不输出他. edit 2016.02.20 . if (at == ActionType.TeampUp) { continue; } // 记录审核节点。 if (at == ActionType.WorkCheck) { checkStr = dr[TrackAttr.NDFrom].ToString(); //记录当前的审核节点id. } //审核信息过滤, if (at == ActionType.WorkCheck) { if (currNodeID == checkStr) { continue; } //如果当前节点与审核信息节点一致,就说明当前人员的审核意见已经保存,但是工作还没有发送,就不让他显示。 } if (at == ActionType.Forward) { if (checkStr == dr[TrackAttr.NDFrom].ToString()) { continue; } } str += "<li class='cls highlight' style=\"background: url('../../Img/Action/" + at.ToString() + ".png') no-repeat 235px 31px\">"; //this.AddTR(); //this.AddTDIdx(idx); DateTime dtt = DataType.ParseSysDateTime2DateTime(dr[TrackAttr.RDT].ToString()); // this.AddTD(dtt.ToString("yy年MM月dd日HH:mm"));</br> str += "<p class='date'>" + dtt.ToString("yy年MM月dd日") + " " + dtt.ToString("hh时mm分"); str += "</br>" + BP.DA.DataType.GetWeek((int)dtt.DayOfWeek); str += "</br>" + BP.WF.Glo.GenerUserImgHtml(dr[TrackAttr.EmpFrom].ToString(), dr[TrackAttr.EmpFromT].ToString()) + "</p>"; str += "<p class='intro'>" + dr[TrackAttr.NDFromT].ToString() + "</p>"; str += "<div class='more'>"; if (at == ActionType.Forward || at == ActionType.ForwardAskfor || at == ActionType.WorkCheck || at == ActionType.Order || at == ActionType.FlowOver || //added by liuxc,2014-12-3,正常结束结点也显示表单 at == ActionType.Skip) //added by liuxc,2015-7-13,自动跳转的也显示表单 { //this.AddTD("<a class='easyui-linkbutton' data-options=\"iconCls:'icon-sheet'\" href=\"javascript:WinOpen('" + BP.WF.Glo.CCFlowAppPath + "WF/WFRpt.aspx?WorkID=" + dr[TrackAttr.WorkID].ToString() + "&FK_Flow=" + this.FK_Flow + "&FK_Node=" + dr[TrackAttr.NDFrom].ToString() + "&DoType=View&MyPK=" + dr[TrackAttr.MyPK].ToString() + "','" + dr[TrackAttr.MyPK].ToString() + "');\">表单</a>"); str += "<p><a class='easyui-linkbutton' data-options=\"iconCls:'icon-sheet'\" href=\"javascript:WinOpen('" + BP.WF.Glo.CCFlowAppPath + "WF/WFRpt.aspx?WorkID=" + dr[TrackAttr.WorkID].ToString() + "&FK_Flow=" + this.FK_Flow + "&FK_Node=" + dr[TrackAttr.NDFrom].ToString() + "&DoType=View&MyPK=" + dr[TrackAttr.MyPK].ToString() + "','" + dr[TrackAttr.MyPK].ToString() + "');\">打开<img src='../../Img/Form.png'>表单</a>" + "</p>"; } if (at == ActionType.FlowOver || at == ActionType.CC || at == ActionType.UnSend) { str += "<p></p>"; str += "<p></p>"; } else { str += "<p>发送到节点:" + dr[TrackAttr.NDToT].ToString() + "</p>"; } //增加两列,到达时间、用时 added by liuxc,2014-12-4 if (idx > 1) { var toTime = Convert.ToDateTime(dv[idx - 1 - 1][TrackAttr.RDT].ToString()); str += "<p>到达时间:" + toTime.ToString("yy年MM月dd日HH:mm") + " 用时:" + DataType.GetSpanTime(toTime, dtt) + "</p>"; } // 删除信息. string tag = dr[TrackAttr.Tag].ToString(); if (tag != null) { tag = tag.Replace("~", "'"); } string msg = DataType.ParseText2Html(dr[TrackAttr.Msg].ToString()); switch (at) { case ActionType.CallChildenFlow: //被调用父流程吊起。 if (string.IsNullOrEmpty(tag) == false) { AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("PWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程{" + mygwf.FlowName + "},<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a></p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程调用{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } msg = "<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a>"; } break; case ActionType.StartChildenFlow: //吊起子流程。 if (string.IsNullOrEmpty(tag) == false) { if (tag.Contains("Sub")) { tag = tag.Replace("Sub", "C"); } AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("CWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "}, <a target=b" + ap.GetValStrByKey("CWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("CWorkID") + "&FK_Flow=" + ap.GetValStrByKey("CFlowNo") + "' >" + msg + "</a></p>"; msg += "<p>当前子流程状态:{" + mygwf.WFStateText + "},运转到:{" + mygwf.NodeName + "},最后处理人{" + mygwf.TodoEmps + "},最后处理时间{" + mygwf.RDT + "}。</p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } } break; default: break; } msg = msg.Replace("\"", ""); str += "<p>" + msg + "</p>"; str += "</div>"; str += "</li>"; idx++; } //判断当前工作是否完成,如果没有完成,就输出当前人员的待办信息 ,读取信息。 if (gwf.WFState == WFState.Runing) { GenerWorkerLists gwls = new GenerWorkerLists(gwf.WorkID, gwf.FK_Node); Node nd = new Node(gwf.FK_Node); str += "<li class='cls highlight' style=\"background: url('../../Img/Action/Todolist.png') no-repeat 235px 31px\" >"; str += "<BR><BR><p class='date'>流程运行到: " + gwf.NodeName + "。"; if (gwf.TodoEmpsNum == 1) { string myemp = gwf.TodoEmps; myemp = myemp.Replace("(", ""); myemp = myemp.Replace(")", ""); string[] strs = myemp.Split(','); str += "<br>" + BP.WF.Glo.GenerUserImgHtml(strs[0], strs[1]) + "。</p>"; } else { // str += "<br>处理人员:(" + gwf.TodoEmps + ")计(" + gwf.TodoEmpsNum + ")个,。</p>"; } str += "<div></div><br><br>"; if (nd.HisNodeWorkType == NodeWorkType.WorkFL || nd.HisNodeWorkType == NodeWorkType.StartWorkFL || nd.HisNodeWorkType == NodeWorkType.WorkFHL) { str += "<div><ul>"; foreach (GenerWorkerList item in gwls) { if (gwls.Count == 0 || nd.TodolistModel == TodolistModel.QiangBan || nd.TodolistModel == TodolistModel.Sharing) { if (item.IsRead == false) { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#00CC66' >未读</font></li>"; } else { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已读</strong></font></li>"; } break; } switch (nd.TodolistModel) { case TodolistModel.QiangBan: str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已读</strong></font></li>"; break; case TodolistModel.Order: if (item.IsPassInt == 1) { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已处理</strong></font></li>"; } else { if (item.IsRead == false) { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#00CC66' >未读</font></li>"; } else { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已读</strong></font></li>"; } } break; case TodolistModel.Sharing: str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已读</strong></font></li>"; break; case TodolistModel.Teamup: if (item.IsPassInt == 1) { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#999966' ><strong>已处理</strong></font></li>"; } else { if (item.IsRead == false) { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#00CC66' >未读</font></li>"; } else { str += "<li><img src='../../Img/Dot.png' width='8px' >处理人:" + BP.WF.Glo.DealUserInfoShowModel(item.FK_Emp, item.FK_EmpText) + " <font style='color:#FFFFFF; background-color:#FF9966' ><strong>已读</strong></font></li>"; } } break; default: break; } } } str += "</ul>"; str += "</div>"; str += "<br>"; str += "<br>"; str += "<br>"; str += "<br>"; str += "<br>"; str += "<br>"; str += "<br>"; str += "</li>"; ///* 运行中的状态. */ //str += "<li>"; //str += "<table>"; //str += "<caption>当前节点信息</caption>"; //str += "<tr>"; //str += "<th>停留节点</th>"; //str += "<th>处理人</th>"; //str += "<th>是否读取?</th>"; //str += "</tr>"; //foreach (GenerWorkerList item in gwls) //{ // str += "<tr>"; // str += "<td>" + item.FK_NodeText + "</td>"; // str += "<td>" + item.FK_EmpText + "</td>"; // if (item.IsRead) // str += "<td>已读</td>"; // else // str += "<td>未读</td>"; // str += "</tr>"; //} //str += "</table>"; //str += "</li>"; } //结束循环. //this.AddTableEnd(); #endregion if (this.CCID != null) { CCList cl = new CCList(); cl.MyPK = this.CCID; cl.RetrieveFromDBSources(); // this.AddFieldSet(cl.Title); // this.Add("抄送人:" + cl.Rec + ", 抄送日期:" + cl.RDT); // this.AddHR(); // this.Add(cl.DocHtml); // this.AddFieldSetEnd(); str += "<li class='cls highlight' style=\"background: url('./Img/Action/circle.png') no-repeat 235px 31px\">"; str += "<p class='date'> </p>"; str += "<p class='intro'>" + cl.Title + "</p>"; str += "<p class='version'> </p>"; str += "<div class='more'>"; str += "<p>抄送人:" + cl.Rec + "</p>"; str += "<p>抄送日期:" + cl.RDT + "</p>"; str += "</div>"; str += "</li>"; if (cl.HisSta == CCSta.UnRead) { cl.HisSta = CCSta.Read; cl.Update(); } } str += "</ul>"; str += "</div>"; str += "</div>"; str += "</div>"; str += "</div>"; str += "</div>"; str += "</div>"; //this.Clear(); HiddenField1.Value = str.ToString(); }
/// <summary> /// dd /// </summary> public void BindLB() { // 当前用的员工权限。 this.Clear(); GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.NodeID, true); string sql = "SELECT * FROM WF_RememberMe WHERE FK_Emp='" + WebUser.No + "' AND FK_Node=" + this.NodeID; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (WebUser.IsWap) { this.AddFieldSet("<a href='./WAP/Home.aspx' ><img src='/WF/Img/Home.gif' border=0/>主页</a> - 工作分配"); } else { this.AddFieldSet("工作分配"); } if (dt.Rows.Count == 0) { throw new Exception("@系统错误..." + sql); } string[] objs = dt.Rows[0]["Objs"].ToString().Split('@'); string[] emps = dt.Rows[0]["Emps"].ToString().Split('@'); string ids = ""; this.AddUL(); foreach (string fk_emp in emps) { if (fk_emp == null || fk_emp == "") { continue; } Emp emp = new Emp(fk_emp); CheckBox cb = new CheckBox(); cb.ID = "CB_" + fk_emp; ids += "," + cb.ID; if (Glo.IsShowUserNoOnly) { cb.Text = emp.No; } else { cb.Text = emp.No + " , " + emp.Name; } GenerWorkerList wl = wls.GetEntityByKey(GenerWorkerListAttr.FK_Emp, fk_emp) as GenerWorkerList; if (wl == null) { cb.Checked = false; } else { cb.Checked = wl.IsEnable; } this.Add("<li>"); this.Add(cb); this.Add("</li>"); //this.AddBR(); } this.AddULEnd(); this.AddHR(); Btn btn = new Btn(); btn.ID = "Btn_Do"; btn.Text = " 确定 "; btn.Click += new EventHandler(BPToolBar1_ButtonClick); this.Add(btn); CheckBox cbx = new CheckBox(); cbx.ID = "seleall"; cbx.Text = "选择全部"; cbx.Checked = true; cbx.Attributes["onclick"] = "SetSelected(this,'" + ids + "')"; this.Add(cbx); //this.Add("<input type=button value='取消' onclick='window.close();' />"); this.Add("<br><br>帮助:系统会记住本次的工作指定,下次您在发送时间它会自动把工作投递给您本次指定的人。"); this.AddFieldSetEnd(); }
protected void Page_Load(object sender, EventArgs e) { this.Page.Title = "工作分配"; if (this.IsPostBack == false) { string fk_emp = this.Request.QueryString["FK_Emp"]; string sid = this.Request.QueryString["SID"]; if (fk_emp != null) { if (BP.Web.WebUser.CheckSID(fk_emp, sid) == false) { return; } Emp emp = new Emp(fk_emp); BP.Web.WebUser.SignInOfGenerLang(emp, null); } } // 当前用的员工权限。 this.Pub1.Clear(); GenerWorkerLists wls = new GenerWorkerLists(this.WorkID, this.NodeID, true); if (WebUser.IsWap) { this.Pub1.AddFieldSet("<a href='./WAP/Home.aspx' ><img src='/WF/Img/Home.gif' border=0/>主页</a> - 工作分配"); } else { this.Pub1.AddFieldSet("工作分配"); } string ids = ""; this.Pub1.AddUL(); foreach (GenerWorkerList wl in wls) { CheckBox cb = new CheckBox(); cb.ID = "CB_" + wl.FK_Emp; ids += "," + cb.ID; cb.Text = BP.WF.Glo.DealUserInfoShowModel(wl.FK_Emp, wl.FK_EmpText); cb.Checked = wl.IsEnable; this.Pub1.Add("<li>"); this.Pub1.Add(cb); this.Pub1.Add("</li>"); } this.Pub1.AddULEnd(); this.Pub1.AddHR(); Btn btn = new Btn(); btn.ID = "Btn_Do"; btn.Text = " 确定 "; btn.Click += new EventHandler(BPToolBar1_ButtonClick); this.Pub1.Add(btn); CheckBox cbx = new CheckBox(); cbx.ID = "seleall"; cbx.Text = "选择全部"; cbx.Checked = true; cbx.Attributes["onclick"] = "SetSelected(this,'" + ids + "')"; this.Pub1.Add(cbx); //this.Pub1.Add("<input type=button value='取消' onclick='window.close();' />"); this.Pub1.Add("<br><br>帮助:系统会记住本次的工作指定,下次您在发送时间它会自动把工作投递给您本次指定的人。"); this.Pub1.AddFieldSetEnd(); }
/// <summary> /// 执行 /// </summary> /// <returns>返回执行结果</returns> public override object Do() { #region 找到要逾期的数据. DataTable generTab = null; string sql = "SELECT a.FK_Flow,a.WorkID,a.Title,a.FK_Node,a.SDTOfNode,a.Starter,a.TodoEmps "; sql += "FROM WF_GenerWorkFlow a, WF_Node b"; sql += " WHERE a.SDTOfNode<='" + DataType.CurrentDataTime + "' "; sql += " AND WFState=2 and b.OutTimeDeal!=0"; sql += " AND a.FK_Node=b.NodeID"; generTab = DBAccess.RunSQLReturnTable(sql); #endregion 找到要逾期的数据. // 遍历循环,逾期表进行处理. string msg = ""; string info = ""; foreach (DataRow row in generTab.Rows) { string fk_flow = row["FK_Flow"] + ""; int fk_node = int.Parse(row["FK_Node"] + ""); long workid = long.Parse(row["WorkID"] + ""); string title = row["Title"] + ""; string compleateTime = row["SDTOfNode"] + ""; string starter = row["Starter"] + ""; GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, workid, GenerWorkerListAttr.FK_Node, fk_node); bool isLogin = false; foreach (GenerWorkerList item in gwls) { if (item.IsEnable == false) { continue; } BP.Port.Emp emp = new Emp(item.FK_Emp); BP.Web.WebUser.SignInOfGener(emp); isLogin = true; } if (isLogin == false) { BP.Port.Emp emp = new Emp("admin"); BP.Web.WebUser.SignInOfGener(emp); } try { Node node = new Node(fk_node); if (node.IsStartNode) { continue; } //获得该节点的处理内容. string doOutTime = node.GetValStrByKey(NodeAttr.DoOutTime); switch (node.HisOutTimeDeal) { case OutTimeDeal.None: //逾期不处理. continue; case OutTimeDeal.AutoJumpToSpecNode: //跳转到指定的节点. try { //if (doOutTime.Contains(",") == false) // throw new Exception("@系统设置错误,不符合设置规范,格式为: NodeID,EmpNo 现在设置的为:"+doOutTime); int jumpNode = int.Parse(doOutTime); Node jumpToNode = new Node(jumpNode); //设置默认同意. BP.WF.Dev2Interface.WriteTrackWorkCheck(jumpToNode.FK_Flow, node.NodeID, workid, 0, "同意(预期自动审批)", null); //执行发送. info = BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, null, null, jumpToNode.NodeID, null).ToMsgOfText(); // info = BP.WF.Dev2Interface.Flow_Schedule(workid, jumpToNode.NodeID, emp.No); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动跳转'," + info; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',WorkID=" + workid + ",标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动跳转',跳转异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.AutoShiftToSpecUser: //走动移交给. // 判断当前的处理人是否是. Emp empShift = new Emp(doOutTime); try { BP.WF.Dev2Interface.Node_Shift(fk_flow, fk_node, workid, 0, empShift.No, "流程节点已经逾期,系统自动移交"); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'移交到指定的人',已经自动移交给'" + empShift.Name + "."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "' ,标题:'" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'移交到指定的人',移交异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.AutoTurntoNextStep: try { GenerWorkerList workerList = new GenerWorkerList(); workerList.RetrieveByAttrAnd(GenerWorkerListAttr.WorkID, workid, GenerWorkFlowAttr.FK_Node, fk_node); BP.Web.WebUser.SignInOfGener(workerList.HisEmp); WorkNode firstwn = new WorkNode(workid, fk_node); string sendIfo = firstwn.NodeSend().ToMsgOfText(); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送消息为:" + sendIfo; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'自动发送到下一节点',发送异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.DeleteFlow: info = BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(fk_flow, workid, true); msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'删除流程'," + info; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); break; case OutTimeDeal.RunSQL: try { BP.WF.Work wk = node.HisWork; wk.OID = workid; wk.Retrieve(); doOutTime = BP.WF.Glo.DealExp(doOutTime, wk, null); //替换字符串 doOutTime.Replace("@OID", workid + ""); doOutTime.Replace("@FK_Flow", fk_flow); doOutTime.Replace("@FK_Node", fk_node.ToString()); doOutTime.Replace("@Starter", starter); if (doOutTime.Contains("@")) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.有未替换的SQL变量."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); break; } //执行sql. DBAccess.RunSQL(doOutTime); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; case OutTimeDeal.SendMsgToSpecUser: try { Emp myemp = new Emp(doOutTime); bool boo = BP.WF.Dev2Interface.WriteToSMS(myemp.No, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "系统发送逾期消息", "您的流程:'" + title + "'的完成时间应该为'" + compleateTime + "',流程已经逾期,请及时处理!", "系统消息"); if (boo) { msg = "'" + title + "'逾期消息已经发送给:'" + myemp.Name + "'"; } else { msg = "'" + title + "'逾期消息发送未成功,发送人为:'" + myemp.Name + "'"; } SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg); } catch (Exception ex) { msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); } break; default: msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name + "'没有找到相应的超时处理规则."; SetText(msg); BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg); break; } } catch (Exception ex) { SetText("流程逾期出现异常:" + ex.Message); BP.DA.Log.DefaultLogWriteLine(LogType.Error, ex.ToString()); } } return(generInfo); }