关于多语言文本字段支持模糊搜索的样例原创
金蝶云社区-野生的指针
野生的指针
11人赞赏了该文章 1,379次浏览 未经作者许可,禁止转载编辑于2021年11月01日 15:32:34

样例场景

一些公司在新增物料信息时,需要填写物料申请单并审核。该样例可以帮助用户填写物料名称(多语言文本字段)和规格型号(多语言文本字段)时,自动模糊搜索相关的物料,辅助用户查询是否已存在该物料。


实现思路

新增一个插件,在物料名称、规格型号的值发生改变时,触发该插件的propertyChanged(PropertyChangedArgs e)方法,在该方法中查询数据库中的物料信息,并返回结果。


设计器界面:

image.png


插件源代码:

public class SamplePlugins extends AbstractBillPlugIn {
    @Override
    public void propertyChanged(PropertyChangedArgs e) {
        String propertyName = e.getProperty().getName();
        if ((StringUtils.equals(propertyName, "kdec_materialname")) || StringUtils.equals(propertyName, "kdec_modelnum")) {
            DynamicObject dataEntity = this.getModel().getDataEntity();
            //获取“物料名称”字段的值
            OrmLocaleValue materialName = (OrmLocaleValue) dataEntity.get("kdec_materialname");
            String materialNameStr = materialName.get("zh_CN");
            //获取“规格型号“字段的值
            OrmLocaleValue modelnum = (OrmLocaleValue) dataEntity.get("kdec_modelnum");
            String modelnumStr = modelnum.get("zh_CN");
            //如果两个字段均为空,则直接返回,不作查询
            if (StringUtils.isEmpty(materialNameStr) && StringUtils.isEmpty(modelnumStr)) {
                return;
            }
            //查询条件,`name` like %xxx% and `modelnum` like "%xxx%"
            QFilter filter = new QFilter("1", "=", "1");
            if (StringUtils.isNotEmpty(materialNameStr)) {
                filter.and(new QFilter("name", "like", "%" + materialNameStr + "%"));
            }
            if (StringUtils.isNotEmpty(modelnumStr)) {
                filter.and(new QFilter("modelnum", "like", "%" + modelnumStr + "%"));
            }
            //执行查询
            DynamicObject[] materalList = BusinessDataServiceHelper.load("bd_material", "name, modelnum", filter.toArray());
            if (materalList.length == 0) {
                this.getView().showSuccessNotification("数据库中不存在该物料");
            } else {
                //将查询结果进行拼接,形式为:物料名称(规格型号)
                StringBuilder sb = new StringBuilder();
                for (DynamicObject dynamicObj : materalList) {
                    String curName = ((OrmLocaleValue)dynamicObj.get("name")).get("zh_CN");
                    String curModelnum = ((OrmLocaleValue)dynamicObj.get("modelnum")).get("zh_CN");
                    sb.append(curName).append("(").append(curModelnum).append(")\r\n");
                }
                //输出提示框
                showMessage(sb.toString());
            }
        }
    }

   private void showMessage(String detail){
        //消息提示框设置
        String header = "为您找到以下相关物料信息";
        MessageBoxOptions options = MessageBoxOptions.OK;
        ConfirmTypes confirmTypes = ConfirmTypes.Default;
        ConfirmCallBackListener callback = null;
        Map<Integer, String> btnNameMaps = new HashMap<Integer, String>();
        btnNameMaps.put(2,"我知道了");
        String customValue = null;
        this.getView().showConfirm(header, detail, options, confirmTypes, callback, btnNameMaps, customValue);
    }
}



实现效果

输入物料名称并查询到相关数据时:

image.png

同时输入物料名称、规格型号并查询到相关数据时:

image.png

数据库不存在输入的物料信息时:

image.png


注意事项:

  1. 物料名称、规格型号,均为多语言文本字段,并且需要开启「即时触发值更新」

  2. 附件包中含有样例的页面元数据、Java插件源码。各位小伙伴通过在mc中升级补丁的方式导入元数据,在本地开发工具中导入Java插件,重启服务后即可复现样例效果。


赞 11