【客户需求】即时库存按照物料分组树型多级显示

  • 需求背景

    很多客户用习惯了K3,希望星空的即时库存也能实现按照物料分组左侧来进行树形结构展示。


  • 实现说明

      系统中即时库存主要涉及的场景为:即时库存查询、即时库存明细查询、单据联查即时库存。

      以下方法借助基础资料的分组属性实现即时库存明细查询、单据联查即时库存树形结构展示。


  • 实现效果



步骤
  1.扩展即时库存,增加基础资料字段(如下图)

  • 字段名:空

  • 可见性:不可见

  • 基础资料类型:数据分组

  • 支持分组:勾选

  • 分组允许维护:不勾选

  2.即时库存编写列表插件,重载实现GetTreeViewData、TreeNodeClick方法。

  • Demo:如下

    #region 构造节点
    //<summary>
    //获取节点(系统会自动往树立添加的)
    //</summary>
    //<param name="treeNodeArgs"></param>
    //<returns></returns>
    public override List<TreeNode> GetTreeViewData(TreeNodeArgs treeNodeArgs)
    {
            if (string.IsNullOrEmpty(treeNodeArgs.NodeId) || treeNodeArgs.NodeId == "0")
            { 
                    string sql = string.Format(" SELECT MG.FID,FNUMBER,FGROUPID,FPARENTID,MGL.FNAME from T_BD_MATERIALGROUP MG INNER JOIN T_BD_MATERIALGROUP_L MGL ON MG.FID = MGL.FID WHERE MGL.FLOCALEID = {0} ",this.View.Context.UserLocale.LCID);
                    DynamicObjectCollection nodeList = DBUtils.ExecuteDynamicObject(this.View.Context,sql);
                    Dictionary<string, TreeNode> _treeNodes = new Dictionary<string, TreeNode>();
                    List<TreeNode> treeNodes = new List<TreeNode>();
                    foreach (DynamicObject node in nodeList)
                    {
                            if (Convert.ToString(node["FPARENTID"]).Equals("0"))
                            {
                                    treeNodes.Add(  new TreeNode()
                                                                    {
                                                                            id = node["FID"].ToString().Trim(),
                                                                            parentid = node["FPARENTID"].ToString().Trim(),
                                                                            xtype = "system",
                                                                            text = node["FNAME"].ToString().Trim(),
                                                                            children = GetSubNode(nodeList, node["FID"].ToString().Trim())
                                                                    }
                                                              );
                            }
                    }  
                    return treeNodes;
            }
            else
            {
                    return null;
            }
    }

    /// <summary>
    /// 节点点击时触发重新查询
    /// </summary>
    /// <param name="e"></param>
    public override void TreeNodeClick(TreeNodeArgs e)

            if (this.Model != null) 
            {
                    TreeViewFilterParameter treeViewFilter = ((ITreeListModel)this.Model).TreeViewFilterParameter as TreeViewFilterParameter;
                    treeViewFilter.IgnoreSelectedGroupIds = true;     // 忽略系统内置的标准选择节点过滤方法
                    treeViewFilter.FilterString = string.Format(" EXISTS (SELECT 1 FROM T_BD_MATERIALGROUP TG INNER JOIN T_BD_MATERIAL TM ON (TM.FMATERIALGROUP = TG.FID AND TG.FID = {0}) WHERE TM.FMATERIALID = t0.FMATERIALID ) ", Convert.ToInt64(e.NodeId));
                    ((ITreeListView)this.ListView).RefreshList();     // 只刷新列表,不刷新树结构
            }


    private List<TreeNode> GetSubNode(DynamicObjectCollection nodeList, string parentID)
    {
            return nodeList
                    .Where(p => p["FPARENTID"].ToString().Equals(parentID) )
                    .Select(p => new TreeNode()
                    {
                            id = p["FID"].ToString(),
                            parentid = p["FPARENTID"].ToString(),
                            xtype = "leaf",
                            text = p["FNAME"].ToString(),
                    }).ToList();

    #endregion


所属分类
推荐知识