PHP shop 数据统计

12 篇文章 0 订阅
3 篇文章 0 订阅
<?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,//下降概率
            ];
        }


    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值