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

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

这里写图片描述

这里使用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

<?php
class 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>

效果图:

这里写图片描述

结束。


版权声明:本文为chenmoimg_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。