前端: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()); }
这里也是参考的网上的方法,具体哪个忘记了
个人心得:代码还需改进,总体写的也不是很好,争取多历练向大佬学习