关于多语言文本字段支持模糊搜索的样例原创
11人赞赏了该文章
1,379次浏览
编辑于2021年11月01日 15:32:34
样例场景
一些公司在新增物料信息时,需要填写物料申请单并审核。该样例可以帮助用户填写物料名称(多语言文本字段)和规格型号(多语言文本字段)时,自动模糊搜索相关的物料,辅助用户查询是否已存在该物料。
实现思路
新增一个插件,在物料名称、规格型号的值发生改变时,触发该插件的propertyChanged(PropertyChangedArgs e)方法,在该方法中查询数据库中的物料信息,并返回结果。
设计器界面:
插件源代码:
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); } }
实现效果
输入物料名称并查询到相关数据时:
同时输入物料名称、规格型号并查询到相关数据时:
数据库不存在输入的物料信息时:
注意事项:
物料名称、规格型号,均为多语言文本字段,并且需要开启「即时触发值更新」
附件包中含有样例的页面元数据、Java插件源码。各位小伙伴通过在mc中升级补丁的方式导入元数据,在本地开发工具中导入Java插件,重启服务后即可复现样例效果。
多语言文本字段模糊搜索样例.rar(7.80KB)
推荐阅读