您的位置:首页 > 编程语言 > PHP开发

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

2017-07-06 19:13 381 查看

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



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


效果图:



结束。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息