<?php

namespace app\admin\controller;

use app\admin\service\AdminBaseService;
use app\admin\service\setting\IPOService;
use app\model\BrokerageSettingModel;
use app\model\ContractListMode;
use app\model\ContractTradeModel;
use app\model\DigitalListModel;
use app\model\DigitalTradeModel;
use app\model\DrawalSettingModel;
use app\model\FeeSettingModel;
use app\model\ForexListModel;
use app\model\PreIdnStockModel;
use app\model\PreInStockModel;
use app\model\PreMysStockModel;
use app\model\PreSgdStockModel;
use app\model\PreThaStockModel;
use app\model\PreUsStockModel;
use app\model\RechargeApplyModel;
use app\model\StockBrlListModel;
use app\model\StockEurListModel;
use app\model\StockFurListModel;
use app\model\StockGBXListModel;
use app\model\StockHkdListModel;
use app\model\StockIdnListModel;
use app\model\StockIdnTradeModel;
use app\model\StockInListModel;
use app\model\StockInTradeModel;
use app\model\StockJpListModel;
use app\model\StockListModel;
use app\model\StockMarketModel;
use app\model\StockMysListModel;
use app\model\StockMysTradeModel;
use app\model\StockOptionInrListModel;
use app\model\StockSgdListModel;
use app\model\StockThaListModel;
use app\model\StockThaTradeModel;
use app\model\StockTradeModel;
use app\model\UserIdnPreStockOrderModel;
use app\model\UserInPreStockOrderModel;
use app\model\UserModel;
use app\model\UserMysPreStockOrderModel;
use app\model\UserSgdPreStockOrderModel;
use app\model\UserStockIdnLogModel;
use app\model\UserStockIdnModel;
use app\model\UserStockInLogModel;
use app\model\UserStockInModel;
use app\model\UserStockLogModel;
use app\model\UserStockModel;
use app\model\UserStockMysLogModel;
use app\model\UserStockMysModel;
use app\model\UserStockSgdLogModel;
use app\model\UserStockSgdModel;
use app\model\UserStockThaLogModel;
use app\model\UserStockThaModel;
use app\model\UserThaPreStockOrderModel;
use app\model\UserUsPreStockOrderModel;
use app\model\UserVerifyLogModel;
use app\model\UserWithdrawalModel;
use app\utility\ClientGo;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Queue;
use PhpOffice\PhpSpreadsheet\IOFactory;

class Index extends AdminBaseController
{

