time = date('Y-m-d H:i:s',time()); $this->MC = new Moneycopy(); $this->M = new Money(); $this->accountManager = new AccountManager(); } /** * 单式串式分类 * @param [array] $res 投注数据 * @return [array] $data * */ public function Classify(array $res){ if(empty($res)){ Render('', '7003',lang('Errors','Api')->get('error-7003')); } // $res = [ // [ // "type" => 1, // 'index' => 0, // 'bet_amount'=> 2000 // ], // [ // "type" => 1, // 'index' => 1, // 'bet_amount'=> 2000 // ], // [ // "type" => 1, // 'index' => 2, // 'bet_amount'=> 2000 // ], // [ // [ // 'id'=>656437, // 'home_team' => "阿尔艾利开罗", // 'guest_team' => '金字塔', // 'name' => '阿尔艾利开罗', // 'odds' => 0.31, // 'p_code' => 'concede_size', // 'ballId' => 'zq', // 'match_id' => 3132384, // 'condition' => '+0/0.5', // 'odds_code' => 'concede_size', // 'bettingTime' => '', // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', // 'type' => 1 // ], // [ // 'id'=>656437, // 'home_team' => "阿尔艾利开罗", // 'guest_team' => '金字塔', // 'name' => '阿尔艾利开罗', // 'odds' => 0.31, // 'p_code' => 'concede_size', // 'ballId' => 'zq', // 'match_id' => 3132384, // 'condition' => '+0/0.5', // 'ganame' => 'concede_size', // 'bettingTime' => '', // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', // 'type' => 1 // ], // [ // 'id'=>656437, // 'home_team' => "阿尔艾利开罗", // 'guest_team' => '金字塔', // 'name' => '阿尔艾利开罗', // 'odds' => 0.31, // 'p_code' => 'concede_size', // 'ballId' => 'zq', // 'match_id' => 3132384, // 'condition' => '+0/0.5', // 'odds_code' => 'concede_size', // 'bettingTime' => '', // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', // 'type' => 1 // ], // ] // ]; $data['single'] = [];//单式 $data['bunch'] = [];//串式 $last[] = $res[count($res)-1]; unset($res[count($res)-1]); foreach($res as $k => $v){ //根据类型分组 if($v['type'] == '1'){ $data['single'][$k] = array_merge($last[0][$v['index']],$v); }else{ $data['bunch'][$k] = $v; } } if(!empty($data['bunch'])){ $data['bunch'] = array_merge_recursive($data['bunch'],$last); } return $data; } /** * 根据赛事ID分组 * @param [array] $data 球类数据 * @return [array] $data */ public function Group_ball($data = []){ if(empty($data)){ return $data; } foreach($data as $k => $v){ if(!isset($data[$v['match_id']])){ $data[$v['match_id']][] = $v; unset($data[$k]); }else{ $data[$v['match_id']][] = $v; unset($data[$k]); } } return $data; } /** * 单式投注单个球类数据插入 * @param [array] $data 单式投注数据 * @param [array] $userInfo 用户信息 * @param [type] $game_code 球类代码 * @return [int] 1 成功 其他失败 */ public function Simplex_bet_insert($data,$userInfo,$game_code,$OrderID,$UUID){ if(empty($data)||empty($userInfo)||empty($game_code)||empty($OrderID)||empty($UUID)){ Render('', '7003',lang('Errors','Api')->get('error-7003')); } foreach($data as $k => $v){ $bet_money = 0; //单个球类单条总投注金额 $prize_money = 0; //可赢额 //统计该球类投注总额 foreach($v as $kk => $vv){ $bet_money += $vv['bet_amount']; $prize_money += ($vv['odds']-1)*$bet_money; } $order =[ 'info_identity' => $UUID, 'account_name' => $userInfo['account'], 'account_identity' => $userInfo['account_identity'], 'order_id' => $OrderID, 'game_name' => $game_code, 'game_no' => "", 'match_id' => $k, 'prize_money'=> $prize_money, 'money' => $bet_money, //投注金额 'codes' => json_encode($v,true), //投注信息json 'money_time' => $this->time, ]; $insert = lm('MoneyBuy','Api')->insert($order); if(!$insert){ Render('','-1005',lang('errors','Api')->get('error-3205')); } $insertMoney = $this->M->insertMoney($userInfo['account_identity'],$bet_money,$OrderID,1,"",$UUID,$userInfo); if($insertMoney!=1){ Render('', $insertMoney,lang('Errors','Api')->get('error'.$insertMoney)); } $bet_money = 0; //初始化 $prize_money = 0; } } /** * 单式投注数据处理 * @param [array] $res 单式投注数据 * @return [int] 1 成功 其他失败 * */ public function Simplex_bet(array $res,array $userInfo){ if(empty($res)||empty($userInfo)){ Render('', '7003',lang('Errors','Api')->get('error-7003')); } //验证与判断投注了几种 foreach($res as $k => $v){ $num = $k + 1; $this->verify_match($v['game_code'],$v['match_id'],$num); $this->verify_odds($v['game_code'],$v['odds_id'],$v['odds_only'],$v['odds'],$v['condition'],$num); if(empty($v['bet_amount'])){ $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5105'); Render([], '5105',$msg); } $this->simplex_money += $v['bet_amount']; //根据类型分组 if(!isset($res[$v['ballId']])){ $res[$v['ballId']][] = $v; unset($res[$k]); }else{ $res[$v['ballId']][] = $v; unset($res[$k]); } } $OrderID = OrderID();//生成订单ID $UUID = UUID(); //生成信息ID //球类联赛分类并且插入数据库 $zq = $this->Group_ball($res['zq']); if(!empty($zq)) $this->Simplex_bet_insert($zq,$userInfo,'zq',$OrderID,$UUID); $lq = $this->Group_ball($res['lq']); if(!empty($lq)) $this->Simplex_bet_insert($zq,$userInfo,'lq',$OrderID,$UUID); $bq = $this->Group_ball($res['bq']); if(!empty($bq)) $this->Simplex_bet_insert($zq,$userInfo,'bq',$OrderID,$UUID); $wq = $this->Group_ball($res['wq']); if(!empty($wq)) $this->Simplex_bet_insert($zq,$userInfo,'wq',$OrderID,$UUID); } public function Bet(){ $userInfo = $this->getAgent();//获取用户信息 $data = $_REQUEST['data']; if(empty($data)){ Render('', '51029',lang('Errors','Api')->get('error-51029')); } // $order_money = $this->simplex_money; //+ $xxx; // //获取用户金额信息 // if(!$this->M->verifyMoney($order_money,$userInfo['cash'])){ // Render('', '4204',lang('Errors','Api')->get('error-4204')); // } //执行数据插入 try { _beginTransaction();//开启事务 $data = $this->Classify($data); if(!empty($data['single'])){ $this->Simplex_bet($data['single'],$userInfo);//单式数据处理 } if(!empty($data['bunch'])){ $data_all = $data['bunch'][count($data['bunch'])-1];//获取最后一个数组 $data['bunch'] = array_pop($data['bunch'][count($data['bunch'])-1]);//删除最后一个元素 $this->stringBet($data['bunch'],$data_all,$userInfo); } _commit();//提交 Render('', '1',lang('Errors','Api')->get('error-1')); } catch (Exception $e) { _rollBack();//回滚 print $e->getMessage(); } } /** * token获取用户详情 */ public function getAgent() { $checkToken = $this->accountManager->checkEffectiveTime(); if ($checkToken['status'] != 1) { Render($checkToken['data'], $checkToken['status'], lang('commons')->get('user does login')); }; $result = $this->accountManager->refreshToken(); return $result['data']; } /** * 赛事是否存在或结束 * @param [type] $game_code 球类代码 * @param [type] $odds_id 赔率ID * @param [type] $num 循环键值 * $type_str 串式类型 */ public function verify_match($game_code,$match_id='',$num,$type_str = ''){ if(empty($odds_id)){ if($type_str){ $msg = '串式投注'.$type_str.':第'.$num.'条投注'.lang('Errors','Api')->get('error-5107'); Render([], '5107',$msg); }else{ $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5107'); Render([], '5107',$msg); } } //根据球类代码 获取相关model $models = getModels($game_code); $model_odds = $models['model_odds']; $model_match = $models['model_match']; $info = lm($model_match,'Sports') ->select('status') // ->where('status', '<', '2') // ->where('us_time','>',qgmdate('Y-m-d H:i:s','', -4)) ->where('match_id',$match_id) ->first(); if(empty($info)){ if($type_str){ $msg = '串式投注'.$type_str.':第'.$num.'条投注'.lang('Errors','Api')->get('error-5103'); Render([], '5103',$msg); }else{ $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5103'); Render([], '5103',$msg); } } $info->toarray(); if($info['status'] == 2){ if($type_str){ $msg = '串式投注'.$type_str.':第'.$num.'条投注'.lang('Errors','Api')->get('error-5108'); Render([], '5108',$msg); }else{ $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5108'); Render([], '5108',$msg); } } return $info; } /** * 验证球类是否存在 * @param [type] $game_code 球类代码 * @param [type] $num 第几条 * $type_str 串式类型 */ public function verify_gameType($game_code,$num,$type_str=''){ if(empty($game_code)){ if($type_str){ $msg = '串式投注'.$type_str.':第'.$num.'条投注'.lang('Errors','Api')->get('error-5102'); Render([], '5102',$msg); }else{ $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-5102'); Render([], '5102', $msg); } } $info = lm('GameType','Sports')->where('game_code',$game_code)->first(); if(empty($info)){ if($type_str){ $msg = '串式投注'.$type_str.':第'.$num.'条投注'.lang('Errors','Api')->get('error-5102'); Render([], '5102',$msg); }else { $msg = '第' . $num . '条数据' . lang('Errors', 'Api')->get('error-5102'); Render([], '5102', $msg); } } return $info; } /** * 验证赔率是否存在 * @param [type] $game_code 球类代码 * @param [type] $odds_id 赔率IDkk */ public function verify_odds($game_code,$odds_id,$odds_only,$odds,$condition,$num){ if(empty($odds_id)||empty($odds_only)||empty($condition)||empty($odds)){ $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029'); Render([], '7029', $msg); } //根据球类代码 获取相关model $models = getModels($game_code); $model_odds = $models['model_odds']; $model_odds_record = $models['model_odds_record']; $info = lm($model_odds,'Sports') ->leftjoin($model_odds_record,$model_odds_record.'.odds_only',$model_odds.'.odds_only') ->select($model_odds_record.'.odds',$model_odds_record.'.condition') ->where($model_odds.'.odds_only',$odds_only) ->first(); if(!$info){ $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029'); Render([], '70291', $msg); } $info->toarray(); if($odds != $info['odds']){ $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029'); Render([], '70292', $msg); } if($condition = $info['condition']){ $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029'); Render([], '70293', $msg); } return $info; } /** * 处理串式投注 * $data_str 各串式 数据 * $data_all 所有赛事 数据 * $userInfo 用户数据 */ public function stringBet($data_str=[],$data_all=[],$userInfo=[]){ //所有串式数据 $data_str = [ [ 'type'=>'4串1',//串式名称 'odds'=>'',//当前串式赔率 'bet_amount'=> 1, ], ]; $data_all = [ [ 'id' => 887529, 'home_team' => '阿尔艾利开罗', 'guest_team' => '金字塔', 'name' => '阿尔艾利开罗', 'odds' => '1.97', 'p_code' => 'concede_size', 'ballId' => 'zq', 'match_id' => 3129809, 'condition' => '+0/0.5', 'ganame' => 'concede_size', 'bettingTime' =>'', 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', 'type' => 1, ], [ 'id' => 887472, 'home_team' => '阿尔艾利开罗', 'guest_team' => '金字塔', 'name' => '阿尔艾利开罗', 'odds' => '1.84', 'p_code' => 'concede_size', 'ballId' => 'zq', 'match_id' => 3124863, 'condition' => '+0/0.5', 'ganame' => 'concede_size', 'bettingTime' =>'', 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', 'type' => 1, ],[ 'id' => 887451, 'home_team' => '阿尔艾利开罗', 'guest_team' => '金字塔', 'name' => '阿尔艾利开罗', 'odds' => '2.05', 'p_code' => 'concede_size', 'ballId' => 'zq', 'match_id' => 3133254, 'condition' => '+0/0.5', 'ganame' => 'concede_size', 'bettingTime' =>'', 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', 'type' => 1, ],[ 'id' => 887450, 'home_team' => '阿尔艾利开罗', 'guest_team' => '金字塔', 'name' => '阿尔艾利开罗', 'odds' => '1.83', 'p_code' => 'concede_size', 'ballId' => 'zq', 'match_id' => 3127596, 'condition' => '+0/0.5', 'ganame' => 'concede_size', 'bettingTime' =>'', 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947', 'type' => 1, ] ]; if(empty($data_all)){ Render($data_all, '1', lang('Tips','Sports')->get('success')); } //验证串式投注是否合法 $this->verify_stringType($data_all); foreach ($data_all as $k =>$v){ //验证赛事是否存在 // $this->verify_match($v['ballId'],$v['id'],$k+1,$v['match_id']); // // //验证球类代码是否有效 // $this->verify_gameType($v['ballId'],$k+1); } //写入串式投注 所有数据 json_encode($oddsData,true) $bet_ttr_id = lm('BetStr','Api')->insertGetId(['bet_str_all'=>json_encode($data_all,true)]); if($bet_ttr_id < 1) Render([], '50039',lang('Errors','Api')->get('error-50039')); //获取串式 总赛事数量 $groupNum = count($data_all);//总数量 $orderData = []; $orderID = OrderID(); foreach ($data_str as $k=>$v){ //字符串替换 $str = str_ireplace("串","_",$v['type']); //获取type 3_12 $after = substr($str,strpos($str,"_")+1); //当前串式 值 $sonNum = substr($str,0,strrpos($str,"_")); //获取倍数 if((int)$after == 1){ $multiple = $this->getMultiple($groupNum,(int)$sonNum); }else{ $multiple =(int)$after; } //获取当前串式投注金额及可赢金额 $money_all = $this->makeMoney((int)$sonNum,$v['bet_amount'],$multiple,$data_all,$after); //投注金额 $moneyData = $money_all['moneyData']; //可赢金额 $prize_money = $money_all['prize_money']; $uuid = UUID(); $orderData[$k]['game_name'] = $v['type']; $orderData[$k]['info_identity'] = $uuid; $orderData[$k]['account_name'] = 'pengjun123';//$userInfo['account']; $orderData[$k]['account_identity'] = 'c0ad12b7-d13f-969a-ccd2-e71473bc971b';//$userInfo['account_identity']; $orderData[$k]['order_id'] = $orderID; $orderData[$k]['game_no'] = ""; $orderData[$k]['money'] = $moneyData; $orderData[$k]['bet_str_id'] = $bet_ttr_id;//投注数据 $orderData[$k]['money_time'] = $this->time;//下注时间 $orderData[$k]['prize_money'] = $prize_money;//可赢金额 } $ret = lm('MoneyBuyStr','Api')->insert($orderData);//true return $ret; } /** * 计算串式投注 倍率 * $groupNum 总赛事 数量 * $sonNum 当前串式 数量 */ public function getMultiple($groupNum = 0,$sonNum = 0){ if($groupNum and $sonNum){ $group =1; for($i = $groupNum ; $i >($groupNum - $sonNum);$i--) { $group = $group * $i; } $son =1; for($i = $sonNum ; $i >0;$i--) { $son = $son * $i; } } return $group/$son; } /** * 计算串式投注 赔率 */ public function getOddsStr(){ } /** * @param int $sonNum 当前串式数量 * @param int $bet_amount 当前串式投注额 * @param int $multiple 当前串式倍数 * @param array $data_all 当前注单 所有投注数据 * @return mixed * 计算当前串式投注总额、可赢总额 */ public function makeMoney($sonNum=0,$bet_amount=0,$multiple=0,$data_all=[],$after = 0){ $allNum = count($data_all);//所有数量 $odds_all = [];//所有投注项数据 foreach ($data_all as $k=>$v){ $odds_all[] = $v['odds']; } //投注总额 $data['moneyData'] = (double)$bet_amount*(double)$multiple; if($sonNum == $allNum and (int)$after ==1){//N场赛事 N串一 //获取所有赛事赔率乘积 $odds = array_product($odds_all); //获取可赢金额 $data['prize_money'] = floor($bet_amount*($odds-1)*100)/100;//保留两位小数 } if($sonNum < $allNum and (int)$after ==1){//例:N场赛事 $v){ $odds[] = array_product($v); } $odds = (array_sum($odds))-(count($odds)); //获取可赢金额 $data['prize_money'] = floor($bet_amount*($odds)*100)/100;//保留两位小数 } return $data; } /** * 验证串式投注 是否合法 * $data 串式 所有赛事 */ public function verify_stringType($data=[]){ if($data){ foreach($data as $k=>$v){ if($v['match_id']==$v['match_id']){ $r[$v['match_id']][] = $v; } } } if($r){ foreach ($r as $k=>$v){ if(count($v) > 1){ $msg = lang('Errors','Api')->get('error-50038'); Render([], '50038',$msg); } } } } }