mirror of
				https://github.com/v2board/v2board.git
				synced 2025-11-04 11:21:46 +08:00 
			
		
		
		
	update: stat user
This commit is contained in:
		@@ -44,7 +44,6 @@ class V2boardStatistics extends Command
 | 
			
		||||
    {
 | 
			
		||||
        ini_set('memory_limit', -1);
 | 
			
		||||
        $this->statOrder();
 | 
			
		||||
        $this->statServer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function statOrder()
 | 
			
		||||
@@ -76,26 +75,4 @@ class V2boardStatistics extends Command
 | 
			
		||||
        }
 | 
			
		||||
        StatOrder::create($data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function statServer()
 | 
			
		||||
    {
 | 
			
		||||
        $endAt = strtotime(date('Y-m-d'));
 | 
			
		||||
        $startAt = strtotime('-1 day', $endAt);
 | 
			
		||||
        $statistics = ServerLog::select([
 | 
			
		||||
            'server_id',
 | 
			
		||||
            'method as server_type',
 | 
			
		||||
            DB::raw("sum(u) as u"),
 | 
			
		||||
            DB::raw("sum(d) as d"),
 | 
			
		||||
        ])
 | 
			
		||||
            ->where('log_at', '>=', $startAt)
 | 
			
		||||
            ->where('log_at', '<', $endAt)
 | 
			
		||||
            ->groupBy('server_id', 'method')
 | 
			
		||||
            ->get()
 | 
			
		||||
            ->toArray();
 | 
			
		||||
        foreach ($statistics as $statistic) {
 | 
			
		||||
            $statistic['record_type'] = 'd';
 | 
			
		||||
            $statistic['record_at'] = $startAt;
 | 
			
		||||
            StatServerJob::dispatch($statistic);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,11 @@ use Illuminate\Queue\SerializesModels;
 | 
			
		||||
class StatServerJob implements ShouldQueue
 | 
			
		||||
{
 | 
			
		||||
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 | 
			
		||||
    protected $statistic;
 | 
			
		||||
    protected $u;
 | 
			
		||||
    protected $d;
 | 
			
		||||
    protected $server;
 | 
			
		||||
    protected $protocol;
 | 
			
		||||
    protected $recordType;
 | 
			
		||||
 | 
			
		||||
    public $tries = 3;
 | 
			
		||||
    public $timeout = 60;
 | 
			
		||||
@@ -22,10 +26,14 @@ class StatServerJob implements ShouldQueue
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct(array $statistic)
 | 
			
		||||
    public function __construct($u, $d, $server, $protocol, $recordType = 'd')
 | 
			
		||||
    {
 | 
			
		||||
        $this->onQueue('stat_server');
 | 
			
		||||
        $this->statistic = $statistic;
 | 
			
		||||
        $this->onQueue('stat');
 | 
			
		||||
        $this->u = $u;
 | 
			
		||||
        $this->d = $d;
 | 
			
		||||
        $this->server = $server;
 | 
			
		||||
        $this->protocol = $protocol;
 | 
			
		||||
        $this->recordType = $recordType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -35,18 +43,32 @@ class StatServerJob implements ShouldQueue
 | 
			
		||||
     */
 | 
			
		||||
    public function handle()
 | 
			
		||||
    {
 | 
			
		||||
        $statistic = $this->statistic;
 | 
			
		||||
        $data = StatServer::where('record_at', $statistic['record_at'])
 | 
			
		||||
            ->where('server_id', $statistic['server_id'])
 | 
			
		||||
        $recordAt = strtotime(date('Y-m-d'));
 | 
			
		||||
        if ($this->recordType === 'm') {
 | 
			
		||||
            //
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $data = StatServer::where('record_at', $recordAt)
 | 
			
		||||
            ->where('server_id', $this->server->id)
 | 
			
		||||
            ->first();
 | 
			
		||||
        if ($data) {
 | 
			
		||||
            try {
 | 
			
		||||
                $data->update($statistic);
 | 
			
		||||
                $data->update([
 | 
			
		||||
                    'u' => $data['u'] + $this->u,
 | 
			
		||||
                    'd' => $data['d'] + $this->d
 | 
			
		||||
                ]);
 | 
			
		||||
            } catch (\Exception $e) {
 | 
			
		||||
                abort(500, '节点统计数据更新失败');
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (!StatServer::create($statistic)) {
 | 
			
		||||
            if (!StatServer::create([
 | 
			
		||||
                'server_id' => $this->server->id,
 | 
			
		||||
                'server_type' => $this->protocol,
 | 
			
		||||
                'u' => $this->u,
 | 
			
		||||
                'd' => $this->d,
 | 
			
		||||
                'record_type' => $this->recordType,
 | 
			
		||||
                'record_at' => $recordAt
 | 
			
		||||
            ])) {
 | 
			
		||||
                abort(500, '节点统计数据创建失败');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										82
									
								
								app/Jobs/StatUserJob.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								app/Jobs/StatUserJob.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Jobs;
 | 
			
		||||
 | 
			
		||||
use App\Models\StatServer;
 | 
			
		||||
use App\Models\StatUser;
 | 
			
		||||
use Illuminate\Bus\Queueable;
 | 
			
		||||
use Illuminate\Contracts\Queue\ShouldQueue;
 | 
			
		||||
use Illuminate\Foundation\Bus\Dispatchable;
 | 
			
		||||
use Illuminate\Queue\InteractsWithQueue;
 | 
			
		||||
use Illuminate\Queue\SerializesModels;
 | 
			
		||||
 | 
			
		||||
class StatUserJob implements ShouldQueue
 | 
			
		||||
{
 | 
			
		||||
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 | 
			
		||||
    protected $u;
 | 
			
		||||
    protected $d;
 | 
			
		||||
    protected $userId;
 | 
			
		||||
    protected $server;
 | 
			
		||||
    protected $protocol;
 | 
			
		||||
    protected $recordType;
 | 
			
		||||
 | 
			
		||||
    public $tries = 3;
 | 
			
		||||
    public $timeout = 60;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a new job instance.
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function __construct($u, $d, $userId, $server, $protocol, $recordType = 'd')
 | 
			
		||||
    {
 | 
			
		||||
        $this->onQueue('stat');
 | 
			
		||||
        $this->u = $u;
 | 
			
		||||
        $this->d = $d;
 | 
			
		||||
        $this->userId = $userId;
 | 
			
		||||
        $this->server = $server;
 | 
			
		||||
        $this->protocol = $protocol;
 | 
			
		||||
        $this->recordType = $recordType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Execute the job.
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    public function handle()
 | 
			
		||||
    {
 | 
			
		||||
        $recordAt = strtotime(date('Y-m-d'));
 | 
			
		||||
        if ($this->recordType === 'm') {
 | 
			
		||||
            //
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $data = StatUser::where('record_at', $recordAt)
 | 
			
		||||
            ->where('server_id', $this->server->id)
 | 
			
		||||
            ->where('user_id', $this->userId)
 | 
			
		||||
            ->first();
 | 
			
		||||
        if ($data) {
 | 
			
		||||
            try {
 | 
			
		||||
                $data->update([
 | 
			
		||||
                    'u' => $data['u'] + $this->u,
 | 
			
		||||
                    'd' => $data['d'] + $this->d
 | 
			
		||||
                ]);
 | 
			
		||||
            } catch (\Exception $e) {
 | 
			
		||||
                abort(500, '用户统计数据更新失败');
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (!StatUser::create([
 | 
			
		||||
                'user_id' => $this->userId,
 | 
			
		||||
                'server_id' => $this->server->id,
 | 
			
		||||
                'server_type' => $this->protocol,
 | 
			
		||||
                'server_rate' => $this->server->rate,
 | 
			
		||||
                'u' => $this->u,
 | 
			
		||||
                'd' => $this->d,
 | 
			
		||||
                'record_type' => $this->recordType,
 | 
			
		||||
                'record_at' => $recordAt
 | 
			
		||||
            ])) {
 | 
			
		||||
                abort(500, '用户统计数据创建失败');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								app/Models/StatUser.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Models/StatUser.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace App\Models;
 | 
			
		||||
 | 
			
		||||
use Illuminate\Database\Eloquent\Model;
 | 
			
		||||
 | 
			
		||||
class StatUser extends Model
 | 
			
		||||
{
 | 
			
		||||
    protected $table = 'v2_stat_user';
 | 
			
		||||
    protected $dateFormat = 'U';
 | 
			
		||||
    protected $guarded = ['id'];
 | 
			
		||||
    protected $casts = [
 | 
			
		||||
        'created_at' => 'timestamp',
 | 
			
		||||
        'updated_at' => 'timestamp'
 | 
			
		||||
    ];
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
namespace App\Services;
 | 
			
		||||
 | 
			
		||||
use App\Jobs\ServerLogJob;
 | 
			
		||||
use App\Jobs\StatServerJob;
 | 
			
		||||
use App\Jobs\StatUserJob;
 | 
			
		||||
use App\Jobs\TrafficFetchJob;
 | 
			
		||||
use App\Models\InviteCode;
 | 
			
		||||
use App\Models\Order;
 | 
			
		||||
@@ -86,5 +88,7 @@ class UserService
 | 
			
		||||
    {
 | 
			
		||||
        TrafficFetchJob::dispatch($u, $d, $userId, $server, $protocol);
 | 
			
		||||
        ServerLogJob::dispatch($u, $d, $userId, $server, $protocol);
 | 
			
		||||
        StatServerJob::dispatch($u, $d, $server, $protocol, 'd');
 | 
			
		||||
        StatUserJob::dispatch($u, $d, $userId, $server, $protocol, 'd');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -173,13 +173,13 @@ return [
 | 
			
		||||
            'V2board' => [
 | 
			
		||||
                'connection' => 'redis',
 | 
			
		||||
                'queue' => [
 | 
			
		||||
                    'order_handle',
 | 
			
		||||
                    'traffic_fetch',
 | 
			
		||||
                    'stat',
 | 
			
		||||
                    'server_log',
 | 
			
		||||
                    'send_email',
 | 
			
		||||
                    'send_email_mass',
 | 
			
		||||
                    'send_telegram',
 | 
			
		||||
                    'stat_server',
 | 
			
		||||
                    'order_handle',
 | 
			
		||||
                ],
 | 
			
		||||
                'balance' => 'auto',
 | 
			
		||||
                'minProcesses' => 1,
 | 
			
		||||
 
 | 
			
		||||
@@ -308,6 +308,23 @@ CREATE TABLE `v2_stat_server` (
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点数据统计';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DROP TABLE IF EXISTS `v2_stat_user`;
 | 
			
		||||
CREATE TABLE `v2_stat_user` (
 | 
			
		||||
                                `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
                                `user_id` int(11) NOT NULL,
 | 
			
		||||
                                `server_id` int(11) NOT NULL,
 | 
			
		||||
                                `server_type` char(11) NOT NULL,
 | 
			
		||||
                                `server_rate` decimal(10,2) NOT NULL,
 | 
			
		||||
                                `u` bigint(20) NOT NULL,
 | 
			
		||||
                                `d` bigint(20) NOT NULL,
 | 
			
		||||
                                `record_type` char(2) NOT NULL,
 | 
			
		||||
                                `record_at` int(11) NOT NULL,
 | 
			
		||||
                                `created_at` int(11) NOT NULL,
 | 
			
		||||
                                `updated_at` int(11) NOT NULL,
 | 
			
		||||
                                PRIMARY KEY (`id`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DROP TABLE IF EXISTS `v2_ticket`;
 | 
			
		||||
CREATE TABLE `v2_ticket` (
 | 
			
		||||
                             `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
@@ -372,4 +389,4 @@ CREATE TABLE `v2_user` (
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 2022-02-16 19:16:57
 | 
			
		||||
-- 2022-02-19 16:59:30
 | 
			
		||||
 
 | 
			
		||||
@@ -489,3 +489,18 @@ ALTER TABLE `v2_order`
 | 
			
		||||
 | 
			
		||||
ALTER TABLE `v2_server_v2ray`
 | 
			
		||||
    CHANGE `port` `port` char(11) NOT NULL AFTER `host`;
 | 
			
		||||
 | 
			
		||||
CREATE TABLE `v2_stat_user` (
 | 
			
		||||
                                `id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
                                `user_id` int(11) NOT NULL,
 | 
			
		||||
                                `server_id` int(11) NOT NULL,
 | 
			
		||||
                                `server_type` char(11) NOT NULL,
 | 
			
		||||
                                `server_rate` decimal(10,2) NOT NULL,
 | 
			
		||||
                                `u` bigint(20) NOT NULL,
 | 
			
		||||
                                `d` bigint(20) NOT NULL,
 | 
			
		||||
                                `record_type` char(2) NOT NULL,
 | 
			
		||||
                                `record_at` int(11) NOT NULL,
 | 
			
		||||
                                `created_at` int(11) NOT NULL,
 | 
			
		||||
                                `updated_at` int(11) NOT NULL,
 | 
			
		||||
                                PRIMARY KEY (`id`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user