29、列表插件,物料列表,多字段,模糊查询,PrepareFilterParameter原创
金蝶云社区-林荫大道cc
林荫大道cc
14人赞赏了该文章 5489次浏览 未经作者许可,禁止转载编辑于2020年07月09日 10:46:46
封面

参考



案例背景:


物料信息很多,已经上百万条。
现在遇到的问题是在输入“轴承”查询出来可能就会有几百条记录。
因此,需要通过输入 “轴承 R12”,然后在名称与规格型号中,同时进行模糊匹配,匹配出名称包含“轴承” ,且规格型号包含 “R12”的所有数据,提升搜索的效率、准确度。



实现方案:


在物料上,增加了一个专门处理模糊查询的文本字段,默认以此字段作为快捷过滤字段,并拦截列表过滤事件,在后台修改过滤条件,使用户录入的搜索值,在多个字段间进行匹配。



1、打开VS,新建一个类库,具体可以参考21.1 ,1-4步


1.1、和第24节一样,使用PrepareFilterParameter方法


1.2、复制参考里面代码,到第24节代码





2、打开BOS,扩展物料,增加一个文本字段,命名为“名称规格查询”,F_YDIE_Text


image.png


3、保存单据设计;之后重新打开物料扩展,以刷新物料的快捷面板可选择字段



4、修改物料的快捷查询面板,把文本字段,摆在首选位置:


image.png


image.png



5、编写物料列表插件,对模糊查询文本字段的过滤条件进行重新解析,拼接出类似于:
     (名称 like '%轴承%' OR 规格型号 like '%轴承%') AND (名称 like '%R12%' OR 规格型号 like '%R12%')


F_YDIE_Text Like ‘%轴承 12%’
1.‘%轴承 12%’
2. 轴承   12
3. FName Like ‘%轴承%’ and FSpecification Like ‘%12%’



6、启用插件,实际运行效果:


image.png


image.png



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS;
using Kingdee.BOS.Core;
using System.ComponentModel;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List;

namespace Kingdee.Bos.ListMy
{
    [Description(" 物料模糊查询")]
    
    [Kingdee.BOS.Util.HotUpdate]
    
    public class ClassName:AbstractListPlugIn
    {
        //过滤条件
        public override void PrepareFilterParameter(BOS.Core.List.PlugIn.Args.FilterArgs e)
        {
            base.PrepareFilterParameter(e);
            
            // "(  F_YDIE_Text Like '%轴承 R12%'   )"
            string quickFilter = this.ListModel.FilterParameter.QuickFilterString;
            if(string.IsNullOrWhiteSpace(quickFilter))
            {// 快捷条件为空白,无需处理
                return;
            }
            if (quickFilter.IndexOf("F_YDIE_Text") <0)
            {// 快捷条件不含模糊查询字段,
                return;
            }
            // 去掉首尾的括号:从第2个字符开始截取,直到倒数第2个字符
            quickFilter = quickFilter.Substring(1, quickFilter.Length - 2);
            // 把过滤条件中的and,替换为大写
            string[] splits = { "AND" };
            string[] oldFilters = quickFilter.Split(splits, StringSplitOptions.None);
            List<string> newFilters = new List<string>();
            foreach(string oldFilter in oldFilters)
            {
                if(oldFilter.IndexOf("F_YDIE_Text")<0)
                {// 此段条件中,未包含模糊查询字段,略过
                    newFilters.Add(oldFilter);
                }
                else
                {
                    // 截取条件值
                    int startIndex = oldFilter.IndexOf("'");
                    int endIndex = oldFilter.IndexOf("'", startIndex + 1);
                    string filterValue = oldFilter.Substring(startIndex + 1, endIndex - startIndex - 1);
                    // 按照空格对条件值进行分解
                    string[] fldValues = filterValue.Split(' ');
                    // 重新拼接条件
                    List<string> fldFilters = new List<string>();
                    foreach(string fldValue in fldValues)
                    {
                        if(string.IsNullOrWhiteSpace(fldValue))
                        {
                            continue;
                        }
                        // 去掉两头空格
                        string fldValueNoSpace = fldValue.Trim();
                        // 拼接新条件:名称 like '%value%' or 规格 like '%value%'
                        string fldFilter = string.Format("(Fname like '%{0}%' OR FSpecification like '%{0}%')", fldValueNoSpace);
                        fldFilters.Add(fldFilter);
                    }
                    string newFilter = string.Join(" AND ", fldFilters);
                    newFilters.Add(newFilter);
                }
            }
            // 重新填写快捷过滤条件
            this.ListModel.FilterParameter.QuickFilterString = "(" + string.Join(" AND ", newFilters) + ")";
        }
    }
}


image.png

image.png



总目录链接

https://vip.kingdee.com/article/64993872014591232




29.zip(35.10KB)

赞 14