ROITJController.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. namespace Modules\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. 'puser_id' => 'nullable|integer|min:1'
  20. ]);
  21. $startAt = $request->input('start_at');
  22. $endAt = $request->input('end_at');
  23. $ranseId = $request->input('ranse_id');
  24. $miniprogramId = $request->input('miniprogram_id');
  25. $roles = $this->listUserRoles();
  26. $puserId = null;
  27. $userId = null;
  28. if ($roles->contains('company')) {
  29. $puserId = $this->getLoginUserId();
  30. }
  31. if ($roles->contains('optimizer')) {
  32. $userId = $this->getLoginUserId();
  33. }
  34. if($roles->contains('administrator')) {
  35. $puserId = $request->input('puser_id');
  36. }
  37. return DB::table('tj_promotion_day_charge')
  38. ->when($startAt, function ($query, $startAt) {
  39. return $query->where('day_at', '>=', $startAt);
  40. })->when($endAt, function ($query, $endAt) {
  41. return $query->where('day_at', '<=', $endAt);
  42. })->when($ranseId, function ($query, $ranseId) {
  43. return $query->where('promotion_id', $ranseId);
  44. })->when($miniprogramId, function ($query, $miniprogramId) {
  45. return $query->where('miniprogram_id', $miniprogramId);
  46. })->when($puserId, function ($query, $puserId) {
  47. return $query->where('puser_id', $puserId);
  48. })->when($userId, function ($query, $userId) {
  49. return $query->where('user_id', $userId);
  50. })->orderBy('id', 'desc');
  51. }
  52. // 推广链接投入产出每日列表
  53. public function list(Request $request)
  54. {
  55. $sql = $this->_sql($request)->select(
  56. 'day_at', 'user_id', 'puser_id', 'new_user_num', 'new_user_pay_uv',
  57. 'cost_money', 'new_user_pay_money', 'new_user_vip_pay_money', 'new_user_common_pay_money',
  58. 'new_user_vip_pay_uv', 'new_user_common_pay_uv', 'miniprogram_id', 'promotion_id','id'
  59. );
  60. $isExport = $request->integer('is_export', false);
  61. if ($isExport) {
  62. $result = $sql->get();
  63. } else {
  64. $result = $sql->paginate($request->input('limit', 20));
  65. }
  66. if ($result->count()) {
  67. $users = DB::table('users')
  68. ->whereIn('id', $result->pluck('user_id'))
  69. ->select('id', 'username')
  70. ->get()->keyBy('id');
  71. $miniprograms = DB::table('miniprogram')
  72. ->whereIn('id', $result->pluck('miniprogram_id'))
  73. ->select('id', 'name')
  74. ->get()->keyBy('id');
  75. $companyUserNames = DB::table('users')
  76. ->whereIn('id', $result->pluck('puser_id'))->select('id','username')
  77. ->get()->keyBy('id');
  78. $promotions = DB::table('promotions')
  79. ->whereIn('id', $result->pluck('promotion_id'))
  80. ->select('id', 'name')
  81. ->get()->keyBy('id');
  82. foreach ($result as $item) {
  83. // 商户
  84. $item->company_username = $companyUserNames->get($item->puser_id)->username ?? '';
  85. // 优化师
  86. $item->optimizer_name = $users->get($item->user_id)->username ?? '';
  87. // 小程序
  88. $item->miniprogram_name = $miniprograms->get($item->miniprogram_id)->name ?? '';
  89. // 推广链接
  90. $item->promotion_name = $promotions->get($item->promotion_id)->name ?? '';
  91. // 回本
  92. $item->huiben = $item->cost_money !== '0.00' ? intval($item->new_user_pay_money * 10000 / $item->cost_money) / 100 . '%' : '0%';
  93. // 新增用户成本
  94. $item->new_user_cost_money = $item->new_user_num ? intval($item->cost_money * 100 / $item->new_user_num) / 100 : 0;
  95. // 新增用户人均充值
  96. $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;
  97. // 会员成本,累计
  98. $item->vip_money_per = $item->new_user_vip_pay_uv ? intval($item->cost_money * 100 / $item->new_user_vip_pay_uv) / 100 : 0;
  99. // 充值成本,累计
  100. $item->common_money_per = $item->new_user_common_pay_uv ? intval($item->cost_money * 100 / $item->new_user_common_pay_uv) / 100 : 0;
  101. // 会员转化率
  102. $item->zhuanhua_vip = $item->new_user_num ? intval($item->new_user_vip_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  103. // 充值转化率
  104. $item->zhuanhua_common = $item->new_user_num ? intval($item->new_user_common_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  105. // 总计转化率
  106. $item->zhuanhua_all = $item->new_user_num ? intval($item->new_user_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
  107. }
  108. }
  109. return $result;
  110. }
  111. // 推广链接投入产出每日列表综合
  112. public function listTotal(Request $request)
  113. {
  114. $sql = $this->_sql($request)->select('new_user_pay_money', 'cost_money');
  115. $result = $sql->select(
  116. DB::raw("sum(new_user_pay_money) as pay_money"),
  117. DB::raw("sum(cost_money) as cost_money"),
  118. )->first();
  119. if ($result) {
  120. return [
  121. 'pay_money' => $result->pay_money,
  122. 'cost_money' => $result->cost_money,
  123. ];
  124. } else {
  125. return [];
  126. }
  127. }
  128. // 更新投放成本
  129. public function updateCostmoney(Request $request) {
  130. $this->validate($request, [
  131. 'id' => 'required',
  132. 'cost_money' => 'required|min:0|max:1000000000'
  133. ]);
  134. DB::table('tj_promotion_day_charge')
  135. ->where([
  136. 'id' => $request->input('id'),
  137. 'user_id' => $this->getLoginUserId(),
  138. ])->update([
  139. 'cost_money' => $request->input('cost_money'),
  140. 'updated_at' => date('Y-m-d H:i:s')
  141. ]);
  142. return 'ok';
  143. }
  144. }