SendOrderStatistic.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2017/12/2
  6. * Time: 15:36
  7. */
  8. namespace General\Services\SendOrder;
  9. use Redis;
  10. use General\Models\OfficialAccount\ForceSubscribeUsers;
  11. use General\Models\Order\Order;
  12. use General\Models\Statistic\WapVisitStat;
  13. use General\Models\User\User;
  14. use stdClass;
  15. /**
  16. * 派单统计
  17. * @method uvPv(int send_order_id)
  18. * @method register(int send_order_id)
  19. * @method newFan(int send_order_id)
  20. * @method charge(int send_order_id)
  21. * @method todayUvPv(int send_order_id)
  22. */
  23. class SendOrderStatistic
  24. {
  25. protected $send_order_ids;
  26. protected $book_infos;
  27. protected $field = [];
  28. public function __construct(array $send_order_ids)
  29. {
  30. $this->send_order_ids = $send_order_ids;
  31. }
  32. public function __get($name)
  33. {
  34. if (!isset($this->field[$name])) {
  35. switch ($name) {
  36. case 'todayUvPvs':
  37. $this->field[$name] = $this->getTodayUVPV();
  38. break;
  39. case 'uvPvs':
  40. $this->field[$name] = $this->getUvAndPv();
  41. break;
  42. case 'registers':
  43. $this->field[$name] = $this->getPromotionTotal();
  44. break;
  45. case 'newFans':
  46. $this->field[$name] = $this->getNewFansNum();
  47. break;
  48. case 'charges':
  49. $this->field[$name] = $this->getCharges();
  50. break;
  51. }
  52. }
  53. return $this->field[$name];
  54. }
  55. public function __call($name, $arguments)
  56. {
  57. $property_name = $name . 's';
  58. $send_order_id = $arguments[0];
  59. return $this->$property_name->where('send_order_id', $send_order_id)->first();
  60. }
  61. /**
  62. * 获取今日PV和UV
  63. * @return \Illuminate\Support\Collection
  64. */
  65. public function getTodayUVPV()
  66. {
  67. return collect($this->send_order_ids)->map(function ($item) {
  68. $obj = new stdClass;
  69. $obj->send_order_id = $item;
  70. $obj->today_pv = (int) Redis::hget('send_order_pv_' . $item, date('Y-m-d'));
  71. $obj->today_uv = (int) Redis::hget('send_order_uv_' . $item, date('Y-m-d'));
  72. return $obj;
  73. });
  74. }
  75. /**
  76. * 获取uv和pv
  77. * @return \Illuminate\Support\Collection
  78. */
  79. public function getUvAndPv()
  80. {
  81. return WapVisitStat::whereIn('key', $this->send_order_ids)
  82. ->where([
  83. ['from_type', 'send_orders'],
  84. ['type', 3],
  85. ])->selectRaw('sum(pv) as pv,sum(uv) as uv,`key` as send_order_id')
  86. ->groupBy('key')
  87. ->get();
  88. }
  89. /**
  90. * 获取派单直接充值数据
  91. * @return \Illuminate\Support\Collection
  92. */
  93. public function getCharges()
  94. {
  95. $sql = Order::whereIn('send_order_id', $this->send_order_ids)
  96. ->where('status', 'PAID')
  97. ->selectRaw('count(distinct uid) as payUserNum,sum(price) as totalChargeAmount, send_order_id')
  98. ->groupBy('send_order_id');
  99. return $sql->get();
  100. }
  101. /**
  102. * 获取推广用户数
  103. * @return \Illuminate\Support\Collection
  104. */
  105. public function getPromotionTotal()
  106. {
  107. return User::whereIn('send_order_id', $this->send_order_ids)
  108. ->selectRaw('count(*) as registerNum, send_order_id')
  109. ->groupBy('send_order_id')
  110. ->get();
  111. }
  112. /**
  113. * 获取强关用户数
  114. * @return \Illuminate\Support\Collection
  115. */
  116. public function getNewFansNum()
  117. {
  118. return ForceSubscribeUsers::whereIn('send_order_id', $this->send_order_ids)
  119. ->selectRaw('count(*) as fansNum, send_order_id')
  120. ->groupBy('send_order_id')
  121. ->get();
  122. }
  123. /**
  124. * 设置统计数据
  125. */
  126. protected function setStatisticData($item)
  127. {
  128. $todayUvPv = $this->todayUvPv($item->id);
  129. $uvPv = $this->uvPv($item->id);
  130. $item->clickNum += $uvPv ? $uvPv->pv + $todayUvPv->today_pv : $todayUvPv->today_pv;
  131. $item->clickNumUV += $uvPv ? $uvPv->uv + $todayUvPv->today_uv : $todayUvPv->today_uv;
  132. $charge = $this->charge($item->id);
  133. $item->payUserNum += $charge ? $charge->payUserNum : 0;
  134. $item->totalChargeAmount += $charge ? $charge->totalChargeAmount : 0;
  135. $register = $this->register($item->id);
  136. $item->registerNum += $register ? $register->registerNum : 0;
  137. $newFan = $this->newFan($item->id);
  138. $item->fansNum += $newFan ? $newFan->fansNum : 0;
  139. }
  140. /**
  141. * 初始化数据
  142. */
  143. protected function setInitData($item)
  144. {
  145. $item->clickNum = 0;
  146. $item->clickNumUV = 0;
  147. $item->payUserNum = 0;
  148. $item->totalChargeAmount = 0;
  149. $item->registerNum = 0;
  150. $item->fansNum = 0;
  151. }
  152. public function getDataList($datas)
  153. {
  154. foreach ($datas as $item) {
  155. $this->setInitData($item);
  156. $this->setStatisticData($item, $item->id);
  157. }
  158. return $datas;
  159. }
  160. }