ROITJController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Tests\Statistic\Http\Controllers;
  3. use Catch\Base\CatchController;
  4. use Illuminate\Foundation\Validation\ValidatesRequests;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use Modules\User\Http\Controllers\UserTrait;
  8. class ROITJController extends CatchController
  9. {
  10. use ValidatesRequests;
  11. use UserTrait;
  12. private function _sql(Request $request)
  13. {
  14. $this->validate($request, [
  15. 'start_at' => 'nullable|date_format:Y-m-d',
  16. 'end_at' => 'nullable|date_format:Y-m-d|after_or_equal:start_at',
  17. 'ranse_id' => 'nullable|integer|min:1',
  18. 'miniprogram_id' => 'nullable|integer|min:1'
  19. ]);
  20. $startAt = $request->input('start_at');
  21. $endAt = $request->input('end_at');
  22. $ranseId = $request->input('ranse_id');
  23. $miniprogramId = $request->input('miniprogram_id');
  24. $roles = $this->listUserRoles();
  25. $puserId = null;
  26. $userId = null;
  27. if ($roles->contains('company')) {
  28. $puserId = $this->getLoginUserId();
  29. }
  30. if ($roles->contains('optimizer')) {
  31. $userId = $this->getLoginUserId();
  32. }
  33. return DB::table('tj_promotion_day_charge')
  34. ->when($startAt, function ($query, $startAt) {
  35. return $query->where('day_at', '>=', $startAt);
  36. })->when($endAt, function ($query, $endAt) {
  37. return $query->where('day_at', '<=', $endAt);
  38. })->when($ranseId, function ($query, $ranseId) {
  39. return $query->where('promotion_id', $ranseId);
  40. })->when($miniprogramId, function ($query, $miniprogramId) {
  41. return $query->where('miniprogram_id', $miniprogramId);
  42. })->when($puserId, function ($query, $puserId) {
  43. return $query->where('puser_id', $puserId);
  44. })->when($userId, function ($query, $userId) {
  45. return $query->where('user_id', $userId);
  46. })->orderBy('id', 'desc');
  47. }
  48. // 推广链接投入产出每日列表
  49. public function list(Request $request)
  50. {
  51. $sql = $this->_sql($request)->select(
  52. 'day_at', 'user_id', 'puser_id', 'new_user_num', 'new_user_pay_uv',
  53. 'cost_money', 'new_user_pay_money', 'new_user_vip_pay_money', 'new_user_common_pay_money',
  54. 'new_user_vip_pay_uv', 'new_user_common_pay_uv', 'miniprogram_id'
  55. );
  56. $isExport = $request->integer('is_export', false);
  57. if ($isExport) {
  58. $result = $sql->get();
  59. } else {
  60. $result = $sql->paginate($request->input('limit', 20));
  61. }
  62. if ($result->count()) {
  63. $users = DB::table('users')
  64. ->whereIn('id', $result->pluck('user_id'))
  65. ->select('id', 'username')
  66. ->get()->keyBy('id');
  67. $miniprograms = DB::table('miniprogram')
  68. ->whereIn('id', $result->pluck('miniprogram_id'))
  69. ->select('id', 'name')
  70. ->get()->keyBy('id');
  71. $companyUserName = DB::table('users')
  72. ->where('id', $result->first()->puser_id)->value('username');
  73. foreach ($result as $item) {
  74. // 商户
  75. $item->company_username = $companyUserName;
  76. // 优化师
  77. $item->optimizer_name = $users->get($item->user_id)->username ?? '';
  78. // 小程序
  79. $item->miniprogram_name = $miniprograms->get($item->miniprogram_id)->name ?? '';
  80. // 回本
  81. $item->huiben = $item->cost_money !== '0.00' ? intval($item->new_user_pay_money * 10000 / $item->cost_money) / 100 . '%' : '0%';
  82. // 新增用户成本
  83. $item->new_user_cost_money = $item->new_user_num ? intval($item->cost_money * 100 / $item->new_user_num) / 100 : 0;
  84. // 新增用户人均充值
  85. $item->new_user_pay_money_per = $item->new_user_pay_uv ? intval($item->new_user_pay_money * 100 / $item->new_user_pay_uv) / 100 : 0;
  86. // 会员成本,累计
  87. $item->vip_money_per = $item->new_user_vip_pay_uv ? intval($item->cost_money * 100 / $item->new_user_vip_pay_uv) / 100 : 0;
  88. // 充值成本,累计
  89. $item->common_money_per = $item->new_user_common_pay_uv ? intval($item->cost_money * 100 / $item->new_user_common_pay_uv) / 100 : 0;
  90. // 会员转化率
  91. $item->zhuanhua_vip = $item->new_user_num ? intval($item->new_user_vip_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  92. // 充值转化率
  93. $item->zhuanhua_common = $item->new_user_num ? intval($item->new_user_common_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  94. // 总计转化率
  95. $item->zhuanhua_all = $item->new_user_num ? intval($item->new_user_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  96. }
  97. }
  98. return $result;
  99. }
  100. // 推广链接投入产出每日列表综合
  101. public function listTotal(Request $request)
  102. {
  103. $sql = $this->_sql($request)->select('new_user_pay_money', 'cost_money');
  104. $result = $sql->select(
  105. DB::raw("sum(new_user_pay_money) as pay_money"),
  106. DB::raw("sum(cost_money) as cost_money"),
  107. )->first();
  108. if ($result) {
  109. return [
  110. 'pay_money' => $result->pay_money,
  111. 'cost_money' => $result->cost_money,
  112. ];
  113. } else {
  114. return [];
  115. }
  116. }
  117. }