个人工作中知识点记录,以便加深影响
1.需求:需要实现一个echarts叠堆报表,如图:
所需格式:
// 指定图表的配置项和数据 var option = { toolbox: { show : true, feature : { magicType : {show: true, type: ['line', 'bar']}, dataView : {show: false, readOnly: false}, restore : {show: false}, saveAsImage : {show: true}, myTool : { show : true, title : 'excel下载', icon : 'image://../../resource/images/op/base/exl.png', onclick : function (){ location.href=encodeURI(getRootPath_web()+"/opMain/exportExcel.xhtml?title=人脸识别业务量&colnames=公司名称,50分以下,50(含)-55分,55(含)-60分,60(含)-65分,65(含)-70分,70(含)-75分,75(含)-80分,80(含)-85分,85(含)以上,其它&datalist="+JSON.stringify(exlArrs.sort())); } } } }, tooltip : { trigger: 'axis' }, grid: { bottom: 200, }, xAxis : [ { type : 'category', axisLabel: {rotate: 30,interval:-1}, flag: dataObj.flag, data : dataObj.gsName, fid: dataObj.gsId } ], yAxis : [ { type : 'value' } ], dataZoom: [ { show: true, showDetail: false, bottom:'50', start: 1, end: 50 }, ], series : [ { name: '50分以下', type: 'bar', stack: '总量', /*label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.one }, { name: '50(含)-55分', type: 'bar', stack: '总量', /*label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.two, }, { name: '55(含)-60分', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.three }, { name: '60(含)-65分', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.four }, { name: '65(含)-70分', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.five }, { name: '70(含)-75分', type: 'bar', stack: '总量', /*label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.six }, { name: '75(含)-80分', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.seven }, { name: '80(含)-85分', type: 'bar', stack: '总量', /*label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.eight }, { name: '85(含)以上', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.nine }, { name: '其它', type: 'bar', stack: '总量', /* label: { normal: { show: true, position: 'insideRight' } },*/ data: dataObj.other } ] };
后台拿到的数据,如下:
[{gsId=8022, gsName=西北分公司, type=0, yybcount=4}, {gsId=8016, gsName=扬州分公司, type=0, yybcount=4}, {gsId=8008, gsName=南京分公司, type=0, yybcount=14409}, {gsId=8008, gsName=南京分公司, type=9, yybcount=107}, {gsId=8008, gsName=南京分公司, type=1, yybcount=45}, {gsId=8008, gsName=南京分公司, type=8, yybcount=8}, {gsId=8008, gsName=南京分公司, type=7, yybcount=5}, {gsId=8008, gsName=南京分公司, type=6, yybcount=4}, {gsId=8008, gsName=南京分公司, type=3, yybcount=3}, {gsId=8008, gsName=南京分公司, type=5, yybcount=1}, {gsId=8008, gsName=南京分公司, type=2, yybcount=1}, {gsId=8008, gsName=南京分公司, type=4, yybcount=1}, {gsId=8002, gsName=苏州分公司, type=0, yybcount=5}, {gsId=8001, gsName=上海分公司, type=0, yybcount=4}, {gsId=8000, gsName=总部特殊业务管理, type=0, yybcount=38616}, {gsId=8000, gsName=总部特殊业务管理, type=9, yybcount=133}, {gsId=8000, gsName=总部特殊业务管理, type=1, yybcount=72}, {gsId=8000, gsName=总部特殊业务管理, type=8, yybcount=46}, {gsId=8000, gsName=总部特殊业务管理, type=3, yybcount=42}, {gsId=8000, gsName=总部特殊业务管理, type=7, yybcount=40}, {gsId=8000, gsName=总部特殊业务管理, type=6, yybcount=32}, {gsId=8000, gsName=总部特殊业务管理, type=5, yybcount=28}, {gsId=8000, gsName=总部特殊业务管理, type=2, yybcount=15}, {gsId=8000, gsName=总部特殊业务管理, type=4, yybcount=2}, {gsId=1, gsName=华泰证券, type=0, yybcount=36}]
需要转换组装的格式,如下:
{ gsId=[8000, 8008, 1, 8002, 8022, 8016, 8001], gsName=[总部特殊业务管理, 南京分公司, 华泰证券, 苏州分公司, 西北分公司, 扬州分公司, 上海分公司], flag=[1, 1, 1, 1, 1, 1, 1], other=[38616, 14409, 36, 5, 4, 4, 4] one=[72, 45, 0, 0, 0, 0, 0], two=[15, 1, 0, 0, 0, 0, 0], three=[42, 3, 0, 0, 0, 0, 0], four=[2, 1, 0, 0, 0, 0, 0], five=[28, 1, 0, 0, 0, 0, 0], six=[32, 4, 0, 0, 0, 0, 0], seven=[40, 5, 0, 0, 0, 0, 0], eight=[46, 8, 0, 0, 0, 0, 0], nine=[133, 107, 0, 0, 0, 0, 0] }
思路分析:
List<type1> type1 List<type2> ... for(1-10){ object obj = list.get(gsId.get(i),1);//循环9个固定阀值,当gsId,类型相等则返回该对象,否则返回null
if(null !=obj){
type1.add(obj.getYybcount());
}else{
type1.add("0");
}
}
公司名称 50分以下 50(含)-55分 55(含)-60分 60(含)-65分 65(含)-70分 70(含)-75分 75(含)-80分 80(含)-85分 85(含)以上 其它 华泰证券 0 0 0 0 0 0 0 0 0 36 总部特殊业务管理 72 15 42 2 28 32 40 46 133 38616 上海分公司 0 0 0 0 0 0 0 0 0 4 苏州分公司 0 0 0 0 0 0 0 0 0 5 南京分公司 45 1 3 1 1 4 5 8 107 14409 扬州分公司 0 0 0 0 0 0 0 0 0 4 西北分公司 0 0 0 0 0 0 0 0 0 4
实现代码,如下:
@SuppressWarnings("unchecked") public static Map<String, Object> assemReturnMap(Map<String, Object> returnMap, List<Map<String, String>> list,String flag) { List<Map<String, String>> lists = mergeList(list); ComparatorMap comparator=new ComparatorMap(); Collections.sort(lists, comparator); //组装name集合 List<String> gsNameList = new ArrayList<String>(); List<String> gsIdList = new ArrayList<String>(); List<String> flags = new ArrayList<String>(); for(Map<String,String> mp:lists){ String gsName = mp.get("gsName"); if(!gsNameList.contains(gsName)){ gsNameList.add(gsName); } String gsId = String.valueOf(mp.get("gsId")); if(!gsIdList.contains(gsId)){ gsIdList.add(gsId); if("0".equals(flag)){ flags.add("0"); } if("1".equals(flag)){ flags.add("1"); } } } List<String> yybcountListOther = new ArrayList<String>(); List<String> yybcountListOne = new ArrayList<String>(); List<String> yybcountListTwo = new ArrayList<String>(); List<String> yybcountListThree = new ArrayList<String>(); List<String> yybcountListFour = new ArrayList<String>(); List<String> yybcountListFive = new ArrayList<String>(); List<String> yybcountListSix = new ArrayList<String>(); List<String> yybcountListSeven = new ArrayList<String>(); List<String> yybcountListEight = new ArrayList<String>(); List<String> yybcountListNine = new ArrayList<String>(); for (int i = 0; i < 10; i++) { for (String gsId : gsIdList) { Map<String, String> obj = getGsInfoByGsIdAndType(list, gsId, i); if (i == 0) { if (null != obj) { yybcountListOther.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListOther.add("0"); } } if (i == 1) { if (null != obj) { yybcountListOne.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListOne.add("0"); } } if (i == 2) { if (null != obj) { yybcountListTwo.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListTwo.add("0"); } } if (i == 3) { if (null != obj) { yybcountListThree.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListThree.add("0"); } } if (i == 4) { if (null != obj) { yybcountListFour.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListFour.add("0"); } } if (i == 5) { if (null != obj) { yybcountListFive.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListFive.add("0"); } } if (i == 6) { if (null != obj) { yybcountListSix.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListSix.add("0"); } } if (i == 7) { if (null != obj) { yybcountListSeven.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListSeven.add("0"); } } if (i == 8) { if (null != obj) { yybcountListEight.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListEight.add("0"); } } if (i == 9) { if (null != obj) { yybcountListNine.add(null != obj.get("yybcount") ? String.valueOf(obj.get("yybcount")) : "0"); } else { yybcountListNine.add("0"); } } } } returnMap.put("gsId", gsIdList); returnMap.put("gsName", gsNameList); returnMap.put("flag", flags); returnMap.put("one", yybcountListOne); returnMap.put("two", yybcountListTwo); returnMap.put("three", yybcountListThree); returnMap.put("four", yybcountListFour); returnMap.put("five", yybcountListFive); returnMap.put("six", yybcountListSix); returnMap.put("seven", yybcountListSeven); returnMap.put("eight", yybcountListEight); returnMap.put("nine", yybcountListNine); returnMap.put("other", yybcountListOther); returnMap.put("list", list); return returnMap; }
/** * 通过公司ID和类型获取公司信息 * @param list * @param gsId * @param type * @return */ private static Map<String, String> getGsInfoByGsIdAndType(List<Map<String, String>> list, String gsId, int type) { for (Map<String, String> obj : list) { if (gsId.equals(String.valueOf(obj.get("gsId"))) && String.valueOf(type).equals(String.valueOf(obj.get("type")))) { return obj; } } return null; }
/** * 合并重复数据 * @param oneList * @return */ public static List<Map<String, String>> mergeList(List<Map<String, String>> oneList) { List<Map<String,String>> list = new ArrayList<Map<String,String>>(); for (int i = 0; i < oneList.size(); i++) { String gsId = String.valueOf(oneList.get(i).get("gsId")); int flag = 0; for (int j = 0; j < list.size(); j++) { String gsId_ = String.valueOf(list.get(j).get("gsId")); if (null!=gsId&&null!=gsId_&&!"".equals(gsId)&&!"".equals(gsId_)&&gsId.equals(gsId_)) { int sum = Integer.parseInt(String.valueOf(oneList.get(i).get("yybcount"))) + Integer.parseInt(String.valueOf(list.get(j).get("yybcount"))); list.get(j).put("yybcount", sum + ""); flag = 1; continue; } } if (flag == 0) { list.add(oneList.get(i)); } } return list; }