Exemple #1
0
    public string GenerWorkNode(string fk_flow, int fk_node, Int64 workID, Int64 fid, string userNo)
    {
        try
        {
            Emp emp = new Emp(userNo);
            BP.Web.WebUser.SignInOfGener(emp);

            MapData md = new MapData();
            md.No = "ND" + fk_node;
            if (md.RetrieveFromDBSources() == 0)
            {
                throw new Exception("装载错误,该表单ID=" + md.No + "丢失,请修复一次流程重新加载一次.");
            }

            DataSet myds = md.GenerHisDataSet();

            // 节点数据.
            Node nd = new Node(fk_node);
            myds.Tables.Add(nd.ToDataTableField("WF_Node"));

            //节点标签数据.
            BtnLab btnLab = new BtnLab(fk_node);
            myds.Tables.Add(btnLab.ToDataTableField("WF_BtnLab"));

            // 流程数据.
            Flow fl = new Flow(fk_flow);
            myds.Tables.Add(fl.ToDataTableField("WF_Flow"));

            //.工作数据放里面去, 放进去前执行一次装载前填充事件.
            BP.WF.Work wk = nd.HisWork;
            wk.OID = workID;
            wk.RetrieveFromDBSources();
            wk.ResetDefaultVal();
            // 执行一次装载前填充.
            string msg = md.FrmEvents.DoEventNode(FrmEventList.FrmLoadBefore, wk);
            if (string.IsNullOrEmpty(msg) == false)
            {
                return(msg);
            }
            myds.Tables.Add(wk.ToDataTableField("Main"));

            #region 获取明细表数据,并把它加入dataset里.
            if (md.MapDtls.Count > 0)
            {
                foreach (MapDtl dtl in md.MapDtls)
                {
                    GEDtls      dtls = new GEDtls(dtl.No);
                    QueryObject qo   = null;
                    try
                    {
                        qo = new QueryObject(dtl);
                        switch (dtl.DtlOpenType)
                        {
                        case DtlOpenType.ForEmp:      // 按人员来控制.
                            qo.AddWhere(GEDtlAttr.RefPK, workID);
                            qo.addAnd();
                            qo.AddWhere(GEDtlAttr.Rec, WebUser.No);
                            break;

                        case DtlOpenType.ForWorkID:     // 按工作ID来控制
                            qo.AddWhere(GEDtlAttr.RefPK, workID);
                            break;

                        case DtlOpenType.ForFID:     // 按流程ID来控制.
                            qo.AddWhere(GEDtlAttr.FID, workID);
                            break;
                        }
                    }
                    catch
                    {
                        dtls.GetNewEntity.CheckPhysicsTable();
                    }
                    DataTable dtDtl = qo.DoQueryToTable();
                    dtDtl.TableName = dtl.No; //修改明细表的名称.
                    myds.Tables.Add(dtDtl);   //加入这个明细表.
                }
            }
            #endregion

            //把流程信息表发送过去.
            GenerWorkFlow gwf = new GenerWorkFlow();
            gwf.WorkID = workID;
            myds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow"));

            if (gwf.WFState == WFState.Forward)
            {
                //如果是转发.
                BP.WF.ForwardWorks fws = new ForwardWorks();
                fws.Retrieve(ForwardWorkAttr.WorkID, workID, ForwardWorkAttr.FK_Node, fk_node);
                myds.Tables.Add(fws.ToDataTableField("WF_ForwardWork"));
            }

            if (gwf.WFState == WFState.ReturnSta)
            {
                //如果是退回.
                ReturnWorks rts = new ReturnWorks();
                rts.Retrieve(ReturnWorkAttr.WorkID, workID, ReturnWorkAttr.ReturnToNode, fk_node);
                myds.Tables.Add(rts.ToDataTableField("WF_ForwardWork"));
            }

            if (gwf.WFState == WFState.HungUp)
            {
                //如果是挂起.
                HungUps hups = new HungUps();
                hups.Retrieve(HungUpAttr.WorkID, workID, HungUpAttr.FK_Node, fk_node);
                myds.Tables.Add(hups.ToDataTableField("WF_HungUp"));
            }

            //放入track信息.
            Paras ps = new Paras();
            ps.SQL = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + BP.SystemConfig.AppCenterDBVarStr + "WorkID";
            ps.Add("WorkID", workID);
            DataTable dt = DBAccess.RunSQLReturnTable(ps);
            dt.TableName = "Track";
            myds.Tables.Add(dt);

            //写入数据.
            myds.WriteXml("c:\\sss.xml");

            //转化成它所能识别的格式.
            return(Silverlight.DataSetConnector.Connector.ToXml(myds));
        }
        catch (Exception ex)
        {
            Log.DebugWriteError(ex.StackTrace);
            return("@生成工作FK_Flow=" + fk_flow + ",FK_Node=" + fk_node + ",WorkID=" + workID + ",FID=" + fid + "错误,错误信息:" + ex.Message);
        }
    }
