<?php

namespace App\Jobs;

use App\Command\Log;
use App\Models\OrderDivideRecord;
use App\Models\OrderInfo;
use App\Models\PaymentRecord;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Exception;

class AutoOrderDivide implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $um_id; //推广人员ID
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($um_id, $delay)
    {
        $this->um_id = $um_id;
        // 设置延迟的时间,delay() 方法的参数代表多少秒之后执行
        $this->delay($delay);
    }

    /**
     * * 定义这个任务类具体的执行逻辑
     * 当队列处理器从队列中取出任务时,会调用 handle() 方法
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $payment_confirm = new \NwVVVS\AdapaySdk\PaymentConfirm(); //支付确认
        $spObj = User::find($this->um_id);
        $member_id = $spObj->member_id;
        $chunkSize = 10; // 每次处理数量
        $orders = OrderDivideRecord::where(['um_id' => $this->um_id, 'is_div' => 0])->whereIn('sh_type', [1, 2])->orderBy('id')->take($chunkSize);
        while ($orders->count() > 0) {
            $orders->chunk($chunkSize, function ($batch) use ($member_id, $payment_confirm) {
                foreach ($batch as $item) {
                    //交易记录
                    $order_sn = OrderInfo::where('id', $item->order_id)->value('order_sn');
                    $prObj = PaymentRecord::where('order_sn', $order_sn)->first();
                    # 支付确认参数设置
                    $payment_params = array(
                        "payment_id" => $prObj->payment_id,
                        "order_no" => 'payconfirm_' . date("YmdHis") . rand(100000, 999999),
                        "confirm_amt" => $item->divide_price,
                        "description" => "",
                        "div_members" => "" //分账参数列表 默认是数组List
                    );
                    // 分账列表
                    $payment_params['div_members'] = [
                        'member_id' => $member_id,
                        'amount' => $item->divide_price,
                        'fee_flag' => 'N'
                    ];
                    # 发起支付确认创建
                    $payment_confirm->create($payment_params);
                    # 对支付确认创建结果进行处理
                    if ($payment_confirm->isError()) {
                        //失败处理
                        Log::add('用户绑卡,支付确认失败', $payment_confirm->result);
                        $result = $payment_confirm->result;
                        //throw new Exception($result['error_msg']);
                    } else {
                        //成功处理
                        Log::add('支付确认成功', $payment_confirm->result);
                        $result = $payment_confirm->result;
                        if ($result['status'] == 'succeeded') {
                            $item->is_div = 1;
                            $item->payconfirm_no = $result['order_no'];
                            $item->save();
                            Log::add('分账成功', ['order_sn' => $order_sn, 'member_id' => $member_id]);
                        }
                    }
                }
            });

            // 移动游标到下一批
            $orders->skip($chunkSize);
            $orders = $orders->getQuery();
            sleep(2);
        }
    }
}