如何开发列表常用搜索功能原创
金蝶云社区-陈来珍
陈来珍
3人赞赏了该文章 420次浏览 未经作者许可,禁止转载编辑于2023年08月11日 15:56:33

关键词:列表、排序、常用条件、Algo

一、需求

在采购订单列表中,添加一个常用搜索排序的功能,即单据列表的常用条件中添加申请组织字段,根据某个用户最近n(n自己定义)次点击申请组织进行搜索中,搜索次数越多,常用条件的选项值越靠前。如下常用条件申请组织字段值中,二车间搜索的次数多,所以往前排。

image.png

二、思路与方案

1、列表打开时,根据历史搜索的信息,初始化常用条件(组织字段)的选项值的顺序。

2、点击常用条件搜索时,要把搜索的信息记录下来(搜索用户、搜索时间、搜索的组织字段值),保存到某个表中。

image.png

三、实现过程

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次。

image.png

image.png

五、开发环境版本

V5.0.011

六、参考资料

开发平台

学习成长中心

SDK接口

开发必备100个小知识

开发案例库



赞 3