234 lines
7.5 KiB
PHP
234 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace app\admin\controller\data;
|
|
|
|
use app\common\controller\Backend;
|
|
use think\Db;
|
|
/**
|
|
* 商品数据
|
|
* @icon fa fa-circle-o
|
|
*/
|
|
class Goods extends Backend
|
|
{
|
|
protected $model = null;
|
|
|
|
public function _initialize()
|
|
{
|
|
parent::_initialize();
|
|
$this->model = new \app\admin\model\data\Traffic();
|
|
$this->timeModel = new \app\admin\model\data\Time();
|
|
}
|
|
|
|
|
|
/**
|
|
* 商品访客排行
|
|
* @return void
|
|
*/
|
|
public function orderRank(){
|
|
|
|
$time = $this->request->post('time/a',0);
|
|
$unit = $this->request->post('unit','');
|
|
if(!$time){
|
|
$this->success('获取成功', []);
|
|
}
|
|
if(count($time) == 1){
|
|
$time = $time[0];
|
|
}
|
|
$time = $this->timeModel->getFilterStartEndTime($time,$unit);
|
|
|
|
$sql = "SELECT * FROM (
|
|
SELECT
|
|
goods_type,
|
|
count(v.user_id) as user_count,
|
|
sum(v.real_price) as price_sum,
|
|
CASE
|
|
WHEN goods_type = 'course' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\course\Course::getTable()." as childtable
|
|
WHERE childtable.id = v.item_id
|
|
AND (childtable.type = 'audio' OR childtable.type = 'video' OR childtable.type = 'live' OR childtable.type = 'article' OR childtable.type = 'column')
|
|
)
|
|
WHEN goods_type = 'vipcard' THEN (
|
|
SELECT CONCAT(id, '||', title)
|
|
FROM ".\app\admin\model\app\vip\Card::getTable()." as childtable
|
|
WHERE childtable.id = v.item_id
|
|
)
|
|
WHEN goods_type = 'exercise' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\app\exam\Exercises::getTable()." as childtable
|
|
WHERE childtable.id = v.item_id
|
|
)
|
|
WHEN goods_type = 'activity' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\app\activity\Activity::getTable()." as childtable
|
|
WHERE childtable.id = v.item_id
|
|
)
|
|
END AS product_name
|
|
FROM
|
|
".\app\admin\model\order\Item::getTable()." AS v
|
|
RIGHT JOIN ".\app\admin\model\order\Order::getTable()." as orders ON v.order_no = orders.order_no
|
|
WHERE v.createtime BETWEEN {$time['start']} AND {$time['end']} and orders.status in ('".implode('\',\'',\app\common\constant\order\Status::getSuccessOrderStatus())."')
|
|
GROUP BY v.goods_type, v.item_id,v.user_id
|
|
) AS subquery
|
|
WHERE subquery.product_name IS NOT NULL
|
|
ORDER BY subquery.user_count DESC
|
|
LIMIT 0, 5;";
|
|
|
|
|
|
$data = $this->parseSqlQuery($sql,$time);
|
|
|
|
$this->success("获取成功",$data);
|
|
}
|
|
|
|
/**
|
|
* 商品访客排行
|
|
* @return void
|
|
*/
|
|
public function visiterRank(){
|
|
|
|
$time = $this->request->post('time/a',0);
|
|
$unit = $this->request->post('unit','');
|
|
if(!$time){
|
|
$this->success('获取成功', []);
|
|
}
|
|
if(count($time) == 1){
|
|
$time = $time[0];
|
|
}
|
|
$time = $this->timeModel->getFilterStartEndTime($time,$unit);
|
|
|
|
$sql = "SELECT * FROM (
|
|
SELECT
|
|
page_type,
|
|
page_id,
|
|
CASE
|
|
WHEN page_type = 'course' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\course\Course::getTable()." as childtable
|
|
WHERE childtable.id = v.page_id
|
|
AND (childtable.type = 'audio' OR childtable.type = 'video' OR childtable.type = 'live' OR childtable.type = 'article' OR childtable.type = 'column')
|
|
)
|
|
WHEN page_type = 'vipcard' THEN (
|
|
SELECT CONCAT(id, '||', title)
|
|
FROM ".\app\admin\model\app\vip\Card::getTable()." as childtable
|
|
WHERE childtable.id = v.page_id
|
|
)
|
|
WHEN page_type = 'exercise' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\app\exam\Exercises::getTable()." as childtable
|
|
WHERE childtable.id = v.page_id
|
|
)
|
|
WHEN page_type = 'activity' THEN (
|
|
SELECT CONCAT(id, '||', name, '||', cover)
|
|
FROM ".\app\admin\model\app\activity\Activity::getTable()." as childtable
|
|
WHERE childtable.id = v.page_id
|
|
)
|
|
END AS product_name,
|
|
COUNT(DISTINCT ip) AS visitor_count
|
|
FROM
|
|
".$this->model->getTable()." AS v
|
|
WHERE page_type <> 'other' AND createtime BETWEEN {$time['start']} AND {$time['end']}
|
|
GROUP BY page_type, page_id
|
|
) AS subquery
|
|
WHERE subquery.product_name IS NOT NULL
|
|
ORDER BY subquery.visitor_count DESC
|
|
LIMIT 0, 5;";
|
|
|
|
// 执行查询
|
|
|
|
|
|
$data = $this->parseSqlQuery($sql,$time);
|
|
|
|
|
|
|
|
$this->success("获取成功",$data);
|
|
|
|
}
|
|
|
|
public function parseSqlQuery($sql,$time){
|
|
$data = [];
|
|
$result = Db::query($sql);
|
|
if($result){
|
|
|
|
|
|
$orderModel = new \app\admin\model\data\Order;
|
|
|
|
foreach ($result as $item){
|
|
$temp = explode("||",$item['product_name']);
|
|
$item['name'] = $temp[1];
|
|
$item['id'] = $temp[0];
|
|
if((isset($item['page_type']) && $item['page_type'] == 'vipcard') || (isset($item['goods_type']) && $item['goods_type'] == 'vipcard')){
|
|
if(\app\common\library\Platform::getSystemType() == 'single'){
|
|
$item['cover'] = MODULE_URL.'/assets/image/vipcard.png';
|
|
}else{
|
|
$item['cover'] = MODULE_URL.'/public/assets/image/vipcard.png';
|
|
}
|
|
}else{
|
|
$item['cover'] = $temp[2];
|
|
}
|
|
|
|
$payerCount = $orderModel->getTimeRangePayUserCount($time['start'],$time['end']);
|
|
|
|
if(isset($item['visitor_count'])){
|
|
$item['pay_rate'] = $item['visitor_count'] && $payerCount ? intval($payerCount / $item['visitor_count'] * 100) ."%" : '0%';
|
|
}
|
|
|
|
$data[] = $item;
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 商品统计
|
|
* @return void
|
|
*/
|
|
public function total(){
|
|
|
|
$dataFields = [
|
|
'course'=>[
|
|
'column','video','audio','article','live','goods'
|
|
],
|
|
'interaction'=>[
|
|
'vipcard','activity','exercise'
|
|
]
|
|
];
|
|
|
|
$query =\app\common\model\goods\Handle::getGoodsQuery();
|
|
|
|
$fields = [];
|
|
foreach ($dataFields as $item){
|
|
foreach ($item as $option){
|
|
$fields[] = "COUNT(IF(type='{$option}', 1, NULL)) as {$option}_count";
|
|
}
|
|
}
|
|
$fields[] = "COUNT(*) as total_count";
|
|
|
|
$data = [];
|
|
$data['goods']['total'] = $query->where([
|
|
'status'=>1
|
|
])->count();
|
|
$query =\app\common\model\goods\Handle::getGoodsQuery();
|
|
$data['goods']['total_pay'] = $query->where([
|
|
'pay_type'=>'pay',
|
|
'status'=>1
|
|
])->count();
|
|
|
|
$data['goods']['total_free'] = $data['goods']['total'] - $data['goods']['total_pay'];
|
|
|
|
$query =\app\common\model\goods\Handle::getGoodsQuery();
|
|
$result = $query->where([
|
|
'status'=>1
|
|
])->field($fields)->find();
|
|
|
|
|
|
foreach ($dataFields as $key =>$item){
|
|
$data[$key] = [];
|
|
foreach ($item as $option){
|
|
$data[$key][$option] = $result[$option."_count"];
|
|
}
|
|
}
|
|
$this->success("获取成功",$data);
|
|
|
|
}
|
|
} |