Exemple #2
0
        /// <summary>
        /// 产生一个WorkNode
        /// </summary>
        /// <param name="fk_flow">流程编号</param>
        /// <param name="fk_node">节点ID</param>
        /// <param name="workID">工作ID</param>
        /// <param name="fid">FID</param>
        /// <param name="userNo">用户编号</param>
        /// <returns>返回dataset</returns>
        public static DataSet GenerWorkNodeForAndroid(string fk_flow, int fk_node, Int64 workID, Int64 fid, string userNo)
        {
            if (fk_node == 0)
            {
                fk_node = int.Parse(fk_flow + "01");
            }

            if (workID == 0)
            {
                workID = BP.WF.Dev2Interface.Node_CreateBlankWork(fk_flow, null, null, userNo, null);
            }

            try
            {
                Emp emp = new Emp(userNo);
                BP.Web.WebUser.SignInOfGener(emp);

                MapData md = new MapData();
                md.No = "ND" + fk_node;
                if (md.RetrieveFromDBSources() == 0)
                {
                    throw new Exception("装载错误,该表单ID=" + md.No + "丢失,请修复一次流程重新加载一次.");
                }



                //表单模版.
                DataSet myds = BP.Sys.CCFormAPI.GenerHisDataSet(md.No);
                return(myds);

                #region 流程设置信息.
                Node nd = new Node(fk_node);

                if (nd.IsStartNode == false)
                {
                    BP.WF.Dev2Interface.Node_SetWorkRead(fk_node, workID);
                }

                // 节点数据.
                string    sql = "SELECT * FROM WF_Node WHERE NodeID=" + fk_node;
                DataTable dt  = BP.DA.DBAccess.RunSQLReturnTable(sql);
                dt.TableName = "WF_NodeBar";
                myds.Tables.Add(dt);

                // 流程数据.
                Flow fl = new Flow(fk_flow);
                myds.Tables.Add(fl.ToDataTableField("WF_Flow"));
                #endregion 流程设置信息.

                #region 把主从表数据放入里面.
                //.工作数据放里面去, 放进去前执行一次装载前填充事件.
                BP.WF.Work wk = nd.HisWork;
                wk.OID = workID;
                wk.RetrieveFromDBSources();

                // 处理传递过来的参数。
                foreach (string k in System.Web.HttpContext.Current.Request.QueryString.AllKeys)
                {
                    wk.SetValByKey(k, System.Web.HttpContext.Current.Request.QueryString[k]);
                }

                // 执行一次装载前填充.
                string msg = md.DoEvent(FrmEventList.FrmLoadBefore, wk);
                if (DataType.IsNullOrEmpty(msg) == false)
                {
                    throw new Exception("错误:" + msg);
                }

                wk.ResetDefaultVal();
                myds.Tables.Add(wk.ToDataTableField(md.No));

                //把附件的数据放入.
                if (md.FrmAttachments.Count > 0)
                {
                    sql          = "SELECT * FROM Sys_FrmAttachmentDB where RefPKVal=" + workID + " AND FK_MapData='ND" + fk_node + "'";
                    dt           = BP.DA.DBAccess.RunSQLReturnTable(sql);
                    dt.TableName = "Sys_FrmAttachmentDB";
                    myds.Tables.Add(dt);
                }
                // 图片附件数据放入
                if (md.FrmImgAths.Count > 0)
                {
                    sql          = "SELECT * FROM Sys_FrmImgAthDB where RefPKVal=" + workID + " AND FK_MapData='ND" + fk_node + "'";
                    dt           = BP.DA.DBAccess.RunSQLReturnTable(sql);
                    dt.TableName = "Sys_FrmImgAthDB";
                    myds.Tables.Add(dt);
                }

                //把从表的数据放入.
                if (md.MapDtls.Count > 0)
                {
                    foreach (MapDtl dtl in md.MapDtls)
                    {
                        GEDtls      dtls = new GEDtls(dtl.No);
                        QueryObject qo   = null;
                        try
                        {
                            qo = new QueryObject(dtls);
                            switch (dtl.DtlOpenType)
                            {
                            case DtlOpenType.ForEmp:      // 按人员来控制.
                                qo.AddWhere(GEDtlAttr.RefPK, workID);
                                qo.addAnd();
                                qo.AddWhere(GEDtlAttr.Rec, WebUser.No);
                                break;

                            case DtlOpenType.ForWorkID:     // 按工作ID来控制
                                qo.AddWhere(GEDtlAttr.RefPK, workID);
                                break;

                            case DtlOpenType.ForFID:     // 按流程ID来控制.
                                qo.AddWhere(GEDtlAttr.FID, workID);
                                break;
                            }
                        }
                        catch
                        {
                            dtls.GetNewEntity.CheckPhysicsTable();
                        }
                        DataTable dtDtl = qo.DoQueryToTable();

                        // 为明细表设置默认值.
                        MapAttrs dtlAttrs = new MapAttrs(dtl.No);
                        foreach (MapAttr attr in dtlAttrs)
                        {
                            //处理它的默认值.
                            if (attr.DefValReal.Contains("@") == false)
                            {
                                continue;
                            }

                            foreach (DataRow dr in dtDtl.Rows)
                            {
                                dr[attr.KeyOfEn] = attr.DefVal;
                            }
                        }

                        dtDtl.TableName = dtl.No; //修改明细表的名称.
                        myds.Tables.Add(dtDtl);   //加入这个明细表, 如果没有数据,xml体现为空.
                    }
                }
                #endregion

                #region 把外键表加入DataSet
                DataTable dtMapAttr = myds.Tables["Sys_MapAttr"];
                foreach (DataRow dr in dtMapAttr.Rows)
                {
                    string lgType = dr["LGType"].ToString();
                    if (lgType.Equals("2") == false)
                    {
                        continue;
                    }

                    string UIIsEnable = dr["UIIsEnable"].ToString();
                    if (UIIsEnable.Equals("0") == true)
                    {
                        continue;
                    }

                    string uiBindKey = dr["UIBindKey"].ToString();
                    if (DataType.IsNullOrEmpty(uiBindKey) == true)
                    {
                        string myPK = dr["MyPK"].ToString();
                        /*如果是空的*/
                        throw new Exception("@属性字段数据不完整,流程:" + fl.No + fl.Name + ",节点:" + nd.NodeID + nd.Name + ",属性:" + myPK + ",的UIBindKey IsNull ");
                    }

                    // 判断是否存在.
                    if (myds.Tables.Contains(uiBindKey) == true)
                    {
                        continue;
                    }

                    myds.Tables.Add(BP.Sys.PubClass.GetDataTableByUIBineKey(uiBindKey));
                }
                #endregion End把外键表加入DataSet

                #region 把流程信息放入里面.
                //把流程信息表发送过去.
                GenerWorkFlow gwf = new GenerWorkFlow();
                gwf.WorkID = workID;
                gwf.RetrieveFromDBSources();

                myds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow"));

                if (gwf.WFState == WFState.Shift)
                {
                    //如果是转发.
                    BP.WF.ShiftWorks fws = new ShiftWorks();
                    fws.Retrieve(ShiftWorkAttr.WorkID, workID, ShiftWorkAttr.FK_Node, fk_node);
                    myds.Tables.Add(fws.ToDataTableField("WF_ShiftWork"));
                }

                if (gwf.WFState == WFState.ReturnSta)
                {
                    //如果是退回.
                    ReturnWorks rts = new ReturnWorks();
                    rts.Retrieve(ReturnWorkAttr.WorkID, workID,
                                 ReturnWorkAttr.ReturnToNode, fk_node,
                                 ReturnWorkAttr.RDT);
                    myds.Tables.Add(rts.ToDataTableField("WF_ReturnWork"));
                }

                if (gwf.WFState == WFState.HungUp)
                {
                    //如果是挂起.
                    HungUps hups = new HungUps();
                    hups.Retrieve(HungUpAttr.WorkID, workID, HungUpAttr.FK_Node, fk_node);
                    myds.Tables.Add(hups.ToDataTableField("WF_HungUp"));
                }

                //if (gwf.WFState == WFState.Askfor)
                //{
                //    //如果是加签.
                //    BP.WF.ShiftWorks fws = new ShiftWorks();
                //    fws.Retrieve(ShiftWorkAttr.WorkID, workID, ShiftWorkAttr.FK_Node, fk_node);
                //    myds.Tables.Add(fws.ToDataTableField("WF_ShiftWork"));
                //}

                Int64 wfid = workID;
                if (fid != 0)
                {
                    wfid = fid;
                }


                //放入track信息.
                Paras ps = new Paras();
                ps.SQL = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID";
                ps.Add("WorkID", wfid);
                DataTable dtNode = DBAccess.RunSQLReturnTable(ps);
                dtNode.TableName = "Track";
                myds.Tables.Add(dtNode);

                //工作人员列表,用于审核组件.
                ps     = new Paras();
                ps.SQL = "SELECT * FROM  WF_GenerWorkerlist WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID";
                ps.Add("WorkID", wfid);
                DataTable dtGenerWorkerlist = DBAccess.RunSQLReturnTable(ps);
                dtGenerWorkerlist.TableName = "WF_GenerWorkerlist";
                myds.Tables.Add(dtGenerWorkerlist);

                //放入CCList信息. 用于审核组件.
                ps     = new Paras();
                ps.SQL = "SELECT * FROM WF_CCList WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID";
                ps.Add("WorkID", wfid);
                DataTable dtCCList = DBAccess.RunSQLReturnTable(ps);
                dtCCList.TableName = "WF_CCList";
                myds.Tables.Add(dtCCList);

                //放入WF_SelectAccper信息. 用于审核组件.
                ps     = new Paras();
                ps.SQL = "SELECT * FROM WF_SelectAccper WHERE WorkID=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "WorkID";
                ps.Add("WorkID", wfid);
                DataTable dtSelectAccper = DBAccess.RunSQLReturnTable(ps);
                dtSelectAccper.TableName = "WF_SelectAccper";
                myds.Tables.Add(dtSelectAccper);

                //放入所有的节点信息. 用于审核组件.
                ps     = new Paras();
                ps.SQL = "SELECT * FROM WF_Node WHERE FK_Flow=" + BP.Sys.SystemConfig.AppCenterDBVarStr + "FK_Flow ORDER BY " + NodeAttr.Step;
                ps.Add("FK_Flow", fk_flow);
                DataTable dtNodes = DBAccess.RunSQLReturnTable(ps);
                dtNodes.TableName = "Nodes";
                myds.Tables.Add(dtNodes);

                #endregion 把流程信息放入里面.

                return(myds);
            }
            catch (Exception ex)
            {
                Log.DebugWriteError(ex.StackTrace);
                throw new Exception(ex.Message);
            }
        }
        private void SingleAttach(HttpContext context, string attachPk, string workid, string fk_node, string ensName)
        {
            FrmAttachment frmAth = new FrmAttachment();

            frmAth.MyPK = attachPk;
            frmAth.RetrieveFromDBSources();

            string athDBPK = attachPk + "_" + workid;

            BP.WF.Node currND = new BP.WF.Node(fk_node);
            BP.WF.Work currWK = currND.HisWork;
            currWK.OID = long.Parse(workid);
            currWK.Retrieve();
            //处理保存路径.
            string saveTo = frmAth.SaveTo;

            if (saveTo.Contains("*") || saveTo.Contains("@"))
            {
                /*如果路径里有变量.*/
                saveTo = saveTo.Replace("*", "@");
                saveTo = BP.WF.Glo.DealExp(saveTo, currWK, null);
            }

            try
            {
                saveTo = context.Server.MapPath("~/" + saveTo);
            }
            catch (Exception)
            {
                saveTo = saveTo;
            }

            if (System.IO.Directory.Exists(saveTo) == false)
            {
                System.IO.Directory.CreateDirectory(saveTo);
            }


            saveTo = saveTo + "\\" + athDBPK + "." + context.Request.Files[0].FileName.Substring(context.Request.Files[0].FileName.LastIndexOf('.') + 1);
            context.Request.Files[0].SaveAs(saveTo);

            FileInfo        info     = new FileInfo(saveTo);
            FrmAttachmentDB dbUpload = new FrmAttachmentDB();

            dbUpload.MyPK             = athDBPK;
            dbUpload.FK_FrmAttachment = attachPk;
            dbUpload.RefPKVal         = workid;

            dbUpload.FK_MapData = ensName;

            dbUpload.FileExts     = info.Extension;
            dbUpload.FileFullName = saveTo;
            dbUpload.FileName     = context.Request.Files[0].FileName;
            dbUpload.FileSize     = (float)info.Length;
            dbUpload.Rec          = WebUser.No;
            dbUpload.RecName      = WebUser.Name;
            dbUpload.RDT          = BP.DA.DataType.CurrentDataTime;


            dbUpload.NodeID = fk_node;

            dbUpload.Save();
        }
