需求背景:待续
1:数据格式:
{"dataTimes":["201904"],"labelConditions":[{"exacts":["14","12"],"exclude":["11.008","12.08"],"fuzzy":["17","16"],"fuzzyExclude":["12.9","14.9"],"labelName":"summileagePerDay_workingDay","range":[["11","11.01"],["13","13.5"]]},{"exacts":["14","12"],"exclude":["12.007936","12.0508"],"fuzzy":["10","16"],"fuzzyExclude":["12.9","14.9"],"labelName":"summileageYear","range":[["11","12.01"],["13","14.5"]]}]}2:前端table 显示
3:代码实现
/** * 新建任务:请求大叔平台(车辆数与开始任务) * * @param dto * @return */ private SearchVinsDto queryBigDataPlatByVehData(VehNumsDto dto) { /** * 1 格式化标签table(列表精确/范围匹配查询) */ SearchVinsDto svd = new SearchVinsDto(); String body = JSON.toJSONString(dto.getTableData()); System.out.println(dto.getTableData()); System.err.println(body); List<FieldsMatchInfo> fmList = JSON.parseArray(body, FieldsMatchInfo.class); System.err.println(JSON.toJSONString(fmList)); /* * * 1.1 根据表格每一行组合标签条件(LabelCondition);根据labelName进行分组:把各条件参数组合一个{}对象里面 * branchMapList:封装的组合标签条件map */ Map<String, List<Map<String, List<String>>>> branchMapList = new HashMap<String, List<Map<String, List<String>>>>();//标签名的map /* * * 1.1.2 fmList: 最基本的table列表data list */ for (FieldsMatchInfo fm: fmList) { /* * * 1.1.3 groupBranchMap: 各分支的分组的map * 把列表项组合到map分组map中 */ Map<String, List<String>> groupBranchMap = new HashMap<String, List<String>>();//精确查询分支map if (StringUtils.isNotBlank(fm.getExtractMode())) {//存在取值方式 /* * * 1.1.3 取值方式两种条件: 1: range是范围: 上下限 2: 其他:精确(exacts是精确 exclude是排除 fuzzy是模糊查询,fuzzyExclude模糊排除) */ if(Consts.LABEL_MODE_RANGE.equals(fm.getExtractMode())){ // List<String> cc=new ArrayList<String>(2); // cc.add(fm.getLowerLimit()); // cc.add(fm.getUpperLimit()); // String[] str=new String[]{fm.getLowerLimit(),fm.getUpperLimit()}; // String cc=Arrays.toString(str); // String cc= JSON.toJSONString(str) String str=fm.getLowerLimit()+","+fm.getUpperLimit(); this.putAdd(groupBranchMap,fm.getExtractMode(),str);// 封装一key对数组value }else{ this.putAdd(groupBranchMap,fm.getExtractMode(), fm.getExactMatch());// 封装一key对多数组value } } /* * * 1.2 组合groupBranchMap: 到集合branchMapList里 * branchMapList封装整个条件列表属性,colName作为key,根据key分组 */ putAddMapList(branchMapList,fm.getColName(),groupBranchMap);//单个标签名 } /* * * 1.3 遍历:集合branchMapList,查询组合groupBranchMap的条件项进行 restful body数据格式的组合 * labelConditions 参数传递集合类 */ List<LabelCondition> labelConditions=new ArrayList<LabelCondition>(); for (String labelName : branchMapList.keySet()) {// -级循环 /* * * 1.3.1 groupBranchMap(各分支的分组的map):一级遍历map中; * 把列表项拆分到map分组map中 * new List: 组合参数类型 */ System.out.println("一级遍历map中的labelName|"+labelName); LabelCondition lc=new LabelCondition(); lc.setLabelName(labelName); List<Map<String, List<String>>> branchMap= branchMapList.get(labelName); List<String[]> rangeListArr=new ArrayList<String[]>(); List<String> exactsListArr=new ArrayList<String>(); List<String> excludeListArr=new ArrayList<String>(); List<String> fuzzyExcludeListArr=new ArrayList<String>(); List<String> fuzzyListArr=new ArrayList<String>(); for (Map<String, List<String>> key : branchMap) {// 二级循环 System.err.println(labelName+"二级循环|key"); /* * * 1.3.2 遍历分支map的list(二级循环): 遍历其中每个属性(字段名)的list */ for (String str:key.keySet()) {// 三级循环 /* * * 1.3.2 遍历分支map的list(三级循环): 遍历具体数据项的list<String>并进行add到1.3.1的new list里 */ List<String> list= key.get(str);//具体数据项的循环 System.out.println(str+"|三级开始遍历map中的list|"+JSON.toJSONString(list)); if(Consts.LABEL_MODE_RANGE.equals(str)){ System.err.println("遍历出范围range属性ls|" + list.get(0)); String [] arr=list.get(0).split(","); rangeListArr.add(arr); } if(Consts.LABEL_MODE_EXACTS.equals(str)){ // String[] val = list.toArray(new String[list.size()]); System.err.println("遍历出精确exacts属性|" + list.get(0)); exactsListArr.add(list.get(0)); } if(Consts.LABEL_MODE_EXCLUDE.equals(str)){ System.err.println("遍历出精确排除exclude属性|" + list.get(0)); excludeListArr.add(list.get(0)); } if(Consts.LABEL_MODE_FUZZY_EXCLUDE.equals(str)){ System.err.println("遍历出范围fuzzyExclude属性ls|" + list.get(0)); fuzzyExcludeListArr.add(list.get(0)); } if(Consts.LABEL_MODE_FUZZY.equals(str)){ System.err.println("遍历出模糊fuzzy属性|" + JSON.toJSONString(list)); fuzzyListArr.add(list.get(0)); } } lc.setFuzzyExclude(fuzzyExcludeListArr); lc.setExclude(excludeListArr); lc.setExacts(exactsListArr); lc.setRange(rangeListArr); lc.setFuzzy(fuzzyListArr); } labelConditions.add(lc);//把各列表项组合add参数传递集合类 } System.out.println("labelConditions|"+JSON.toJSONString(labelConditions)); /** * 1.1 标签数据时间,多个离散值(时间段) */ try { Date startTime = DateUtil.getDateFromStr(dto.getStartTime(), DateUtil.DATE_TYPE8); Date endTime = DateUtil.getDateFromStr(dto.getEndTime(), DateUtil.DATE_TYPE8); List<String> monthList = DateUtil.getMonthBetween(startTime, endTime, DateUtil.DATE_TYPE18); svd.setDataTimes(monthList); } catch (Exception e) { logger.info("get month list error! StartTime|" + dto.getStartTime() + "|" + dto.getEndTime()); e.printStackTrace(); } svd.setLabelConditions(labelConditions); return svd; } /** * 封装tableList 进行一对多集合匹配 map(key:value1,value2...) * * @param m 集合map * @param key 字段名 * @param value 字段值 */ private void putAdd(Map<String, List<String>> m, String key, String value) { if (!m.containsKey(key)) { List<String> strls = new ArrayList<String>(); m.put(key, strls); } m.get(key).add(value); System.out.println("putAdd branchMap|" + key + "|" + value + "|size:" + m.get(key).size()); } /** * 封装tableList 进行一对多集合匹配 map({key:value1},{key2:value2}...) * * @param labelBranchMap 集合map * @param key 字段名 * @param branchMap 属性值值 */ private void putAddMapList(Map<String, List<Map<String, List<String>>>> labelBranchMap , String key, Map<String, List<String>> branchMap) { if (!labelBranchMap.containsKey(key)) { List<Map<String, List<String>>> strls = new ArrayList<Map<String, List<String>>>(); labelBranchMap.put(key, strls); } labelBranchMap.get(key).add(branchMap); System.out.println("putAddLableMap branchMapList|" + key + "|" + branchMap + "|size:" + labelBranchMap.get(key).size()); }