[抛砖引玉]二开列表插件:通用仓管用户的库存单据查看权限配置原创
金蝶云社区-XxcsGmdx
XxcsGmdx
10人赞赏了该文章 62次浏览 未经作者许可,禁止转载编辑于2024年10月14日 08:45:49
summary-icon摘要由AI智能服务提供

本文讨论了金蝶云星空中权限配置的不足,特别是上游单据携带不受权限控制的问题,以及数据规则中仅支持“且”运算而缺少“或”运算的局限性。作者提出了仓管用户库存类单据查看权限应同时考虑创建人和仓库负责人的建议,并展示了通过列表查询条件控制实现该建议的代码示例。代码中,根据用户是否为仓管员(用户名含“仓库”且不含“主管”)及其负责的仓库信息,动态生成查询条件,以控制库存单据的查看权限。针对不同类型的单据,如直接调拨单、组装拆卸单等,给出了具体的查询字符串拼接逻辑。

         实际工作中,权限配置是理想很丰满现实很骨感,且金蝶云星空中:

                ①上游单据携带不受权限控制;如生产用料清单上有不在权责范围内的仓库物料明细,下推生产领料单是可保存过帐;   

                ② 数据规则中的[数据规则]与[明细数据规则]间只有"且",没有"或"运算; 

          而个人认为:仓管用户的库存类单据查看权限控制为:(创建人=当前用户) or (明细条目仓库所属为当前用户)  才比较合情合理;

            下述代码用列表查询条件控制实现:

                    ①仓管类用户库存单据查看权限配置更合理--主+明细兼顾;

                    ①仓管类用户库存单据查看权限配置更快捷--一次挂载即可;

                    ②仓库转交更便捷--更改仓库的负责人即可;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core.List.PlugIn;

using Kingdee.BOS.Core.List.PlugIn.Args;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.Util;

using System;

using System.ComponentModel;

using System.Reflection;

using System.Runtime.InteropServices.ComTypes;

using System.Runtime.Remoting.Channels;

using System.Text;

using System.Web.UI.WebControls;

using System.Windows.Controls;

using System.Xml.Linq;


namespace Hjt.Kingdee.PlugIn.列表插件

{

    /// <summary> 

    /// 系统的[数据规则][明细数据规则]只有"且"没有"或" 

    /// 此功能用于单据列表查看:创建人为当前用户或明细仓库的负责人为当前用户(即仓管员库存单据查看权限授权管理)

    /// ①仓管员用户名称必须包含"仓库";

    /// ②仓库信息中的"仓库负责人"必须指定;

    /// </summary>


    [Description("【列表插件】仓管员库存类单据列表查询数据权限"), HotUpdate]

    public class ListQueryFilter_DataRules_Stock : AbstractListPlugIn

    {

        public override void PrepareFilterParameter(FilterArgs e)

        {

            base.PrepareFilterParameter(e);

            string userName = this.Context.UserName;//获取当前用户名

            string formTitle = this.ListView.GetFormTitle();//获取当前列表的标题

            long userId = this.Context.UserId;


            string queryParameters = "";//

            StringBuilder builder = new StringBuilder();

        

            if (userName.Contains("仓库") && !userName.Contains("主管"))//根据用户id取用户所负责的仓库Id 并将仓库主管排除

            {

                builder.Clear();

                builder.Append("/*dialect*/");

                builder.Append("  select t0.FSTOCKID ");

                //builder.Append("  --SELECT t0.FSTOCKID 仓库id, t3.FUSERID, t0.FPRINCIPAL 负责人id, t0_L.FNAME AS FName "); 

                builder.Append(" FROM t_BD_Stock t0  ");

                builder.Append("  LEFT JOIN  t_BD_Stock_L t0_L ON(t0.FSTOCKID = t0_L.FSTOCKID AND t0_L.FLocaleId = 2052)  ");

                builder.Append(" left join T_BD_STAFF t1 on t0.FPRINCIPAL = t1.FMASTERID  ");

                builder.Append(" left join T_BD_PERSON t2 on t1.FPERSONID = t2.FPERSONID  ");

                builder.Append(" left join T_SEC_USER t3 on t2.FPERSONID = t3.FLINKOBJECT  ");

                builder.AppendFormat(" WHERE(t0.FForbidStatus = N'A'    and t3.FUSERID ={0})  ", userId);

                DynamicObjectCollection stockIdSet = DBUtils.ExecuteDynamicObject(this.Context, builder.ToString());


                if (stockIdSet.Count == 0) { return; }


                for (int count = 0; count <= stockIdSet.Count - 1; count++)

                {

                    if (queryParameters.IsNullOrEmptyOrWhiteSpace())

                    {

                        queryParameters = stockIdSet[count][0].ToString();

                    }

                    else

                    {

                        queryParameters = queryParameters + "," + stockIdSet[count][0].ToString();

                    }


                }

            } 

            else

            {

                return;

            }


   

            switch (formTitle)

            {

                case "直接调拨单":

                    //  FCreatorId//创建人|FSrcStockId//调出仓库|FDestStockId//调入仓库

                    e.FilterString = e.FilterString.JoinFilterString("  FCreatorId  =  " + userId + " or (  FSrcStockId   in  (" + queryParameters + ")  or  FDestStockId in  (" + queryParameters + ") )  ");

                    break;

                case "组装拆卸单": 

                    e.FilterString = e.FilterString.JoinFilterString("  FCreatorId  =  " + userId + " or (  FStockID   in  (" + queryParameters + ")  or  FStockIDSETY in  (" + queryParameters + ") )  ");

                    break;

                case "生产用料清单":

                case "委外用料清单":

                    //FIssueType发料方式|直接领料1直接倒冲2调拨领料3调拨倒冲4不发料7

                    e.FilterString = e.FilterString.JoinFilterString("  ( (FIssueType=1 or FIssueType=2 or FIssueType=7 ) and  (  FStockID   in  (" + queryParameters + ") or FStockID=0 )    or   (  (FIssueType=3 or FIssueType=4  ) and   (   FSrcTransStockId in  (" + queryParameters + ") or FSrcTransStockId=0) ) ");

                    break;

                case "发货通知单":

                case "收料通知单":

                    e.FilterString = e.FilterString.JoinFilterString("    FStockID in  (" + queryParameters + ")  ");

                    break;

                default:

                    #region

                    //case "采购入库单":

                    //case "采购退料单":

                    //case "销售出库单": 

                    //case "销售退货单":

                    //case "其他入库单":

                    //case "其他出库单":

                    //case "盘亏单":

                    //case "盘盈单":

                    //case "简单生产领料单":

                    //case "简单生产入库单":

                    //case "简单生产退库单":

                    //case "简单生产退料单":

                    //case "生产补料单":

                    //case "生产领料单":

                    //case "生产入库单":

                    //case "生产退库单":

                    //case "生产退料单":

                    //case "委外补料单":

                    //case "委外领料单":

                    //case "委外退料单": 

                    #endregion

                    e.FilterString = e.FilterString.JoinFilterString("  FCreatorId  =  " + userId + " or  FStockID in  (" + queryParameters + ")  ");

                    break; 

            } 

        }


    }


}


图标赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0