如何开发列表常用搜索功能原创
3人赞赏了该文章
555次浏览
编辑于2023年08月11日 15:56:33
关键词:列表、排序、常用条件、Algo
一、需求
在采购订单列表中,添加一个常用搜索排序的功能,即单据列表的常用条件中添加申请组织字段,根据某个用户最近n(n自己定义)次点击申请组织进行搜索中,搜索次数越多,常用条件的选项值越靠前。如下常用条件申请组织字段值中,二车间搜索的次数多,所以往前排。
二、思路与方案
1、列表打开时,根据历史搜索的信息,初始化常用条件(组织字段)的选项值的顺序。
2、点击常用条件搜索时,要把搜索的信息记录下来(搜索用户、搜索时间、搜索的组织字段值),保存到某个表中。
三、实现过程
1、列表打开时,初始化常用条件值顺序
private static final String KDEC_SEARCHRECORDS = "sunp_searchcords"; public void filterContainerInit(FilterContainerInitArgs args) { super.filterContainerInit(args); List<FilterColumn> fastFilter = args.getFastFilterColumns(); List<FilterColumn> commonFilterColumns = args.getCommonFilterColumns(); for (FilterColumn filterColumn : commonFilterColumns) { FilterField filterField = filterColumn.getFilterField(); String srcFieldKey = filterField.getSrcFieldKey(); if (srcFieldKey.equals("org")) { List<FilterColumn> filterColumns = filterColumn.getFilterColumns(); //常用条件中标签数据 List<ComboItem> comboItems = ((CommonBaseDataFilterColumn) filterColumns.get(0)).getComboItems(); //删除一级标签中的固定标签和自定义标签 ArrayList<Long> ids = new ArrayList<>(); //最多两条数据 Iterator<ComboItem> it = comboItems.iterator(); while (it.hasNext()) { ComboItem next = it.next(); String id = next.getValue(); ids.add(Long.valueOf(id)); } QFilter idQFilter = new QFilter("sunp_org.id", QCP.in, ids); //只查当前用户的搜索记录 QFilter userQFilter = new QFilter("sunp_user", QCP.equals, UserServiceHelper.getCurrentUserId()); //搜索人,搜索时间,搜索组织 String selectFields="sunp_user,sunp_datetime,sunp_org"; //查出历史搜索记录表的数据 DataSet queryDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), KDEC_SEARCHRECORDS, selectFields, new QFilter[]{idQFilter,userQFilter}, "sunp_datetime DESC", 100); //根据搜索组织分组计数 DataSet countDs = queryDataSet.groupBy(new String[]{ "sunp_org"}).count().finish(); //查询结果集按照搜索次数排序 DataSet rows = countDs.orderBy(new String[]{"count desc"}); List<String> searchCount = new ArrayList<>(); for(Row row:rows.copy()){ searchCount.add(row.getString("sunp_org")); } //按照searchCount的顺序对选项序列comboItems进行排序 sortLabelSearch(comboItems,searchCount); } } } //按条件排序 private List<ComboItem> sortLabelSearch(List<ComboItem> comboItems, List<String> searchCount) { //目前comboItems大概2000数据量,searchCount最大100数据量 for (int index=0;index<searchCount.size();index++){ String id = searchCount.get(index); for(int i=index;i<comboItems.size();i++){ ComboItem item = comboItems.get(i); if (item.getValue().equals(id)){ //搜索次数最大的放前面 ComboItem temp = comboItems.get(index); comboItems.set(index,item); comboItems.set(i,temp); break; } } } return comboItems; }
2、记录搜索信息
@Override public void setFilter(SetFilterEvent e) { //如果是主业务组织字段,用e.getMainOrgQFilter()取过滤条件 List<QFilter> customQFilters = e.getCustomQFilters(); QFilter mainOrgQFilter = e.getMainOrgQFilter(); List<QFilter> qFilters = e.getQFilters(); if (!qFilters.isEmpty()) { QFilter propertyQFilter = qFilters.get(0); //点击标签常用过滤条件时,记录搜索信息 if (propertyQFilter.getProperty().equals("org.id")) {//点击的字段 if (propertyQFilter.getCP().equals("=")) { Long value = (Long) propertyQFilter.getValue(); DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject(KDEC_SEARCHRECORDS); SaveServiceHelper.save(new DynamicObject[]{setRecord(value, dynamicObject)}); } else if (propertyQFilter.getCP().equals("IN") && propertyQFilter.getValue() instanceof List) {//多选时 List<Object> searchlabes = (List<Object>) propertyQFilter.getValue(); DynamicObject[] searchRecords = new DynamicObject[searchlabes.size()]; for (int index = 0; index < searchlabes.size(); index++) { Object value = searchlabes.get(index); DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject(KDEC_SEARCHRECORDS); searchRecords[index] = setRecord(value, dynamicObject); } SaveServiceHelper.save(searchRecords);//直接保存搜索记录 } } } } private DynamicObject setRecord(Object value,DynamicObject dynamicObject) { dynamicObject.set("sunp_user", UserServiceHelper.getCurrentUserId()); dynamicObject.set("sunp_datetime",new Date()); dynamicObject.set("sunp_org",value); return dynamicObject; }
四、效果图
如下某个用户搜索的情况下,根据用户最近时间100次搜索中次数对常用条件进行排序
二车间:3次,
一车间:2次,
cosmic-simple:1次。
五、开发环境版本
V5.0.011
六、参考资料
FilterSortListPlugin.zip(2.15KB)
sunp_trainexample-sunp_reqord- …(9.33KB)
推荐阅读