最后效果是要通过查询某个车位ID和开始时间以及结束时间,查询出在这个时间段内这个车位上的车辆总数,以及每个车辆的信息。
1.通过redis获取所有车位的车辆信息(realtime集合,查询出所有车位的车辆信息(mac地址,车位ID,采集到的时间))。
2.把第一步得到的数组进行循环筛选,根据查询的时候输入的车位ID,进行筛选满足这个车位ID的结果。得到一个数组。
3.把获取过来的开始时间转化成时间戳格式,把第二步中的数组进行筛选。数组中的时间满足大于等于获取到的开始时间戳的筛选出来组成数组。
4.把获取过来的结束时间转化成时间戳格式,把第三步中的数组进行筛选。数组中的时间满足小于等于获取到的结束时间戳的筛选出来组成数组。
5.第四步中得到的数组就是我们想要的数据。foreach循环,把bikes里面的json数据解析成数组。循环这个数组,依次向集合添加数据。
$redis->sadd("statistics:".$dwz_info_id.$start2.$end2,$v2["mac"]);
6.后面直接把集合的数据取出来用就可以了。
代码如下:
StalistController.class.php
<?php
namespace Admin\Controller;
use Think\Controller;
class StalistController extends CommonController {
public function index()
{
$dwz_info_id="";
$start="";
$end="";
$nowtime=date('Y-m-d H:i:s');
$starttime=date('Y-m-d H:i:s',strtotime('-1 hour'));
$this->assign("nowtime2",$nowtime);
$this->assign("starttime2",$starttime);
if($_GET){
$redis = new \Redis();
$redis->connect('116.62.171.54', 8085);
$all_real=$redis->KEYS("realtime:?*");
$all_dwzinfo2=array();
foreach($all_real as $k=>$v){
//var_dump($v);
//var_dump($redis->hget($v,'time'));
$all_dwzinfo["bikes"]=$redis->hget($v,'bikes');
$all_dwzinfo["dwz_info_id"]=$redis->hget($v,'dwz_info_id');
$all_dwzinfo["time"]=$redis->hget($v,'time');
$all_dwzinfo2[]=$all_dwzinfo;
}
//var_dump($all_dwzinfo2);
$dwz_info_id = $_REQUEST["dwz_info_id"];
$this->assign('dwz_info_id', $dwz_info_id);
$start = strtr($_REQUEST["start"],"+"," ");
if($start==""){
$start=$starttime;
}
$end = strtr($_REQUEST["end"],"+"," ");
if($end==""){
$end=$nowtime;
}
if($dwz_info_id!=''&& $start=='' && $end==''){
$stanum=$redis->scard("infobikes:$dwz_info_id");
$stalist2=$redis->smembers("infobikes:$dwz_info_id");
}else{
foreach ($all_dwzinfo2 as $k2 => $v2) {
if ($v2["dwz_info_id"] == $dwz_info_id) {
$all_dwzinfo3[] = $v2;
};
}
//var_dump($all_dwzinfo3);
$start2 = strtotime($start);
foreach ($all_dwzinfo3 as $k => $v) {
if ($v["time"] >= $start2) {
$all_dwzinfo4[] = $v;
}
}
$end2 = strtotime($end);
foreach ($all_dwzinfo4 as $k4 => $v4) {
if ($v["time"] <= $end2) {
$all_dwzinfo5[] = $v4;
}
}
//var_dump($all_dwzinfo5);
$arr2 = array();
foreach ($all_dwzinfo5 as $k => $v) {
$arr2[] = json_decode($v["bikes"], true);
}
//var_dump($arr2);
foreach($arr2 as $v1){
foreach($v1 as $v2){
$redis->sadd("statistics:".$dwz_info_id.$start2.$end2,$v2["mac"]);
}
}
$stanum=$redis->scard("statistics:".$dwz_info_id.$start2.$end2);
$stalist2=$redis->smembers("statistics:".$dwz_info_id.$start2.$end2);
//运算结束以后删除
$redis->del("statistics:".$dwz_info_id.$start2.$end2);
}
$this->assign('start', $start);
$this->assign('end', $end);
foreach($stalist2 as $k=>$v){
//获取名称和最后停放时间
$mac = str_replace(':','',$v);
$exist = $redis->scard("infobike:$dwz_info_id:$mac");
$sm = $redis->smembers("infobike:$dwz_info_id:$mac");
//var_dump($mac);
$arr_all[$k]['mac']=$mac;
$arr_all[$k]['name']=$redis->get('bikes:'.$mac);;
$arr_all[$k]['rssi']=$redis->get('bikesrssi:'.$mac);
$arr_all[$k]['num']=$exist;
$arr_all[$k]['lasttime']=date('Y-m-d H:i:s',max($sm));
}
//var_dump($stalist2);
$this->assign('stanum', $stanum);
$this->assign('arr_all', $arr_all);
}
$bike_company=M("bike_company")->select();
foreach($bike_company as $k=>$v){
//var_dump($v);
$arr[$v['title']]=explode('|',$v['keyword']);
}
//var_dump($arr);
foreach($arr_all as $k=>$v){
$flag = 'no';
$name = $v['name'];
foreach($arr as $kk=>$vv){
foreach($vv as $kkk=>$vvv){
if(strpos($name,$vvv)!==false){
$bike_names[]=$kk;
$flag = 'yes';
}
}
}
if($flag=='no'){
$bike_names[]='其他';
}
}
$arr1 = $bnames = array_unique($bike_names);
$bn = array_count_values($bike_names);
$len = sizeof($bn);
$i=0;
foreach($bn as $k=>$v){
$arr2[$i]['name']=$k;
$arr2[$i]['value']=$v;
$i++;
}
//var_dump($bnames);
//var_dump($bn);
//var_dump($len);
//分类统计图
/*foreach($exist_list as $k=>$v){
//对名称的一个计数
//车名称
$arr1[]=array();
//车名称 数量
$arr2[]['name']=array();
$arr2[]['value']=array();
}*/
$str1 = json_encode($arr1);
$str2 = json_encode($arr2);
$this->assign('length',$len);
$this->assign('str1',$str1);
//var_dump($str2);
$this->assign('str2',$str2);
$this->display();
}
}
Stalist/index.php
<extend name="Public:left" />
<block name="main">
<link href="__PUBLIC__/myjslib/css/bootstrap-datetimepicker.min.css" rel="stylesheet" media="screen">
<script src="https://cdn.bootcss.com/jquery/2.1.2/jquery.js"></script>
<script src="http://echarts.baidu.com/gallery/vendors/echarts/echarts-all-3.js"></script>
<!-- page content -->
<div class="">
<div class="page-title">
<div class="title_left">
<h3>数据分析 <small>车位分时数据统计</small></h3>
</div>
</div>
<div class="clearfix"></div>
<div class="row">
</div>
<div class="clearfix"></div>
<div class="col-md-12 col-sm-12 col-xs-12">
<div class="x_panel">
<div class="x_title">
<span style="color: red">
提示:<br>
填写车位ID,选择开始时间和结束时间,点击查询即可看到该车位该时间段内停放的车辆数和具体的车辆信息。
</span>
<ul class="nav navbar-right panel_toolbox">
<li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-wrench"></i></a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Settings 1</a>
</li>
<li><a href="#">Settings 2</a>
</li>
</ul>
</li>
<li><a class="close-link"><i class="fa fa-close"></i></a>
</li>
</ul>
<div class="clearfix"></div>
</div>
<div class="x_content">
<!-- <p><a class="btn btn-primary" href="javascript:;" οnclick="add()">添加区块信息</a></p>-->
<div style="margin-bottom: 10px" class="input-group">
<form method="GET" action="{:U('Admin/Stalist/index')}">
<input id="name" type="text" class="form-control" style="width: 150px;margin-bottom: 10px;" placeholder="车位ID" name="dwz_info_id" value="{$dwz_info_id}"/>
<div class="input-group date form_datetime col-md-10" data-date-format="yyyy-mm-dd hh:ii:00" data-link-field="dtp_input1">
<input name="start" id="start" class="form-control" size="16" type="text" placeholder="开始时间" value="{$start}" readonly style="width: 250px">
<span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
<span class="input-group-addon"><span class="glyphicon glyphicon-th"></span></span>
</div>
<div class="input-group date form_datetime col-md-10" data-date-format="yyyy-mm-dd hh:ii:00" data-link-field="dtp_input1">
<input name="end" id="end" class="form-control" size="16" type="text" placeholder="结束时间" value="{$end}" readonly style="width: 250px">
<span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
<span class="input-group-addon"><span class="glyphicon glyphicon-th"></span></span>
</div>
<input type="submit" value="查询" class="btn btn-default"/>
</form>
</div>
<div id="main" style="width: 100%;height:300px;"></div>
<input id="iid" type="hidden" value="{$dwz_info_id}" />
<if condition="$dwz_info_id neq '' || $start neq '' || $end neq ''">
<div class="row tile_count">
<div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
<span class="count_top"><i class="fa fa-bicycle"></i> 分时停放车辆数 </span>
<div class="count">{$stanum}</div>
</div>
<!--<div class="col-md-2 col-sm-4 col-xs-6 tile_stats_count">
<span class="count_top"><i class="fa fa-bicycle"></i> 所有停放车辆数 </span>
<div class="count">{$all}</div>
<span class="count_bottom"><i class="green"><i class="fa fa-sort-asc"></i>3% </i> From last Week</span>
</div>-->
</div>
</if>
<div class="table-responsive">
<if condition="$dwz_info_id neq '' || $start neq '' || $end neq ''">
<table class="table table-striped jambo_table bulk_action">
<thead>
<tr class="headings">
<th>
</th>
<th class="column-title">车辆名称 </th>
<th class="column-title">车辆mac地址 </th>
<th class="column-title">信号强度rssi </th>
<th class="column-title">最后采集到的时间 </th>
<th class="column-title">采集到的次数 </th>
</th>
<th class="bulk-actions" colspan="7">
<a class="antoo" style="color:#fff; font-weight:500;">Bulk Actions ( <span class="action-cnt"> </span> ) <i class="fa fa-chevron-down"></i></a>
</th>
</tr>
</thead>
<tbody>
<volist name="arr_all" id="vo">
<tr class="even pointer">
<td class="a-center ">
</td>
<td class=" ">{$vo.name}</td>
<td class=" ">{$vo.mac}</td>
<td class=" ">{$vo.rssi}</td>
<td class=" ">{$vo.lasttime}</td>
<td class=" ">{$vo.num}</td>
</tr>
</volist>
</tbody>
</table>
</if>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="bjy-add" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"> ×
</button>
<h4 class="modal-title" id="myModalLabel"> 添加区块信息</h4>
</div>
<div class="modal-body">
<form id="bjy-form" class="form-inline" action="{:U('Admin/Iblock/add')}" method="post">
<table class="table table-striped table-bordered table-hover table-condensed">
<tr>
<th width="20%">区块名称:</th>
<td>
<input class="input-medium" type="text" name="title">
</td>
</tr>
<tr>
<th>内容:</th>
<td>
<textarea name="content" class="form-control"></textarea>
</td>
</tr>
<tr>
<th></th>
<td>
<input class="btn btn-success" type="submit" value="添加">
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="bjy-edit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"> ×</button>
<h4 class="modal-title" id="myModalLabel"> 修改区块信息</h4>
</div>
<div class="modal-body">
<form id="bjy-form" class="form-inline" action="{:U('Admin/Iblock/edit')}" method="post">
<input type="hidden" name="id">
<table class="table table-striped table-bordered table-hover table-condensed">
<tr>
<th width="20%">区块名称:</th>
<td>
<input class="input-medium" type="text" name="title">
</td>
</tr>
<tr>
<th>内容:</th>
<td>
<textarea name="content" id="m_content" class="form-control"></textarea>
</td>
</tr>
<tr>
<th></th>
<td>
<input class="btn btn-success" type="submit" value="修改">
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript">
// 添加菜单
function add(){
$("input[name='title'],input[name='mca']").val('');
$('#bjy-add').modal('show');
}
// 修改菜单
//navName="{$vo['name']}" navMac="{$vo['mac']}" navRssi="{$vo['rssi']}" navInfoid="{$vo['dwz_info_id']}" navLng_Lat="{$vo['lng']},{$vo['lat']}"
function edit(obj){
var navId=$(obj).attr('navId');
var navTitle=$(obj).attr('navTitle');
var navContent=$(obj).attr('navContent');
$("input[name='id']").val(navId);
$("input[name='title']").val(navTitle);
$("#m_content").val(navContent);
$('#bjy-edit').modal('show');
}
</script>
<script type="text/javascript" src="__PUBLIC__/myjslib/jquery/jquery-1.8.3.min.js" charset="UTF-8"></script>
<script type="text/javascript" src="__PUBLIC__/myjslib/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/myjslib/js/bootstrap-datetimepicker.js" charset="UTF-8"></script>
<script type="text/javascript" src="__PUBLIC__/myjslib/js/locales/bootstrap-datetimepicker.fr.js" charset="UTF-8"></script>
<script type="text/javascript">
$('.form_datetime').datetimepicker({
//language: 'fr',
weekStart: 1,
todayBtn: 1,
autoclose: 1,
todayHighlight: 1,
startView: 2,
forceParse: 0,
showMeridian: 1
});
</script>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
//var test = genData(50);
var jstr1 = $.parseJSON('{$str1}');
var jstr2 = $.parseJSON('{$str2}');
option = {
title : {
text: '分时车位各个公司单车数量',
//subtext: '纯属虚构',
x:'left'
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
type: 'scroll',
orient: 'vertical',
right: 10,
top: 20,
bottom: 20,
data: jstr1
},
series : [
{
name: '车企',
type: 'pie',
radius : '55%',
center: ['40%', '50%'],
data: jstr2,
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
<!-- /page content -->
</block>