From b20504a431bfd8d74322ecadc263a66155fe52d2 Mon Sep 17 00:00:00 2001 From: v2board Date: Sat, 20 May 2023 20:50:53 +0800 Subject: [PATCH] update: more api --- .../Controllers/Admin/SystemController.php | 3 +- app/Http/Controllers/User/StatController.php | 233 ++++++++++++++++-- app/Services/StatisticalService.php | 46 +++- update.sh | 11 + update_dev.sh | 11 + 5 files changed, 277 insertions(+), 27 deletions(-) diff --git a/app/Http/Controllers/Admin/SystemController.php b/app/Http/Controllers/Admin/SystemController.php index c5e25c62..cf33b84d 100644 --- a/app/Http/Controllers/Admin/SystemController.php +++ b/app/Http/Controllers/Admin/SystemController.php @@ -22,7 +22,8 @@ class SystemController extends Controller return response([ 'data' => [ 'schedule' => $this->getScheduleStatus(), - 'horizon' => $this->getHorizonStatus() + 'horizon' => $this->getHorizonStatus(), + 'schedule_last_runtime' => Cache::get(CacheKey::get('SCHEDULE_LAST_CHECK_AT', null)) ] ]); } diff --git a/app/Http/Controllers/User/StatController.php b/app/Http/Controllers/User/StatController.php index d0d53452..9b1fbbab 100644 --- a/app/Http/Controllers/User/StatController.php +++ b/app/Http/Controllers/User/StatController.php @@ -1,40 +1,225 @@ setStartAt(strtotime(date('Y-m-d'))); - $statService->setUserStats(); - $stats = StatUser::select([ - 'u', - 'd', - 'record_at', - 'user_id', - 'server_rate' - ]) - ->where('user_id', $request->user['id']) - ->where('record_at', '>=', strtotime(date('Y-m-1'))) + $params = $request->validate([ + 'start_at' => '', + 'end_at' => '' + ]); + + if (isset($params['start_at']) && isset($params['end_at'])) { + $stats = Stat::where('record_at', '>=', $params['start_at']) + ->where('record_at', '<', $params['end_at']) + ->get() + ->makeHidden(['record_at', 'created_at', 'updated_at', 'id', 'record_type']) + ->toArray(); + } else { + $statisticalService = new StatisticalService(); + return [ + 'data' => $statisticalService->generateStatData() + ]; + } + + $stats = array_reduce($stats, function($carry, $item) { + foreach($item as $key => $value) { + if(isset($carry[$key]) && $carry[$key]) { + $carry[$key] += $value; + } else { + $carry[$key] = $value; + } + } + return $carry; + }, []); + + return [ + 'data' => $stats + ]; + } + + public function getStatRecord(Request $request) + { + $request->validate([ + 'type' => 'required|in:paid_total,commission_total,register_count', + 'start_at' => '', + 'end_at' => '' + ]); + + $statisticalService = new StatisticalService(); + $statisticalService->setStartAt($request->input('start_at')); + $statisticalService->setEndAt($request->input('end_at')); + return [ + 'data' => $statisticalService->getStatRecord($request->input('type')) + ]; + } + + public function getRanking(Request $request) + { + $request->validate([ + 'type' => 'required|in:server_traffic_rank,user_consumption_rank', + 'start_at' => '', + 'end_at' => '', + 'limit' => 'nullable|integer' + ]); + + $statisticalService = new StatisticalService(); + $statisticalService->setStartAt($request->input('start_at')); + $statisticalService->setEndAt($request->input('end_at')); + return [ + 'data' => $statisticalService->getRanking($request->input('type'), $request->input('limit') ?? 20) + ]; + } + + public function getOverride(Request $request) + { + return [ + 'data' => [ + 'month_income' => Order::where('created_at', '>=', strtotime(date('Y-m-1'))) + ->where('created_at', '<', time()) + ->whereNotIn('status', [0, 2]) + ->sum('total_amount'), + 'month_register_total' => User::where('created_at', '>=', strtotime(date('Y-m-1'))) + ->where('created_at', '<', time()) + ->count(), + 'ticket_pending_total' => Ticket::where('status', 0) + ->count(), + 'commission_pending_total' => Order::where('commission_status', 0) + ->where('invite_user_id', '!=', NULL) + ->whereNotIn('status', [0, 2]) + ->where('commission_balance', '>', 0) + ->count(), + 'day_income' => Order::where('created_at', '>=', strtotime(date('Y-m-d'))) + ->where('created_at', '<', time()) + ->whereNotIn('status', [0, 2]) + ->sum('total_amount'), + 'last_month_income' => Order::where('created_at', '>=', strtotime('-1 month', strtotime(date('Y-m-1')))) + ->where('created_at', '<', strtotime(date('Y-m-1'))) + ->whereNotIn('status', [0, 2]) + ->sum('total_amount'), + 'commission_month_payout' => CommissionLog::where('created_at', '>=', strtotime(date('Y-m-1'))) + ->where('created_at', '<', time()) + ->sum('get_amount'), + 'commission_last_month_payout' => CommissionLog::where('created_at', '>=', strtotime('-1 month', strtotime(date('Y-m-1')))) + ->where('created_at', '<', strtotime(date('Y-m-1'))) + ->sum('get_amount'), + ] + ]; + } + + public function getOrder(Request $request) + { + $statistics = Stat::where('record_type', 'd') + ->limit(31) ->orderBy('record_at', 'DESC') ->get() ->toArray(); - - $stats = array_merge($stats, $statService->getStatUserByUserID($request->user['id'])); - usort($stats, function ($a, $b) { - return $b['record_at'] - $a['record_at']; - }); - - return response([ - 'data' => $stats - ]); + $result = []; + foreach ($statistics as $statistic) { + $date = date('m-d', $statistic['record_at']); + $result[] = [ + 'type' => '收款金额', + 'date' => $date, + 'value' => $statistic['paid_total'] / 100 + ]; + $result[] = [ + 'type' => '收款笔数', + 'date' => $date, + 'value' => $statistic['paid_count'] + ]; + $result[] = [ + 'type' => '佣金金额(已发放)', + 'date' => $date, + 'value' => $statistic['commission_total'] / 100 + ]; + $result[] = [ + 'type' => '佣金笔数(已发放)', + 'date' => $date, + 'value' => $statistic['commission_count'] + ]; + } + $result = array_reverse($result); + return [ + 'data' => $result + ]; } + + public function getServerLastRank() + { + $servers = [ + 'shadowsocks' => ServerShadowsocks::where('parent_id', null)->get()->toArray(), + 'v2ray' => ServerVmess::where('parent_id', null)->get()->toArray(), + 'trojan' => ServerTrojan::where('parent_id', null)->get()->toArray(), + 'vmess' => ServerVmess::where('parent_id', null)->get()->toArray() + ]; + $startAt = strtotime('-1 day', strtotime(date('Y-m-d'))); + $endAt = strtotime(date('Y-m-d')); + $statistics = StatServer::select([ + 'server_id', + 'server_type', + 'u', + 'd', + DB::raw('(u+d) as total') + ]) + ->where('record_at', '>=', $startAt) + ->where('record_at', '<', $endAt) + ->where('record_type', 'd') + ->limit(10) + ->orderBy('total', 'DESC') + ->get() + ->toArray(); + foreach ($statistics as $k => $v) { + foreach ($servers[$v['server_type']] as $server) { + if ($server['id'] === $v['server_id']) { + $statistics[$k]['server_name'] = $server['name']; + } + } + $statistics[$k]['total'] = $statistics[$k]['total'] / 1073741824; + } + array_multisort(array_column($statistics, 'total'), SORT_DESC, $statistics); + return [ + 'data' => $statistics + ]; + } + + public function getStatUser(Request $request) + { + $request->validate([ + 'user_id' => 'required|integer' + ]); + $current = $request->input('current') ? $request->input('current') : 1; + $pageSize = $request->input('pageSize') >= 10 ? $request->input('pageSize') : 10; + $builder = StatUser::orderBy('record_at', 'DESC')->where('user_id', $request->input('user_id')); + + $total = $builder->count(); + $records = $builder->forPage($current, $pageSize) + ->get(); + return [ + 'data' => $records, + 'total' => $total + ]; + } + } + diff --git a/app/Services/StatisticalService.php b/app/Services/StatisticalService.php index 4a4f0385..26dc5d1c 100644 --- a/app/Services/StatisticalService.php +++ b/app/Services/StatisticalService.php @@ -5,6 +5,7 @@ use App\Models\CommissionLog; use App\Models\Order; use App\Models\Stat; use App\Models\StatServer; +use App\Models\StatUser; use App\Models\User; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; @@ -175,10 +176,10 @@ class StatisticalService { public function getStatRecord($type) { switch ($type) { - case "order_total": { + case "paid_total": { return Stat::select([ '*', - DB::raw('order_total / 100 as order_total') + DB::raw('paid_total / 100 as paid_total') ]) ->where('record_at', '>=', $this->startAt) ->where('record_at', '<', $this->endAt) @@ -203,4 +204,45 @@ class StatisticalService { } } } + + public function getRanking($type, $limit = 20) + { + switch ($type) { + case 'server_traffic_rank': { + return StatServer::select([ + 'server_id', + 'server_type', + DB::raw('sum(u) as u'), + DB::raw('sum(d) as d'), + DB::raw('sum(u) + sum(d) as total') + ]) + ->where('record_at', '>=', $this->startAt) + ->where('record_at', '<', $this->endAt) + ->groupBy('server_id', 'server_type') + ->orderBy('total', 'DESC') + ->limit($limit) + ->get(); + } + case 'user_consumption_rank': { + $stats = StatUser::select([ + 'user_id', + DB::raw('sum(u) as u'), + DB::raw('sum(d) as d'), + DB::raw('sum(u) + sum(d) as total') + ]) + ->where('record_at', '>=', $this->startAt) + ->where('record_at', '<', $this->endAt) + ->groupBy('user_id') + ->orderBy('total', 'DESC') + ->limit($limit) + ->get(); + $users = User::whereIn('id', $stats->pluck('user_id')->toArray())->get()->keyBy('id'); + foreach ($stats as $k => $v) { + if (!isset($users[$v['user_id']])) continue; + $stats[$k]['email'] = $users[$v['user_id']]['email']; + } + return $stats; + } + } + } } diff --git a/update.sh b/update.sh index 7c9d45b8..cbd000aa 100755 --- a/update.sh +++ b/update.sh @@ -1,5 +1,16 @@ #!/bin/bash +if [ ! -d ".git" ]; then + echo "Please deploy using Git." + exit 1 +fi + +if ! command -v git &> /dev/null; then + echo "Git is not installed! Please install git and try again." + exit 1 +fi + +git config --global --add safe.directory $(pwd) git fetch --all && git reset --hard origin/master && git pull origin master rm -rf composer.lock composer.phar wget https://github.com/composer/composer/releases/latest/download/composer.phar -O composer.phar diff --git a/update_dev.sh b/update_dev.sh index 857f2e6b..685c7afa 100755 --- a/update_dev.sh +++ b/update_dev.sh @@ -1,5 +1,16 @@ #!/bin/bash +if [ ! -d ".git" ]; then + echo "Please deploy using Git." + exit 1 +fi + +if ! command -v git &> /dev/null; then + echo "Git is not installed! Please install git and try again." + exit 1 +fi + +git config --global --add safe.directory $(pwd) git fetch --all && git reset --hard origin/dev && git pull origin dev git checkout dev rm -rf composer.lock composer.phar