6 changed files with 353 additions and 402 deletions
@ -1,26 +0,0 @@ |
|||
<?php |
|||
namespace app\api\controller\stadium; |
|||
|
|||
|
|||
use app\api\controller\Controller; |
|||
|
|||
class Param extends Controller |
|||
{ |
|||
|
|||
public function paramInfo() |
|||
{ |
|||
$config = config('api_config'); |
|||
$returnArr = [ |
|||
'host' => $config['host'], |
|||
'port' => $config['port'], |
|||
'appkey' => $config['cid'], |
|||
'secret' => $config['cskey'] |
|||
]; |
|||
|
|||
$base64 = base64_encode(json_encode($returnArr)) . "=="; |
|||
$base64Two = base64_encode($base64); |
|||
|
|||
return $this->renderSuccess(compact('base64Two')); |
|||
} |
|||
|
|||
} |
|||
@ -1,11 +0,0 @@ |
|||
<?php |
|||
namespace app\api\controller\stadium; |
|||
|
|||
use app\api\controller\Controller; |
|||
|
|||
class Pass extends Controller |
|||
{ |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,317 @@ |
|||
<?php |
|||
|
|||
namespace app\common\logic; |
|||
|
|||
use app\common\dm\Dm; |
|||
use app\common\model\Pass; |
|||
|
|||
class PassFlow |
|||
{ |
|||
/** |
|||
* 分时时间段接口 <首页-客流趋势> |
|||
* @return array |
|||
* @throws \think\db\exception\DataNotFoundException |
|||
* @throws \think\db\exception\ModelNotFoundException |
|||
* @throws \think\exception\DbException |
|||
*/ |
|||
public static function allGroupTimeNum($param,$dm = null) { |
|||
|
|||
$granularity = $param['granularity']; |
|||
$groupsId = $param['groupsId']; |
|||
|
|||
if (empty($granularity)) return ['code' => 0,'msg' => '缺少参数:granularity']; |
|||
$where = ''; |
|||
if(!empty($groupsId)){ |
|||
$garr = explode("|",$groupsId); |
|||
$where .= ' "groupId" in(' . "'" . implode("','",$garr) . "')"; |
|||
|
|||
} |
|||
|
|||
$allTimeData = []; |
|||
$groupsData = []; |
|||
$dkeys=[]; |
|||
if (empty($dm)) $dm = new Dm(); |
|||
if ($granularity == 'daily') { |
|||
$where .= $where ? ' and "granularity" = ' . "'hourly'" : ' "granularity" = ' . "'hourly'"; |
|||
$list = $dm->select('bt_passenger_flow',$where); |
|||
$data = self::handleGroupData($list); |
|||
$allTimeData = $data['allTimeData']; |
|||
$groupsData = $data['groupsData']; |
|||
$dkeys = $data['dkeys']; |
|||
} elseif ($granularity == 'monthly') { |
|||
$where .= $where ? ' and "granularity" = ' . "'daily'" : ' "granularity" = ' . "'daily'"; |
|||
$list = $dm->select('bt_passenger_flow',$where); |
|||
$data = self::handleGroupData($list,'d'); |
|||
$allTimeData = $data['allTimeData']; |
|||
$groupsData = $data['groupsData']; |
|||
$dkeys = $data['dkeys']; |
|||
} elseif ($granularity == 'yearly') { |
|||
$where .= $where ? ' and "granularity" = ' . "'monthly'" : ' "granularity" = ' . "'monthly'"; |
|||
$list = $dm->select('bt_passenger_flow',$where); |
|||
$data = self::handleGroupData($list,'m'); |
|||
$allTimeData = $data['allTimeData']; |
|||
$groupsData = $data['groupsData']; |
|||
$dkeys = $data['dkeys']; |
|||
} |
|||
|
|||
$data = ['allTimeData' => $allTimeData, 'groupsData' => $groupsData, 'dkeys' => $dkeys]; |
|||
return ['code' => 1, 'msg' => 'success', 'data' => $data]; |
|||
} |
|||
|
|||
/** |
|||
* 特殊处理 |
|||
* @param $list |
|||
* @param $date_str |
|||
* @return array |
|||
*/ |
|||
protected static function handleGroupData($list,$date_str = 'H:00') { |
|||
$allTimeData = []; |
|||
$groupsData = []; |
|||
$dkey=[]; |
|||
if ($date_str == 'H:00') { |
|||
for ($i = 9; $i < 23; $i++) { |
|||
$str = strlen($i) == 1 ? '0'.$i.':00' : $i.':00'; |
|||
$allTimeData[$str]['num'] = 0; |
|||
$allTimeData[$str]['title'] = $str; |
|||
$dkey[]=$str; |
|||
} |
|||
} elseif ($date_str == 'd') { |
|||
$d = date('d') * 1; |
|||
$date = $d - 12 > 0 ? $d - 12 : 1; |
|||
for ($i = $date; $i <= $d; $i++) { |
|||
$str = strlen($i) == 1 ? '0'.$i : $i; |
|||
$allTimeData[$str]['num'] = 0; |
|||
$allTimeData[$str]['title'] = $str; |
|||
$dkey[]=$str; |
|||
} |
|||
} elseif ($date_str == 'm') { |
|||
$m = date('m') * 1; |
|||
$date = $m - 12 > 0 ? $m - 12 : 1; |
|||
for ($i = $date; $i <= $m; $i++) { |
|||
$str = strlen($i) == 1 ? '0'.$i : $i; |
|||
$allTimeData[$str]['num'] = 0; |
|||
$allTimeData[$str]['title'] = $str; |
|||
$dkey[]=$str; |
|||
} |
|||
} |
|||
$sumNoRepeatInNum = 0; |
|||
foreach ($list as $value) { |
|||
$sumNoRepeatInNum += $value['noRepeatInNum']; // 进馆总人数 |
|||
if (!isset($groupsData[$value['groupName']]['noRepeatInNum'])) $groupsData[$value['groupName']]['noRepeatInNum'] = 0; |
|||
$groupsData[$value['groupName']]['noRepeatInNum'] += $value['noRepeatInNum']; // 分租进馆人数 |
|||
$date = date($date_str,ceil($value['createTime'] / 1000) + (8*3600)); // 各时间端进馆人数 |
|||
if (!isset($allTimeData[$date])) continue; |
|||
$allTimeData[$date]['num'] += $value['noRepeatInNum']; |
|||
} |
|||
ksort($allTimeData); |
|||
|
|||
// 计算各组占比 |
|||
foreach ($groupsData as &$val) { |
|||
$val['proportion'] = $val['noRepeatInNum'] > 0 ? (round($val['noRepeatInNum']/$sumNoRepeatInNum,2) * 100) ."%" : '0%'; |
|||
} |
|||
|
|||
$groupData = []; |
|||
foreach ($groupsData as $groupName => $groupValue) { |
|||
$groupData[] = [ |
|||
'groupName' => $groupName, |
|||
'noRepeatInNum' => $groupValue['noRepeatInNum'], |
|||
'proportion' => $groupValue['proportion'] |
|||
]; |
|||
} |
|||
|
|||
return [ |
|||
'allTimeData' => $allTimeData, // 总客流趋势时间段 |
|||
'groupsData' => $groupData, // 各组总数及占比 |
|||
'dkeys' =>$dkey |
|||
]; |
|||
} |
|||
|
|||
/** |
|||
* 总览总数据接口 <首页-中间部分总览> |
|||
* @return array |
|||
* @throws \think\db\exception\DataNotFoundException |
|||
* @throws \think\db\exception\ModelNotFoundException |
|||
* @throws \think\exception\DbException |
|||
*/ |
|||
public static function allGroupNum($dm = null) { |
|||
|
|||
$dateArr = ['day' => 'daily', 'week' => 'daily', 'month' => 'monthly', 'year' => 'yearly']; |
|||
|
|||
$returnData = []; |
|||
$y = date("Y"); |
|||
# 总进馆人数 |
|||
$yearSum = 0; |
|||
if (empty($dm)) $dm = new Dm(); |
|||
foreach ($dateArr as $date => $granularity) { |
|||
|
|||
$list = $dm->select( |
|||
'bt_passenger_flow_all', |
|||
' "granularity" = ' . "'{$granularity}'" . ' and "date" = ' . "'{$date}'" |
|||
); |
|||
|
|||
$returnData[$date]['noRepeatInNum'] = 0; |
|||
foreach ($list as $value) { |
|||
if ($date == 'year') { |
|||
$yearSum += $value['noRepeatInNum']; |
|||
$yDate = date('Y',ceil($value['createTime'] / 1000)); // 各今年端进馆人数 |
|||
if ($y == $yDate) $returnData[$date]['noRepeatInNum'] += $value['noRepeatInNum']; |
|||
} else { |
|||
$returnData[$date]['noRepeatInNum'] += $value['noRepeatInNum']; |
|||
} |
|||
} |
|||
} |
|||
$returnData['sumYear']['noRepeatInNum'] = $yearSum; |
|||
|
|||
foreach ($returnData as &$val) { |
|||
$val['noRepeatInNum'] = formatNumber($val['noRepeatInNum']); |
|||
} |
|||
|
|||
return $returnData; |
|||
} |
|||
|
|||
/** |
|||
* 查询最新客流统计组实时数据 <各场管实施实时进馆人数> |
|||
* @return array |
|||
* @throws \think\db\exception\DataNotFoundException |
|||
* @throws \think\db\exception\ModelNotFoundException |
|||
* @throws \think\exception\DbException |
|||
*/ |
|||
public static function realTimeData($dm = null) |
|||
{ |
|||
if (empty($dm)) $dm = new Dm(); |
|||
|
|||
$list = $dm->select('bt_passenger_flow_real'); |
|||
$data = []; |
|||
|
|||
$configRes = $dm->find("bt_config",' "key" = ' . "'threshold'"); |
|||
$threshold = $configRes['value'] ?: 0; |
|||
|
|||
foreach ($list as $value) { |
|||
if (!isset($data[$value['groupId']]['allEnter'])) $data[$value['groupId']]['allEnter'] = 0; |
|||
$data[$value['groupId']]['allEnter'] += $value['allEnter']; |
|||
} |
|||
|
|||
$returnData = []; |
|||
foreach ($data as $groupId => $val) { |
|||
$proportion = $val['allEnter'] > 0 ? round($val['allEnter']/$threshold,2) : 0; |
|||
$val['proportion'] = ($proportion * 100) . "%"; |
|||
$val['congestion'] = Pass::getPassType($proportion); |
|||
$val['groupId'] = $groupId; |
|||
|
|||
$getGroup = $dm->find('bt_passenger_monitor_group',' "groupId" = ' . "'{$groupId}'"); |
|||
$val['groupName'] = $getGroup['groupName'] ?: ''; |
|||
$returnData[] = $val; |
|||
} |
|||
$libData = $dm->select('bt_library',['group_id' => ['baz001','BAF055']]); |
|||
foreach ($libData as $libRow) { |
|||
$libProportion = $libRow['today_incount'] > 0 ? round($libRow['today_incount']/$threshold,2) : 0; |
|||
$returnData[] = [ |
|||
'allEnter' => $libRow['today_incount'] ?: 0, |
|||
'proportion' => ($libProportion * 100) . "%", |
|||
'congestion' => self::getPassType($libProportion), |
|||
'groupId' => $libRow['group_id'], |
|||
'groupName' => $libRow['group_name'] |
|||
]; |
|||
} |
|||
|
|||
return $returnData; |
|||
} |
|||
|
|||
protected static function getPassType($proportion) |
|||
{ |
|||
# 舒适:阈值<80% |
|||
if ($proportion < 0.8) { |
|||
return '舒适'; |
|||
} |
|||
# 饱和:80%<阈值<100% |
|||
if (0.8 < $proportion || $proportion < 1) { |
|||
return '饱和'; |
|||
} |
|||
# 拥挤:阈值=100% |
|||
if ($proportion == 1) { |
|||
return '拥挤'; |
|||
} |
|||
# 拥挤:阈值=100% |
|||
if ($proportion >= 1.2) { |
|||
return '爆满'; |
|||
} |
|||
return ''; |
|||
} |
|||
|
|||
/** |
|||
* 今日各场馆人数趋势 |
|||
* @return array |
|||
* @throws \think\db\exception\DataNotFoundException |
|||
* @throws \think\db\exception\ModelNotFoundException |
|||
* @throws \think\exception\DbException |
|||
*/ |
|||
public static function toDayGroupsEnterNum($dm = null) |
|||
{ |
|||
if (empty($dm)) $dm = new Dm(); |
|||
|
|||
$list = $dm->select('bt_passenger_flow',' "granularity"='."'hourly'"); |
|||
$allTimeData = []; |
|||
for ($i = 9; $i < 23; $i++) { |
|||
$str = strlen($i) == 1 ? '0'.$i.':00' : $i.':00'; |
|||
$allTimeData[$str] = 0; |
|||
} |
|||
$returnData = []; |
|||
foreach ($list as $value) { |
|||
$date = date('H:00',ceil($value['createTime'] / 1000)); // 各时间端进馆人数 |
|||
if (!isset($allTimeData[$date])) continue; |
|||
if (!isset($returnData[$value['groupName']][$allTimeData[$date]])) $returnData[$value['groupName']][$date] = 0; |
|||
$returnData[$value['groupName']][$date] += $value['noRepeatInNum']; |
|||
} |
|||
|
|||
$data = []; |
|||
foreach ($returnData as $groupName => $item) { |
|||
$listData = []; |
|||
foreach ($item as $itemKey => $itemRow) { |
|||
$listData[] = [ |
|||
'time' => $itemKey, |
|||
'count' => $itemRow |
|||
]; |
|||
} |
|||
$data[] = [ |
|||
'groupName' => $groupName, |
|||
'list' => $listData |
|||
]; |
|||
} |
|||
|
|||
return $data; |
|||
} |
|||
|
|||
/** |
|||
* 图书管数据接口 |
|||
* @return array |
|||
* 返回数据:today.incount=今天进 month.incount=本月进 year.incount=今年进 day30.incount=近30天近 outcount=出 |
|||
* 不传参数就是所有摄像头,传cameraid就是按传的摄像头ID |
|||
* cameraid = 宝安图书馆9,7,6,4,2,1,67,3 1990分馆134、 135 |
|||
*/ |
|||
public static function allFlowTrends($dm = null) |
|||
{ |
|||
if (empty($dm)) $dm = new Dm(); |
|||
$res = $dm->find('bt_library',['group_id' => 'lib001']); |
|||
|
|||
$data = [ |
|||
'day30' => [ |
|||
'incount' => isset($res['day30_incount']) ? $res['day30_incount'] : 0, |
|||
'outcount' => isset($res['day30_outcount']) ? $res['day30_outcount'] : 0 |
|||
], |
|||
'month' => [ |
|||
'incount' => isset($res['month_incount']) ? $res['month_incount'] : 0, |
|||
'outcount' => isset($res['month_outcount']) ? $res['month_outcount'] : 0 |
|||
], |
|||
'today' => [ |
|||
'incount' => isset($res['today_incount']) ? $res['today_incount'] : 0, |
|||
'outcount' => isset($res['today_outcount']) ? $res['today_outcount'] : 0 |
|||
], |
|||
'year' => [ |
|||
'incount' => isset($res['year_incount']) ? $res['year_incount'] : 0, |
|||
'outcount' => isset($res['year_outcount']) ? $res['year_outcount'] : 0 |
|||
], |
|||
]; |
|||
|
|||
return $data; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue