Beispiel #1
0
        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();
        }
Beispiel #2
0
        /// <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();
        }
Beispiel #4
0
        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("没有发现异常。");
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        /// <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 + "]流程修复成功。");
        }
Beispiel #7
0
        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());
        }
Beispiel #9
0
        /// <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 检查发送结果是否符合预期.
        }
Beispiel #10
0
        /// <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步: 检查 节点表单表数据.
        }
Beispiel #11
0
        /// <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  检查【开始节点】发送数据信息否完整?
        }
Beispiel #12
0
        /// <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));
        }
Beispiel #13
0
        /// <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);
        }
Beispiel #14
0
        /// <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("@子流程向下发送时不成功.");
            }
        }
Beispiel #15
0
        /// <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 + "}";
        }
Beispiel #16
0
        /// <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  检查【开始节点】发送数据信息否完整?
        }
Beispiel #17
0
        /// <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步: 检查 节点表单表数据.
        }
Beispiel #18
0
        /// <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 + "&nbsp;&nbsp;";
                }

                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>&nbsp;&nbsp;";
                    }
                    else
                    {
                        rm.EmpsExt += "<strike><font color=red>(" + BP.WF.Glo.DealUserInfoShowModel(wl.FK_Emp, wl.FK_EmpText) + "</font></strike>&nbsp;&nbsp;";
                    }
                }
                rm.Save();

                if (WebUser.IsWap)
                {
                    this.Pub1.Clear();
                    this.Pub1.AddFieldSet("提示信息");
                    this.Pub1.Add("<br>&nbsp;&nbsp;任务分配成功,特别提示:当下一次流程发送时系统会按照您设置的路径进行智能投递。");
                    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);
            }
        }
Beispiel #19
0
        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");
            }
        }
Beispiel #20
0
        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>&nbsp;&nbsp;</div>";
            this.Top.Add(lb);
        }
Beispiel #22
0
        /// <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");
        }
Beispiel #23
0
        /// <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);
        }
Beispiel #24
0
        /// <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 检查其它的人在开始节点上是否还有待办工作。
        }
Beispiel #25
0
        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();
            }
        }
Beispiel #26
0
        /// <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);
        }
Beispiel #27
0
        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='#'>&nbsp;&nbsp;时间轴<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) + "&nbsp;&nbsp; <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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp; <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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp;<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) + "&nbsp;&nbsp; <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) + "&nbsp;&nbsp;<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'>&nbsp;</p>";
                str += "<p class='intro'>" + cl.Title + "</p>";
                str += "<p class='version'>&nbsp;</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();
        }
Beispiel #28
0
        /// <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();
        }
Beispiel #29
0
        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();
        }
Beispiel #30
0
        /// <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);
        }