将数据库的数据处理为echarts统计图的日度周度月度年度数据

项目场景:

需要满足业务场景为
在这里插入图片描述
因为前端使用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>
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值