報表統計——java實現查詢某年某月每天數據,沒數據補0


一般圖表繪制例如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();
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM