mirror of
				https://github.com/v2board/v2board.git
				synced 2025-11-01 01:41:47 +08:00 
			
		
		
		
	update: statistical service
This commit is contained in:
		| @@ -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'); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user