Selaa lähdekoodia

Merge branch 'liuzj-1000967-dev' into test

# Conflicts:
#	modules/Statistic/routes/route.php
liuzejian 1 vuosi sitten
vanhempi
commit
ce16ff6ae6

+ 6 - 0
modules/Statistic/routes/route.php

@@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Route;
 use Modules\Statistic\Http\Controllers\ChargeTJController;
 use Modules\Statistic\Http\Controllers\UserStatisticsController;
 use Modules\Statistic\Http\Controllers\VideoStatController;
+use Tests\Statistic\Http\Controllers\ROITJController;
 
 Route::prefix('statistic')->group(function(){
     //next
@@ -26,4 +27,9 @@ Route::prefix('statistic')->group(function(){
         Route::get('lastMonthCharge', [ChargeTJController::class, 'lastMonthCharge']);
         Route::get('totalCharge', [ChargeTJController::class, 'totalCharge']);
     });
+    // 投入产出
+    Route::prefix('roi')->group(function(){
+        Route::get('list', [ROITJController::class, 'list']);
+        Route::get('listTotal', [ROITJController::class, 'listTotal']);
+    });
 });

+ 127 - 0
tests/Statistic/Http/Controllers/ROITJController.php

@@ -0,0 +1,127 @@
+<?php
+
+namespace Tests\Statistic\Http\Controllers;
+
+use Catch\Base\CatchController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Modules\User\Http\Controllers\UserTrait;
+
+class ROITJController extends CatchController
+{
+    use ValidatesRequests;
+    use UserTrait;
+
+    private function _sql(Request $request)
+    {
+        $this->validate($request, [
+            'start_at' => 'nullable|date_format:Y-m-d',
+            'end_at' => 'nullable|date_format:Y-m-d|after_or_equal:start_at',
+            'ranse_id' => 'nullable|integer|min:1',
+            'miniprogram_id' => 'nullable|integer|min:1'
+        ]);
+
+        $startAt = $request->input('start_at');
+        $endAt = $request->input('end_at');
+        $ranseId = $request->input('ranse_id');
+        $miniprogramId = $request->input('miniprogram_id');
+        $roles = $this->listUserRoles();
+        $puserId = null;
+        $userId = null;
+        if ($roles->contains('company')) {
+            $puserId = $this->getLoginUserId();
+        }
+        if ($roles->contains('optimizer')) {
+            $userId = $this->getLoginUserId();
+        }
+
+        return DB::table('tj_promotion_day_charge')
+            ->when($startAt, function ($query, $startAt) {
+                return $query->where('day_at', '>=', $startAt);
+            })->when($endAt, function ($query, $endAt) {
+                return $query->where('day_at', '<=', $endAt);
+            })->when($ranseId, function ($query, $ranseId) {
+                return $query->where('promotion_id', $ranseId);
+            })->when($miniprogramId, function ($query, $miniprogramId) {
+                return $query->where('miniprogram_id', $miniprogramId);
+            })->when($puserId, function ($query, $puserId) {
+                return $query->where('puser_id', $puserId);
+            })->when($userId, function ($query, $userId) {
+                return $query->where('user_id', $userId);
+            })->orderBy('id', 'desc');
+    }
+
+    // 推广链接投入产出每日列表
+    public function list(Request $request)
+    {
+        $sql = $this->_sql($request)->select(
+            'day_at', 'user_id', 'puser_id', 'new_user_num', 'new_user_pay_uv',
+            'cost_money', 'new_user_pay_money', 'new_user_vip_pay_money', 'new_user_common_pay_money',
+            'new_user_vip_pay_uv', 'new_user_common_pay_uv', 'miniprogram_id'
+        );
+        $isExport = $request->integer('is_export', false);
+        if ($isExport) {
+            $result = $sql->get();
+        } else {
+            $result = $sql->paginate($request->input('limit', 20));
+        }
+        if ($result->count()) {
+            $users = DB::table('users')
+                ->whereIn('id', $result->pluck('user_id'))
+                ->select('id', 'username')
+                ->get()->keyBy('id');
+            $miniprograms = DB::table('miniprogram')
+                ->whereIn('id', $result->pluck('miniprogram_id'))
+                ->select('id', 'name')
+                ->get()->keyBy('id');
+            $companyUserName = DB::table('users')
+                ->where('id', $result->first()->puser_id)->value('username');
+            foreach ($result as $item) {
+                // 商户
+                $item->company_username = $companyUserName;
+                // 优化师
+                $item->optimizer_name = $users->get($item->user_id)->username ?? '';
+                // 小程序
+                $item->miniprogram_name = $miniprograms->get($item->miniprogram_id)->name ?? '';
+                // 回本
+                $item->huiben = $item->cost_money !== '0.00' ? intval($item->new_user_pay_money * 10000 / $item->cost_money) / 100 . '%' : '0%';
+                // 新增用户成本
+                $item->new_user_cost_money = $item->new_user_num ? intval($item->cost_money * 100 / $item->new_user_num) / 100 : 0;
+                // 新增用户人均充值
+                $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;
+                // 会员成本,累计
+                $item->vip_money_per = $item->new_user_vip_pay_uv ? intval($item->cost_money * 100 / $item->new_user_vip_pay_uv) / 100 : 0;
+                // 充值成本,累计
+                $item->common_money_per = $item->new_user_common_pay_uv ? intval($item->cost_money * 100 / $item->new_user_common_pay_uv) / 100 : 0;
+                // 会员转化率
+                $item->zhuanhua_vip = $item->new_user_num ? intval($item->new_user_vip_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
+                // 充值转化率
+                $item->zhuanhua_common = $item->new_user_num ? intval($item->new_user_common_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
+                // 总计转化率
+                $item->zhuanhua_all = $item->new_user_num ? intval($item->new_user_pay_uv * 10000 / $item->new_user_num) / 100 . '%' : '0%';
+            }
+
+        }
+
+        return $result;
+    }
+
+    // 推广链接投入产出每日列表综合
+    public function listTotal(Request $request)
+    {
+        $sql = $this->_sql($request)->select('new_user_pay_money', 'cost_money');
+        $result = $sql->select(
+            DB::raw("sum(new_user_pay_money) as pay_money"),
+            DB::raw("sum(cost_money) as cost_money"),
+        )->first();
+        if ($result) {
+            return [
+                'pay_money' => $result->pay_money,
+                'cost_money' => $result->cost_money,
+            ];
+        } else {
+            return [];
+        }
+    }
+}

+ 35 - 0
tests/Statistic/Http/Controllers/ROITJControllerTest.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace Tests\Statistic\Http\Controllers;
+
+use PHPUnit\Framework\TestCase;
+use Tests\UsedTestCase;
+
+class ROITJControllerTest extends UsedTestCase
+{
+
+    public function testList()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('get','http://localhost/api/statistic/roi/list', [
+//            'user_id' => 10,
+            'limit' => 3,
+//            'start_at' => '2023-06-03',
+//            'end_at' => '2023-06-04',
+        ]);
+        $this->dumpJson($res);
+    }
+    public function testlistTotal()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('get','http://localhost/api/statistic/roi/listTotal', [
+//            'user_id' => 10,
+            'limit' => 3,
+//            'start_at' => '2023-06-03',
+//            'end_at' => '2023-06-04',
+        ]);
+        $this->dumpJson($res);
+    }
+}