SendOrderForceDayStatsController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2017/12/1
  6. * Time: 14:17
  7. */
  8. namespace App\Http\Controllers\Manage\SendOrder;
  9. use App\Http\Controllers\Channel\BaseController;
  10. use App\Http\Controllers\Manage\SendOrder\Transformers\SendOrderBookDayStatTransformer;
  11. use App\Modules\Book\Models\BookUvStat;
  12. use App\Modules\Book\Services\BookConfigService;
  13. use App\Modules\SendOrder\Services\SendOrderForceDayStatService;
  14. use DB;
  15. use Illuminate\Http\Request;
  16. use Log;
  17. use Redis;
  18. class SendOrderForceDayStatsController extends BaseController
  19. {
  20. /**
  21. * @apiDefine sendOrder 派单
  22. */
  23. /**
  24. * @apiVersion 1.0.0
  25. * @api {GET} getBookSendOrderDayStats 获取派单统计
  26. * @apiGroup sendOrder
  27. * @apiName sendOrderDayStats
  28. */
  29. function getGroupByBook(Request $request)
  30. {
  31. $begin_time = $request->has('begin_time') && $request->input('begin_time') ? $request->input('begin_time') : '';
  32. $end_time = $request->has('end_time') && $request->input('end_time') ? $request->input('end_time') : '';
  33. $gender = $request->input('gender','');
  34. $data = SendOrderForceDayStatService::getSendOrderDayStatsByBook(compact('begin_time', 'end_time','gender'));
  35. return response()->collection(new SendOrderBookDayStatTransformer(), $data);
  36. }
  37. /**
  38. * @apiVersion 1.0.0
  39. * @api {GET} exportBookSendOrderDayStats 获取派单统计
  40. * @apiGroup sendOrder
  41. * @apiName exportBookSendOrderDayStats
  42. */
  43. function exportGroupByBook(Request $request)
  44. {
  45. $end_time = $request->has('end_time') && $request->input('end_time') ? $request->input('end_time') : '';
  46. $begin_time = $request->has('begin_time') && $request->input('begin_time') ? $request->input('begin_time') : '';
  47. $gender = $request->input('gender','');
  48. $data = SendOrderForceDayStatService::getSendOrderDayStatsByBook(compact('begin_time', 'end_time','gender'));
  49. header("Content-type:application/vnd.ms-excel");
  50. header("Content-Disposition:attachment;filename=" . "书籍数据" . date("YmdHis") . ".csv");
  51. echo iconv("UTF-8", "GBK", "\"书本名称\",\"男女频\",\"派单数\",\"充值总额\",\"成功订单数\",\"PV\",\"UV\",\"充值总额/UV\",\"注册用户/UV\",\"订单总数\",\"订单成功率\"\r\n");
  52. foreach ($data as $item) {
  53. echo("\"" . mb_convert_encoding($item->book_name, "GBK", "UTF-8") . "\",");
  54. echo("\"" . mb_convert_encoding(($item->pid==1)?'男':'女', "GBK", "UTF-8") . "\",");
  55. echo("\"" . mb_convert_encoding($item->send_order_num, "GBK", "UTF-8") . "\",");
  56. echo("\"" . mb_convert_encoding($item->sum_recharge_amount, "GBK", "UTF-8") . "\",");
  57. echo("\"" . mb_convert_encoding($item->sum_paid_num, "GBK", "UTF-8") . "\",");
  58. echo("\"" . mb_convert_encoding($item->sum_pv, "GBK", "UTF-8") . "\",");
  59. echo("\"" . mb_convert_encoding($item->sum_uv, "GBK", "UTF-8") . "\",");
  60. $total_send_order_count = $item->sum_paid_num + $item->sum_unpaid_num;
  61. if (0 == $item->sum_uv) {
  62. $recharge_persent_result = '100%';
  63. $register_persent_result = '100%';
  64. } else {
  65. $recharge_persent_result = round(($item->sum_recharge_amount / $item->sum_uv) * 100, 2) . '%';
  66. $register_persent_result = round(($item->sum_register_user_num / $item->sum_uv) * 100, 2) . '%';
  67. }
  68. if (0 == $total_send_order_count) {
  69. $success_order_persent_result = '0%';
  70. } else {
  71. $success_order_persent_result = round(($item->sum_paid_num / $total_send_order_count) * 100, 2) . '%';
  72. }
  73. echo("\"" . mb_convert_encoding($recharge_persent_result, "GBK", "UTF-8") . "\",");
  74. echo("\"" . mb_convert_encoding($register_persent_result, "GBK", "UTF-8") . "\",");
  75. echo("\"" . mb_convert_encoding($total_send_order_count, "GBK", "UTF-8") . "\",");
  76. echo("\"" . $success_order_persent_result . "\"\r\n");
  77. }
  78. exit();
  79. }
  80. //注册用户/UV比值大于85%的派单链接的强关转化(强关用户数/注册用户数量)、付费转化(付费用户数/强关粉丝)、注册用户ARPU值(充值/注册用户)
  81. function newUserArpu(Request $request)
  82. {
  83. $begin_time = $request->has('begin_time') && $request->input('begin_time') ? $request->input('begin_time') : '';
  84. $end_time = $request->has('end_time') && $request->input('end_time') ? $request->input('end_time') : '';
  85. $bid = $request->has('bid') && $request->input('bid') ? $request->input('bid') : '';
  86. $data = DB::select("select avg(sum_recharge_amount) avg_recharge_amount,avg(sum_force_user_num) avg_force_user_num,avg(sum_register_user_num) avg_register_user_num,avg(sum_pay_user_num) avg_pay_user_num
  87. from (select t.* from (select sum(recharge_amount) as sum_recharge_amount,sum(force_user_num) sum_force_user_num,
  88. sum(register_user_num) sum_register_user_num,sum(pay_user_num) sum_pay_user_num,sum(uv) sum_uv from send_orders_force_day_stats
  89. where total_uv > 20 and date >='{$begin_time}' and date <= '{$end_time}' and bid = '{$bid}'
  90. group by send_order_id) as t ) as tt where sum_register_user_num/sum_uv > 0.85");
  91. return response()->success([
  92. 'sub_per_register' => $data[0]->avg_register_user_num ? round(100 * $data[0]->avg_force_user_num / $data[0]->avg_register_user_num, 2) . '%' : 0,
  93. 'pay_per_sub' => $data[0]->avg_force_user_num ? round(100 * $data[0]->avg_pay_user_num / $data[0]->avg_force_user_num, 2) . '%' : 0,
  94. 'arpu' => $data[0]->avg_register_user_num ? round($data[0]->avg_recharge_amount / $data[0]->avg_register_user_num, 2) : 0
  95. ]);
  96. }
  97. function deepReadRecordData(Request $request)
  98. {
  99. $bid = $request->input('bid');
  100. if (empty($bid)) {
  101. return response()->error('LACK_PARAM');
  102. }
  103. $total_count = $this->getCount($bid);
  104. $count = $request->input('count');
  105. if (!$count) {
  106. $count = $total_count;
  107. }
  108. $book = BookConfigService::getBookById($bid);
  109. if ($count == $total_count) {
  110. $info = $this->getReadRecordDataFromRedis($bid);
  111. } else {
  112. $info = $this->getReadRecordDataFromDB($bid, $count);
  113. }
  114. $info['total_count'] = $total_count;
  115. $info['now_count'] = $count;
  116. $info['book_name'] = $book->book_name;
  117. return response()->success($info);
  118. }
  119. private function getReadRecordDataFromRedis($bid)
  120. {
  121. $key = 'book:' . $bid . ':deepread:uv';
  122. $total = Redis::scard($key);
  123. $forseq = 30;
  124. $uv = [];
  125. $chapter = [];
  126. for ($i = 1; $i <= $forseq; $i++) {
  127. $chapter_key = 'book:' . $bid . ':chapterseq:' . $i;
  128. $uv[] = (int)Redis::scard($chapter_key);
  129. $chapter[] = '第' . $i . '章';
  130. }
  131. return ['chapter' => $chapter, 'uv' => $uv, 'total_uv' => $total];
  132. }
  133. private function getReadRecordDataFromDB($bid, $count)
  134. {
  135. $info = BookUvStat::where('bid', $bid)->where('count', $count)->orderBy('chapter_seq')->select('bid', 'chapter_seq', 'chapter_uv', 'total_uv', 'count')->get();
  136. if (!$info) {
  137. return [];
  138. }
  139. $data = [];
  140. foreach ($info as $v) {
  141. $data['total_uv'] = $v->total_uv;
  142. $data['uv'][] = $v->chapter_uv;
  143. $data['chapter'][] = '第' . $v->chapter_seq . '章';
  144. }
  145. return $data;
  146. }
  147. public function resetDeepReadRecordData(Request $request)
  148. {
  149. $bid = $request->input('bid');
  150. $key = 'book:' . $bid . ':deepread:uv';
  151. $total = Redis::scard($key);
  152. $forseq = 30;
  153. $info = BookUvStat::where('bid', $bid)->select('count')->orderBy('count', 'desc')->first();
  154. $count = 1;
  155. if ($info && !empty($info->count)) {
  156. $count = $info->count + 1;
  157. }
  158. $data = [];
  159. for ($i = 1; $i <= $forseq; $i++) {
  160. $chapter_key = 'book:' . $bid . ':chapterseq:' . $i;
  161. $temp = (int)Redis::scard($chapter_key);
  162. $data[] = ['bid' => $bid, 'chapter_seq' => $i, 'total_uv' => $total, 'chapter_uv' => $temp,
  163. 'count' => $count, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s')];
  164. Redis::del($chapter_key);
  165. }
  166. DB::table('book_uv_stats')->insert($data);
  167. Redis::del($key);
  168. return response()->success();
  169. }
  170. private function getCount($bid)
  171. {
  172. $info = BookUvStat::where('bid', $bid)->select('count')->orderBy('count', 'desc')->first();
  173. $count = 1;
  174. if ($info && !empty($info->count)) {
  175. $count = $info->count + 1;
  176. }
  177. return $count;
  178. }
  179. }