Exemple #4
0
        /// <summary>
        /// 逾期流程
        /// </summary>
        private void DoOverDueFlow()
        {
            //特殊处理天津的需求.
            if (SystemConfig.CustomerNo == "")
            {
                DoTianJinSpecFunc();
            }


            #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;

                            BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg);
                        }
                        catch (Exception ex)
                        {
                            msg = "流程 '" + node.FlowName + "',WorkID=" + workid + ",标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                                  "'超时处理规则为'自动跳转',跳转异常:" + ex.Message;
                            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 + ".";
                            BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg);
                        }
                        catch (Exception ex)
                        {
                            msg = "流程 '" + node.FlowName + "' ,标题:'" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                                  "'超时处理规则为'移交到指定的人',移交异常:" + ex.Message;
                            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);

                            WebUser.SignInOfGener(workerList.HisEmp);
                            WorkNode firstwn = new WorkNode(workid, fk_node);
                            string   sendIfo = firstwn.NodeSend().ToMsgOfText();
                            msg = "流程  '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                                  "'超时处理规则为'自动发送到下一节点',发送消息为:" + sendIfo;
                            BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg);
                        }
                        catch (Exception ex)
                        {
                            msg = "流程  '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                                  "'超时处理规则为'自动发送到下一节点',发送异常:" + ex.Message;
                            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;
                        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变量.";
                                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;
                            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 + "'";
                            }
                            BP.DA.Log.DefaultLogWriteLine(LogType.Info, msg);
                        }
                        catch (Exception ex)
                        {
                            msg = "流程  '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                                  "'超时处理规则为'执行SQL'.运行SQL出现异常:" + ex.Message;
                            BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg);
                        }
                        break;

                    default:
                        msg = "流程 '" + node.FlowName + "',标题: '" + title + "'的应该完成时间为'" + compleateTime + "',当前节点'" + node.Name +
                              "'没有找到相应的超时处理规则.";
                        BP.DA.Log.DefaultLogWriteLine(LogType.Error, msg);
                        break;
                    }
                }
                catch (Exception ex)
                {
                    BP.DA.Log.DefaultLogWriteLine(LogType.Error, ex.ToString());
                }
            }
            BP.DA.Log.DefaultLogWriteLine(LogType.Info, "结束扫描逾期流程数据.");
        }
        /// <summary>
        /// 创建WorkID
        /// </summary>
        /// <param name="flowNo">流程编号</param>
        /// <param name="ht">表单参数,可以为null。</param>
        /// <param name="workDtls">明细表参数,可以为null。</param>
        /// <param name="starter">流程的发起人</param>
        /// <param name="title">创建工作时的标题,如果为null,就按设置的规则生成。</param>
        /// <param name="parentWorkID">父流程的WorkID,如果没有父流程就传入为0.</param>
        /// <param name="parentFlowNo">父流程的流程编号,如果没有父流程就传入为null.</param>
        /// <returns>为开始节点创建工作后产生的WorkID.</returns>
        public static Int64 Node_CreateBlankWork(string flowNo, Hashtable ht, DataSet workDtls,
                                                 string guestNo, string title, Int64 parentWorkID, string parentFlowNo, int parentNodeID, string parentEmp)
        {
            //if (BP.Web.WebUser.No != "Guest")
            //    throw new Exception("@必须是Guest登陆才能发起.");



            string dbstr = SystemConfig.AppCenterDBVarStr;

            Flow fl = new Flow(flowNo);
            Node nd = new Node(fl.StartNodeID);


            //把一些其他的参数也增加里面去,传递给ccflow.
            Hashtable htPara = new Hashtable();

            if (parentWorkID != 0)
            {
                htPara.Add(StartFlowParaNameList.PWorkID, parentWorkID);
            }
            if (parentFlowNo != null)
            {
                htPara.Add(StartFlowParaNameList.PFlowNo, parentFlowNo);
            }
            if (parentNodeID != 0)
            {
                htPara.Add(StartFlowParaNameList.PNodeID, parentNodeID);
            }
            if (parentEmp != null)
            {
                htPara.Add(StartFlowParaNameList.PEmp, parentEmp);
            }


            Emp   empStarter = new Emp(BP.Web.WebUser.No);
            Work  wk         = fl.NewWork(empStarter, htPara);
            Int64 workID     = wk.OID;

            #region 给各个属性-赋值
            if (ht != null)
            {
                foreach (string str in ht.Keys)
                {
                    wk.SetValByKey(str, ht[str]);
                }
            }
            wk.OID = workID;
            if (workDtls != null)
            {
                //保存从表
                foreach (DataTable dt in workDtls.Tables)
                {
                    foreach (MapDtl dtl in wk.HisMapDtls)
                    {
                        if (dt.TableName != dtl.No)
                        {
                            continue;
                        }
                        //获取dtls
                        GEDtls daDtls = new GEDtls(dtl.No);
                        daDtls.Delete(GEDtlAttr.RefPK, wk.OID); // 清除现有的数据.

                        GEDtl daDtl = daDtls.GetNewEntity as GEDtl;
                        daDtl.RefPK = wk.OID.ToString();

                        // 为从表复制数据.
                        foreach (DataRow dr in dt.Rows)
                        {
                            daDtl.ResetDefaultVal();
                            daDtl.RefPK = wk.OID.ToString();

                            //明细列.
                            foreach (DataColumn dc in dt.Columns)
                            {
                                //设置属性.
                                daDtl.SetValByKey(dc.ColumnName, dr[dc.ColumnName]);
                            }
                            daDtl.InsertAsOID(DBAccess.GenerOID("Dtl")); //插入数据.
                        }
                    }
                }
            }
            #endregion 赋值

            Paras ps = new Paras();
            // 执行对报表的数据表WFState状态的更新,让它为runing的状态.
            if (DataType.IsNullOrEmpty(title) == false)
            {
                ps     = new Paras();
                ps.SQL = "UPDATE " + fl.PTable + " SET WFState=" + dbstr + "WFState,Title=" + dbstr + "Title WHERE OID=" + dbstr + "OID";
                ps.Add(GERptAttr.WFState, (int)WFState.Blank);
                ps.Add(GERptAttr.Title, title);
                ps.Add(GERptAttr.OID, wk.OID);
                DBAccess.RunSQL(ps);
            }
            else
            {
                ps     = new Paras();
                ps.SQL = "UPDATE " + fl.PTable + " SET WFState=" + dbstr + "WFState,FK_Dept=" + dbstr + "FK_Dept,Title=" + dbstr + "Title WHERE OID=" + dbstr + "OID";
                ps.Add(GERptAttr.WFState, (int)WFState.Blank);
                ps.Add(GERptAttr.FK_Dept, empStarter.FK_Dept);
                ps.Add(GERptAttr.Title, BP.WF.WorkFlowBuessRole.GenerTitle(fl, wk));
                ps.Add(GERptAttr.OID, wk.OID);
                DBAccess.RunSQL(ps);
            }

            // 删除有可能产生的垃圾数据,比如上一次没有发送成功,导致数据没有清除.
            ps     = new Paras();
            ps.SQL = "DELETE FROM WF_GenerWorkFlow  WHERE WorkID=" + dbstr + "WorkID1 OR FID=" + dbstr + "WorkID2";
            ps.Add("WorkID1", wk.OID);
            ps.Add("WorkID2", wk.OID);
            DBAccess.RunSQL(ps);

            ps     = new Paras();
            ps.SQL = "DELETE FROM WF_GenerWorkerList  WHERE WorkID=" + dbstr + "WorkID1 OR FID=" + dbstr + "WorkID2";
            ps.Add("WorkID1", wk.OID);
            ps.Add("WorkID2", wk.OID);
            DBAccess.RunSQL(ps);

            // 设置流程信息
            if (parentWorkID != 0)
            {
                BP.WF.Dev2Interface.SetParentInfo(flowNo, workID, parentFlowNo, parentWorkID, parentNodeID, parentEmp);
            }

            #region 处理generworkid
            // 设置父流程信息.
            GenerWorkFlow gwf = new GenerWorkFlow();
            gwf.WorkID = wk.OID;
            int i = gwf.RetrieveFromDBSources();

            //将流程信息提前写入wf_GenerWorkFlow,避免查询不到
            gwf.FlowName    = fl.Name;
            gwf.FK_Flow     = flowNo;
            gwf.FK_FlowSort = fl.FK_FlowSort;
            gwf.SysType     = fl.SysType;
            gwf.FK_Dept     = WebUser.FK_Dept;
            gwf.DeptName    = WebUser.FK_DeptName;
            gwf.FK_Node     = fl.StartNodeID;
            gwf.NodeName    = nd.Name;
            gwf.WFState     = WFState.Runing;
            if (DataType.IsNullOrEmpty(title))
            {
                gwf.Title = BP.WF.WorkFlowBuessRole.GenerTitle(fl, wk);
            }
            else
            {
                gwf.Title = title;
            }
            gwf.Starter     = WebUser.No;
            gwf.StarterName = WebUser.Name;
            gwf.RDT         = DataType.CurrentDataTime;
            gwf.PWorkID     = parentWorkID;
            // gwf.PFID = parentFID;
            gwf.PFlowNo = parentFlowNo;
            gwf.PNodeID = parentNodeID;
            if (i == 0)
            {
                gwf.Insert();
            }
            else
            {
                gwf.Update();
            }

            //插入待办.
            GenerWorkerList gwl = new GenerWorkerList();
            gwl.WorkID  = wk.OID;
            gwl.FK_Node = nd.NodeID;
            gwl.FK_Emp  = WebUser.No;
            i           = gwl.RetrieveFromDBSources();

            gwl.FK_EmpText  = WebUser.Name;
            gwl.FK_NodeText = nd.Name;
            gwl.FID         = 0;
            gwl.FK_Flow     = fl.No;
            gwl.FK_Dept     = WebUser.FK_Dept;
            gwl.FK_DeptT    = WebUser.FK_DeptName;

            gwl.SDT         = "无";
            gwl.DTOfWarning = DataType.CurrentDataTime;
            gwl.IsEnable    = true;
            gwl.IsPass      = false;
            gwl.PRI         = gwf.PRI;
            if (i == 0)
            {
                gwl.Insert();
            }
            else
            {
                gwl.Update();
            }
            #endregion

            return(wk.OID);
        }
