BetOrder.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. <?php
  2. namespace App\Api\Controller;
  3. use Biz\Money\Moneycopy;
  4. use Biz\Money\Money;
  5. use Biz\Account\AccountManager;
  6. /*
  7. * Class Register
  8. * @package App\Api\Controller
  9. * User: junghwi
  10. * Date: 2019/3/21
  11. */
  12. class Betorder extends BaseController{
  13. private $simplex_money = 0; //单式投注总额
  14. public function init() {
  15. $this->time = date('Y-m-d H:i:s',time());
  16. $this->MC = new Moneycopy();
  17. $this->M = new Money();
  18. $this->accountManager = new AccountManager();
  19. $this->commonFunction = C()->get('commonFunction');
  20. }
  21. /**
  22. * 单式串式分类
  23. * @param [array] $res 投注数据
  24. * @return [array] $data
  25. *
  26. */
  27. public function Classify(array $res){
  28. if(empty($res)){
  29. Render('', '7003',lang('Errors','Api')->get('error-7003'));
  30. }
  31. // $res = [
  32. // [
  33. // "type" => 1,
  34. // 'index' => 0,
  35. // 'bet_amount'=> 2000
  36. // ],
  37. // [
  38. // "type" => 1,
  39. // 'index' => 1,
  40. // 'bet_amount'=> 2000
  41. // ],
  42. // [
  43. // "type" => 1,
  44. // 'index' => 2,
  45. // 'bet_amount'=> 2000
  46. // ],
  47. // [
  48. // 'type' => '3串1',
  49. // 'odds' => 16.299205,
  50. // 'bet_amount' =>'bet_amount'
  51. // ],
  52. // [
  53. // [
  54. // 'id'=>656437,
  55. // 'home_team' => "阿尔艾利开罗",
  56. // 'guest_team' => '金字塔',
  57. // 'name' => '阿尔艾利开罗',
  58. // 'odds' => 0.31,
  59. // 'p_code' => 'concede_size',
  60. // 'ballId' => 'zq',
  61. // 'odds_code' => 'concede_size',
  62. // 'match_id' => 313238,
  63. // 'condition' => '+0/0.5',
  64. // 'ganame' => 'concede_size',
  65. // 'bettingTime' => '',
  66. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  67. // 'type' => 1
  68. // ],
  69. // [
  70. // 'id'=>656437,
  71. // 'home_team' => "阿尔艾利开罗",
  72. // 'guest_team' => '金字塔',
  73. // 'name' => '阿尔艾利开罗',
  74. // 'odds' => 0.31,
  75. // 'p_code' => 'concede_size',
  76. // 'ballId' => 'zq',
  77. // 'match_id' => 3132384,
  78. // 'condition' => '+0/0.5',
  79. // 'ganame' => 'concede_size',
  80. // 'bettingTime' => '',
  81. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  82. // 'type' => 1
  83. // ],
  84. // [
  85. // 'id'=>656431,
  86. // 'home_team' => "阿尔艾利开罗",
  87. // 'guest_team' => '金字塔',
  88. // 'name' => '阿尔艾利开罗',
  89. // 'odds' => 0.31,
  90. // 'p_code' => 'concede_size',
  91. // 'ballId' => 'zq',
  92. // 'match_id' => 3132384,
  93. // 'condition' => '+0/0.5',
  94. // 'ganame' => 'concede_size',
  95. // 'bettingTime' => '',
  96. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  97. // 'type' => 1
  98. // ],
  99. // ]
  100. // ];
  101. $data['single'] = [];//单式
  102. $data['bunch'] = [];//串式
  103. $last[] = $res[count($res)-1];
  104. unset($res[count($res)-1]);
  105. foreach ($last as $k =>$v){
  106. foreach ($v as $kk =>$vv){
  107. //验证赛事是否存在
  108. $this->verify_match($vv['ballId'],$vv['match_id'],$kk+1);
  109. //验证球类代码是否有效
  110. $this->verify_gameType($vv['ballId'],$kk+1);
  111. //验证赛事下赔率玩法是否有效
  112. // $this->verify_odds($vv['ballId'],$vv['record_id'],$vv['odds'],$vv['condition'],$kk+1);
  113. }
  114. }
  115. foreach($res as $k => $v){
  116. //根据类型分组
  117. if($v['type'] == '1'){
  118. $data['single'][$k] = array_merge($last[0][$v['index']],$v);
  119. }else{
  120. $data['bunch'][$k] = $v;
  121. }
  122. }
  123. if(!empty($data['bunch'])){
  124. $data['bunch'] = array_merge_recursive($data['bunch'],$last);
  125. }
  126. return $data;
  127. }
  128. /**
  129. * 根据赛事ID分组
  130. * @param [array] $data 球类数据
  131. * @return [array] $data
  132. */
  133. public function Group_ball($data = []){
  134. if(empty($data)){
  135. return $data;
  136. }
  137. foreach($data as $k => $v){
  138. if(!isset($data[$v['match_id']])){
  139. $data[$v['match_id']][] = $v;
  140. unset($data[$k]);
  141. }else{
  142. $data[$v['match_id']][] = $v;
  143. unset($data[$k]);
  144. }
  145. }
  146. return $data;
  147. }
  148. /**
  149. * 单式投注数据处理
  150. * @param [array] $res 单式投注数据
  151. * @return [int] 1 成功 其他失败
  152. * @param [int] $batch_id 批量ID
  153. */
  154. public function Simplex_bet(array $res,array $userInfo,$batch_id){
  155. if(empty($res)||empty($userInfo)||empty($batch_id)){
  156. Render('', '7003',lang('Errors','Api')->get('error-7003'));
  157. }
  158. //验证与判断投注了几种
  159. foreach($res as $k => $v){
  160. $num = $k + 1;
  161. if(empty($v['bet_amount'])){
  162. $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5105');
  163. Render([], '5105',$msg);
  164. }
  165. //根据类型分组
  166. if(!isset($res[$v['ballId']])){
  167. $res[$v['ballId']][] = $v;
  168. unset($res[$k]);
  169. }else{
  170. $res[$v['ballId']][] = $v;
  171. unset($res[$k]);
  172. }
  173. }
  174. //球类联赛分类并且插入数据库
  175. foreach($res as $k => $v){
  176. $gamedate = $this->Group_ball($res[$k]);
  177. $this->Simplex_bet_insert($gamedate,$userInfo,$k,$batch_id);
  178. }
  179. }
  180. /**
  181. * 单式投注单个球类数据插入
  182. * @param [array] $data 单式投注数据
  183. * @param [array] $userInfo 用户信息
  184. * @param [type] $game_code 球类代码
  185. * @param [int] $batch_id 批量ID
  186. * @return [int] 1 成功 其他失败
  187. */
  188. public function Simplex_bet_insert($data,$userInfo,$game_code,$batch_id){
  189. if(empty($data)||empty($userInfo)||empty($game_code)){
  190. Render('', '7003',lang('Errors','Api')->get('error-7003'));
  191. }
  192. foreach($data as $k => $v){
  193. $OrderID = OrderID();//生成订单ID
  194. $UUID = UUID(); //生成信息ID
  195. $bet_money = 0; //赛事总投注额
  196. $prize_money = 0; //可赢额
  197. foreach($v as $kk => $vv){
  198. $bet_money += $vv['bet_amount'];
  199. $prize_money += ($vv['odds']-1) * $vv['bet_amount'] - $vv['bet_amount'];
  200. $matchData =[
  201. 'odds_id' =>$vv['id'],
  202. 'home_team' => $vv['home_team'],
  203. 'guest_team' => $vv['guest_team'],
  204. 'condition' => $vv['condition'],
  205. 'odds' => $vv['odds'],
  206. 'odds_code' => $vv['odds_code'],
  207. 'p_code' => $vv['p_code'],
  208. 'odds_only' => $vv['odds_only'],
  209. 'match_id' => $vv['match_id'],
  210. 'game_code' => $game_code,
  211. 'lg_id' => $vv['lg_id'],
  212. 'batch_id' => $batch_id,
  213. 'bet_type' => 1,
  214. 'bet_money' => $vv['bet_amount'],
  215. 'ctime' => date('Y-m-d H:i:s',time()),
  216. 'utime' => date('Y-m-d H:i:s',time())
  217. ];
  218. //插入数据源
  219. $moneyBuyMatch = lm('MoneyBuyMatch','Api')->insert($matchData);
  220. if(!$moneyBuyMatch){
  221. Render('','-1005',lang('errors','Api')->get('error-3205'));
  222. }
  223. }
  224. $order =[
  225. 'info_identity' => $UUID,
  226. 'account_name' => $userInfo['account'],
  227. 'account_identity' => $userInfo['account_identity'],
  228. 'order_id' => $OrderID,
  229. 'game_code' => $game_code,
  230. 'batch_id' => $batch_id,
  231. 'match_id' => $k,
  232. 'game_no' => "",
  233. 'prize_money'=> $prize_money,
  234. 'money' => $bet_money, //投注金额
  235. 'money_time' => $this->time
  236. ];
  237. $insert = lm("MoneyBuySimplex",'Api')->insert($order);
  238. if(!$insert){
  239. Render('','-1005',lang('errors','Api')->get('error-3205'));
  240. }
  241. $insertMoney = $this->M->insertMoney($userInfo['account_identity'],$bet_money,$OrderID,1,"",$UUID,$userInfo);
  242. if($insertMoney!=1){
  243. Render('', $insertMoney,lang('Errors','Api')->get('error'.$insertMoney));
  244. }
  245. }
  246. }
  247. public function Bet(){
  248. $userInfo = $this->getAgent();//获取用户信息
  249. $data = $_REQUEST['data'];
  250. $bet_money = $_REQUEST['bet_money'];
  251. if(empty($data)||empty($bet_money)){
  252. Render('', '51029',lang('Errors','Api')->get('error-51029'));
  253. }
  254. //获取用户金额信息
  255. if(!$this->M->verifyMoney($bet_money,$userInfo['cash'])){
  256. Render('', '4204',lang('Errors','Api')->get('error-4204'));
  257. }
  258. $batch_id = strtotime(date('Y-m-d H:i:s',time())).mt_rand('1','99');//批量ID
  259. //执行数据插入
  260. try {
  261. _beginTransaction();//开启事务
  262. $data = $this->Classify($data);
  263. if(!empty($data['single'])){
  264. $this->Simplex_bet($data['single'],$userInfo,$batch_id);//单式数据处理
  265. }
  266. if(!empty($data['bunch'])){
  267. $data_all = $data['bunch'][count($data['bunch'])-1];//获取最后一个数组
  268. unset($data['bunch'][count($data['bunch'])-1]);//删除最后一个元素
  269. $this->stringBet($data['bunch'],$data_all,$userInfo,$batch_id);
  270. }
  271. _commit();//提交
  272. Render('', '1',lang('Errors','Api')->get('error-1'));
  273. } catch (Exception $e) {
  274. _rollBack();//回滚
  275. print $e->getMessage();
  276. }
  277. }
  278. /**
  279. * token获取用户详情
  280. */
  281. public function getAgent() {
  282. $checkToken = $this->accountManager->checkEffectiveTime();
  283. if ($checkToken['status'] != 1) {
  284. Render($checkToken['data'], $checkToken['status'], lang('commons')->get('user does login'));
  285. };
  286. $result = $this->accountManager->refreshToken();
  287. return $result['data'];
  288. }
  289. /**
  290. * 赛事是否存在或结束
  291. * @param [type] $game_code 球类代码
  292. * @param [type] $match_id 赔率ID
  293. * @param [type] $num 循环键值
  294. * $@param [type]type_str 串式
  295. */
  296. public function verify_match($game_code,$match_id,$num = 1){
  297. if(empty($match_id)){
  298. $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5109');
  299. Render([], '5109',$msg);
  300. }
  301. //根据球类代码 获取相关model
  302. $models = $this->commonFunction->getModels($game_code);
  303. $model_match = $models['model_match'];
  304. $info = lm($model_match,'Sports')
  305. ->select('status')
  306. ->where('status', '<', '2')
  307. ->where('us_time','>',qgmdate('Y-m-d H:i:s','', -4))
  308. ->where('match_id',$match_id)
  309. ->first();
  310. if(empty($info)){
  311. $msg = '第'.$num.'条'.lang('Errors','Api')->get('error-5103');
  312. Render([], '5103',$msg);
  313. }
  314. return $info;
  315. }
  316. /**
  317. * 验证球类是否存在
  318. * @param [type] $game_code 球类代码
  319. * @param [type] $num 第几条
  320. */
  321. public function verify_gameType($game_code,$num){
  322. if(empty($game_code)){
  323. $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-5102');
  324. Render([], '5102', $msg);
  325. }
  326. $info = lm('GameType','Sports')->where('game_code',$game_code)->first();
  327. if(empty($info)){
  328. $msg = '第' . $num . '条数据' . lang('Errors', 'Api')->get('error-5102');
  329. Render([], '5102', $msg);
  330. }
  331. return $info;
  332. }
  333. /**
  334. * 验证赔率是否存在
  335. * @param [type] $game_code 球类代码
  336. * @param [type] $odds_id 赔率IDkk
  337. */
  338. public function verify_odds($game_code,$record_id,$odds,$condition,$num = 1){
  339. if(empty($record_id)||empty($condition)||empty($odds)){
  340. $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029');
  341. Render([], '7029', $msg);
  342. }
  343. //根据球类代码 获取相关model
  344. $models = $this->commonFunction->getModels($game_code);
  345. $model_odds = $models['model_odds'];
  346. $model_odds_record = $models['model_odds_record'];
  347. $odds_info = lm($model_odds,'Sports')
  348. ->join($model_odds_record,$model_odds_record.'.id',$model_odds.'.record_id')
  349. ->select($model_odds_record.'.odds',$model_odds_record.'.condition')
  350. ->where($model_odds.'.record_id',$record_id)
  351. ->first();
  352. if(empty($odds_info)){
  353. $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029');
  354. Render([], '70291', $msg);
  355. }
  356. $odds_info = $odds_info->toarray();
  357. if($odds != $odds_info['odds']){
  358. $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029');
  359. Render([], '70292', $msg);
  360. }
  361. if($condition = $odds_info['condition']){
  362. $msg = '第'.$num.'条数据'.lang('Errors','Api')->get('error-7029');
  363. Render([], '70293', $msg);
  364. }
  365. return $odds_info;
  366. }
  367. /**
  368. * 处理串式投注
  369. * $data_str 各串式 数据
  370. * $data_all 所有赛事 数据
  371. * $userInfo 用户数据
  372. * $batch_id 批次号
  373. */
  374. public function stringBet($data_str=[],$data_all=[],$userInfo=[],$batch_id=23456){
  375. // $userInfo = $this->getAgent();
  376. // dd($userInfo);
  377. // //所有串式数据
  378. // $data_str = [
  379. // [
  380. // 'type'=>'4串1',//串式名称
  381. // 'odds'=>'',//当前串式赔率
  382. // 'bet_amount'=> 1,
  383. // ],
  384. // [
  385. // 'type'=>'3串1',//串式名称
  386. // 'odds'=>'',//当前串式赔率
  387. // 'bet_amount'=> 1,
  388. // ],
  389. // [
  390. // 'type'=>'2串1',//串式名称
  391. // 'odds'=>'',//当前串式赔率
  392. // 'bet_amount'=> 1,
  393. // ],
  394. // [
  395. // 'type'=>'4串11',//串式名称
  396. // 'odds'=>'',//当前串式赔率
  397. // 'bet_amount'=> 1,
  398. // ],
  399. // ];
  400. ////
  401. // $data_all = [
  402. //
  403. // [
  404. // 'id' => 887529,
  405. // 'home_team' => '阿尔艾利开罗',
  406. // 'guest_team' => '金字塔',
  407. // 'name' => '阿尔艾利开罗',
  408. // 'odds' => '3.02',
  409. // 'p_code' => 'concede_size',
  410. // 'ballId' => 'zq',
  411. // 'match_id' => 3129809,
  412. // 'condition' => '+0/0.5',
  413. // 'ganame' => 'concede_size',
  414. // 'bettingTime' =>'',
  415. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  416. // 'type' => 1,
  417. // ],
  418. // [
  419. // 'id' => 887472,
  420. // 'home_team' => '阿尔艾利开罗',
  421. // 'guest_team' => '金字塔',
  422. // 'name' => '阿尔艾利开罗',
  423. // 'odds' => '2.84',
  424. // 'p_code' => 'concede_size',
  425. // 'ballId' => 'zq',
  426. // 'match_id' => 3124863,
  427. // 'condition' => '+0/0.5',
  428. // 'ganame' => 'concede_size',
  429. // 'bettingTime' =>'',
  430. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  431. // 'type' => 1,
  432. // ],[
  433. // 'id' => 887451,
  434. // 'home_team' => '阿尔艾利开罗',
  435. // 'guest_team' => '金字塔',
  436. // 'name' => '阿尔艾利开罗',
  437. // 'odds' => '3.01',
  438. // 'p_code' => 'concede_size',
  439. // 'ballId' => 'zq',
  440. // 'match_id' => 3133254,
  441. // 'condition' => '+0/0.5',
  442. // 'ganame' => 'concede_size',
  443. // 'bettingTime' =>'',
  444. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  445. // 'type' => 1,
  446. // ],[
  447. // 'id' => 887450,
  448. // 'home_team' => '阿尔艾利开罗',
  449. // 'guest_team' => '金字塔',
  450. // 'name' => '阿尔艾利开罗',
  451. // 'odds' => '2.94',
  452. // 'p_code' => 'concede_size',
  453. // 'ballId' => 'zq',
  454. // 'match_id' => 3127596,
  455. // 'condition' => '+0/0.5',
  456. // 'ganame' => 'concede_size',
  457. // 'bettingTime' =>'',
  458. // 'odds_only' => '1dee7e98db303852227cf1e0d8085dfb1555617310.3833947',
  459. // 'type' => 1,
  460. // ]
  461. // ];
  462. //验证串式投注是否合法
  463. $this->verify_stringType($data_all);
  464. //获取串式 总赛事数量
  465. $groupNum = count($data_all);//总数量
  466. $orderData = [];
  467. foreach ($data_str as $k=>$v){
  468. //字符串替换
  469. $str = str_ireplace("串","_",$v['type']);
  470. //获取type 3_12
  471. $after = substr($str,strpos($str,"_")+1);
  472. //当前串式 值
  473. $sonNum = substr($str,0,strrpos($str,"_"));
  474. //获取倍数
  475. if((int)$after == 1){
  476. $multiple = $this->getMultiple($groupNum,(int)$sonNum);
  477. }else{
  478. $multiple =(int)$after;
  479. }
  480. //获取当前串式投注金额及可赢金额
  481. if($after == 1){
  482. $money_all = $this->getmakeMoney((int)$sonNum,$v['bet_amount'],$multiple,$data_all,$after);
  483. }else{
  484. $money_all = $this->getStrAllMoney((int)$sonNum,$v['bet_amount'],$multiple,$data_all,$after);
  485. }
  486. //投注金额
  487. $moneyData = $money_all['moneyData'];
  488. //可赢金额
  489. $prize_money = $money_all['prize_money'];
  490. $uuid = UUID();
  491. $orderID = OrderID();
  492. $orderData[$k]['info_identity'] = $uuid;
  493. $orderData[$k]['account_name'] = $userInfo['account'];
  494. $orderData[$k]['account_identity'] = $userInfo['account_identity'];
  495. $orderData[$k]['order_id'] = $orderID;
  496. $orderData[$k]['game_no'] = "";
  497. $orderData[$k]['money'] = $moneyData;//$pay_money//总投注金额
  498. $orderData[$k]['money_time'] = $this->time;//下注时间
  499. $orderData[$k]['prize_money'] = $prize_money;//$expect_money ;//预期总可赢金额
  500. $orderData[$k]['str_type'] = $v['type'];//串式类型
  501. $orderData[$k]['batch_id'] = $batch_id;//批次号
  502. $orderData[$k]['wait_match_num'] = count($data_all);//批次号
  503. //写资金变动表
  504. $insertMoney = $this->M->insertMoney($userInfo['account_identity'],$moneyData,$orderID,1,"",$uuid,$userInfo);
  505. if($insertMoney!=1){
  506. Render('', $insertMoney,lang('Errors','Api')->get('error'.$insertMoney));
  507. }
  508. }
  509. //写注单 表
  510. $moneyBuy = lm('MoneyBuyStr','Api')->insert($orderData);
  511. if(!$moneyBuy){
  512. Render('','-1005',lang('errors','Api')->get('error-3205'));
  513. }
  514. foreach ($data_all as $kk=>$vv){
  515. $getModels = $this->commonFunction->getModels($vv['ballId']);
  516. $model_match = $getModels['model_match'];
  517. $matchData[] = [
  518. 'batch_id'=>$batch_id,
  519. 'odds_id'=>$vv['id'],
  520. 'home_team'=>$vv['home_team'],
  521. 'guest_team'=>$vv['guest_team'],
  522. 'condition'=>$vv['condition'],
  523. 'odds'=>$vv['odds'],
  524. 'odds_code'=>$vv['odds_code'],
  525. 'p_code'=>$vv['p_code'],
  526. 'odds_only'=>$vv['odds_only'],
  527. 'status'=>0,
  528. 'match_id'=>$vv['match_id'],
  529. 'game_code'=>$vv['ballId'],
  530. 'lg_id'=>lm($model_match,"Sports")->select('lg_id')->where('match_id',$vv['match_id'])->first()->lg_id,
  531. 'ctime'=>$this->time,//写入时间
  532. 'bet_type'=>2
  533. ];
  534. }
  535. //写赔率数据表
  536. $moneyBuyMatch = lm('MoneyBuyMatch','Api')->insert($matchData);
  537. if(!$moneyBuyMatch){
  538. Render('','-1005',lang('errors','Api')->get('error-3205'));
  539. }
  540. return true;
  541. }
  542. /**
  543. * 计算串式投注 倍率
  544. * $groupNum 总赛事 数量
  545. * $sonNum 当前串式 数量
  546. */
  547. public function getMultiple($groupNum = 0,$sonNum = 0){
  548. if($groupNum and $sonNum){
  549. $group =1;
  550. for($i = $groupNum ; $i >($groupNum - $sonNum);$i--) {
  551. $group = $group * $i;
  552. }
  553. $son =1;
  554. for($i = $sonNum ; $i >0;$i--) {
  555. $son = $son * $i;
  556. }
  557. }
  558. return $group/$son;
  559. }
  560. /**
  561. * @param int $sonNum 当前串式数量
  562. * @param int $bet_amount 当前串式投注额
  563. * @param int $multiple 当前串式倍数
  564. * @param array $data_all 当前注单 所有投注数据
  565. * @return mixed
  566. * 计算当前串式投注总额、可赢总额
  567. */
  568. public function getmakeMoney($sonNum=0,$bet_amount=0,$multiple=0,$data_all=[],$after = 0){
  569. $allNum = count($data_all);//所有数量
  570. $odds_all = [];//所有投注项数据
  571. foreach ($data_all as $k=>$v){
  572. $odds_all[] = $v['odds'];
  573. }
  574. //投注总额
  575. $data['moneyData'] = (double)$bet_amount*(double)$multiple;
  576. if($sonNum == $allNum and (int)$after ==1){//N场赛事 N串一
  577. //获取所有赛事赔率乘积
  578. $odds = array_product($odds_all);
  579. //获取可赢金额
  580. $data['prize_money'] = floor($bet_amount*($odds-1)*100)/100;//保留两位小数
  581. }
  582. if($sonNum < $allNum and (int)$after ==1){//例:N场赛事 <N串一
  583. $group = $this->commonFunction->combination($odds_all, $sonNum);
  584. foreach ($group as $k=>$v){
  585. $odds[] = array_product($v);
  586. }
  587. $odds = (array_sum($odds))-(count($odds));
  588. //获取可赢金额
  589. $data['prize_money'] = floor($bet_amount*($odds)*100)/100;
  590. }
  591. return $data;
  592. }
  593. /**
  594. * 获取所有可用串式 N场赛事 2串1,3串1...N串1,N<11
  595. * 并计算 其投注可赢金额
  596. */
  597. public function getStrAllMoney($sonNum=0,$bet_amount=0,$multiple=0,$data_all=[],$after = 0){
  598. $d = [];
  599. for ($i=2;$i<($sonNum+1);$i++){
  600. $d[] = $i;
  601. }
  602. foreach ($d as $k=>$v){
  603. $multiple = $this->getMultiple($sonNum,$v);
  604. $money[] = $this->getmakeMoney($v,$bet_amount,$multiple,$data_all,1);
  605. }
  606. $data=array();
  607. foreach($money as $k=>$v){
  608. $data['moneyData']+=$v['moneyData'];
  609. $data['prize_money']+=$v['prize_money'];
  610. }
  611. return $data;
  612. }
  613. /**
  614. * 验证串式投注 是否合法
  615. * $data 串式 所有赛事
  616. */
  617. public function verify_stringType($data=[]){
  618. if($data){
  619. foreach($data as $k=>$v){
  620. if($v['match_id']==$v['match_id']){
  621. $r[$v['match_id']][] = $v;
  622. }
  623. }
  624. }
  625. if($r){
  626. foreach ($r as $k=>$v){
  627. if(count($v) > 1){
  628. $msg = lang('Errors','Api')->get('error-50038');
  629. Render([], '50038',$msg);
  630. }
  631. }
  632. }
  633. }
  634. /**
  635. * 更新投注项相关数据
  636. */
  637. public function getBetData(){
  638. $data = $_REQUEST;
  639. // $data = [['game_code'=>'zq','match_id'=>3095448,'odds_id'=>623078],['game_code'=>'zq','match_id'=>3095448,'odds_id'=>623078]];
  640. foreach ($data as $k=>$v){
  641. $getModels = $this->commonFunction->getModels($v['game_code']);
  642. $model_match = $getModels['model_match'];
  643. $model_odds = $getModels['model_odds'];
  644. $oddsData = lm($model_match,"Sports")
  645. ->join($model_odds,$model_odds.'.match_id',$model_match.'.match_id')
  646. ->select($model_match.'.match_id',$model_match.'.match_date',$model_match.'.home_team',$model_match.'.guest_team',$model_odds.'.id as odds_id',$model_odds.'.p_code',$model_odds.'.odds_code',$model_odds.'.condition',$model_odds.'.odds',$model_odds.'.odds_only',$model_odds.'.status',$model_odds.'.sort')
  647. ->where($model_match.'.source',$this->source)
  648. ->where($model_match.'.match_id',$v['match_id'])
  649. ->where($model_odds.'.id',$v['odds_id'])
  650. //->where($model_odds.'.expire_time','>',date("Y-m-d H:i:s"))
  651. ->first();
  652. $oddsData->game_code = $v['game_code'];
  653. $betData[] = $oddsData;
  654. }
  655. Render($betData, '1', lang('Tips','Sports')->get('success'));
  656. }
  657. }