本帖最后由 ajaxtop 于 2011-08-04 15:06:22 编辑

解决方案 »

  1.   

    你的目的:拿到某个角色下的所有单据
    但你又有新的问题,即同一角色下的不同用户只能拿到自己的单据。所以思路大致如下:
    1、根据角色拿到该角色权限下所有工作流
    2、根据用户拿到通过角色过滤出来的工作流下的所有单据。
    以上操作完全可以通过SQL来实现,没必要循环。这样效率会好些。
      

  2.   

       /// <summary>
            /// 通过用户取到用户所属的单据
            /// </summary>
            /// <param name="user">登录用户</param>
            /// <param name="IsSp">是否有工作流权限,如果没有,直接反回,能尽量节省时间</param>
            /// <returns></returns>
            public IList<Bdxx> GetUserWaitingWorkItems(Userinfo user , out bool IsSp)
            {
                #region 拿到用户的所有基础数据
                IList<Bdxx> bdxxList = new List<Bdxx>();//单据集合
                BdxxBll bdBll = new BdxxBll();//单据业务层对象
                User_state_mapBll ubll = new User_state_mapBll();//工作流权限集合
                IList<User_state_map> stateList = ubll.GetListByUser(user.ID);//通过用户编号拿到所有工作流权限
                if (stateList == null || stateList.Count == 0) { IsSp = false; return null; } else { IsSp = true; }//是否有工作流权限,如果没有,直接反回,能尽量节省时间
                JcrywzgxBll jcrwwzgxbll = new JcrywzgxBll();//同一计划员角色中的不同计划员管理不同的物资大类
                IList<Jcrywzgx> userdl = jcrwwzgxbll.GetModelList("rwyhid='" + user.USERID + "'");//拿到用户所管的物资大类集合
                IList<Kckf> kflist = new whims.bll.KckfBll().GetList("trim(kffzr)=trim('" + user.USERNAME + "')");//同一保管员角色中的不同保管员管理的库房不一样,拿到用户管理的库房的集合
                IList<Bdxx> bdList = new whims.bll.BdxxBll().GetListBySP();//拿到所有待审批的单据
                #endregion
                foreach (Bdxx bdxx in bdList)//遍历所有的单据
                {
                    #region 通过单据号拿到该工作流的作态
                    StateMachineWorkflowInstance stateInstance = null;
                    try
                    {
                        stateInstance= new StateMachineWorkflowInstance(WorkflowMgr.CurrentWorkflowRuntime, bdxx.INSTANCEID);
                    }
                    catch (Exception)
                    {
                        continue;
                    }   
                    string wfname = stateInstance.CurrentState.Parent.Name;//工作流名称
                    string statename = stateInstance.CurrentStateName;//工作流审批状态
                    #endregion 
                    foreach (User_state_map up in stateList)//遍历所有的工作流权限
                    {
                        if (up.STATENAME == statename && up.WFNAME == wfname)//如果这个工作流的名称,审批状态和用户的权限相匹配
                        {
                            bool add = false;//标识是否为用户的单据,true属于该用户则添加,否则不添加
                            switch (wfname)
                            {
                                #region 出库
                                case "CkWorkflow":
                                    switch (statename)
                                    {
                                        case "BgyCheckState"://如果是保管员则要根据库房的不同查看自己库房的单子
                                            Kcck ckmodel=new KcckBll().GetModel(bdxx.BDBH);//拿到单据的库房信息
                                            if (kflist != null && kflist.Count > 0)
                                            {
                                                string ckkfid = ckmodel.CKKFID;
                                                foreach (Kckf kf in kflist)//遍历该保管员管理的所有库房
                                                {
                                                    if (ckkfid.Equals(kf.KFID))//如果包含该库房则标识为true
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "JlyCheckState":
                                            add = true;
                                            break;
                                        case "JhyCheckState"://如果是计划员则根据管理物资大类的不同查看自己大类的单子
                                            StringBuilder strSql = new StringBuilder();
                                            strSql.Append("select wzdl from kcckmx ,jcwz");
                                            strSql.Append(" where ckid='" + bdxx.BDBH + "' and xtid=kcckmx.wzid and rownum=1");
                                            object objck=DbHelperSQL.GetSingle(strSql.ToString());//拿到此单据物资明细中第一条的物资类别 
                                            if(objck==null)break;
                                            string dl = (objck).ToString();
                                            if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)//遍历该计划员管理的所有的物资类别
                                                {
                                                    if (dl.Equals(rw.RWWZDL))//如果包含则标识为true
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "BmldCheckState":
                                            if (user.BUMEN.Equals(bdxx.BUMEN))
                                            {
                                                add = true;
                                            }
                                            break;
                                        case "RequestState":
                                            if (user.BUMEN.Equals(bdxx.BUMEN))
                                            {
                                                if (user.USERID.Equals(bdxx.CJR))
                                                {
                                                    add = true;
                                                }
                                            }
                                            break;
                                    }
                                    break;
                                #endregion 
      

  3.   


      #region 入库
                                case "RkWorkflow":
                                    KcrkBll rkbll = new KcrkBll();
                                    bdxx.BDMC = rkbll.GetGysByRkid(bdxx.BDBH);
                                    switch (statename)
                                    {
                                        case "BgyCheckState"://保管员,库房不同,单据不同,只查属于自己的单据
                                            Kcrk rkmodel = rkbll.GetModel(bdxx.BDBH);
                                            if (kflist != null && kflist.Count > 0)
                                            {
                                                string rkkfid = rkmodel.RKKFID;
                                                foreach (Kckf kf in kflist)
                                                {
                                                    if (rkkfid.Equals(kf.KFID))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "JlyCheckState":
                                            add = true;
                                            break;
                                        case "JhyCheckState"://计划员不同,查询属于自己管理大类的单据
                                            StringBuilder strSql = new StringBuilder();
                                            strSql.Append("select wzdl from kcrkmx ,jcwz");
                                            strSql.Append(" where rkid='" + bdxx.BDBH + "' and xtid=kcrkmx.wzid  and rownum=1");
                                            object obj=(DbHelperSQL.GetSingle(strSql.ToString()));
                                            if (obj == null) break;
                                            string dl = obj.ToString();
                                            
                                            if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)
                                                {
                                                    if (dl.Equals(rw.RWWZDL))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "JyyCheckState":
                                            add = true;
                                            break;
                                        case "RequestState"://采购员不同,查询属于自己管理大类的单据
                                            StringBuilder Sql = new StringBuilder();
                                            Sql.Append("select wzdl from kcrkmx ,jcwz");
                                            Sql.Append(" where rkid='" + bdxx.BDBH + "' and xtid=kcrkmx.wzid  and rownum=1");
                                            object objr = (DbHelperSQL.GetSingle(Sql.ToString()));
                                            if (objr == null) break;
                                            string dlr = objr.ToString();
                                            if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)
                                                {
                                                    if (dlr.Equals(rw.RWWZDL))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                    }
                                    break;
                                #endregion
                                #region 退库
                                case "TkWorkflow":
                                    switch (statename)
                                    {
                                        case "BgyCheckState"://保管员查看自己库房的单子
                                            Kcck ckmodel = new KcckBll().GetModel(new KctkBll().GetModel(bdxx.BDBH).TKCKID);
                                            if (kflist != null && kflist.Count > 0)
                                            {
                                                string ckkfid = ckmodel.CKKFID;
                                                foreach (Kckf kf in kflist)
                                                {
                                                    if (ckkfid.Equals(kf.KFID))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "JlyCheckState":
                                            add = true;
                                            break;
                                        case "JhyCheckState"://计划员查看自己大类的单子
                                            StringBuilder strSql = new StringBuilder();
                                            strSql.Append("select wzdl from kctk ,jcwz");
                                            strSql.Append(" where tkid='" + bdxx.BDBH + "' and xtid=tkwzid  and rownum=1");
                                            object obj = (DbHelperSQL.GetSingle(strSql.ToString()));
                                            if (obj == null) break;
                                            string dl = obj.ToString();                                        if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)
                                                {
                                                    if (dl.Equals(rw.RWWZDL))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "JyyCheckState":
                                            add = true;
                                            break;
                                        case "RequestState"://采购员不同,查询属于自己管理大类的单据
                                            StringBuilder Sql = new StringBuilder();
                                            Sql.Append("select wzdl from kctk ,jcwz");
                                            Sql.Append(" where tkid='" + bdxx.BDBH + "' and xtid=tkwzid  and rownum=1");
                                            object objr = (DbHelperSQL.GetSingle(Sql.ToString()));
                                            if (objr == null) break;
                                            string dlr = objr.ToString();
                                            if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)
                                                {
                                                    if (dlr.Equals(rw.RWWZDL))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                    }
                                    break;
                                #endregion
      

  4.   


      #region 采购
                                case "CgWorkflow":
                                    switch (statename)
                                    {
                                        case "RequestState":
                                            if (user.BUMEN.Equals(bdxx.BUMEN))
                                            {
                                                if (user.USERID.Equals(bdxx.CJR))
                                                {
                                                    add = true;
                                                }
                                            }
                                            break;
                                        case "CgbmldCheckState":
                                            if (user.BUMEN.Equals(bdxx.BUMEN))
                                            {
                                                add = true;
                                            }
                                            break;
                                        case "CgbjhyCheckState"://计划员查看自己大类的单子
                                            StringBuilder strSql = new StringBuilder();
                                            strSql.Append("select wzdl from cgprdetail ,jcwz");
                                            strSql.Append(" where prdsqdh='" + bdxx.BDBH + "' and xtid=prdxtm and rownum=1");
                                            object objdl=DbHelperSQL.GetSingle(strSql.ToString());
                                            if(objdl==null)break;
                                            string dl = (objdl).ToString();
                                            if (userdl != null && userdl.Count > 0)
                                            {
                                                foreach (Jcrywzgx rw in userdl)
                                                {
                                                    if (dl.Equals(rw.RWWZDL))
                                                    {
                                                        add = true;
                                                        break;
                                                    }
                                                }
                                            }
                                            break;
                                        case "MultiCheckState"://多人审批,属于这一角色时标识为true
                                            RolewaitstateBll rbll = new RolewaitstateBll();
                                            if (rbll.IsExistByUserId(bdxx.INSTANCEID.ToString(), user.USERID))
                                            {
                                                add = true;
                                            }
                                            break;
                                    }
                                    break;
                                #endregion
                            }
                            if (add) { bdxxList.Add(bdxx); break; }
                        }
                    }
                }
                return bdxxList;
            }