报表统计——java实现查询某年某月每天数据,没数据补0

java

一般图表绘制例如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();

}

以上是 报表统计——java实现查询某年某月每天数据,没数据补0 的全部内容, 来源链接: utcz.com/z/393271.html

回到顶部