Exemple #6
0
        /// <summary>
        /// 分合流的撤销发送.
        /// </summary>
        /// <param name="gwf"></param>
        /// <returns></returns>
        private string DoUnSendInFeiLiuHeiliu(GenerWorkFlow gwf)
        {
            //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。
            GenerWorkerList gwl = new GenerWorkerList();

            //删除合流节点的处理人.
            gwl.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node);

            //查询已经走得分流节点待办.
            int i = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, this.UnSendToNode, GenerWorkerListAttr.FK_Emp, WebUser.No);

            if (i == 0)
            {
                throw new Exception("@您不能执行撤消发送,因为当前分流工作不是您发送的。");
            }

            // 更新分流节点,让其出现待办.
            gwl.IsPassInt = 0;
            gwl.IsRead    = false;
            gwl.SDT       = BP.DA.DataType.CurrentDataTime; //这里计算时间有问题.
            gwl.Update();

            // 把设置当前流程运行到分流流程上.
            gwf.FK_Node = this.UnSendToNode;
            Node nd = new Node(this.UnSendToNode);

            gwf.NodeName = nd.Name;
            gwf.Sender   = BP.Web.WebUser.No;
            gwf.SendDT   = BP.DA.DataType.CurrentDataTime;
            gwf.Update();


            Work wk = nd.HisWork;

            wk.OID = gwf.WorkID;
            wk.RetrieveFromDBSources();

            string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wk, null);

            // 记录日志..
            WorkNode wn = new WorkNode(wk, nd);

            wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, gwf.FK_Node, gwf.NodeName, "");


            //删除上一个节点的数据。
            foreach (Node ndNext in nd.HisToNodes)
            {
                i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID);
                if (i == 0)
                {
                    continue;
                }

                if (ndNext.HisRunModel == RunModel.SubThread)
                {
                    /*如果到达的节点是子线程,就查询出来发起的子线程。*/
                    GenerWorkFlows gwfs = new GenerWorkFlows();
                    gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID);
                    foreach (GenerWorkFlow en in gwfs)
                    {
                        BP.WF.Dev2Interface.Flow_DeleteSubThread(gwf.FK_Flow, en.WorkID, "合流节点撤销发送前,删除子线程.");
                    }
                    continue;
                }

                // 删除工作记录。
                Works wks = ndNext.HisWorks;
                if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow)
                {
                    wks.Delete(GenerWorkerListAttr.FID, this.WorkID);
                }
            }


            // 设置当前节点的状态.
            Node cNode = new Node(gwf.FK_Node);
            Work cWork = cNode.HisWork;

            cWork.OID = this.WorkID;
            msg      += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wk, null);
            if (cNode.IsStartNode)
            {
                return("@撤消执行成功." + msg);
            }
            else
            {
                return("@撤消执行成功." + msg);
            }
        }
