<?php
/**
* Created by PhpStorm.
* User: Rain
* Date: 2020/5/16
* Time: 13:44
*/
namespace app\api\service\business\controllers\Monitoring;
use app\api\service\business\BaseControllerService;
use app\api\service\business\controllers\Monitoring\Models\MonitoringModel;
use app\api\service\business\controllers\Collect\Models\CollectModel;
use app\service\alone\Path\PathService;
/**
* Class ArticlesService
*
* @property-read PathService $path
*
*/
class MonitoringService extends BaseControllerService
{
protected $rely = [
'model' => MonitoringModel::class,
'collectmodel' => CollectModel::class,
'path' => PathService::class
];
/**
* $paidPrice 已付订单金额数组
* $paidNumber 已付订单数
* $paidUsers 已付 订单人数数组
* $unpidPrice 未付款金额 进度
* $attentionPerson 店铺访问人数进度条
* $visitPerson 访问商家、商品 进度条
* $neworderProportion 老支付用户 下单率
* $newVisitProportion 老用户访问率
*
*/
/**
* 实时自动刷新当天数据
* @param int $business_id 商户id
* @return array
*/
public function gainTrafficData(int $business_id,int $time)
{
switch ($time){
case 1:
//实时
$start_time =date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d'), date('Y')));
$end_time = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')));
break;
case 2:
//日报 昨日
$start_time =date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')));
$end_time = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1);
break;
case 3:
//周报 上周
$length = 7;
// 星期天直接返回上星期,因为计算周围 星期一到星期天,如果不想直接去掉
if (date('w') == 0) {
$length = 14;
}
$start_time =date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') - date('w') + 1 - $length, date('Y')));
$end_time = date('Y-m-d H:i:s',mktime(23, 59, 59, date('m'), date('d') - date('w') + 7 - $length, date('Y')));
break;
case 4:
// 月报 上个月
$start = mktime(0, 0, 0, date('m') - 1, 1, date('Y'));
$end = mktime(23, 59, 59, date('m') - 1, date('t'), date('Y'));
if (date('m', $start) != date('m', $end)) {
$end -= 60 * 60 * 24;
}
$start_time =date('Y-m-d H:i:s',$start);
$end_time = date('Y-m-d H:i:s',$end);
break;
}
// // 今天 开始时间
// $start_time= date('Y-m-d 00:00:00');
// $end_time=date('Y-m-d 23:59:59');
$paidwhere=[
'business_id'=>$business_id,
];
$list = $this->model->orderList($paidwhere)->toArray();
// 当天订单订单汇总
$intradayOrder= []; // 付款订单
$unpaidOrder=[]; // 未付款订单
foreach ($list as $k => $v){
if($v['create_time']>$start_time && $v['create_time']<$end_time) {
if ($v['status'] == 1) { // 已付款
$price_details = json_decode($v['price_detail'], true);
$intradayOrder[] = [
'paid_price' => $price_details['actual_payment'],// 订单实付金额
'user_id' => $v['user_id'],
];
}
if ($v['status']==0){ // 未付款
$unpaidPriceDetails = json_decode($v['price_detail'], true);
$unpaidOrder[] = [
'unpaid_price' => $unpaidPriceDetails['actual_payment'],// 订单实付金额
'unpaiduUserId' => $v['user_id'],
];
}
}
}
$paid_price =0; $paid_number =0;
foreach ($intradayOrder as $key => $value){
$paid_price = bcadd($paid_price,$value['paid_price'],2); // 已付订单总价 当日
$paid_number +=1; // 已付订单总数
}
// 计算已付 订单 率
// 上上天 已付 订单数
$beforePaidprice = $this->recentlyData($business_id,$time)['paid_price'];
$paidPrice=$this->progressBar($paid_price,$beforePaidprice);// 已支付金额 进度数组
// 上上天 订单数
$beforePaidNumber=$this->recentlyData($business_id,$time)['paid_number'];
$paidNumber=$this->progressBar($paid_number,$beforePaidNumber);// 订单数 进度数组
$paid_user = count(array_unique(array_column($intradayOrder,'user_id'))); // 已付订单人数
//前天 订单人数
$beforepaidUser=$this->recentlyData($business_id,$time)['paid_user'];
$paidUsers=$this->progressBar($paid_user,$beforepaidUser);//已订单人数进度数组
// 计算老客户 下单比重
$orderProportion=$this->newRegularCustomerProportion($intradayOrder,$business_id,$start_time,'order'); //老客户访问比重 传指定时间访问的客户
$beforeorderProportion=$this->recentlyData($business_id,$time)['orderProportion'];
//支付老客户订单下降
$neworderProportion=$this->oldCustomerData($orderProportion,$beforeorderProportion);
$unpaid_price =0; $unpaid_number =0;
foreach ($unpaidOrder as $items => $item){
$unpaid_price = bcadd($unpaid_price,$item['unpaid_price'],2); // 未付订单总价 当日
$unpaid_number +=1; // 未付订单总数
}
// 计算未订单 付款订单人数
$beforeUnpidprice=$this->recentlyData($business_id,$time)['unpaid_price'];
$unpidPrice=$this->progressBar($unpaid_price,$beforeUnpidprice);//未订单价钱进度数组
// 未付款人数
$beforeUnpidprice=$this->recentlyData($business_id,$time)['unpaid_price'];
$unpidPrice=$this->progressBar($unpaid_price,$beforeUnpidprice);//未订单价钱进度数组
$unpaid_user = count(array_unique(array_column($unpaidOrder,'unpaiduUserId'))); // 未付订单人数
// 店铺 访问数
$visitwhere = ['business_id'=>$business_id];
$visitTime =[];
$visitResult = $this -> model->selectAccessRecord($visitwhere)->toArray();
foreach ($visitResult as $visits => $visit){
if($visit['create_time']>$start_time && $visit['create_time']<$end_time) {
$visitTime[]=$visit;
}
}
$visitNumber = count(array_unique(array_column($visitTime,'user_id'))); // 指定时间 店铺访问数
// 访问数量人数比
$beforeVisit=$this->recentlyData($business_id,$time)['visitUser'];
$visitPerson=$this->progressBar($visitNumber,$beforeVisit);//访问店铺人数比
$visitProportion=$this->newRegularCustomerProportion($visitTime,$business_id,$start_time,'visit'); //老客户访问比重 传指定时间访问的客户
$beforeVisitProportion=$this->recentlyData($business_id,$time)['visitProportion'];
//支付老客户订单下降
$newVisitProportion=$this->oldCustomerData($visitProportion,$beforeVisitProportion);
// 店铺关注人数
$attention=$this->model->attentionBusiness($business_id)->toArray();
$timeAttention = []; //指定时间统计 关注人数
foreach ($attention as $atts =>$att){
if($att['create_time']>$start_time && $att['create_time']<$end_time) {
$timeAttention[]=$att;
}
}
$attentionNumber = count($timeAttention); //指定时间统计 关注人数
$beforeattentionNumber=$this->recentlyData($business_id,$time)['attentionNumber'];
$attentionPerson=$this->progressBar($attentionNumber,$beforeattentionNumber);// 店铺关注人数 进度数组
$new_result =[
'paid_price'=>$paidPrice,// 已付订单金额 当日
'paid_number'=>$paidNumber,// 已付订单指数
'paid_user'=>$paidUsers,// 已付订单人数
'visitUser'=>$visitPerson,// 访问店铺人数
'unpaid_price'=>$unpidPrice,//未付款订单金额
'unpaid_number'=> $paidUsers,//未付款 订单数
'visitProportion'=>$newVisitProportion,// 访问中 老客户 所占比重
'orderProportion'=>$neworderProportion,// 老客下单 所占比重
'attentionNumber'=>$attentionPerson,//店铺关注人数
];
return $new_result;
}
/**
* 算上一天 上周 上个月 结果
* @param int $business_id 商户id
* @return array
*/
public function recentlyData(int $business_id,int $time)
{
switch ($time){
// case 1:
// //实时
// $start_time =date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d'), date('Y')));
// $end_time = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')));
// break;
case 2:
//日报 前日
$start_time =date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')));
$end_time = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d')-1, date('Y')) - 1);
break;
case 3:
//周报 上上周
$length = 14;
// 星期天直接返回上星期,因为计算周围 星期一到星期天,如果不想直接去掉
if (date('w') == 0) {
$length = 28;
}
$start_time =date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') - date('w') + 1 - $length, date('Y')));
$end_time = date('Y-m-d H:i:s',mktime(23, 59, 59, date('m'), date('d') - date('w') + 7 - $length, date('Y')));
break;
case 4:
// 月报 上上月
$start = mktime(0, 0, 0, date('m') - 1, 1, date('Y'));
$end = mktime(23, 59, 59, date('m') - 1, date('t'), date('Y'));
if (date('m', $start) != date('m', $end)) {
$end -= 60 * 60 * 24;
}
$start_time =date('Y-m-d H:i:s',$start);
$end_time = date('Y-m-d H:i:s',$end);
break;
}
// // 今天 开始时间
// $start_time= date('Y-m-d 00:00:00');
// $end_time=date('Y-m-d 23:59:59');
$paidwhere=[
'business_id'=>$business_id,
];
$list = $this->model->orderList($paidwhere)->toArray();
// 当天订单订单汇总
$intradayOrder= []; // 付款订单
$unpaidOrder=[]; // 未付款订单
foreach ($list as $k => $v){
if($v['create_time']>=$start_time && $v['create_time']<=$end_time) {
if ($v['status'] == 1) { // 已付款
$price_details = json_decode($v['price_detail'], true);
$intradayOrder[] = [
'paid_price' => $price_details['actual_payment'],// 订单实付金额
'user_id' => $v['user_id'],
];
}
if ($v['status']==0){ // 未付款
$unpaidPriceDetails = json_decode($v['price_detail'], true);
$unpaidOrder[] = [
'unpaid_price' => $unpaidPriceDetails['actual_payment'],// 订单实付金额
'unpaiduUserId' => $v['user_id'],
];
}
}
}
$paid_price =0; $paid_number =0;
foreach ($intradayOrder as $key => $value){
$paid_price = bcadd($paid_price,$value['paid_price'],2); // 已付订单总价 当日
$paid_number +=1; // 已付订单总数
}
$paid_user = count(array_unique(array_column($intradayOrder,'user_id'))); // 已付订单人数
// 计算老客户 下单比重
$orderProportion=$this->newRegularCustomerProportion($intradayOrder,$business_id,$start_time,'order'); //老客户访问比重 传指定时间访问的客户
$unpaid_price =0; $unpaid_number =0;
foreach ($unpaidOrder as $items => $item){
$unpaid_price = bcadd($unpaid_price,$item['unpaid_price'],2); // 未付订单总价 当日
$unpaid_number +=1; // 未付订单总数
}
$unpaid_user = count(array_unique(array_column($unpaidOrder,'unpaiduUserId'))); // 未付订单人数
// 店铺 访问数
$visitwhere = ['business_id'=>$business_id];
$visitTime =[];
$visitResult = $this -> model->selectAccessRecord($visitwhere)->toArray();
foreach ($visitResult as $visits => $visit){
if($visit['create_time']>$start_time && $visit['create_time']<$end_time) {
$visitTime[]=$visit;
}
}
$visitNumber = count(array_unique(array_column($visitTime,'user_id'))); // 指定时间 店铺访问数
$visitProportion=$this->newRegularCustomerProportion($visitTime,$business_id,$start_time,'visit'); //老客户访问比重
// 店铺关注人数
$attention=$this->model->attentionBusiness($business_id)->toArray();
$timeAttention = []; //指定时间统计 关注人数
foreach ($attention as $atts =>$att){
if($att['create_time']>$start_time && $att['create_time']<$end_time) {
$timeAttention[]=$att;
}
}
$attentionNumber = count($timeAttention);
$new_result =[
'paid_price'=>$paid_price,// 已付订单金额 当日
'paid_number'=>$paid_number,// 已付订单指数
'paid_user'=>$paid_user,// 已付订单人数
'visitUser'=>$visitNumber,// 访问店铺、商品人数
'unpaid_price'=>$unpaid_price,//未付款订单金额
'unpaid_number'=> $unpaid_number,//未付款 订单数
'visitProportion'=>$visitProportion,// 访问中 老客户 所占比重
'orderProportion'=>$orderProportion,// 老客下单 所占比重
'attentionNumber'=>$attentionNumber,//店铺关注人数
];
return $new_result;
}
/**
* 重新计算老客户比重
* @param $visitTime // 指定访问时间的用户
* @param $business_id // 商户
* @param $start_time // 指定访问的 开始时间
* @param $end_time // 指定访问的结束时间
* @return string
*/
public function newRegularCustomerProportion(array $visitTime,int $business_id,string $start_time,string $method = ''){
$thisTimeUser = array_unique(array_column($visitTime,'user_id'));// 去重 指定时间访问的用户
$thisTimeUserNumber=count($thisTimeUser);//计算数量
// 查询 数据库中 用户量
$where['business_id'] = (int)$business_id;
$where['start_time'] = $start_time;
// 访问
if($method == 'visit') $userVisit = $this->model->selectAccessRecord($where)->toArray();
// 下单
if($method == 'order') $userVisit = $this->model->orderlist($where)->toArray();
$userArray = array_unique(array_column($userVisit,'user_id')); // 去重 用户数据库中的用户
$regular_customer =0; //老客户数量
foreach ($thisTimeUser as $k => $v){
foreach ($userArray as $key => $value){
if($v == $value) $regular_customer +=1; // 计算出 老客户访问次数
}
}
// 当天访问 用户 < 以前综合用户 少
$regular_customer_proportion=bcdiv($regular_customer,$thisTimeUserNumber,2); // 计算老客户访问比例
return $regular_customer_proportion;
}
/**
* 重构 老客户 返回数据
* @param $Proportion // 当前数据比例
* @param $beforeProportion // 之前数据比例
* @return array|int[]
*/
public function oldCustomerData($Proportion,$beforeProportion)
{
//下降
if($Proportion > $beforeProportion){
$radio =bcsub($Proportion,$beforeProportion,2);
$new_orderProportion=[
'range'=> 0,
'radio'=> $radio,
];
}
// 上升
if($Proportion < $beforeProportion){
$radio =bcsub($beforeProportion,$Proportion,2);
$new_orderProportion=[
'range'=> 1,
'radio'=> $radio,
];
}
// 相等
if($Proportion == $beforeProportion){
$new_orderProportion=[
'range'=> 0,
'radio'=> 0,
];
}
return $new_orderProportion;
}
/**
* 计算 上升 和下降比重
* @param $last //昨天 上周 上月
* @param $before // 前天 上上周 上上月
* @return array
*/
public function progressBar($last,$before)
{
//上升
if($last > $before){
$paid_progress_bar=bcsub($last,$before,2);
$goup=bcdiv($paid_progress_bar,$before,2); // 上升比率
return [
'last'=>$last,// 最近参数
'range'=>1,//上升
'ratio'=>$goup,//上升概率
];
}
// 下降
if($last < $before){
$paid_progress_bar=bcsub($before,$last,2);
$declie=bcdiv($paid_progress_bar,$before,2); // 下降比率
return [
'last'=>$last,// 最近参数
'range'=>0,//下降
'ratio'=>$declie,//下降概率
];
}
//相等
if($last == $before){
return [
'last'=>$last,// 最近参数
'range'=>0,//下降
'ratio'=>0,//下降概率
];
}
}
}
PHP shop 数据统计
最新推荐文章于 2022-04-07 20:49:46 发布