一般圖表繪制例如echarts等,返回數據格式都大同小異。重點是利用sql或者java實現數據格式的轉型,接下來是關鍵部分:
1.前提:提供的工具方法——獲取某月有多少天
//通過年份和月份確定該月的最后一天 public static int getMaxDay(int year,int month ){ Calendar time=Calendar.getInstance(); time.clear(); time.set(Calendar.YEAR,year); //year 為 int time.set(Calendar.MONTH,month-1); //month 為int return time.getActualMaximum(Calendar.DAY_OF_MONTH); }
2.mapper層sql語句書寫
<select id="getAllOrderCountByYearAndMonth" parameterType="pd" resultType="OrderCount" > SELECT sum(t.ordercount) ordercount, t.[month] month , t.[day] day from order t where 1=1 <if test="year != null and year != ''"> and t.year=convert(int, #{year}) </if> <if test="month != null and month != ''"> and t.month=convert(int, #{month}) </if> GROUP BY t.[month],t.[day] HAVING 1=1 ORDER BY t.[day] asc </select>
3.service層實現,調用sql返回結果,及對其返回結果進行格式轉換(重要)
Map<String,String> resultMap = new HashMap<String,String>(); //獲取到數據庫搜索的年份對應某月份的31天訂單量 List<OrderCount> orderCountList = orderCountManager.getAllOrderCountByYearAndMonth(pd); //確定某個月的天數(如果日期截止只要到有數據的最大日期,那么可以修改sql語句排列方式,例如,日期從大到小排列,那么就是位置在0上的數據是最大天數,很簡單實現,此處不列出來了) int days = getMaxDay(Integer.parseInt(pd.get("year").toString()),Integer.parseInt(pd.get("month").toString())); //定義數組,默認都是0 int[] countVIP = new int[days]; //將獲取到不同年份不同月份不同日期對應不同的訂單量放在數組中 if (orderCountList.size()>0 && orderCountList!=null) { for (int i=0;i<orderCountList.size();i++) { OrderCount oc = orderCountList.get(i); //獲取對應日期補充數據 if(oc!=null){ countVIP[oc.getDay()-1] = oc.getOrderCount(); } } } resultMap.put("orderStatistics", countVIP);
優化部分
接下來是后期我們的需求優化,即,數據只獲取到當前日期,當前月之前月份日期數據要補充滿,當前日期數據補充到下單截止日期;當前年份之前年份12個月要補全,當前年份數據補充到下單截止月份。具體如下:
@Override public YJLResponseModel getOrderNewDayCountByYearAndMonth(String condtionStr) { setYjlResponseModel(new YJLResponseModel()); PageData pageData = JSON.parseObject(condtionStr, PageData.class); //按年+月獲取每一天數據 List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYearAndMonth(pageData); //初始化==================== //java獲取當前年份 Calendar cale = Calendar.getInstance(); int currentYear = cale.get(Calendar.YEAR); int currentMonth= cale.get(Calendar.MONTH)+ 1; //判斷是否是當前年月,不是的話取滿月,是的話,取當前截止日期 int argYear = Integer.parseInt(pageData.getString("year")); int argMonth = Integer.parseInt(pageData.getString("month")); //定義最大天數,默認取滿天 int maxDays= getMaxDay(argYear,argMonth); //如果有數據,補充數據=================== if(orderCountList!=null && orderCountList.size()>0) { if (argYear == currentYear && argMonth == currentMonth) { //獲取最后一天日期 PageData lastDay = orderCountList.get(orderCountList.size() - 1); //獲取截止天數 maxDays = Integer.parseInt(lastDay.get("day").toString()); } } //定義最大天數數組 int[] count = new int[maxDays]; int[] days = new int[maxDays]; //補全日期到數組中 for(int i=0;i<maxDays;i++){ days[i] = i+1; } if(orderCountList!=null && orderCountList.size()>0) { //將獲取到不同年份不同月份不同日期對應不同的訂單量放在數組中 for (int i=0;i<orderCountList.size();i++) { PageData oc = orderCountList.get(i); //獲取對應天 if(oc!=null){ count[Integer.parseInt(oc.get("day").toString())-1] = Integer.parseInt(oc.get("count").toString()); } } } pageData.put("count",count); pageData.put("days",days); getYjlResponseModel().setData(pageData); getYjlResponseModel().setSuccess(true); return getYjlResponseModel(); } @Override public YJLResponseModel getOrderNewDayCountByYear(String condtionStr) { setYjlResponseModel(new YJLResponseModel()); PageData pageData = JSON.parseObject(condtionStr, PageData.class); //按年獲取每一天數據 List<PageData> orderCountList = ordOrderNewMapper.getOrderNewDayCountByYear(pageData); //初始化數據============================== //定義最大月數數組,默認除了當前年之前年是12個月,當期年是截止月 //獲取傳參年數 int argYear = Integer.parseInt(pageData.getString("year")); //java獲取當前年份 Calendar cale = Calendar.getInstance(); int currentYear = cale.get(Calendar.YEAR); //定義某年月數,默認12 int maxMonths = 12; //優化數據,補充數據======================= if(orderCountList!=null && orderCountList.size()>0){ if(argYear==currentYear){ //獲取最后一個月份 PageData lastMonth = orderCountList.get(orderCountList.size()-1); //獲取截止月份 maxMonths= Integer.parseInt(lastMonth.get("month").toString()); } } //定義返回數據格式,默認都是0 int[] count = new int[maxMonths]; int[] months = new int[maxMonths]; //補全月份到數組中 for(int i=0;i<maxMonths;i++){ months[i] = i+1; } if(orderCountList!=null && orderCountList.size()>0){ //將獲取到不同年份不同月份對應的訂單量放在數組中 for (int i=0;i<orderCountList.size();i++) { PageData oc = orderCountList.get(i); //獲取對應天 if(oc!=null){ count[Integer.parseInt(oc.get("month").toString())-1] = Integer.parseInt(oc.get("count").toString()); } } } pageData.put("count",count); pageData.put("month",months); getYjlResponseModel().setData(pageData); getYjlResponseModel().setSuccess(true); return getYjlResponseModel(); }