Exemple #7
0
        /// <summary>
        /// 撤消分流点
        /// 1, 把分流节点的人员设置成待办。
        /// 2,删除所有该分流点发起的子线程。
        /// </summary>
        /// <param name="gwf"></param>
        /// <returns></returns>
        private string DoUnSendFeiLiu(GenerWorkFlow gwf)
        {
            //首先要检查,当前的处理人是否是分流节点的处理人?如果是,就要把,未走完的所有子线程都删除掉。
            GenerWorkerList gwl = new GenerWorkerList();
            int             i   = gwl.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node, GenerWorkerListAttr.FK_Emp, WebUser.No);

            if (i == 0)
            {
                throw new Exception("@您不能执行撤消发送,因为当前工作不是您发送的。");
            }

            //处理事件.
            Node nd = new Node(gwf.FK_Node);
            Work wk = nd.HisWork;

            wk.OID = gwf.WorkID;
            wk.RetrieveFromDBSources();

            string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wk, null);

            // 记录日志..
            WorkNode wn = new WorkNode(wk, nd);

            wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, gwf.FK_Node, gwf.NodeName, "");

            //删除上一个节点的数据。
            foreach (Node ndNext in nd.HisToNodes)
            {
                i = DBAccess.RunSQL("DELETE FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND FK_Node=" + ndNext.NodeID);
                if (i == 0)
                {
                    continue;
                }

                if (ndNext.HisRunModel == RunModel.SubThread)
                {
                    /*如果到达的节点是子线程,就查询出来发起的子线程。*/
                    GenerWorkFlows gwfs = new GenerWorkFlows();
                    gwfs.Retrieve(GenerWorkFlowAttr.FID, this.WorkID);
                    foreach (GenerWorkFlow en in gwfs)
                    {
                        BP.WF.Dev2Interface.Flow_DeleteSubThread(gwf.FK_Flow, en.WorkID, "合流节点撤销发送前,删除子线程.");
                    }
                    continue;
                }

                // 删除工作记录。
                Works wks = ndNext.HisWorks;
                if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow)
                {
                    wks.Delete(GenerWorkerListAttr.FID, this.WorkID);
                }
            }

            //设置当前节点。
            BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND IsPass=1");

            // 设置当前节点的状态.
            Node cNode = new Node(gwf.FK_Node);
            Work cWork = cNode.HisWork;

            cWork.OID = this.WorkID;
            msg      += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wk, null);

            return("@撤消执行成功." + msg);
        }
