项目场景:
需要满足业务场景为
因为前端使用echarts来实现这个统计图,所以需要将数据库的数据处理一下返回给前端。
解决方案:
1、数据库中使用group by来实现统计
2、在代码中对期间没有的数据填充数量为0
解决方案:
EchartsFormatUtil
public class echartsFormatUtil {
/**
* 统一处理echarts返回数据
* @param echartsResults mapper层返回的没有补全日期的结果
* @param echartsDuring 前端传来的时间范围的参数
* @param formatStr 需要格式化的格式
* @return List<EchartsResult>
* @throws ParseException
*/
public static List<EchartsResult> echartsFormat(List<EchartsResult> echartsResults, EchartsDuring echartsDuring, String formatStr) throws ParseException {
//创建返回结果
List<EchartsResult> list = new ArrayList<>();
//如果数据为空直接返回
if (echartsResults==null||echartsResults.size()==0){
return list;
}
//格式化接收参数的时间
SimpleDateFormat requestFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取期间的所有日期 这里的格式对应mapper层返回的数据
SimpleDateFormat format = new SimpleDateFormat(formatStr);
//每天的秒数-----因为存在大小月,闰年,这种不确定的变化因素,这里懒得写那些的话就按着固定的天累加做循环即可,虽然效率低了
long day = 1000*60*60*24L;
long beginTime= format.parse(echartsResults.get(0).getDate()).getTime();
long endTime= format.parse(echartsResults.get(echartsResults.size()-1).getDate()).getTime();
//如果有输入时间范围则根据时间范围进行筛选
if (echartsDuring.getBeginTime()!=null){
beginTime = requestFormat.parse(echartsDuring.getBeginTime()).getTime();
}
if (echartsDuring.getEndTime()!=null){
endTime = requestFormat.parse(echartsDuring.getEndTime()).getTime();
}
int tap = 0;
String tapStr = "";//---------------------------去重,避免出现多个周 月 年
//从开始时间一直循环到结束时间,每次加一天
for (long i = beginTime; i <= endTime; i=i+day) {
//遍历所有的数据,如果存在则返回存在值,不存在则返回0
for (EchartsResult echartsResult : echartsResults) {
//存在
if (echartsResult.getDate().equals(format.format(i))&&!tapStr.equals(format.format(i))){//如果在存在这月----------
list.add(echartsResult);
tap=1;
tapStr = format.format(i);
System.out.println(echartsResult);
break;
}
}
//不存在返回0
if (tap==0&&!tapStr.equals(format.format(i))){
EchartsResult echartsResult = new EchartsResult();
echartsResult.setDate(format.format(i));
echartsResult.setNum("0");
tapStr = format.format(i);
list.add(echartsResult);
}
//初始化判断条件
tap=0;
}
return list;
}
}
mapper
List<EchartsResult> echartsYearCommis(String commisId);
List<EchartsResult> echartsMonthCommis(String commisId);
List<EchartsResult> echartsDayCommis(String commisId);
List<EchartsResult> echartsWeekCommis(String commisId);
xml
<select id="echartsYearCommis" resultType="com.operative.core.homeAdmin.entity.EchartsResult">
select DATE_FORMAT(created_at,'%Y年') as date,count(*) num from d3_patient where commis_id=#{commisId} GROUP BY date
</select>
<select id="echartsMonthCommis" resultType="com.operative.core.homeAdmin.entity.EchartsResult">
select DATE_FORMAT(created_at,'%Y年%m月') as date,count(*) num from d3_patient where commis_id=#{commisId} GROUP BY date
</select>
<select id="echartsDayCommis" resultType="com.operative.core.homeAdmin.entity.EchartsResult">
select DATE_FORMAT(created_at,'%Y年%m月%d日') as date,count(*) num from d3_patient where commis_id=#{commisId} GROUP BY date
</select>
<select id="echartsWeekCommis" resultType="com.operative.core.homeAdmin.entity.EchartsResult">
select DATE_FORMAT(created_at,'%X年第%V周') as date,count(*) num from d3_patient where commis_id=#{commisId} GROUP BY date
</select>