mirror of
https://github.com/v2board/v2board.git
synced 2024-11-10 09:39:10 +08:00
update: statistical service
This commit is contained in:
parent
6dd509d73e
commit
7be6553396
@ -45,6 +45,7 @@ class SendRemindMail extends Command
|
|||||||
$mailService = new MailService();
|
$mailService = new MailService();
|
||||||
foreach ($users as $user) {
|
foreach ($users as $user) {
|
||||||
if ($user->remind_expire) $mailService->remindExpire($user);
|
if ($user->remind_expire) $mailService->remindExpire($user);
|
||||||
|
if ($user->remind_traffic) $mailService->remindTraffic($user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
|
|
||||||
namespace App\Console\Commands;
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Models\StatUser;
|
||||||
|
use App\Services\StatisticalService;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
use App\Models\StatOrder;
|
use App\Models\StatOrder;
|
||||||
use App\Models\CommissionLog;
|
use App\Models\CommissionLog;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class V2boardStatistics extends Command
|
class V2boardStatistics extends Command
|
||||||
{
|
{
|
||||||
@ -44,6 +47,31 @@ class V2boardStatistics extends Command
|
|||||||
$this->statOrder();
|
$this->statOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function statUser()
|
||||||
|
{
|
||||||
|
$createdAt = time();
|
||||||
|
$recordAt = strtotime('-1 day', strtotime(date('Y-m-d')));
|
||||||
|
$statService = new StatisticalService($recordAt);
|
||||||
|
$stats = $statService->getStatUser();
|
||||||
|
DB::beginTransaction();
|
||||||
|
foreach ($stats as $stat) {
|
||||||
|
if (!StatUser::insert([
|
||||||
|
'user_id' => $stat['user_Id'],
|
||||||
|
'u' => $stat['u'],
|
||||||
|
'd' => $stat['d'],
|
||||||
|
'server_rate' => $stat['server_rate'],
|
||||||
|
'created_at' => $createdAt,
|
||||||
|
'updated_at' => $createdAt,
|
||||||
|
'record_type' => 'd',
|
||||||
|
'record_at' => $recordAt
|
||||||
|
])) {
|
||||||
|
DB::rollback();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DB::commit();
|
||||||
|
}
|
||||||
|
|
||||||
private function statOrder()
|
private function statOrder()
|
||||||
{
|
{
|
||||||
$endAt = strtotime(date('Y-m-d'));
|
$endAt = strtotime(date('Y-m-d'));
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\Server;
|
namespace App\Http\Controllers\Server;
|
||||||
|
|
||||||
use App\Services\ServerService;
|
use App\Services\ServerService;
|
||||||
|
use App\Services\StatisticalService;
|
||||||
use App\Services\UserService;
|
use App\Services\UserService;
|
||||||
use App\Utils\CacheKey;
|
use App\Utils\CacheKey;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
@ -81,12 +82,17 @@ class DeepbworkController extends Controller
|
|||||||
Cache::put(CacheKey::get('SERVER_VMESS_ONLINE_USER', $server->id), count($data), 3600);
|
Cache::put(CacheKey::get('SERVER_VMESS_ONLINE_USER', $server->id), count($data), 3600);
|
||||||
Cache::put(CacheKey::get('SERVER_VMESS_LAST_PUSH_AT', $server->id), time(), 3600);
|
Cache::put(CacheKey::get('SERVER_VMESS_LAST_PUSH_AT', $server->id), time(), 3600);
|
||||||
$userService = new UserService();
|
$userService = new UserService();
|
||||||
|
$statData = [];
|
||||||
foreach ($data as $item) {
|
foreach ($data as $item) {
|
||||||
$u = $item['u'];
|
$u = $item['u'];
|
||||||
$d = $item['d'];
|
$d = $item['d'];
|
||||||
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'vmess');
|
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'vmess');
|
||||||
|
$statData[$item['user_id']] = [$u, $d];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$statService = new StatisticalService();
|
||||||
|
$statService->statUser($server['rate'], $statData);
|
||||||
|
|
||||||
return response([
|
return response([
|
||||||
'ret' => 1,
|
'ret' => 1,
|
||||||
'msg' => 'ok'
|
'msg' => 'ok'
|
||||||
|
@ -4,6 +4,7 @@ namespace App\Http\Controllers\Server;
|
|||||||
|
|
||||||
use App\Models\ServerShadowsocks;
|
use App\Models\ServerShadowsocks;
|
||||||
use App\Services\ServerService;
|
use App\Services\ServerService;
|
||||||
|
use App\Services\StatisticalService;
|
||||||
use App\Services\UserService;
|
use App\Services\UserService;
|
||||||
use App\Utils\CacheKey;
|
use App\Utils\CacheKey;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
@ -73,12 +74,17 @@ class ShadowsocksTidalabController extends Controller
|
|||||||
Cache::put(CacheKey::get('SERVER_SHADOWSOCKS_ONLINE_USER', $server->id), count($data), 3600);
|
Cache::put(CacheKey::get('SERVER_SHADOWSOCKS_ONLINE_USER', $server->id), count($data), 3600);
|
||||||
Cache::put(CacheKey::get('SERVER_SHADOWSOCKS_LAST_PUSH_AT', $server->id), time(), 3600);
|
Cache::put(CacheKey::get('SERVER_SHADOWSOCKS_LAST_PUSH_AT', $server->id), time(), 3600);
|
||||||
$userService = new UserService();
|
$userService = new UserService();
|
||||||
|
$statData = [];
|
||||||
foreach ($data as $item) {
|
foreach ($data as $item) {
|
||||||
$u = $item['u'];
|
$u = $item['u'];
|
||||||
$d = $item['d'];
|
$d = $item['d'];
|
||||||
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'shadowsocks');
|
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'shadowsocks');
|
||||||
|
$statData[$item['user_id']] = [$u, $d];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$statService = new StatisticalService();
|
||||||
|
$statService->statUser($server['rate'], $statData);
|
||||||
|
|
||||||
return response([
|
return response([
|
||||||
'ret' => 1,
|
'ret' => 1,
|
||||||
'msg' => 'ok'
|
'msg' => 'ok'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\Server;
|
namespace App\Http\Controllers\Server;
|
||||||
|
|
||||||
use App\Services\ServerService;
|
use App\Services\ServerService;
|
||||||
|
use App\Services\StatisticalService;
|
||||||
use App\Services\UserService;
|
use App\Services\UserService;
|
||||||
use App\Utils\CacheKey;
|
use App\Utils\CacheKey;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
@ -78,12 +79,17 @@ class TrojanTidalabController extends Controller
|
|||||||
Cache::put(CacheKey::get('SERVER_TROJAN_ONLINE_USER', $server->id), count($data), 3600);
|
Cache::put(CacheKey::get('SERVER_TROJAN_ONLINE_USER', $server->id), count($data), 3600);
|
||||||
Cache::put(CacheKey::get('SERVER_TROJAN_LAST_PUSH_AT', $server->id), time(), 3600);
|
Cache::put(CacheKey::get('SERVER_TROJAN_LAST_PUSH_AT', $server->id), time(), 3600);
|
||||||
$userService = new UserService();
|
$userService = new UserService();
|
||||||
|
$statData = [];
|
||||||
foreach ($data as $item) {
|
foreach ($data as $item) {
|
||||||
$u = $item['u'];
|
$u = $item['u'];
|
||||||
$d = $item['d'];
|
$d = $item['d'];
|
||||||
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'trojan');
|
$userService->trafficFetch($u, $d, $item['user_id'], $server->toArray(), 'trojan');
|
||||||
|
$statData[$item['user_id']] = [$u, $d];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$statService = new StatisticalService();
|
||||||
|
$statService->statUser($server['rate'], $statData);
|
||||||
|
|
||||||
return response([
|
return response([
|
||||||
'ret' => 1,
|
'ret' => 1,
|
||||||
'msg' => 'ok'
|
'msg' => 'ok'
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Controllers\Server;
|
namespace App\Http\Controllers\Server;
|
||||||
|
|
||||||
use App\Services\ServerService;
|
use App\Services\ServerService;
|
||||||
|
use App\Services\StatisticalService;
|
||||||
use App\Services\UserService;
|
use App\Services\UserService;
|
||||||
use App\Utils\CacheKey;
|
use App\Utils\CacheKey;
|
||||||
use App\Utils\Helper;
|
use App\Utils\Helper;
|
||||||
@ -69,6 +70,9 @@ class UniProxyController extends Controller
|
|||||||
$userService->trafficFetch($u, $d, $k, $this->nodeInfo->toArray(), $this->nodeType);
|
$userService->trafficFetch($u, $d, $k, $this->nodeInfo->toArray(), $this->nodeType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$statService = new StatisticalService();
|
||||||
|
$statService->statUser($this->nodeInfo->rate, $data);
|
||||||
|
|
||||||
return response([
|
return response([
|
||||||
'data' => true
|
'data' => true
|
||||||
]);
|
]);
|
||||||
|
@ -50,8 +50,8 @@ class TrafficFetchJob implements ShouldQueue
|
|||||||
$user->t = time();
|
$user->t = time();
|
||||||
$user->u = $user->u + ($this->u * $this->server['rate']);
|
$user->u = $user->u + ($this->u * $this->server['rate']);
|
||||||
$user->d = $user->d + ($this->d * $this->server['rate']);
|
$user->d = $user->d + ($this->d * $this->server['rate']);
|
||||||
if (!$user->save()) throw new \Exception('流量更新失败');
|
if (!$user->save()) {
|
||||||
$mailService = new MailService();
|
info("流量更新失败\n未记录用户ID:{$this->userId}\n未记录上行:{$user->u}\n未记录下行:{$user->d}");
|
||||||
$mailService->remindTraffic($user);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,11 @@ class OrderService
|
|||||||
$order->paid_at = time();
|
$order->paid_at = time();
|
||||||
$order->callback_no = $callbackNo;
|
$order->callback_no = $callbackNo;
|
||||||
if (!$order->save()) return false;
|
if (!$order->save()) return false;
|
||||||
OrderHandleJob::dispatch($order->trade_no);
|
try {
|
||||||
|
OrderHandleJob::dispatchNow($order->trade_no);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
53
app/Services/StatisticalService.php
Normal file
53
app/Services/StatisticalService.php
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Services;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
class StatisticalService {
|
||||||
|
protected $userStats;
|
||||||
|
protected $recordAt;
|
||||||
|
|
||||||
|
public function __construct($recordAt = '')
|
||||||
|
{
|
||||||
|
ini_set('memory_limit', -1);
|
||||||
|
$this->recordAt = $recordAt ?? strtotime(date('Y-m-d'));
|
||||||
|
$this->userStats = Cache::get("stat_user_{$this->recordAt}");
|
||||||
|
$this->userStats = json_decode($this->userStats, true) ?? [];
|
||||||
|
if (!is_array($this->userStats)) {
|
||||||
|
$this->userStats = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function statUser($rate, $data)
|
||||||
|
{
|
||||||
|
foreach (array_keys($data) as $key) {
|
||||||
|
$this->userStats[$rate] = $this->userStats[$rate] ?? [];
|
||||||
|
if (isset($this->userStats[$rate][$key])) {
|
||||||
|
$this->userStats[$rate][$key][0] += $data[$key][0];
|
||||||
|
$this->userStats[$rate][$key][1] += $data[$key][1];
|
||||||
|
} else {
|
||||||
|
$this->userStats[$rate][$key] = $data[$key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Cache::set("stat_user_{$this->recordAt}", json_encode($this->userStats));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getStatUser()
|
||||||
|
{
|
||||||
|
$stats = [];
|
||||||
|
foreach ($this->userStats as $k => $v) {
|
||||||
|
foreach (array_keys($v) as $userId) {
|
||||||
|
if (isset($v[$userId])) {
|
||||||
|
$stats[] = [
|
||||||
|
'server_rate' => $k,
|
||||||
|
'u' => $v[$userId][0],
|
||||||
|
'd' => $v[$userId][1],
|
||||||
|
'user_id' => $userId
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $stats;
|
||||||
|
}
|
||||||
|
}
|
@ -172,6 +172,5 @@ class UserService
|
|||||||
{
|
{
|
||||||
TrafficFetchJob::dispatch($u, $d, $userId, $server, $protocol);
|
TrafficFetchJob::dispatch($u, $d, $userId, $server, $protocol);
|
||||||
StatServerJob::dispatch($u, $d, $server, $protocol, 'd');
|
StatServerJob::dispatch($u, $d, $server, $protocol, 'd');
|
||||||
StatUserJob::dispatch($u, $d, $userId, $server, $protocol, 'd');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user