Exemple #8
0
        /// <summary>
        /// 执行
        /// </summary>
        /// <returns>返回执行结果</returns>
        public override object Do()
        {
            if (Web.WebUser.No != "admin")
            {
                return("非法的用户执行。");
            }

            //DA.DBAccess.RunSQL("DELETE FROM WF_CHOfFlow");
            DA.DBAccess.RunSQL("DELETE FROM WF_Bill");
            DA.DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist");
            DA.DBAccess.RunSQL("DELETE FROM WF_GENERWORKFLOW");
            DA.DBAccess.RunSQL("DELETE FROM WF_ReturnWork");
            DA.DBAccess.RunSQL("DELETE FROM WF_GenerFH");
            DA.DBAccess.RunSQL("DELETE FROM WF_SelectAccper");

            DA.DBAccess.RunSQL("DELETE FROM WF_RememberMe");

            DA.DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB");


            Flows fls = new Flows();

            fls.RetrieveAll();
            foreach (Flow item in fls)
            {
                DA.DBAccess.RunSQL("DELETE FROM ND" + int.Parse(item.No) + "Track");
            }


            Nodes nds = new Nodes();

            foreach (Node nd in nds)
            {
                try
                {
                    Work wk = nd.HisWork;
                    DA.DBAccess.RunSQL("DELETE FROM " + wk.EnMap.PhysicsTable);
                }
                catch
                {
                }
            }

            MapDatas mds = new MapDatas();

            mds.RetrieveAll();
            foreach (MapData nd in mds)
            {
                try
                {
                    DA.DBAccess.RunSQL("DELETE FROM " + nd.PTable);
                }
                catch
                {
                }
            }

            MapDtls dtls = new MapDtls();

            dtls.RetrieveAll();
            foreach (MapDtl dtl in dtls)
            {
                try
                {
                    DA.DBAccess.RunSQL("DELETE FROM " + dtl.PTable);
                }
                catch
                {
                }
            }
            return("执行成功...");
        }