mirror of
				https://github.com/v2board/v2board.git
				synced 2025-11-04 11:21:46 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Console\Commands;
 | 
						|
 | 
						|
use App\Models\CommissionLog;
 | 
						|
use Illuminate\Console\Command;
 | 
						|
use App\Models\Order;
 | 
						|
use App\Models\User;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
 | 
						|
class CheckCommission extends Command
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * The name and signature of the console command.
 | 
						|
     *
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $signature = 'check:commission';
 | 
						|
 | 
						|
    /**
 | 
						|
     * The console command description.
 | 
						|
     *
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $description = '返佣服务';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create a new command instance.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        parent::__construct();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Execute the console command.
 | 
						|
     *
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    public function handle()
 | 
						|
    {
 | 
						|
        $this->autoCheck();
 | 
						|
        $this->autoPayCommission();
 | 
						|
    }
 | 
						|
 | 
						|
    public function autoCheck()
 | 
						|
    {
 | 
						|
        if ((int)config('v2board.commission_auto_check_enable', 1)) {
 | 
						|
            Order::where('commission_status', 0)
 | 
						|
                ->where('invite_user_id', '!=', NULL)
 | 
						|
                ->whereNotIn('status', [0, 2])
 | 
						|
                ->where('updated_at', '<=', strtotime('-3 day', time()))
 | 
						|
                ->update([
 | 
						|
                    'commission_status' => 1
 | 
						|
                ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function autoPayCommission()
 | 
						|
    {
 | 
						|
        $orders = Order::where('commission_status', 1)
 | 
						|
            ->where('invite_user_id', '!=', NULL)
 | 
						|
            ->get();
 | 
						|
        foreach ($orders as $order) {
 | 
						|
            DB::beginTransaction();
 | 
						|
            if (!$this->payHandle($order->invite_user_id, $order)) {
 | 
						|
                DB::rollBack();
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            $order->commission_status = 2;
 | 
						|
            if (!$order->save()) {
 | 
						|
                DB::rollBack();
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            DB::commit();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function payHandle($inviteUserId, Order $order)
 | 
						|
    {
 | 
						|
        if ((int)config('v2board.commission_distribution_enable', 0)) {
 | 
						|
            $level = 3;
 | 
						|
            $commissionShareLevels = [
 | 
						|
                0 => (int)config('v2board.commission_distribution_l1'),
 | 
						|
                1 => (int)config('v2board.commission_distribution_l2'),
 | 
						|
                2 => (int)config('v2board.commission_distribution_l3')
 | 
						|
            ];
 | 
						|
        } else {
 | 
						|
            $level = 3;
 | 
						|
            $commissionShareLevels = [
 | 
						|
                0 => 100
 | 
						|
            ];
 | 
						|
        }
 | 
						|
        for ($l = 0; $l < $level; $l++) {
 | 
						|
            $inviter = User::find($inviteUserId);
 | 
						|
            if (!$inviter) continue;
 | 
						|
            if (!isset($commissionShareLevels[$l])) continue;
 | 
						|
            $commissionBalance = $order->commission_balance * ($commissionShareLevels[$l] / 100);
 | 
						|
            if ((int)config('v2board.withdraw_close_enable', 0)) {
 | 
						|
                $inviter->balance = $inviter->balance + $commissionBalance;
 | 
						|
            } else {
 | 
						|
                $inviter->commission_balance = $inviter->commission_balance + $commissionBalance;
 | 
						|
            }
 | 
						|
            if (!$inviter->save()) {
 | 
						|
                DB::rollBack();
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            if (!CommissionLog::create([
 | 
						|
                'invite_user_id' => $inviteUserId,
 | 
						|
                'user_id' => $order->user_id,
 | 
						|
                'trade_no' => $order->trade_no,
 | 
						|
                'order_amount' => $order->total_amount,
 | 
						|
                'get_amount' => $commissionBalance
 | 
						|
            ])) {
 | 
						|
                DB::rollBack();
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            $inviteUserId = $inviter->invite_user_id;
 | 
						|
            // update order actual commission balance
 | 
						|
            $order->actual_commission_balance = $order->actual_commission_balance + $commissionBalance;
 | 
						|
        }
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
}
 |