统计每月订单数量并生成折线图

来源:互联网 发布:sql server 基础语法 编辑:程序博客网 时间:2024/06/06 09:06

数据库内生成订单时的时间格式是这样的:

这里写图片描述

这里使用Yii1.1框架

1、先在 include/components 下封装了一个执行sql工具类 :ExecSql.php 和 拼接数据的工具类:GetCharsData.php

ExecSql.php代码:

<?php/*** * @执行 sql 类。 */class ExecSql {    //@执行sql方法【获取所有】    public static function All($sql){        //@获得数据库对象        $connection = Yii::app()->db;        //@执行传递过来的sql        return $connection->createCommand($sql)->queryALL();    }    //@执行sql方法【获取第一条】    public static function One($sql){        //@获得数据库对象        $connection = Yii::app()->db;        //@执行传递过来的sql        return $connection->createCommand($sql)->queryRow();    }}

GetCharsData.php代码:

<?php/*** * @拼接图表所需数据类。 */class GetCharsData {    /***     * @array 拼接的数据     * @获取 Highcharts 所需数据格式     */    public static function getHighData($rows){        //按照每年的格式区分数据        $new_row=array();        foreach ($rows as $r){            $year=substr($r['months'],0,4);            $new_row[$year][]=$r;        }        unset($rows);        //将区分的数据拼接成客户端使用的格式        $new_arr=array();        foreach ($new_row as $key=>$val){            $count='';            foreach ($val as $v){                $count.=','.$v['count'];            }            $new_arr[$key]='['.substr($count,1).']';        }        unset($new_row);        $data='';        foreach ($new_arr as $newk=>$newv){            $data.=',{name: \''.$newk.'年\', data: '.$newv.'}';        }        unset($new_arr);        //返回拼接好的数据。        return $data;    }    /***     * @array 操作的数据     * @获取数据对应的月份     */    public static function getTime($rows){        //获取每条数据的月份        $time=array();        foreach ($rows as $r){            $time[]=substr($r['months'],5,2);        }        //@返回筛选好的数据        return empty($time)?'':'[\''.implode('\',\'',array_unique($time)).'\']';    }}

2、订单统计控住器:CountController.php

<?phpclass CountController extends JController {    //@订单统计模块    public function actionOrder(){        //@默认三个月数据        $begin=date('Y-m-d',strtotime("-3 month"));        $end=date('Y-m-d',time());        //@订单数据sql        $sql='select DATE_FORMAT(create_time,\'%Y-%m\') months,count(id) count from `order` where create_time >= \''.$begin.'\' and create_time <= \''.$end.'\' group by months order by months';        //@执行sql        $rows=ExecSql::All($sql);        //调用拼接数据方法。        $data=GetCharsData::getHighData($rows);        $view['count']=count($rows);        //渲染页面        $this->render('order',array(            'data'=>substr($data,1),            'time'=>GetCharsData::getTime($rows),            'view'=>$view,        ));    }    //@订单搜索模块    public function actionOrderpost(){        //@判断如果没有选择开始时间        if(empty($_POST['start'])){            $this->error('开始时间不得为空~');            die;        }        //@如果是提交        if($_POST){            //@过滤数据            $start=isset($_POST['start'])?htmlentities(htmlentities($_POST['start'])):'';            $end=isset($_POST['end'])?htmlentities(htmlentities($_POST['end'])):'';            //@如果开始时间大于结束时间            if(strtotime($start)>strtotime($end)&&!empty($end)){                $this->error('开始时间不得大于结束时间~');                die;            }            //@默认条件            $where=' where';            //@如果选择了开始时间            if(!empty($start)){                $view['start']=$start;                $where.=' create_time >= \''.$start.'\'';            }            //@如果选择了结束时间            if(!empty($end)){                $view['end']=$end;                $where.=' and create_time <= \''.$end.'\'';            }            //@拼接sql            $sql='select DATE_FORMAT(create_time,\'%Y-%m\') months,count(id) count from `order`'.$where.' group by months order by months';            //执行 sql 语句            $rows=ExecSql::All($sql);            //调用拼接数据方法。            $data=GetCharsData::getHighData($rows);            $view['count']=count($rows);            //渲染页面            $this->render('order',array(                'data'=>substr($data,1),                'time'=>GetCharsData::getTime($rows),                'view'=>$view,            ));            //@销毁变量            unset($rows);            die;        }    }}

3、展示订单折线图页面代码:

<div class="formbody">    <div id="usual1" class="usual" >        <form id="companyForm" action="/count/orderpost" method="post" >            <ul class="seachform1" style="width:100%;">                <li>                    <div class="vocation">                        下单时间:<input type="text" class="scinput" id="start" readonly="readonly" name="start" value="<?php if(isset($view['start'])){echo $view['start'];}?>" > --                        <input type="text" class="scinput" id="end" readonly="readonly" name="end" value="<?php if(isset($view['end'])){echo $view['end'];}?>" >                    </div>                </li>                <li>                    <label>&nbsp;</label>                    <input name="submit" type="submit" class="scbtn" value="统计"/>                </li>            </ul>        </form>        <hr style="width: 100%;height: 1px;border: 1px solid #c2ccd1;margin-bottom: 30px;margin-top: 10px;"/>        <?php if($view['count']==0){ ?>            <p style="text-align:center;font-weight: bold;font-size: 24px;color: red;" class="p_style">                没有您想要的数据,请重新尝试~            </p>        <?php }else{ ?>            <div id="container" style="min-width:400px;height:400px"></div>        <?php }?>    </div></div><script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js"></script><script src="https://img.hcharts.cn/highcharts/highcharts.js"></script><script src="https://img.hcharts.cn/highcharts/modules/exporting.js"></script><script src="https://img.hcharts.cn/highcharts-plugins/highcharts-zh_CN.js"></script><script>    $(function () {        Highcharts.setOptions({            credits:{                enabled:false            }        });        $('#container').highcharts({            chart: {                type: 'line'            },            title: {                text: '折线图'            },            subtitle: {                text: '单位(单)'            },            xAxis: {                categories: <?php echo $time; ?>            },            yAxis: {                title: {                    text: ''                }            },            plotOptions: {                line: {                    dataLabels: {                        enabled: true          // 开启数据标签                    },                    enableMouseTracking: false // 关闭鼠标跟踪,对应的提示框、点击事件会失效                }            },            series: [                <?php echo $data; ?>            ]        });    });</script>

效果图:

这里写图片描述

结束。

原创粉丝点击