    public function index()
    {
        try {
            $prefix = env('DATABASE.prefix');
            $ContractTradeTableName = $prefix . (new ContractTradeModel())->getName();
            $digitalTradeTableName = $prefix . (new DigitalTradeModel())->getName();
            $rechargeApplyTableName = $prefix . (new RechargeApplyModel())->getName();
            $stockTradeTableName = $prefix . (new StockTradeModel())->getName();
            $stockMysTradeTableName = $prefix . (new StockMysTradeModel())->getName();
            $stockThaTradeTableName = $prefix . (new StockThaTradeModel())->getName();
            $stockIdnTradeTableName = $prefix . (new StockIdnTradeModel())->getName();
            $stockInTradeTableName = $prefix . (new StockInTradeModel())->getName();

            $userTableName = $prefix . (new UserModel())->getName();
            $userWithdrawTableName = $prefix . (new UserWithdrawalModel())->getName();


            // 总注册人数(用户的总数)
            $totalRegisterNum = Db::table($userTableName)->count();

            // 总充值用户(充值用户的个数 以用户id分组)
            $totalRechargeNum = Db::table($rechargeApplyTableName)->where('status', 1)->group('user_id')->count();

            // 总交易用户(合约 股票 现货 交易的用户去重  订单状态为持仓 和 完成 订单)
            $contractTradeUserId = Db::table($ContractTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $stockTradeUserId = Db::table($stockTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $stockMysTradeUserId = Db::table($stockMysTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $stockThaTradeUserId = Db::table($stockThaTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $stockIdnTradeUserId = Db::table($stockIdnTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $stockInTradeUserId = Db::table($stockInTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');
            $digitalTradeUserId = Db::table($digitalTradeTableName)->where('status', 'in', [1, 3])->distinct(true)->column('user_id');

            $totalArrayMerge = array_unique(array_merge($contractTradeUserId, $stockTradeUserId, $digitalTradeUserId, $stockMysTradeUserId, $stockIdnTradeUserId, $stockThaTradeUserId, $stockInTradeUserId));
            $totalTradeNum = count($totalArrayMerge);

            // 总提现用户(以用户id 分组查询数量)
            $totalWithdrawalNum = Db::table($userWithdrawTableName)->group('user_id')->count();

            // 总充值金额 充值完成
            $totalRechargeAmount = Db::table($rechargeApplyTableName)->where('status', 1)->sum('recharge_num');

            // 总提款金额 提款完成
            $totalWithdrawAmount = Db::table($userWithdrawTableName)->where('status', 2)->sum('apply_num');


            // 今日注册用户
            $today = date('Y-m-d'); // 今天凌晨
            $tomorrow = date('Y-m-d', strtotime('tomorrow')); // 明天凌晨
            $todayRegisterNum = Db::table($userTableName)->whereTime('create_time', 'between', [$today, $tomorrow])->count();

            // 今日充值用户  完成状态
            $todayRechargeNum = Db::table($userTableName)->where('status', 1)
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->group('user_id')->count();

            // 今日交易用户
            // 合约
            $todayContractTradeUserId = Db::table($ContractTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            //股票
            $todayStockTradeUserId = Db::table($stockTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            $todayStockMysTradeUserId = Db::table($stockMysTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            $todayStockThaTradeUserId = Db::table($stockThaTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            $todayStockIndTradeUserId = Db::table($stockIdnTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            $todayStockInTradeUserId = Db::table($stockInTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');
            // 现货
            $todayDigitalTradeUserId = Db::table($digitalTradeTableName)->where('status', 'in', [1, 3])
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->distinct(true)->column('user_id');

            // 计算总数
            $todayArrayMerge = array_unique(array_merge($todayStockInTradeUserId, $todayContractTradeUserId, $todayStockTradeUserId, $todayDigitalTradeUserId, $todayStockMysTradeUserId, $todayStockThaTradeUserId, $todayStockIndTradeUserId));
            $todayTradeNum = count($todayArrayMerge);

            // 今日提款用户
            $todayWithdrawNum = Db::table($userWithdrawTableName)
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->group('user_id')->count();

            // 今日充值金额 完成状态
            $todayRechargeAmount = Db::table($rechargeApplyTableName)
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->where('status', 1)->sum('recharge_num');

            // 今日提款金额 完成状态
            $todayWithdrawAmount = Db::table($userWithdrawTableName)
                ->whereTime('create_time', 'between', [$today, $tomorrow])
                ->where('status', 2)->sum('apply_num');

            //等待处理订单
            $no_deal_recharge=Db::table($rechargeApplyTableName)->where('status', 0)->count();
            $no_deal_withdraw=Db::table($userWithdrawTableName)->where('status', 0)->count();
            $no_deal_real=Db::table($userTableName)->where('real_status', 2)->count();
            $no_deal_level=Db::table($userTableName)->where('lever_status', 2)->count();


            $data = [
                'totalRegisterNum' => $totalRegisterNum, // 总注册人数
                'totalRechargeNum' => $totalRechargeNum,// 总充值用户
                'totalTradeNum' => $totalTradeNum,// 总交易用户
                'totalWithdrawalNum' => $totalWithdrawalNum,// 总提现用户
                'totalRechargeAmount' => $totalRechargeAmount,// 总充值金额
                'totalWithdrawAmount' => $totalWithdrawAmount, // 总提款金额

                'todayRegisterNum' => $todayRegisterNum, // 今日注册用户
                'todayRechargeNum' => $todayRechargeNum, // 今日充值用户
                'todayTradeNum' => $todayTradeNum, // 今日交易用户
                'todayWithdrawNum' => $todayWithdrawNum, // 今日提款用户
                'todayRechargeAmount' => $todayRechargeAmount, // 今日充值金额
                'todayWithdrawAmount' => $todayWithdrawAmount, // 今日提款金额

                'no_deal_recharge' => $no_deal_recharge, // 等待处理充值订单数量
                'no_deal_withdraw' => $no_deal_withdraw, // 等待处理提现订单数量
                'no_deal_real' => $no_deal_real, // 等待审核实名数量
                'no_deal_level' => $no_deal_level, // 等待审核开通杠杆数量
            ];

            return json(['code' => '0', 'message' => 'SUCCESS', 'data' => $data]);
        } catch (\Exception $exception) {
            return json(['code' => '1', 'message' => '系统繁忙']);
        }
    }
    public function getReamNum()
    {
       $adminId= $this->getAdminId();
       $Withdraw_Read_Time= Cache::store('redis')->get('Withdraw_Read_Time'.$adminId);
       $Recharge_Read_Time= Cache::store('redis')->get('Recharge_Read_Time'.$adminId);
       $User_Read_Time= Cache::store('redis')->get('User_Read_Time'.$adminId);

       $withdraw_count=UserWithdrawalModel::where('create_time','>=',date('Y-m-d H:i:s',$Withdraw_Read_Time))->count();
       $recharge_count=RechargeApplyModel::where('create_time','>=',date('Y-m-d H:i:s',$Recharge_Read_Time))->count();
       $real_count=UserVerifyLogModel::where('create_time','>=',date('Y-m-d H:i:s',$User_Read_Time))->count();
        return json(['code' => '0', 'message' => 'SUCCESS', 'data' => [
            'withdraw_count'=>$withdraw_count,
            'recharge_count'=>$recharge_count,
            'real_count'=>$real_count,
        ]]);
    }

    // 缓存美股数据
    public function cacheUsStock()
    {
        try {
            $list = StockListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $list_key = "US:STOCK:LIST:" . $stock->stock_code;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 缓存印尼
    public function cacheIdnStock()
    {
        try {
            $list = StockIdnListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "IDN:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "IDN:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 缓存马来西亚股票
    public function cacheMysStock()
    {
        try {
            $list = StockMysListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "MYS:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "MYS:STOCK:LIST:" . $stock->stock_code;
                    $redis->del($old_key);
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'numeric_code' => $stock->numeric_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 缓存泰股
    public function cacheThaStock()
    {
        try {
            $list = StockThaListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "THA:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "THA:STOCK:LIST:" . $stock->stock_code;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 印度股票
    public function cacheInStock()
    {
        try {
            $list = StockInListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "IN:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "IN:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 新加坡股票
    public function cacheSgdStock()
    {
        try {
            $list = StockSgdListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "SGD:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "SGD:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 香港股票
    public function cacheHkStock()
    {
        try {
            $list = StockHkdListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "HKD:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "HKD:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 英国股票
    public function cacheGbxStock()
    {
        try {
            $list = StockGBXListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "UK:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "UK:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    public function cacheFurStock()
    {
        try {
            $list = StockFurListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "FUR:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "FUR:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    public function cacheEurStock()
    {
        try {
            $list = StockEurListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "EUR:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "EUR:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    //巴西股票
    public function cacheBrlStock()
    {
        try {
            $list = StockBrlListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "BR:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "BR:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }
    public function cacheJpStock()
    {
        try {
            $list = StockJpListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $old_code = $stock->stock_code;
                    if (strpos($stock->stock_code, ':') !== false) {
                        $code_arr = explode(":", $stock->stock_code);
                        $old_code = $code_arr[1] ?? $code_arr[0];
                    }
                    $old_key = "JP:STOCK:LIST:" . $old_code;
                    $redis->del($old_key);

                    $list_key = "JP:STOCK:LIST:" . $stock->stock_code;
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => 4,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 印度期权
    public function cacheInOption()
    {
        try {
            $list = StockOptionInrListModel::where('id', '>', '0')->select();
            if (!$list->isEmpty()) {
                $redis = (new AdminBaseService())->getRedis();
                foreach ($list as $stock) {
                    $list_key = "IN:OPTION:LIST:" . $stock->stock_code;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'rate' => $stock->rate,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }
            return json(['msg' => 'SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 缓存股票 大类(数据量较大 有时出现超时)
    public function cacheStock()
    {
        try {
            $redis = (new AdminBaseService())->getRedis();
            // 缓存美股
            $stockList = StockListModel::where('id', '>', '0')->select();
            if (!$stockList->isEmpty()) {
                foreach ($stockList as $stock) {
                    $list_key = "US:STOCK:LIST:" . $stock->stock_code;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stock->id,
                        'stock_name' => $stock->stock_name,
                        'stock_code' => $stock->stock_code,
                        'status' => $stock->status,
                        'keep_decimal' => $stock->keep_decimal,
                        'forced_closure' => $stock->forced_closure,
                        'up_limit' => $stock->up_limit,
                        'down_limit' => $stock->down_limit,
                        'info' => $stock->info,
                        'tape' => $stock->tape,
                    ]);
                }
            }

            var_dump("美股完成");
            // 缓存 印尼股
            $stockIdnList = StockIdnListModel::where('id', '>', '0')->select();
            if (!$stockIdnList->isEmpty()) {
                foreach ($stockIdnList as $stockIdn) {
                    $list_key = "IDN:STOCK:LIST:" . $stockIdn->stock_code;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stockIdn->id,
                        'stock_name' => $stockIdn->stock_name,
                        'stock_code' => $stockIdn->stock_code,
                        'status' => $stockIdn->status,
                        'keep_decimal' => $stockIdn->keep_decimal,
                        'forced_closure' => $stockIdn->forced_closure,
                        'up_limit' => $stockIdn->up_limit,
                        'down_limit' => $stockIdn->down_limit,
                        'info' => $stockIdn->info,
                        'tape' => $stockIdn->tape,
                    ]);
                }
            }

            var_dump("印尼股完成");
            return json(['msg' => ' 美股 印尼股票 缓存完成 SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }

    // 缓存现货 合约 返佣配置 等非股票配置
    public function cacheRedis()
    {
        try {
            $redis = (new AdminBaseService())->getRedis();


            var_dump("开始");
            // 缓存现货
            $digitalList = DigitalListModel::where('id', '>', '0')->select();
            if (!$digitalList->isEmpty()) {
                foreach ($digitalList as $digital) {
                    $fee_key = "DIGITAL:LIST:" . strtoupper($digital->trade_name);
                    $redis->del($fee_key);
                    $redis->hMSet($fee_key, [
                        'name' => strtoupper($digital->trade_name),
                        'sort' => $digital->sort,
                        'logo_link' => $digital->logo_link,
                        'keep_decimal' => $digital->keep_decimal,
                        'status' => $digital->status,
                        'exchange_name' => $digital->exchange_name,
                    ]);
                    var_dump($redis->hGetAll($fee_key));
                }
            }


            var_dump("现货完成");
            // 缓存合约
            $contractList = ContractListMode::where('id', '>', '0')->select();
            if (!$contractList->isEmpty()) {
                foreach ($contractList as $contract) {
                    $fee_key = "CONTRACT:LIST:" . strtoupper($contract->trade_name);
                    $redis->del($fee_key);
                    $redis->hMSet($fee_key, [
                        'name' => strtoupper($contract->trade_name),
                        'code' => strtoupper($contract->trade_name),
                        'sort' => $contract->sort,
                        'face_value' => $contract->face_value,
                        'min_pry' => $contract->min_pry,
                        'max_pry' => $contract->max_pry,
                        'compel_num' => $contract->compel_num,
                        'keep_decimal' => $contract->keep_decimal,
                        'status' => $contract->status,
                        'is_owner' => $contract->is_owner,
                    ]);
                    var_dump($redis->hGetAll($fee_key));
                }
            }


            var_dump("合约完成");

            // 返佣配置
            $brokerageSettingList = BrokerageSettingModel::where('id', '>', '0')->select();
            if (!$brokerageSettingList->isEmpty()) {
                foreach ($brokerageSettingList as $brokerSetting) {
                    $fee_key = (new AdminBaseService())->getBrokerageKey($brokerSetting->brok_type);
                    $redis->del($fee_key);
                    $redis->hMset($fee_key, [
                        'id' => $brokerSetting->id,
                        'brok_type' => $brokerSetting->brok_type,
                        'parent_fee' => $brokerSetting->parent_fee,
                        'grandpa_fee' => $brokerSetting->grandpa_fee,
                        'top_fee' => $brokerSetting->top_fee,
                        'pay_type' => $brokerSetting->pay_type,
                        'remark' => $brokerSetting->remark,
                    ]);
                }
            }


            var_dump("返佣配置完成");
            // 提现手续费配置  只有一条
            $drawalSettingList = DrawalSettingModel::where('id', '>', '0')->select();
            if (!$drawalSettingList->isEmpty()) {
                $fee_key = "DRAWAL:FEE:SETTING";
                $redis->del($fee_key);
                foreach ($drawalSettingList as $drawalSetting) {
                    $redis->hMset($fee_key, [
                        'id' => $brokerSetting->id,
                        'bank_drawal_fee' => $drawalSetting->bank_drawal_fee,
                        'digital_drawal_fee' => $drawalSetting->digital_drawal_fee,
                        'bank_recharge_fee' => $drawalSetting->bank_recharge_fee,
                        'digital_recharge_fee' => $drawalSetting->digital_recharge_fee,
                        'min_recharge' => $drawalSetting->min_recharge,
                        'min_drawal' => $drawalSetting->min_drawal,
                    ]);
                }
            }


            var_dump("提现手续费完成");
            // 交易手续费
            $feeSettingList = FeeSettingModel::where('id', '>', '0')->select();
            if (!$feeSettingList->isEmpty()) {
                foreach ($feeSettingList as $feeSetting) {
                    $fee_key = (new AdminBaseService())->getTradeFeeKey($feeSetting->market_type);
                    $redis->del($fee_key);
                    $redis->hMset($fee_key, [
                        'id' => $feeSetting->id,
                        'market_type' => $feeSetting->market_type,
                        'buy_fee' => $feeSetting->buy_fee,
                        'sale_fee' => $feeSetting->sale_fee,
                        'pay_type' => $feeSetting->pay_type,
                        'min_buy_num' => $feeSetting->min_buy_num,
                        'min_sale_num' => $feeSetting->min_sale_num,
                        'max_entrust_num' => $feeSetting->max_entrust_num,
                        'max_hold_num' => $feeSetting->max_hold_num,
                    ]);
                }
            }
            var_dump("交易手续费完成");
            // 合约插针缓存
            (new AdminBaseService())->initContractHqData();
            (new AdminBaseService())->initForexHqData();
            (new AdminBaseService())->initContractSetting();

            var_dump("合约插针完成");
            // 股票市场
            $stockMarketList = StockMarketModel::where('id', '>', '0')->select();
            if (!$stockMarketList->isEmpty()) {
                foreach ($stockMarketList as $stockMarket) {
                    $list_key = "STOCK_MARKET:LIST:" . $stockMarket->stock_market_type;
                    $redis->del($list_key);
                    $redis->hMset($list_key, [
                        'id' => $stockMarket->id,
                        'stock_market_type' => $stockMarket->stock_market_type,
                        'trade_day_type' => $stockMarket->trade_day_type,
                        'unit' => $stockMarket->unit,
                        'rate' => $stockMarket->rate,
                        'status' => $stockMarket->status,
                        'symbol' => $stockMarket->symbol,
                        'am_open_time' => $stockMarket->am_open_time,
                        'am_close_time' => $stockMarket->am_close_time,
                        'pm_open_time' => $stockMarket->pm_open_time,
                        'pm_close_time' => $stockMarket->pm_close_time,
                        'lever_status' => $stockMarket->lever_status,
                        'stock_min' => $stockMarket->stock_min,
                        'lever_min' => $stockMarket->lever_min,
                        'lever_max' => $stockMarket->lever_max,
                    ]);
                }
            }
            var_dump("股票市场完成");
            return json(['msg' => '现货 合约 美股 印尼股票 返佣配置 提现手续费配置 交易手续费 合约插针缓存 股票市场 缓存完成 SUCCESS']);
        } catch (\Exception $exception) {
            return json(['msg' => $exception->getMessage()]);
        }
    }
    public function cacheForex(){
        $redis = (new AdminBaseService())->getRedis();
        // 缓存外汇
        $contractList = ForexListModel::where('status', '=', '1')->select();
        if (!$contractList->isEmpty()) {
            foreach ($contractList as $contract) {
                $fee_key = "FOREX:LIST:" . strtoupper($contract->trade_name);
                $redis->del($fee_key);
                $redis->hMSet($fee_key, [
                    'name' => strtoupper($contract->trade_name),
                    'code' => strtoupper($contract->trade_name),
                    'sort' => $contract->sort,
                    'face_value' => $contract->face_value,
                    'min_pry' => $contract->min_pry,
                    'max_pry' => $contract->max_pry,
                    'compel_num' => $contract->compel_num,
                    'keep_decimal' => $contract->keep_decimal,
                    'status' => $contract->status,
                    'is_owner' => $contract->is_owner,
                ]);
                var_dump($redis->hGetAll($fee_key));
            }
        }
        return json(['msg' => '外汇 缓存完成 SUCCESS']);
    }

    /*
     * 执行IPO中签
     * */
    public function signStock()
    {
        $market_list = [3, 4, 5, 6, 7, 9, 12, 14, 15, 16,17,18];
        foreach ($market_list as $market_type) {
            (new IPOService())->signStockIPO($market_type);
        }
    }

    public function autoAddStock()
    {
        $service = new IPOService();
        $result = $service->autoAddStock($this->request->param());
        return json($result);
    }

    public function dealStock()
    {
        $market_type = $this->request->param('market_type');
        $file_arr = [
            4 => '/www/bourse/idn.xlsx',
            5 => '/www/bourse/mys.xlsx',
            6 => '/www/bourse/tha.xlsx',
            7 => '/www/bourse/in.xlsx',
            9 => '/www/bourse/sgd.xlsx',
            12 => '/www/bourse/hk.xlsx',
        ];
        if (in_array($market_type, [4, 5, 6, 7, 9, 12])) {
            $service = new IPOService();
            $redis = $service->getRedis();
            $table_obj = $service->getStockModel($market_type);
            $tap_list = $service->getStockTape($market_type);

            $tape_arr = array_flip($tap_list['tape']);

            // 你的Excel文件路径
            $filePath = $file_arr[$market_type];
            $reader = IOFactory::createReader('Xlsx');
            $reader->setReadDataOnly(true);
            $spreadsheet = $reader->load($filePath);
            $worksheet = $spreadsheet->getActiveSheet();
            $highestRow = $worksheet->getHighestRow();
            $result = [];
            for ($row = 1; $row <= $highestRow; $row++) {
                $arr['stock_code'] = $worksheet->getCellByColumnAndRow(1, $row)->getValue();
                $arr['name'] = $worksheet->getCellByColumnAndRow(2, $row)->getValue();
                $arr['country'] = $worksheet->getCellByColumnAndRow(3, $row)->getValue();
                $arr['tape'] = $worksheet->getCellByColumnAndRow(4, $row)->getValue();
                $arr['old_code'] = $worksheet->getCellByColumnAndRow(5, $row)->getValue();

                Db::startTrans();
                // 判断股票交易所
                $tape = '0';
                if (isset($arr['tape']) && in_array($arr['tape'], array_keys($tape_arr))) {
                    $tape = $tape_arr[$arr['tape']];
                }
                $new_key = $table_obj['redis_key'] . $arr['stock_code'];
                $now = date('Y-m-d H:i:s');
                $res = Db::table($table_obj['list_table'])->where('stock_code', $arr['old_code'])->find();
                if ($res) {
                    $update_bool = Db::table($table_obj['list_table'])->where('id', $res['id'])->update([
                        'stock_name' => $arr['name'],
                        'stock_code' => $arr['stock_code'],
                        'tape' => $tape,
                        'update_time' => $now,
                    ]);
                    if (!$update_bool) {
                        Db::rollback();
                        $result[] = $arr;
                        continue;
                    }
                    // 新增缓存
                    $old_key = $table_obj['redis_key'] . $arr['old_code'];
                    $redis->del($old_key);
                    $redis->hMset($new_key, [
                        'stock_name' => !empty($arr['name']) ? $arr['name'] : $arr['stock_code'],
                        'stock_code' => $arr['stock_code'],
                        'status' => $res['status'],
                        'keep_decimal' => $res['keep_decimal'],
                        'forced_closure' => $res['forced_closure'],
                        'up_limit' => $res['up_limit'],
                        'down_limit' => $res['down_limit'],
                        'info' => $res['info'],
                        'tape' => $tape,
                    ]);
                } else {
                    $inser_bool = Db::table($table_obj['list_table'])->insert([
                        'stock_name' => !empty($arr['name']) ? $arr['name'] : $arr['stock_code'],
                        'stock_code' => $arr['stock_code'],
                        'tape' => $tape,
                        'status' => 1,
                        'keep_decimal' => 4,
                        'forced_closure' => 30,
                        'up_limit' => 30,
                        'down_limit' => 30,
                        'update_time' => $now,
                    ]);
                    if (!$inser_bool) {
                        Db::rollback();
                        $result[] = $arr;
                        continue;
                    }
                    $redis->hMset($new_key, [
                        'stock_name' => $arr['name'],
                        'stock_code' => $arr['stock_code'],
                        'status' => 1,
                        'keep_decimal' => 4,
                        'forced_closure' => 30,
                        'up_limit' => 30,
                        'down_limit' => 30,
                        'info' => '',
                        'tape' => $tape,
                    ]);
                }

                // 提交事务
                Db::commit();


            }
            return json($result);
        }
    }

    public function updateSource()
    {
        try {
            //国家
            $param = file_get_contents("php://input");
            if (empty($param)) return json(['code' => 1, 'msg' => 'error 0']);
            $paramArr = json_decode($param, true);
            if ($paramArr['token'] != "pv6j1AzMjdFvXtMymoHjk8mEsq7PEHyVExBLcwcnhCa8Qgouotj4lQ2lTtFav5eU") json(['code' => 1, 'msg' => 'error0']);
            $locale = $paramArr['locale'];
            if ($locale != 'India') return json(['code' => 1, 'msg' => 'error1']);
            $source = $paramArr['source'];
            if (!in_array($source, [1, 2])) return json(['code' => 1, 'msg' => 'error2']);

            $stockCode = $paramArr['stock_code'];
            $tableObj = (new IPOService())->getStockModel(7);
            $res = Db::table($tableObj['list_table'])->where('stock_code', $stockCode)->find();
            if (empty($res)) return json(["error3"]);
            Db::table($tableObj['list_table'])->where('id', $res['id'])->update(['source' => $source]);

            $bool = (new ClientGo())->updateIndiaSource($locale, $stockCode, $source);
            if (!$bool) {
                return json(['code' => 1, 'msg' => 'error4']);
            }
            return json(['code' => 0, 'msg' => 'success']);
        } catch (\Exception $exception) {

            trace("updateSource error " . $exception->getMessage(), 'error');
            return json([$exception->getMessage()]);
        }
    }

}