<?php

namespace app\common\logic;

use app\api\logic\order\OrderLogic;
use app\common\enum\OrderEnum;
use app\common\enum\PayEnum;
use app\common\enum\user\UserShipEnum;
use app\common\enum\YesNoEnum;
use app\common\logic\user_product_storage\UserProductStorageLogic;
use app\common\model\Config;
use app\common\model\dict\DictType;
use app\common\model\finance\CapitalFlow;
use app\common\model\finance\PayNotifyLog;
use app\common\model\pay\PayNotify;
use app\common\model\store_branch_product\StoreBranchProduct;
use app\common\model\store_cash_finance_flow\StoreCashFinanceFlow;
use app\common\model\store_finance_flow\StoreFinanceFlow;
use app\common\model\store_order\StoreOrder;
use app\common\model\store_order_cart_info\StoreOrderCartInfo;
use app\common\model\store_product_log\StoreProductLog;
use app\common\model\system_store\SystemStore;
use app\common\model\user\User;
use app\common\model\user\UserAddress;
use app\common\model\user\UserRecharge;
use app\common\model\user\UserShip;
use app\common\model\user_sign\UserSign;
use app\common\model\vip_flow\VipFlow;
use app\common\service\Curl;
use app\common\service\PushService;
use support\Log;
use think\facade\Db;
use Webman\RedisQueue\Redis;

/**
 * 支付成功后处理订单状态
 * Class PayNotifyLogic
 * @package app\api\logic
 */
class PayNotifyLogic extends BaseLogic
{

    public static function handle($action, $orderSn, $extra = [], $type = 'wechat')
    {
        Db::startTrans();
        try {
            self::$action($orderSn, $extra, $type);
            Db::commit();
            return true;
        } catch (\Exception $e) {
            Db::rollback();
            Log::error('支付回调处理失败' . $e->getMessage() . ',lien:' . $e->getLine() . ',file:' . $e->getFile());
            throw new \Exception($e->getMessage());
        }
    }

    /**
     * 余额支付
     * @param $orderSn
     * @param $extra
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function balancePay($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();
        $user = User::where('id', $order['uid'])->find();
        if ($user['now_money'] < $order['pay_price']) {
            throw new \Exception('余额不足');
        }
        $order->money = $order['pay_price'];
        $order->paid = 1;
        $order->pay_time = time();
        if (!$order->save()) {
            throw new \Exception('订单保存出错');
        }
        if($order['is_storage']==1){
            $order->status=2;
            UserProductStorageLogic::add($order);
        }
        // 减去余额
        $user->now_money = bcsub($user['now_money'], $order['pay_price'], 2);
        $user->save();

        if ($order['spread_uid'] > 0  && $user['user_ship'] ==  1) {
            $oldUser = User::where('id', $order['spread_uid'])->value('purchase_funds');
            if ($oldUser < $order['pay_price']) {
                $order['pay_price'] = $oldUser;
            }
        }
        // self::addUserSing($order);
        $capitalFlowDao = new CapitalFlowLogic($user);
        $capitalFlowDao->userExpense('user_order_balance_pay', 'order', $order['id'], $order['pay_price'], '', 0, $order['store_id']);
        self::dealProductLog($order);
//        if ($order['shipping_type'] == 3) {
//            self::descStock($order['id']);
//        }
        self::afterPay($order);
        if ($extra && $extra['store_id']) {
            $params = [
                'verify_code' => $order['verify_code'],
                'store_id' => $extra['store_id'],
                'staff_id' => $extra['staff_id']
            ];
            OrderLogic::writeOff($params);
        }
        // Redis::send('push-platform-print', ['id' => $order['id']], 60);
        // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']);
    }

    /**
     * 礼品券支付
     * @param $orderSn
     * @param $extra
     * @return void
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */

    public static function gift_pay($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();
        $user = User::where('id', $order['uid'])->find();
        if ($user['integral'] < $order['pay_price']) {
            throw new \Exception('礼品券不足');
        }
        $order->money = $order['pay_price'];
        $order->paid = 1;
        $order->pay_time = time();
        if (!$order->save()) {
            throw new \Exception('订单保存出错');
        }
        // 减去礼品券
        $user->integral = bcsub($user['integral'], $order['pay_price'], 2);
        $user->save();
        //入礼品券表扣款记录
        $sing[] = [
            'uid' => $order['uid'],
            'order_id' => $order['order_id'],
            'title' => '订单扣除兑换券',
            'store_id' => $order['store_id'],
            'number' => $order['pay_price'],
            'financial_pm' => 0,
            'user_ship' => $user['user_ship'],
        ];
        (new UserSign())->saveAll($sing);

        if ($extra && $extra['store_id']) {
            $params = [
                'verify_code' => $order['verify_code'],
                'store_id' => $extra['store_id'],
                'staff_id' => $extra['staff_id']
            ];
            OrderLogic::lessWriteOff($params);
        }
        self::dealProductLog($order);
    }


