前端C#,后端java,多条件动态分组;多条件动态查询

前端:C#窗体

难点:操作者根据在蓝色区域输入的条件值查询,但是后端数据库原是Orcale和SQL分开的两个表,两表连接字段是纱支全称和 原料编号,其中归类、业务部、转换后纱支来自第二个表

另一个难点是,季节和客户有初始化表,如果操作者对数据初始化过,上表要显示初始化后字段,查询时通过初始化和未初始化的字段都可以查到,例如:季节为夏天,转化后季节为summer,上表显示的则是summer,同时查询时搜索字段不管是夏天还是summer都可以检索到相同内容。

分析:

        把选择条件和未选择条件分为两个单独的执行体(意思就是两个不同的接口进行查询得到数据),个人感觉简便处理。

情况一:没有多选条件分组

 其实我这里做了一个很笨的处理

private List<YwtjbDTO> js(List<YwtjbDTO> newList ,Map<String, Object> param){
        List<YwtjbCshDTO> cshList = ywtjbSaveMapper.selectNeedData(param);
        Map<String, YwtjbCshDTO> cshMap = new HashMap<>();
        for (YwtjbCshDTO csh : cshList) {
            cshMap.put(csh.getYlbh() + "_" + csh.getSzqc(), csh);
        }
        // 遍历newList,查找每个元素在cshMap中的对应项并进行操作
       
        List<SyjhKhzhDTO> khzhList = ywtjbKhJjcshMapper.queryKhmcData();
        Map<String, SyjhKhzhDTO> khCshMap = new HashMap<>();
        khzhList.forEach(a->khCshMap.put(a.getKhmc(),a));
        newList.forEach(b->{
            String key = b.getKehu();
            if (khCshMap.containsKey(key)){
                b.setKehu(khCshMap.get(key).getZhhkhmc());
            }
        });

        List<SyjhJjzhDTO> seasonList = ywtjbKhJjcshMapper.querySeason();
        Map<String, SyjhJjzhDTO> jjCshMap = new HashMap<>();
        seasonList.forEach(a->jjCshMap.put(a.getSeason(),a));
        newList.forEach(b->{
            String key = b.getSeason();
            if (jjCshMap.containsKey(key)) {
                b.setSeason(jjCshMap.get(key).getZhhjj());
            }
        });

        if (param.get("zhhszqc")!=null){
            newList = newList.stream()
                    .filter(obj -> obj.getZhhszqc() != null && !obj.getZhhszqc().isEmpty())
                    .collect(Collectors.toList());
        }
        if ( param.get("gl")!=null){
            newList = newList.stream()
                    .filter(obj -> obj.getGuil() != null && !obj.getGuil().isEmpty())
                    .collect(Collectors.toList());
        }
        return newList;
    }

为了让条件生效,选择将表二查到的数据空的全部去除,大家有好的方法吗?

情形二:多条件动态分组

因为不确定操作者选择哪几个条件分组,所以需要用到动态分组

@Override
    public List<YwtjbDTO> selectYwtjbSyTj(Map<String, Object> param) {
        Map<String, Object> map = changeValues(param);
        List<YwtjbDTO> newList = ywtjbSyjhMapper.selectYwtjbSyjhData(map);
        String  tj = map.get("tj").toString();
        String[] split  = tj.split("f");
        String[] groupByProperties = Arrays.stream(split)
                .filter(Objects::nonNull)
                .filter(s -> !s.isEmpty())
                .toArray(String[]::new);

        //可实现动态分组
        List<YwtjbDTO> jsResult = js(newList,param);
        Map<String, YwtjbDTO> resultMap = jsResult.stream().collect(Collectors.toMap(o1 -> {
            StringBuilder sb = new StringBuilder();
            for (String property : groupByProperties) {
                try {
                    sb.append(o1.getClass().getMethod(property).invoke(o1));
                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {

                }
            }
            return sb.toString();
        }, Function.identity(), (o1, o2) -> {
            o1.setShl_jh(o1.getShl_jh().add(o2.getShl_jh()));//数量相加
            return o1;
        }));

        return resultMap.values().stream().collect(Collectors.toList());
    }

这里也是参考的网上的方法,具体哪个忘记了

个人心得:代码还需改进,总体写的也不是很好,争取多历练向大佬学习