123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- /**
- * Created by PhpStorm.
- * User: hp
- * Date: 2017/12/2
- * Time: 15:36
- */
- namespace General\Services\SendOrder;
- use Redis;
- use General\Models\OfficialAccount\ForceSubscribeUsers;
- use General\Models\Order\Order;
- use General\Models\Statistic\WapVisitStat;
- use General\Models\User\User;
- use stdClass;
- /**
- * 派单统计
- * @method uvPv(int send_order_id)
- * @method register(int send_order_id)
- * @method newFan(int send_order_id)
- * @method charge(int send_order_id)
- * @method todayUvPv(int send_order_id)
- */
- class SendOrderStatistic
- {
- protected $send_order_ids;
- protected $book_infos;
- protected $field = [];
- public function __construct(array $send_order_ids)
- {
- $this->send_order_ids = $send_order_ids;
- }
- public function __get($name)
- {
- if (!isset($this->field[$name])) {
- switch ($name) {
- case 'todayUvPvs':
- $this->field[$name] = $this->getTodayUVPV();
- break;
- case 'uvPvs':
- $this->field[$name] = $this->getUvAndPv();
- break;
- case 'registers':
- $this->field[$name] = $this->getPromotionTotal();
- break;
- case 'newFans':
- $this->field[$name] = $this->getNewFansNum();
- break;
- case 'charges':
- $this->field[$name] = $this->getCharges();
- break;
- }
- }
- return $this->field[$name];
- }
- public function __call($name, $arguments)
- {
- $property_name = $name . 's';
- $send_order_id = $arguments[0];
- return $this->$property_name->where('send_order_id', $send_order_id)->first();
- }
- /**
- * 获取今日PV和UV
- * @return \Illuminate\Support\Collection
- */
- public function getTodayUVPV()
- {
- return collect($this->send_order_ids)->map(function ($item) {
- $obj = new stdClass;
- $obj->send_order_id = $item;
- $obj->today_pv = (int) Redis::hget('send_order_pv_' . $item, date('Y-m-d'));
- $obj->today_uv = (int) Redis::hget('send_order_uv_' . $item, date('Y-m-d'));
- return $obj;
- });
- }
- /**
- * 获取uv和pv
- * @return \Illuminate\Support\Collection
- */
- public function getUvAndPv()
- {
- return WapVisitStat::whereIn('key', $this->send_order_ids)
- ->where([
- ['from_type', 'send_orders'],
- ['type', 3],
- ])->selectRaw('sum(pv) as pv,sum(uv) as uv,`key` as send_order_id')
- ->groupBy('key')
- ->get();
- }
- /**
- * 获取派单直接充值数据
- * @return \Illuminate\Support\Collection
- */
- public function getCharges()
- {
- $sql = Order::whereIn('send_order_id', $this->send_order_ids)
- ->where('status', 'PAID')
- ->selectRaw('count(distinct uid) as payUserNum,sum(price) as totalChargeAmount, send_order_id')
- ->groupBy('send_order_id');
- return $sql->get();
- }
- /**
- * 获取推广用户数
- * @return \Illuminate\Support\Collection
- */
- public function getPromotionTotal()
- {
- return User::whereIn('send_order_id', $this->send_order_ids)
- ->selectRaw('count(*) as registerNum, send_order_id')
- ->groupBy('send_order_id')
- ->get();
- }
- /**
- * 获取强关用户数
- * @return \Illuminate\Support\Collection
- */
- public function getNewFansNum()
- {
- return ForceSubscribeUsers::whereIn('send_order_id', $this->send_order_ids)
- ->selectRaw('count(*) as fansNum, send_order_id')
- ->groupBy('send_order_id')
- ->get();
- }
- /**
- * 设置统计数据
- */
- protected function setStatisticData($item)
- {
- $todayUvPv = $this->todayUvPv($item->id);
- $uvPv = $this->uvPv($item->id);
- $item->clickNum += $uvPv ? $uvPv->pv + $todayUvPv->today_pv : $todayUvPv->today_pv;
- $item->clickNumUV += $uvPv ? $uvPv->uv + $todayUvPv->today_uv : $todayUvPv->today_uv;
- $charge = $this->charge($item->id);
- $item->payUserNum += $charge ? $charge->payUserNum : 0;
- $item->totalChargeAmount += $charge ? $charge->totalChargeAmount : 0;
- $register = $this->register($item->id);
- $item->registerNum += $register ? $register->registerNum : 0;
- $newFan = $this->newFan($item->id);
- $item->fansNum += $newFan ? $newFan->fansNum : 0;
- }
- /**
- * 初始化数据
- */
- protected function setInitData($item)
- {
- $item->clickNum = 0;
- $item->clickNumUV = 0;
- $item->payUserNum = 0;
- $item->totalChargeAmount = 0;
- $item->registerNum = 0;
- $item->fansNum = 0;
- }
- public function getDataList($datas)
- {
- foreach ($datas as $item) {
- $this->setInitData($item);
- $this->setStatisticData($item, $item->id);
- }
- return $datas;
- }
- }
|