    /**
     * 采购款支付
     * @param $orderSn
     * @param $extra
     * @return void
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function purchase_funds($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();
        $user = User::where('id', $order['uid'])->find();
        if ($user['purchase_funds'] < $order['pay_price']) {
            throw new \Exception('采购款不足');
        }
        $order->money = $order['pay_price'];
        $order->paid = 1;
        $order->pay_time = time();
        if (!$order->save()) {
            throw new \Exception('订单保存出错');
        }
        if($order['is_storage']==1){
            $order->status=2;
            UserProductStorageLogic::add($order);
        }
        // 减去采购款
        $user->purchase_funds = bcsub($user['purchase_funds'], $order['pay_price'], 2);
        $user->save();

        $capitalFlowDao = new CapitalFlowLogic($user);
        $capitalFlowDao->userExpense('user_order_purchase_pay', 'order', $order['id'], $order['pay_price'], '', 1, $order['store_id']);
        //        if ($user['user_ship'] ==  1) {
        //            self::dealVipAmount($order, PayEnum::PURCHASE_FUNDS);
        //        }
        // self::addUserSing($order);
        self::afterPay($order);
        if ($extra && $extra['store_id']) {
            $params = [
                'verify_code' => $order['verify_code'],
                'store_id' => $extra['store_id'],
                'staff_id' => $extra['staff_id']
            ];
            OrderLogic::writeOff($params);
        }
        self::dealProductLog($order);
        $count = UserSign::where([
            'uid'=>$order['uid'],
            'type'=>1,
            'status'=>0
        ])->count();
        if($count){
            self::addFlowLog($order);
        }
        //        if($order['shipping_type'] == 3){
        //            self::descStock($order['id']);
        //        }


        // Redis::send('push-platform-print', ['id' => $order['id']], 60);
        // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']);
    }
    
    //采购款支付后如果有对应的冻结的话就去反对应的log
    public static function addFlowLog($order)
    {
        //查询当前用户有无对应的充值的冻结金额
        if($order['uid'] >0){
            $query = UserSign::where([
                'uid'=>$order['uid'],
                'type'=>1,
                'status'=>0
            ]);
            $query1 = clone $query;
            $ids = $query->column('id');
            $check = $query->sum('back_num');
            $count = $query1->count();
            if($check && $check >0){
                $backPurchase = bcsub($order['pay_price'],0.1,2);
                if($count == 1){
                    //存在拆单子否
                    //少了就冻结减去这个对应的金额
                    $one = UserSign::where([
                        'uid'=>$order['uid'],
                        'type'=>1,
                        'status'=>0
                    ])->find();
                    $data = [
                        'uid' => $order['uid'],
                        'order_id' => $order['order_id'],
                        'title' => '充值获得冻结兑换券',
                        'financial_pm' => 1,
                        'type' => 1,
                    ];

                    if($one['back_num'] >= $backPurchase){

                        $data['number'] =$backPurchase;
                        Db::name('user_sign_log')->insert($data);
                        //总的减去采购款百分之十剩余的
                        $wait = bcsub($one['back_num'],$backPurchase,2)??0;

                        if(empty($wait)){
                            UserSign::where('id',$one['id'])->update(
                                [
                                    'back_num'=>0,
                                    'status'=>1
                                ]
                            );
                        }else{
                            //add
                            UserSign::where('id',$one['id'])->update(
                                [
                                    'back_num'=>$wait
                                ]
                            );
                        }

                        //并且加到对应的用户的采购款中
                        User::where('id',$order['uid'])->inc('purchase_funds',$wait)->update();
                    }
                    else{
                        //对比采购款支付的多少  多了就拿冻结金额即可
                        $data['number'] =$one['number'];
                        //都存到对应的log日志
                        Db::name('user_sign_log')->insert($data);
                        UserSign::where('id',$one['id'])->update(
                            [
                                'back_num'=>0,
                                'status'=>1
                            ]
                        );
                        //并且加到对应的用户的采购款中
                        User::where('id',$order['uid'])->inc('purchase_funds',$one['number'])->update();
                    }

                }
                else{
                    //大于0的时候
                    //先处理金额大的再处理剩余的
                    /**** 把所有的金额改为正的再加一条后再加***/
                    UserSign::where([
                        'uid'=>$order['uid'],
                        'type'=>1,
                        'status'=>0
                    ])->update([
                        'status'=>1,
                        'title'=>json_encode($ids)
                    ]);
                    if ($check >= $backPurchase) {
                        //补一条待解冻的
                        $left = bcsub($check,$backPurchase,2);
                        if($left > 0){
                            $data = [
                                'uid' => $order['uid'],
                                'order_id' => $order['order_id'],
                                'title' => '补冻结兑换券',
                                'financial_pm' => 0,
                                'type' => 1,
                            ];
                            $data['number'] =$check;
                            Db::name('user_sign')->insert($data);
                        }
                        User::where('id',$order['uid'])->inc('purchase_funds',$backPurchase)->update();//add

                    }else{
                        //log
                        $data = [
                            'uid' => $order['uid'],
                            'order_id' => $order['order_id'],
                            'title' => '充值获得冻结兑换券',
                            'financial_pm' => 1,
                            'type' => 1,
                        ];
                        $data['number'] =$check;
                        Db::name('user_sign_log')->insert($data);
                        User::where('id',$order['uid'])->inc('purchase_funds',$check)->update();//add
                    }

                }

            }
            return true;

        }

        return true;
    }

    /**
     * @notes 微信通用回调
     * @param $orderSn
     * @param array $extra
     * @date 2023/2/27 15:28
     */
    public static function wechat_common($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();

        if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) {
            return true;
        }
        $order->status = 1;
        $order->paid = 1;
        $order->pay_time = time();
        if($order['is_storage']==1){
            $order->status=2;
            UserProductStorageLogic::add($order);
        }
        if ($order->pay_type != 10) {
            $order->pay_price = bcdiv($extra['amount']['payer_total'], 100, 2);
        } else {
            $extra['transaction_id'] = time();
        }
        $user = User::where('id', $order['uid'])->find();
        if ($order->pay_type == OrderEnum::CASHIER_ORDER_PAY || $order->pay_type == OrderEnum::CASHIER_ORDER_ALI_PAY) { //收银台支付
            $order->status = 2;
        } else {
            $capitalFlowDao = new CapitalFlowLogic($user);
            //微信支付和用户余额无关
            $capitalFlowDao->userExpense('user_order_pay', 'order', $order['id'], $order->pay_price, '', 1, $order['store_id']);
        }
        $order->save();
        self::afterPay($order, $extra['transaction_id']);
        // self::addUserSing($order);
        self::dealProductLog($order);
        if ($order['shipping_type'] == 3) {
            self::descStock($order['id']);
        }
        if (!empty($extra['payer']['openid']) && $order->pay_type == 7) {
            Redis::send('push-delivery', ['order_id' => $order['order_id'], 'openid' => $extra['payer']['openid']], 4);
        }
        return true;
    }

    //退款
    public static function refund($orderSn, $extra = [])
    {
        //更新状态
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();
        if ($order->isEmpty() || $order->status == OrderEnum::REFUND_PAY) {
            //充值
            $orderRe = UserRecharge::where('order_id', $orderSn)->findOrEmpty();
            if ($orderRe->isEmpty() || $orderRe->status == -1) {
                return true;
            }
            $orderRe->status = -1;
            $orderRe->refund_price = $orderRe->price;
            $orderRe->refund_time = time();
            $orderRe->remarks = '';
            $orderRe->save();

            return true;
        }
        $order->status = OrderEnum::REFUND_PAY;
        $order->refund_status = OrderEnum::REFUND_STATUS_FINISH;
        $order->refund_price = bcdiv($extra['amount']['refund'], 100, 2);
        $order->refund_reason_time = time();
        $order->refund_num +=  1;
        $order->save();
        //日志记录
        //加用户余额,采购款,    日志记录  加数量
        $user = User::where('id', $order['uid'])->findOrEmpty();
        $capitalFlowDao = new CapitalFlowLogic($user);
        $deal_money = bcdiv($extra['amount']['refund'], 100, 2);
        $check_user_sing = UserSign::where('order_id',$order['order_id'])->count();
        if (in_array($order['pay_type'], [PayEnum::BALANCE_PAY, PayEnum::PURCHASE_FUNDS])) {
            if ($order['pay_type'] == PayEnum::BALANCE_PAY) { //用户余额
                $user->now_money = bcadd($user->now_money, $deal_money, 2);
                $user->save();
                //增加数量
                self::addStock($order['id']);
                //退款
                $capitalFlowDao->userIncome('system_balance_back', 'system_back', $order['id'], $deal_money);
            }
            if ($order['pay_type'] == PayEnum::PURCHASE_FUNDS) { //采购款
                $user->purchase_funds = bcadd($user->purchase_funds, $deal_money, 2);
                $user->save();
                //增加数量
                self::addStock($order['id']);
                //退款
                $capitalFlowDao->userIncome('system_purchase_back', 'system_back', $order['id'], $deal_money);
            }
            if($check_user_sing){
                self::descUserSing($order);
            }
            return true;
        }
        //积分
        if($check_user_sing){
            self::descUserSing($order);
        }
        //微信日志  user_order_refund
        $capitalFlowDao->userIncome('user_order_refund', 'system_back', $order['id'], $deal_money, '', 1);
        //处理财务流水退还
        self::store_finance_back($orderSn);
        self::addStock($order['id']); //微信
        return true;
        //        self::afterPay($order,$extra['transaction_id']);
    }
    
    //退积分
    public static function descUserSing($order)
    {
        $user_sing = new UserSign();
        if ($order['uid'] > 0 ) {
            $user_number = bcmul($order['refund_price'], '0.10', 2);
            $sing = [
                'uid' => $order['uid'],
                'order_id' => $order['order_id'],
                'title' => '退款扣除兑换券',
                'financial_pm' => 0,
                'store_id' => $order['store_id'],
                'number' => $user_number,
            ];
            $user_sing->save($sing);
            $now_int = User::where('id',$order['uid'])->find();
            if($now_int){
                if($now_int['integral'] > $user_number){
                    User::where('id',$order['uid'])->dec('integral',$user_number)->update();
                }else{
                    User::where('id',$order['uid'])->dec('integral',$now_int['integral'])->update();
                }

            }
        }
        return true;
        
    }



    /**
     * 财务退还金额相关
     * @param $orderSn
     * @return void
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function store_finance_back($orderSn)
    {
        $data = StoreFinanceFlow::where('order_sn', $orderSn)
            ->where(['financial_pm' => 1])
            ->select()->toArray();
        foreach ($data as &$value) {
            unset($value['id']);
            $value['financial_record_sn'] = (new StoreFinanceFlowLogic)->getSn();
            $value['financial_pm'] = 0;
            $value['financial_type'] = OrderEnum::PAY_BACK;
            $value['create_time'] = time();
        }
        (new StoreFinanceFlow)->saveAll($data);
    }

    /**
     * 现金退款相关
     * @param $orderSn
     * @param $extra
     * @return true
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function cash_refund($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();
        if ($order->isEmpty() || $order->status == OrderEnum::REFUND_PAY) {
            return true;
        }
        $order->refund_status = OrderEnum::REFUND_STATUS_FINISH;
        $order->refund_price = $order->pay_price;
        $order->refund_reason_time = time();
        $order->refund_num +=  1;
        $order->save();
        //日志记录
        $model = new StoreCashFinanceFlow();
        $model->store_id = $order['store_id'] ?? 0;
        $model->cash_price = $order->pay_price;
        $model->receivable = $order->pay_price;
        $model->remark = '退款';
        $model->type = 1;
        $model->status = YesNoEnum::YES;
        $model->save();
        //增加数量
        self::addStock($order['id']);
        return true;
    }

    /**
     * 充值现金退款相关
     * @param $orderId
     * @param $extra
     * @return true
     */
    public static function recharge_cash_refund($orderId, $extra = [])
    {
        $order = UserRecharge::where('id', $orderId)->findOrEmpty();
        if ($order->isEmpty() || $order->status == -1) {
            return true;
        }
        $order->status = -1;
        $order->refund_price = $order->price;
        $order->refund_time = time();
        $order->remarks = '';
        $order->save();
        return true;
    }

    //入冻结礼品券
    public static function addUserSing($order)
    {
        $user_sing = new UserSign();
        if ($order['uid'] > 0  && $order['total_price'] >= 500) {
            $user_number = bcmul($order['pay_price'], '0.10', 2);
            $sing = [
                'uid' => $order['uid'],
                'order_id' => $order['order_id'],
                'title' => '购买商品获得兑换券',
                'financial_pm' => 1,
                'store_id' => $order['store_id'],
                'number' => $user_number,
            ];
            $user_sing->save($sing);
        }
        return true;
    }

    public static function dealRechargeFrozen($order)
    {
        $total_vip = bcmul($order['price'],0.1,2);
        $user_sing = new UserSign();
        $sing = [
            'uid' => $order['uid'],
            'order_id' => $order['order_id'],
            'title' => '充值获得冻结兑换券',
            'financial_pm' => 1,
            'store_id' => $order['store_id'],
            'type' => 1,
            'number' => $total_vip,
            'back_num' => $total_vip,
        ];
            $user_sing->save($sing);

        return true;
    }


    /**
     * 充值
     */
    public static function recharge($orderSn, $extra = [], $type = 'wechat')
    {
        $order = UserRecharge::where('order_id', $orderSn)->findOrEmpty();
        if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) {
            return true;
        }
        if ($type == 'wechat') {
            $price =  bcdiv($extra['amount']['payer_total'], 100, 2);
        } else {
            $price = $extra['buyer_pay_amount'];
        }
        $order->price = $price;
        $order->paid = 1;
        $order->pay_time = time();
        $order->save();
        $uid = $order->uid;
        $user = User::where('id', $uid)->findOrEmpty();
        //用户的财务add
        $capitalFlowDao = new CapitalFlowLogic($user);
        $capitalFlowDao->userIncome('user_balance_recharge', 'user_recharge', $order['id'], $price);

        if ($user->isEmpty()) {
            return true;
        }
        bcscale(2);
        //        $user->now_money = bcadd($user->now_money, $price, 2);//v.1
        //更新等级
        $limit_1=UserShip::where('id',1)->value('limit');
        $limit_4=UserShip::where('id',4)->value('limit');
        if ($price >= $limit_1 &&$price<$limit_4) {
            $user->user_ship = 1; //v.1
        }
        if ($price>$limit_4) {
            $user->user_ship = 4;
        }
        $user->purchase_funds = bcadd($user->purchase_funds, $price, 2);
        $user->total_recharge_amount = bcadd($user->total_recharge_amount, $price, 2);
        $user->save();
        if($order['other_uid']>0){
            $uid=$order['other_uid'];
        }
        self::dealRechargeFrozen($order);
        PushService::push('wechat_mmp_' . $uid, $uid, ['type'=>'INDUSTRYMEMBERS','msg'=>'订单支付成功','data'=>['id'=>$order['id'],'paid'=>1]]);
        PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type'=>'INDUSTRYMEMBERS','msg'=>'订单支付成功','data'=>['id'=>$order['id'],'paid'=>1]]);
        if (!empty($extra['payer']['openid'])) {
            Redis::send('push-delivery', ['order_id' => $order['order_id'], 'openid' => $extra['payer']['openid'], 'logistics_type' => 3], 4);
        }
        return true;
    }

    /**
     * 现金支付
     */
    public static function cash_pay($orderSn)
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();

        if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) {
            return true;
        }
        $order->paid = 1;
        $order->pay_time = time();
        $order->status = 2;
        if (!$order->save()) {
            throw new \Exception('订单保存出错');
        }
        self::afterPay($order);
        $cashFlowLogic = new CashFlowLogic();
        $cashFlowLogic->insert($order['store_id'], $order['pay_price']);
        self::dealProductLog($order);
        if ($order['shipping_type'] == 3) {
            self::descStock($order['id']);
        }
        // Redis::send('push-platform-print', ['id' => $order['id']]);
        return true;
    }

    /**
     * @notes 阿里回调
     * @param $orderSn
     * @param array $extra
     * @author 段誉
     * @date 2023/2/27 15:28
     */
    public static function alipay_cashier($orderSn, $extra = [])
    {
        $order = StoreOrder::where('order_id', $orderSn)->findOrEmpty();

        if ($order->isEmpty() || $order->paid == PayEnum::ISPAID) {
            return true;
        }
        if ($order->pay_type != 10) {
            $order->money = $extra['buyer_pay_amount'];
            $order->paid = 1;
            $order->pay_time = time();
            $order->status = 1;
            $order->save();
        } else {
            $extra['transaction_id'] = time();
        }
        if ($order->pay_type == 9) {
            $order->status = 2;
            self::afterPay($order);
        }
        self::dealProductLog($order);
        if ($order['shipping_type'] == 3) {
            self::descStock($order['id']);
        }

        // if ($order->pay_type == 9) {
        // $extra['create_time'] = $order['create_time'];
        // PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'cash_register', 'msg' => '您有一笔订单已支付', 'data' => $extra]);
        // Redis::send('push-platform-print', ['id' => $order['id']]);
        // }
        // else {
        //     PushService::push('store_merchant_' . $order['store_id'], $order['store_id'], ['type' => 'store_merchant', 'msg' => '您有一笔新的订单']);
        // }
        return true;
    }

    /**
     * 支付后逻辑
     * @param $order
     * @return void
     */
    public static function afterPay($order, $transaction_id = 0)
    {
        $financeLogic = new StoreFinanceFlowLogic();
        $user_sing = new UserSign();
        $off_activity = Config::where('name', 'off_activity')->value('value');
        if ($off_activity == 1) {
            //-----活动价结算更改
            $financeLogic->order = $order;
            $financeLogic->user = ['uid' => $order['uid']];
            $financeLogic->in($transaction_id, $order['pay_price'], OrderEnum::USER_ORDER_PAY, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);  //用户订单支付
            $financeLogic->in($transaction_id, $order['pay_price'], OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);
            $financeLogic->out($transaction_id, $order['pay_price'], OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
            $financeLogic->save();
            if ($order['uid'] > 0  && $order['total_price'] > 500 && $order['pay_type'] !=18
            && $order['pay_type'] !=3) {
                $user_number = bcmul($order['pay_price'], '0.10', 2);
                $sing = [
                    'uid' => $order['uid'],
                    'order_id' => $order['order_id'],
                    'title' => '购买商品获得兑换券',
                    'financial_pm' => 1,
                    'store_id' => $order['store_id'],
                    'number' => $user_number,
                ];
                $user_sing->save($sing);
            }
            return false;
        }
        $vipFen = 0;
        if ($order['uid'] > 0) {
            // 结算金额 要支付的钱减去冻结得钱去走后面得逻辑  发得兑换券也要去减去
            //用户下单该用户等级为1得时候才处理冻结金额
            $user = User::where('id', $order['uid'])->find();
            //纯在分销关系的时候要去判断分销出来的用户的采购款的额度 (只有会员按照这个逻辑拆分,其余的还是按照正常的支付金额)
            if ($order['spread_uid'] > 0) {
                $oldUser = User::where('id', $order['spread_uid'])->field('purchase_funds,user_ship')->find();
                if ($oldUser && $oldUser['user_ship'] ==  1) {
                    if ($oldUser['purchase_funds'] < $order['pay_price']) {
                        $vipFen = $oldUser['purchase_funds'];
                    }
                }
            } elseif ($user['user_ship'] ==  1 && $order['pay_type'] != PayEnum::CASH_PAY) {
                $vipFrozenAmount = self::dealFrozenPrice($order['id']);
                //为1的时候要去减活动价
                //                $final_price = bcsub($order['pay_price'],$order['deduction_price'],2);
                //                d($final_price,$vipFrozenAmount);
                $order['pay_price'] = bcsub($order['pay_price'], $vipFrozenAmount, 2);
                self::dealVipAmount($order,  $order['pay_type']);
            }
            if($order['total_price'] >= 500 ){
                $user_number = bcmul($order['pay_price'], '0.10', 2);
                $sing = [
                    'uid' => $order['uid'],
                    'order_id' => $order['order_id'],
                    'title' => '购买商品获得兑换券',
                    'financial_pm' => 1,
                    'store_id' => $order['store_id'],
                    'number' => $user_number,
                    'status' => 0,
                ];
                $user_sing->save($sing);
            }

            // User::where('id', $order['uid'])->inc('integral', $user_number)->update();
        }


        $financeLogic->order = $order;
        $financeLogic->user = ['uid' => $order['uid']];
        // if ($order->pay_type != 9 || $order->pay_type != 10) {
        $financeLogic->in($transaction_id, $order['pay_price'], OrderEnum::USER_ORDER_PAY, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);  //用户订单支付
        $count_frees = 0;

        //平台手续费
        $fees = bcdiv(bcmul($order['pay_price'], '0.02', 2), 1, 2);
        $count_frees = bcadd($count_frees, $fees, 2);
        if ($fees > 0) {
            $financeLogic->in($transaction_id, $fees, OrderEnum::ORDER_HANDLING_FEES, $order['store_id'], 0, 0, $order['pay_type']);  //平台手续费
            $financeLogic->out($transaction_id, $fees, OrderEnum::ORDER_HANDLING_FEES, $order['store_id'], $order['staff_id'], 0, $order['pay_type']); //商户平台手续费支出
        }
        // $frozen = bcsub($order->profit, $fees, 2);
        //缴纳齐全了就加商户没有就加到平台
        $money_limt = SystemStore::where('id', $order['store_id'])->field('paid_deposit,security_deposit')->find();
        $deposit = bcsub($money_limt['security_deposit'], $money_limt['paid_deposit'], 2); //保证金剩余额度
        $store_profit = bcdiv(bcmul($order['pay_price'], '0.05', 2), 1, 2);
        $count_frees = bcadd($count_frees, $store_profit, 2);
        if ($deposit > 0) {
            if ($deposit > $store_profit) {
                if ($store_profit > 0) {
                    // SystemStore::where('id', $order['store_id'])->inc('paid_deposit', $store_profit)->update();
                    $financeLogic->out($transaction_id, $store_profit, OrderEnum::ORDER_MARGIN, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
                    $financeLogic->in($transaction_id, 0, OrderEnum::MERCHANT_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);  //平台手续费
                }
            } else {
                $money = bcsub($store_profit, $deposit, 2);
                if ($deposit > 0) {
                    // SystemStore::where('id', $order['store_id'])->inc('paid_deposit', $deposit)->update();
                    $financeLogic->out($transaction_id, $deposit, OrderEnum::ORDER_MARGIN, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
                }
                if ($money) {
                    // SystemStore::where('id', $order['store_id'])->inc('store_money', $money)->update();
                    $financeLogic->in($transaction_id, $money, OrderEnum::MERCHANT_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);  //平台手续费
                }
            }
        } else {
            if ($store_profit > 0) {
                // SystemStore::where('id', $order['store_id'])->inc('store_money', $store_profit)->update();
                $financeLogic->in($transaction_id, $store_profit, OrderEnum::MERCHANT_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);  //平台手续费
            }
        }
        // if ($order['is_vip'] >= 1) {
        if ($order['spread_uid'] > 0) {
            if ($vipFen) {
                $fees = bcdiv(bcmul($vipFen, '0.08', 2), 1, 2);
            } else {
                $fees = bcdiv(bcmul($order['pay_price'], '0.08', 2), 1, 2);
            }
            $count_frees = bcadd($count_frees, $fees, 2);
        }
        $fees = bcdiv(bcmul($order['pay_price'], '0.01', 2), 1, 2);
        $count_frees = bcadd($count_frees, bcmul($fees, 3, 2), 2);
        $village_uid = 0;
        $brigade_uid = 0;
        //查询用户对应的村长和队长
        if ($order['uid'] > 0) {
            $address = UserAddress::where(['uid' => $order['uid'], 'is_default' => 1])->find();
            if ($address) {
                $arr1 = UserAddress::where(['village' => $address['village'], 'is_default' => 1])->column('uid');
                if ($arr1) {
                    $uid = User::where('id', 'in', $arr1)->where('user_ship', 2)->value('id');
                    if ($uid) {
                        // User::where('id', $uid)->inc('integral', $fees)->update();
                        $village_uid = $uid;
                    }
                }
                $arr2 = UserAddress::where(['village' => $address['village'], 'brigade' => $address['brigade'], 'is_default' => 1])->column('uid');
                if ($arr2) {
                    $uid = User::where('id', 'in', $arr1)->where('user_ship', 3)->value('id');
                    if ($uid) {
                        // User::where('id', $uid)->inc('integral', $fees)->update();
                        $brigade_uid = $uid;
                    }
                }
            }
        }
        if ($fees > 0) {
            //村长获得
            // $sing = [];

            // $sing[] = [
            //     'uid' => $village_uid,
            //     'order_id' => $order['order_id'],
            //     'title' => '村长订单获得兑换券',
            //     'store_id' => $order['store_id'],
            //     'number' => $fees,
            //     'financial_pm' => 1,
            //     'user_ship' => 2,
            // ];
            // $sing[] = [
            //     'uid' => $brigade_uid,
            //     'order_id' => $order['order_id'],
            //     'title' => '队长订单获得兑换券',
            //     'store_id' => $order['store_id'],
            //     'number' => $fees,
            //     'financial_pm' => 1,
            //     'user_ship' => 3,
            // ];
            // $sing[] = [
            //     'uid' => $village_uid,
            //     'order_id' => $order['order_id'],
            //     'title' => '订单扣除兑换券',
            //     'store_id' => $order['store_id'],
            //     'number' => $fees,
            //     'financial_pm' => 0,
            //     'user_ship' => 2,
            // ];
            // $sing[] = [
            //     'uid' => $brigade_uid,
            //     'order_id' => $order['order_id'],
            //     'title' => '订单扣除兑换券',
            //     'store_id' => $order['store_id'],
            //     'number' => $fees,
            //     'financial_pm' => 0,
            //     'user_ship' => 3,
            // ];
            if ($village_uid > 0) {
                // SystemStore::where('id', $village_uid)->inc('store_money', $fees)->update();
                $financeLogic->other_arr['vip_uid'] = $village_uid;
            }
            $financeLogic->in($transaction_id, $fees, OrderEnum::VILLAGE_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);
            $financeLogic->out($transaction_id, $fees, OrderEnum::VILLAGE_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
            //队长获得
            if ($brigade_uid > 0) {
                // SystemStore::where('id', $brigade_uid)->inc('store_money', $fees)->update();
                $financeLogic->other_arr['vip_uid'] = $brigade_uid;
            }
            $financeLogic->in($transaction_id, $fees, OrderEnum::BRIGADE_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);
            $financeLogic->out($transaction_id, $fees, OrderEnum::BRIGADE_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
            // $user_sing->saveAll($sing);
            //其他获得
            $financeLogic->other_arr['vip_uid'] = 0;
            $financeLogic->in($transaction_id, $fees, OrderEnum::OTHER_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);
            $financeLogic->out($transaction_id, $fees, OrderEnum::OTHER_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
        }
        // }
        $fees = bcsub($order['pay_price'], $count_frees, 2);
        //供应链订单获得
        if ($fees > 0) {
            $financeLogic->in($transaction_id, $fees, OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], 0, 0, $order['pay_type']);
            $financeLogic->out($transaction_id, $fees, OrderEnum::SUPPLIER_ORDER_OBTAINS, $order['store_id'], $order['staff_id'], 0, $order['pay_type']);
        }
        // }
        $financeLogic->save();
        // }
    }

    /**
     * 回调日志
     * @param $order
     * @param $extra
     * @return void
     */
    public static function notifyLog($order, $extra)
    {
        $data = [
            'pay_type' => 'wechat',
            'type' => OrderEnum::PAY,
            'amount' => $extra['amount']['payer_total'], //分
            'order_sn' => $order,
            'out_trade_no' => $extra['transaction_id'],
            'attach' => $extra['attach'],
            'create_time' => date('Y-m-d H:i:s', time()),
        ];
        PayNotify::create($data);
    }

    /**
     * 冻结金额
     * @param $oid
     * @return int|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */

    public static function dealFrozenPrice($oid)
    {
        $detail = StoreOrderCartInfo::where('oid', $oid)->select()->toArray();
        $total_vip = 0;
        foreach ($detail as $value) {
            $total_vip += $value['cart_info']['vip_frozen_price'];
        }
        return $total_vip;
    }


    /**
     * 处理用户为vip1时得冻结资金
     * @param $order
     * @param $pay_type
     * @param $transaction_id
     * @return true
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function dealVipAmount($order, $pay_type = 1, $transaction_id = 0)
    {
        $total_vip = self::dealFrozenPrice($order['id']);
        $data = [
            'order_id' => $order['id'],
            'transaction_id' => $transaction_id ?? 0,
            'order_sn' => $order['order_id'],
            'user_id' => $order['uid'],
            'number' => $total_vip,
            'pay_type' => $pay_type ?? 1,
            'status' => 0,
            'store_id' => $order['store_id'],
            'staff_id' => $order['staff_id'],
            'create_time' => time()
        ];
        Db::name('vip_flow')->insert($data);
        return true;
    }

    /**
     * 商品统计逻辑
     * @param $order
     * @return true
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function dealProductLog($order)
    {
        $store_id = $order['store_id'];
        $cart_id = $order['cart_id'];
        $uid = $order['uid'];
        if ($uid && $cart_id && $store_id) {
            $cart_id =  explode(',', $cart_id);
            $productLog = StoreProductLog::where([
                'uid' => $uid
            ])->whereIn('cart_id', $cart_id)
                ->select()->toArray();

            foreach ($productLog as &$value) {
                $value['pay_uid'] = $uid;
                $value['oid'] = $order['id'];
                $cart_info = StoreOrderCartInfo::where([
                    'uid' => $uid, 'old_cart_id' => $value['cart_id'], 'store_id' => $store_id
                ])->find();
                $value['order_num'] = $cart_info['cart_num'] ?? 1;
                $value['pay_num'] = $cart_info['cart_num'] ?? 1;
                $value['pay_price'] = $cart_info['price'] ?? 0;
                $value['cost_price'] = $cart_info['cart_info']['cost'] ?? 0;
                $value['update_time'] = time();
                unset($value['create_time'], $value['delete_time']);
            }

            (new StoreProductLog())->saveAll($productLog);
        }
        return true;
    }


    public static function descSwap($oid)
    {
        $updateData = [];
        $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray();
        foreach ($goods_list as  $v) {
            $StoreBranchProduct = StoreBranchProduct::where(
                [
                    'store_id' => $v['store_id'],
                    'product_id' => $v['product_id'],
                ]
            )->withTrashed()->find();
            $updateData[] = [
                'id' => $StoreBranchProduct['id'],
                'swap' => $StoreBranchProduct['swap'] - $v['cart_num'],
                'sales' => ['inc', $v['cart_num']]
            ];
        }

        (new StoreBranchProduct())->saveAll($updateData);
    }


    /**
     * 扣库存
     * @param $oid
     * @return void
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function descStock($oid)
    {
        $updateData = [];
        $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray();
        foreach ($goods_list as  $v) {
            $StoreBranchProduct = StoreBranchProduct::where(
                [
                    'store_id' => $v['store_id'],
                    'product_id' => $v['product_id'],
                ]
            )->withTrashed()->find();
            if ($StoreBranchProduct) {
                $updateData[] = [
                    'id' => $StoreBranchProduct['id'],
                    'stock' => $StoreBranchProduct['stock'] - $v['cart_num'],
                    'sales' => ['inc', $v['cart_num']]
                ];
            }
        }

        (new StoreBranchProduct())->saveAll($updateData);
    }

    /**
     * 加库存
     * @param $oid
     * @return void
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function addStock($oid)
    {
        $updateData = [];
        $goods_list = StoreOrderCartInfo::where('oid', $oid)->select()->toArray();
        foreach ($goods_list as  $v) {
            $StoreBranchProduct = StoreBranchProduct::where(
                [
                    'store_id' => $v['store_id'],
                    'product_id' => $v['product_id'],
                ]
            )->withTrashed()->find();
            if ($StoreBranchProduct) {
                $updateData[] = [
                    'id' => $StoreBranchProduct['id'],
                    'stock' => $StoreBranchProduct['stock'] + $v['cart_num'],
                    //                    'sales' => ['inc', $v['cart_num']]
                    //                    'sales' => ['inc', $v['cart_num']]
                ];
            }
        }

        (new StoreBranchProduct())->saveAll($updateData);
    }
}