GetmatchData.php 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. <?php
  2. /**
  3. * 根据不同状态获取 赛事数据
  4. * User: Jun.peng
  5. * Date: 2019/4/4
  6. * Time: 10:57
  7. */
  8. namespace Biz\Match;
  9. use Biz\Match\GetOddsData;
  10. use App\Sports\Model\St_zq_league as leagueModel;
  11. use App\Sports\Model\St_zq_competition as matchModel;
  12. use App\Sports\Model\St_zq_odds as ZQoddsModel;
  13. use App\Sports\Model\St_wq_odds as WQoddsModel;
  14. use App\Sports\Model\St_bq_odds as BQoddsModel;
  15. use App\Sports\Model\St_lq_odds as LQoddsModel;
  16. class GetmatchData {
  17. public function __construct() {
  18. $this->getOddsData = new GetOddsData();
  19. $this->commonFunction = C()->get('commonFunction');
  20. }
  21. /**
  22. * @param $ret 提交参数
  23. * @param $source 数据源条件
  24. * @return array
  25. * @throws \Exception
  26. * 获取不同状态下的赛事相关数据
  27. */
  28. public function typeData($ret,$source){
  29. //根据球类代码 获取相关model
  30. $models = $this->commonFunction->getModels($ret['game_code']);
  31. $model_match = $models['model_match'];
  32. //获取 不同状态的查询条件
  33. $where = $this->commonFunction->getState($ret['type_code'],$model_match);
  34. //根据联赛id查询
  35. if(!empty($ret['lg_id'])){
  36. $lg_id = $ret['lg_id'];
  37. }
  38. //根据搜索查询
  39. if(!empty($ret['search'])){
  40. $search = $ret['search'];
  41. }
  42. switch ($ret['type_code']){
  43. case 'StRollBall'://滚球
  44. $data = $this->getRollBall($source,$models,$where,$ret,$search);
  45. break;
  46. case 'StSoon'://即将
  47. $oddsTypeWhere = [
  48. [$models['model_odds'].'.is_morningplate','=',1],
  49. ];
  50. $data = $this->getSoon($source,$models,$where,$lg_id,$ret,$search,$oddsTypeWhere);
  51. break;
  52. case 'StToday'://今日
  53. $oddsTypeWhere = [
  54. [$models['model_odds'].'.is_today','=',1],
  55. ];
  56. $data = $this->getToday($source,$models,$where,$lg_id,$search,$oddsTypeWhere);
  57. break;
  58. case 'StMorningPlate'://早盘
  59. //默认当天
  60. if(empty($ret['match_date'])){
  61. $match_date = date("Y-m-d");
  62. }else{
  63. if($ret['match_date'] != 'other'){
  64. $match_date = $ret['match_date'];
  65. }else{
  66. $match_date = 'other';
  67. }
  68. }
  69. $oddsTypeWhere = [
  70. [$models['model_odds'].'.is_morningplate','=',1],
  71. ];
  72. $data = $this->getMorningPlate($source,$models,$where,$lg_id,$search,$match_date,$oddsTypeWhere);
  73. break;
  74. case 'StStringScene'://串场
  75. $oddsTypeWhere = [
  76. [$models['model_odds'].'.is_stringscene','=',1],
  77. ];
  78. if(empty($ret['str_type']) || $ret['str_type'] ==0){//赛事
  79. $data = $this->getStringScene($source,$models,$where,$lg_id,$search,'',$oddsTypeWhere);
  80. }
  81. if($ret['str_type'] == 1){//参赛表
  82. }
  83. if($ret['str_type'] == 2){//冠军盘口
  84. $where = $this->commonFunction->getState('StChampion',$model_match);
  85. $data = $this->getChampion($source,$models,$where,$lg_id,$search,'StChampion');
  86. }
  87. break;
  88. case 'StChampion'://冠军
  89. $data = $this->getChampion($source,$models,$where,$lg_id,$search,$ret['type_code']);
  90. break;
  91. default:
  92. throw new \Exception(Render([], '10002', lang('Tips','Sports')->get('PARAM_ERROR')));
  93. }
  94. return $data;
  95. }
  96. /**
  97. * 获取各球类 滚球/即将 默认赔率数据
  98. */
  99. public function getDefault($data,$game_code,$models,$match_ids,$source){
  100. if($game_code == 'zq') {
  101. //获取赛事下默认赔率
  102. $oddsData = ZQoddsModel::getMatchOdds($source, $models,$match_ids);
  103. foreach ($data as $k=>$v){
  104. foreach ($v['matchData'] as $kk=>$vv){
  105. //获取赛事下赔率并且分组
  106. foreach ($oddsData as $kkk=>$vvv) {
  107. if ($vv['match_id'] == $vvv['match_id'] and $vvv['sort']==0) {
  108. if($vvv['odds_code'] == 'concede_guest'){
  109. $concede_g = $vvv;
  110. }
  111. if($vvv['odds_code'] == 'concede_home'){
  112. $concede_h = $vvv;
  113. }
  114. if($vvv['odds_code'] == 'goal_size_big'){
  115. $size_s = $vvv;
  116. }
  117. if($vvv['odds_code'] == 'goal_size_small'){
  118. $size_b = $vvv;
  119. }
  120. if($vvv['odds_code'] == 'capot_home'){
  121. $capot_h = $vvv;
  122. }
  123. if($vvv['odds_code'] == 'capot_dogfall'){
  124. $capot_d = $vvv;
  125. }
  126. if($vvv['odds_code'] == 'capot_guest'){
  127. $capot_g = $vvv;
  128. }
  129. }
  130. }
  131. $concede_size = [$concede_g,$concede_h,$size_s,$size_b];
  132. $capot = [$capot_h,$capot_d,$capot_g];
  133. foreach ($concede_size as $key => $vaule){
  134. if($vaule == null) unset($concede_size[$key]);
  135. }
  136. foreach ($capot as $key1 => $vaule1){
  137. if($vaule1 == null) unset($capot[$key1]);
  138. }
  139. sort($concede_size);
  140. sort($capot);
  141. $data[$k]['matchData'][$kk]['oddsData'] = [$concede_size,$capot];
  142. }
  143. }
  144. }
  145. if($game_code == 'lq') {
  146. $oddsData = LQoddsModel::getMatchOdds($source,$match_ids);
  147. foreach ($data as $k=>$v){
  148. foreach ($v['matchData'] as $kk=>$vv){
  149. //获取赛事下赔率并且分组
  150. $capot = [];
  151. $total_size = [];
  152. $concede = [];
  153. foreach ($oddsData as $kkk=>$vvv) {
  154. if ($vv['match_id'] == $vvv['match_id'] and $vvv['sort']==0) {
  155. if($vvv['p_code'] == 'capot'){
  156. $capot[] = $vvv;
  157. }else{
  158. if($vvv['p_code'] == 'total_size'){
  159. $total_size[] = $vvv;
  160. }
  161. if($vvv['p_code'] == 'concede'){
  162. $concede[] = $vvv;
  163. }
  164. }
  165. }
  166. }
  167. $concede_size = [$concede[0],$concede[1],$total_size[0],$total_size[1]];
  168. $data[$k]['matchData'][$kk]['oddsData'] = [$concede_size,$capot];
  169. }
  170. }
  171. }
  172. if($game_code == 'wq') {
  173. $oddsData = WQoddsModel::getMatchOdds($source,$match_ids);
  174. foreach ($data as $k=>$v){
  175. foreach ($v['matchData'] as $kk=>$vv){
  176. //获取赛事下赔率并且分组
  177. $odds = [];
  178. foreach ($oddsData as $kkk=>$vvv) {
  179. if ($vv['match_id'] == $vvv['match_id'] and $vvv['sort']==0) {
  180. $odds[] = $vvv;
  181. }
  182. }
  183. $data[$k]['matchData'][$kk]['oddsData'] = $odds;
  184. }
  185. }
  186. }
  187. if($game_code == 'bq') {
  188. $oddsData = BQoddsModel::getMatchOdds($source,$match_ids);
  189. foreach ($data as $k=>$v){
  190. foreach ($v['matchData'] as $kk=>$vv){
  191. //获取赛事下赔率并且分组
  192. $odds = [];
  193. foreach ($oddsData as $kkk=>$vvv) {
  194. if ($vv['match_id'] == $vvv['match_id'] and $vvv['sort']==0) {
  195. if($vvv['odds_code'] == 'concede_guest'){
  196. $concede_g = $vvv;
  197. }
  198. if($vvv['odds_code'] == 'concede_home'){
  199. $concede_h = $vvv;
  200. }
  201. if($vvv['odds_code'] == 'total_size_small'){
  202. $size_s = $vvv;
  203. }
  204. if($vvv['odds_code'] == 'total_size_big'){
  205. $size_b = $vvv;
  206. }
  207. if($vvv['odds_code'] == 'capot_home'){
  208. $capot_h = $vvv;
  209. }
  210. if($vvv['odds_code'] == 'capot_guest'){
  211. $capot_g = $vvv;
  212. }
  213. }
  214. }
  215. $concede_size = [$concede_g,$concede_h,$size_s,$size_b];
  216. $capot = [$capot_h,$capot_g];
  217. foreach ($concede_size as $key => $vaule){
  218. if($vaule == null) unset($concede_size[$key]);
  219. }
  220. foreach ($capot as $key1 => $vaule1){
  221. if($vaule1 == null) unset($capot[$key1]);
  222. }
  223. sort($concede_size);
  224. sort($capot);
  225. $data[$k]['matchData'][$kk]['oddsData'] = [$concede_size,$capot];
  226. }
  227. }
  228. }
  229. return $data;
  230. }
  231. /**
  232. * 获取滚球数据
  233. */
  234. public function getRollBall($source,$models,$where,$ret,$search=''){
  235. //获取当前状态下所有联赛
  236. $leagueData = leagueModel::getRollLeagueData($source,$models,$where,$search);
  237. if(empty($leagueData)){
  238. return $leagueData=[];
  239. }
  240. //获取联赛id
  241. $lg_ids = [];
  242. foreach ($leagueData as $k => $v){
  243. $lg_ids[] = $v['lg_id'];
  244. }
  245. //统计联赛下的赛事及查询赛事
  246. $matchData = matchModel::getRollMatchDataAll($source,$models,$where,$lg_ids);
  247. //如果赛事为空,直接返回
  248. if(empty($matchData)) return $matchData;
  249. //===获取当前赛事是否有赔率,如果没有则去除===
  250. //获取当前match_id
  251. $match_ids = [];
  252. foreach($matchData as $k=>$v){
  253. $match_ids[] = $v['match_id'];
  254. }
  255. //获取下赛事赔率
  256. $oddsData = lm($models['model_odds'],'Sports')
  257. ->select('id','match_id')
  258. ->whereIn('match_id',$match_ids)
  259. ->get()
  260. ->toArray();
  261. //根据match_id 去重
  262. $oddsData = $this->commonFunction->array_unset_tt($oddsData,'match_id');
  263. sort($oddsData);
  264. //如果赔率为空,则返回空
  265. if(empty($oddsData)) return $oddsData;
  266. $matchData_new = [];
  267. foreach($matchData as $k=>$v){
  268. foreach($oddsData as $kk=>$vv){
  269. if($v['match_id'] == $vv['match_id']){
  270. $matchData_new[] = $matchData[$k];
  271. }
  272. }
  273. }
  274. //===赛事空赔率 处理end ===
  275. //组装联赛下赛事
  276. $data = [];
  277. foreach ($leagueData as $k=>$v){
  278. $data[$k] = $v;
  279. foreach ($matchData_new as $kk=>$vv){
  280. if($v['lg_id'] == $vv['lg_id']){
  281. $data[$k]['matchData'][] = $vv;
  282. }
  283. }
  284. $data[$k]['matchNum'] = count($data[$k]['matchData']);
  285. }
  286. //获取滚球/即将赛事 默认 赔率数据
  287. $data = $this->getDefault($data,$ret['game_code'],$models,$match_ids,$source);
  288. return $data;
  289. }
  290. /**
  291. * 获取即将数据
  292. */
  293. public function getSoon($source,$models,$where,$lg_id=0,$ret,$search='',$oddsTypeWhere=''){
  294. //获取当前状态下所有联赛
  295. $leagueData = leagueModel::getSoonLeagueData($source,$models,$where,$search);
  296. if(empty($leagueData)){
  297. return $leagueData=[];
  298. }
  299. //获取联赛id
  300. $lg_ids = [];
  301. foreach ($leagueData as $k => $v){
  302. $lg_ids[] = $v['lg_id'];
  303. }
  304. //统计联赛下的赛事及查询赛事
  305. $matchData = matchModel::getSoonMatchDataAll($source,$models,$where,$lg_ids);
  306. //如果赛事为空,直接返回
  307. if(empty($matchData)) return $matchData;
  308. //===获取当前赛事是否有赔率,如果没有则去除===
  309. //获取当前match_id
  310. $match_ids = [];
  311. foreach($matchData as $k=>$v){
  312. $match_ids[] = $v['match_id'];
  313. }
  314. //获取下赛事赔率
  315. $oddsData = lm($models['model_odds'],'Sports')
  316. ->select('id','match_id')
  317. ->whereIn('match_id',$match_ids)
  318. ->get()
  319. ->toArray();
  320. //根据match_id 去重
  321. $oddsData = $this->commonFunction->array_unset_tt($oddsData,'match_id');
  322. sort($oddsData);
  323. //如果赔率为空,则返回空
  324. if(empty($oddsData)) return $oddsData;
  325. $matchData_new = [];
  326. foreach($matchData as $k=>$v){
  327. foreach($oddsData as $kk=>$vv){
  328. if($v['match_id'] == $vv['match_id']){
  329. $matchData_new[] = $matchData[$k];
  330. }
  331. }
  332. }
  333. //===赛事空赔率 处理end ===
  334. //获取当前美东时间
  335. $s_time = strtotime($this->commonFunction->qgmdate('Y-m-d H:i:s', '', -4));
  336. $data = [];
  337. foreach ($leagueData as $k=>$v){
  338. $data[$k] = $v;
  339. foreach ($matchData_new as $kk=>$vv){
  340. if($v['lg_id'] == $vv['lg_id']){
  341. $wait_time = ceil(((strtotime( $vv['us_time']))-$s_time)/60);
  342. $vv['wait_time'] = $wait_time;//追加距离开赛时间
  343. $data[$k]['matchData'][] = $vv;
  344. }
  345. }
  346. $data[$k]['matchNum'] = count($data[$k]['matchData']);
  347. }
  348. //获取滚球/即将赛事 默认 赔率数据
  349. $data = $this->getDefault($data,$ret['game_code'],$models,$match_ids,$source);
  350. return $data;
  351. }
  352. /**
  353. * 获取今日数据
  354. */
  355. public function getToday($source,$models,$where,$lg_id=0,$search='',$oddsTypeWhere=[]){
  356. //获取model
  357. $model_match = $models['model_match'];
  358. $model_odds = $models['model_odds'];
  359. $model_league = $models['model_league'];
  360. $model_result = $models['model_result'];
  361. //根据联赛id 获取联赛下 赛事赔率数据
  362. if($lg_id >0){
  363. $leagueData = $this->getMatchOdds($source,$model_league,$model_match,$model_odds,$where,$search,$lg_id,'',$oddsTypeWhere);
  364. return $leagueData;
  365. }
  366. $data = $this->getMatch($source,$models,$search,$where);
  367. return $data;
  368. }
  369. /**
  370. * 获取早盘数据
  371. */
  372. public function getMorningPlate($source,$models,$where,$lg_id=0,$search='',$time='',$oddsTypeWhere=''){
  373. //获取model
  374. $model_match = $models['model_match'];
  375. $model_odds = $models['model_odds'];
  376. $model_league = $models['model_league'];
  377. $model_result = $models['model_result'];
  378. //根据联赛id 获取联赛下 赛事赔率数据
  379. if($lg_id >0){
  380. $leagueData = $this->getMatchOdds($source,$model_league,$model_match,$model_odds,$where,$search,$lg_id,$time,$oddsTypeWhere);
  381. return $leagueData;
  382. }
  383. $data = $this->getMatch($source,$models,$search,$where,$time);
  384. return $data;
  385. }
  386. /**
  387. * 获取串场数据
  388. */
  389. public function getStringScene($source,$models,$where,$lg_id=0,$search='',$time='',$oddsTypeWhere=''){
  390. //获取model
  391. $model_match = $models['model_match'];
  392. $model_odds = $models['model_odds'];
  393. $model_league = $models['model_league'];
  394. $model_result = $models['model_result'];
  395. //根据联赛id 获取联赛下 赛事赔率数据
  396. if($lg_id >0){
  397. $leagueData = $this->getMatchOdds($source,$model_league,$model_match,$model_odds,$where,$search,$lg_id,$time,$oddsTypeWhere);
  398. return $leagueData;
  399. }
  400. $data = $this->getMatch($source,$models,$search,$where,$time);
  401. return $data;
  402. }
  403. /**
  404. * 获取冠军数据
  405. */
  406. public function getChampion($source,$models,$where,$lg_id=0,$search='',$type_code=''){
  407. //获取model
  408. $model_odds = $models['model_odds'];
  409. $model_league = $models['model_league'];
  410. //根据联赛id 获取联赛下 冠军玩法盘口
  411. if($lg_id >0){
  412. $last_time = lm($model_league, 'Sports')
  413. ->select('last_time')
  414. ->where('id',$lg_id)
  415. ->first()->last_time;
  416. $championData = lm($model_odds, 'Sports')
  417. ->select("id","lg_id","match_id","p_code","odds_code","team","odds","sort","status","odds_only")
  418. ->where('lg_id',$lg_id)
  419. ->where($where)
  420. ->where(['status'=>0])
  421. ->groupBy("id","lg_id","match_id","p_code","odds_code","team","odds","sort","status","odds_only")
  422. ->get()->toArray();
  423. //按p_code分组
  424. $p_code=array();
  425. foreach($championData as $k=>$v){
  426. $p_code[$v['p_code']][]=$v;
  427. }
  428. $sd = [];
  429. foreach ($p_code as $k1=>$v1){
  430. foreach ($v1 as $k2=>$v2){
  431. $sd[$v2['p_code']]['last_time'] =$last_time;
  432. $sd[$v2['p_code']][$v2['odds_code']][] = $v2;
  433. }
  434. }
  435. return $sd;
  436. }
  437. //获取国家/洲下所有联赛及数量
  438. $data = $this->getMatch($source,$models,$search,$where,'',$type_code);
  439. return $data;
  440. }
  441. /**
  442. * 获取国家/洲 下联赛
  443. */
  444. public function getMatch($source,$models,$search,$where,$time='',$type_code=''){
  445. //国家下所有联赛
  446. $country = lm($models['model_league'],"Sports")
  447. ->leftjoin('st_area_country','st_area_country.id',$models['model_league'].'.country_id')
  448. ->select('st_area_country.id as country_id','st_area_country.name as region')
  449. ->distinct('st_area_country.name')
  450. ->where([[$models['model_league'].'.name_chinese','!=','']])
  451. ->where($models['model_league'].'.name_chinese','like','%'.$search.'%')
  452. ->get()
  453. ->toArray();
  454. //洲下所有联赛
  455. $area = lm($models['model_league'],"Sports")
  456. ->leftjoin('st_area_country','st_area_country.id',$models['model_league'].'.area_id')
  457. ->select('st_area_country.id as area_id','st_area_country.name as region')
  458. ->distinct('st_area_country.name')
  459. ->where([[$models['model_league'].'.name_chinese','!=','']])
  460. ->where($models['model_league'].'.name_chinese','like','%'.$search.'%')
  461. ->get()
  462. ->toArray();
  463. if($type_code != 'StChampion'){//非冠军赛事
  464. $data = $this->getMatchNum($source,$country,$area,$models,$where,$search,$time);
  465. }else{//冠军赛事
  466. $data = $this->getMatchStChampionNum($source,$country,$area,$models,$where,$search,$time);
  467. }
  468. return $data;
  469. }
  470. /**
  471. * 获取联赛下赛事 数量
  472. * 非冠军盘口
  473. */
  474. public function getMatchNum($source,$country,$area,$models,$where,$search,$time='',$type=0){
  475. $leagueData = lm($models['model_league'],'Sports')
  476. ->select('id as lg_id','name_chinese as league','country_id','area_id')
  477. ->where([[$models['model_league'].'.name_chinese','!=','']])
  478. ->where($models['model_league'].'.name_chinese','like','%'.$search.'%')
  479. ->get()
  480. ->toArray();
  481. //如果有时间条件
  482. $timeWhere = [];
  483. if(!empty($time)){
  484. if($time == 'other'){
  485. $timeWhere[] = ['match_date','>',date("Y-m-d",strtotime("+1weeks",strtotime(date('Y-m-d',time()))))];
  486. }else{
  487. $timeWhere[] = ['match_date',$time];
  488. }
  489. }
  490. //获取赛事
  491. $matchData = lm($models['model_match'],'Sports')
  492. ->select('id as match_id','lg_id')
  493. ->where($where)
  494. ->where($timeWhere)
  495. ->get()
  496. ->toArray();
  497. //如果赛事为空,直接返回
  498. if(empty($matchData)) return $matchData;
  499. //===获取当前赛事是否有赔率,如果没有则去除===
  500. //获取当前match_id
  501. $match_ids = [];
  502. foreach($matchData as $k=>$v){
  503. $match_ids[] = $v['match_id'];
  504. }
  505. //获取下赛事赔率
  506. $oddsData = lm($models['model_odds'],'Sports')
  507. ->select('id','match_id')
  508. ->whereIn('match_id',$match_ids)
  509. ->get()
  510. ->toArray();
  511. //根据match_id 去重
  512. $oddsData = $this->commonFunction->array_unset_tt($oddsData,'match_id');
  513. sort($oddsData);
  514. //如果赔率为空,则返回空
  515. if(empty($oddsData)) return $oddsData;
  516. $matchData_new = [];
  517. foreach($matchData as $k=>$v){
  518. foreach($oddsData as $kk=>$vv){
  519. if($v['match_id'] == $vv['match_id']){
  520. $matchData_new[] = $matchData[$k];
  521. }
  522. }
  523. }
  524. //===赛事空赔率 处理end ===
  525. //按国家
  526. $countryData = [];
  527. if(!empty($country) and !empty($leagueData) and !empty($matchData_new)){
  528. foreach ($country as $k=>$v){
  529. if($v['country_id']){
  530. $countryData[$k] = $v;
  531. foreach ($leagueData as $kk=>$vv){
  532. if($v['country_id'] == $vv['country_id']){
  533. $countryData[$k]['league_count'][] = $vv;
  534. }
  535. }
  536. }
  537. }
  538. }
  539. //去除无联赛 国家
  540. foreach ($countryData as $k=>$v){
  541. if(count($v) == 2){
  542. unset($countryData[$k]);
  543. }
  544. }
  545. //按地区
  546. $areaData = [];
  547. if(!empty($area) and !empty($leagueData) and($matchData_new)){
  548. foreach ($area as $k=>$v){
  549. if($v['area_id']){
  550. $areaData[$k] = $v;
  551. foreach ($leagueData as $kk=>$vv){
  552. if($v['area_id'] == $vv['area_id']){
  553. $areaData[$k]['league_count'][] = $vv;
  554. }
  555. }
  556. }
  557. }
  558. }
  559. //去除无联赛 地区
  560. foreach ($areaData as $k=>$v){
  561. if(count($v) == 2){
  562. unset($areaData[$k]);
  563. }
  564. }
  565. $countryData = $this->commonFunction->array_other_tt($countryData,$matchData_new);
  566. $areaData = $this->commonFunction->array_other_tt($areaData,$matchData_new);
  567. $data = array_merge($countryData,$areaData);
  568. return $data;
  569. }
  570. /**
  571. * 获取联赛下赛事 数量
  572. * 冠军盘口
  573. */
  574. public function getMatchStChampionNum($source,$country,$area,$models,$where,$search,$time='',$type=0){
  575. $leagueData = lm($models['model_league'],'Sports')
  576. ->select('id as lg_id','name_chinese as league','country_id','area_id')
  577. ->where([[$models['model_league'].'.name_chinese','!=','']])
  578. ->where($models['model_league'].'.name_chinese','like','%'.$search.'%')
  579. ->get()
  580. ->toArray();
  581. $oddsData = lm($models['model_odds'],'Sports')
  582. ->select('id','lg_id','p_code')
  583. ->distinct("p_code")//去重
  584. ->where($where)
  585. ->where(['status'=>0])
  586. ->get()
  587. ->toArray();
  588. //按国家
  589. $countryData = [];
  590. if(!empty($country) and !empty($leagueData) and !empty($oddsData)){
  591. foreach ($country as $k=>$v){
  592. if($v['country_id']){
  593. $countryData[$k] = $v;
  594. foreach ($leagueData as $kk=>$vv){
  595. if($v['country_id'] == $vv['country_id']){
  596. $countryData[$k]['league_count'][] = $vv;
  597. }
  598. }
  599. }
  600. }
  601. }
  602. //去除无联赛 国家
  603. foreach ($countryData as $k=>$v){
  604. if(count($v) == 2){
  605. unset($countryData[$k]);
  606. }
  607. }
  608. //按地区
  609. $areaData = [];
  610. if(!empty($area) and !empty($leagueData) and($oddsData)){
  611. foreach ($area as $k=>$v){
  612. if($v['area_id']){
  613. $areaData[$k] = $v;
  614. foreach ($leagueData as $kk=>$vv){
  615. if($v['area_id'] == $vv['area_id']){
  616. $areaData[$k]['league_count'][] = $vv;
  617. }
  618. }
  619. }
  620. }
  621. }
  622. //去除无联赛 地区
  623. foreach ($areaData as $k=>$v){
  624. if(count($v) == 2){
  625. unset($areaData[$k]);
  626. }
  627. }
  628. $countryData = $this->commonFunction->array_gj_tt($countryData,$oddsData);
  629. $areaData = $this->commonFunction->array_gj_tt($areaData,$oddsData);
  630. $data = array_merge($countryData,$areaData);
  631. return $data;
  632. }
  633. /**
  634. * 获取联赛下 赛事赔率
  635. */
  636. public function getMatchOdds($source,$model_league,$model_match,$model_odds,$where,$search,$lg_id,$time='',$oddsTypeWhere=[]){
  637. $leagueData = lm($model_league,"Sports")
  638. ->select('id as lg_id','name_chinese as leagueName')
  639. ->where('id',$lg_id)
  640. ->first();
  641. //根据时间 拼装查询条件
  642. $whereTime = [];
  643. if(!empty($time)){
  644. if($time == 'other'){
  645. //其他时间(七天后)
  646. $whereTime = [
  647. ['match_date','>',date("Y-m-d",strtotime("+1weeks",strtotime(date('Y-m-d',time()))))],
  648. ];
  649. }elseif($time == date('Y-m-d')){
  650. //今天
  651. $whereTime = [
  652. ['is_morningplate','=',1],
  653. ['match_date','=',$time],
  654. ['match_time','>',date("H:i:s", time())]
  655. ];
  656. }else{
  657. //今天以后 七天内
  658. $whereTime = [
  659. ['match_date','=',$time]
  660. ];
  661. }
  662. }
  663. $matchData = lm($model_match,"Sports")
  664. ->select($model_match.'.id as match_id',$model_match.'.tag','match_date',$model_match.'.match_time',$model_match.'.home_team',$model_match.'.guest_team')
  665. ->where($model_match.'.lg_id',$lg_id)
  666. ->where($where)
  667. ->where($whereTime)
  668. ->where(function($query)use ($model_match,$search){
  669. $query->where($model_match.'.home_team','like','%'.$search.'%')
  670. ->orWhere(function($query)use ($model_match,$search) {
  671. $query->where($model_match . '.guest_team', 'like', '%' . $search . '%');
  672. });
  673. })
  674. ->get()
  675. ->toarray();
  676. //如果赛事为空,直接返回
  677. if(empty($matchData)) return $matchData;
  678. //===获取当前赛事是否有赔率,如果没有则去除===
  679. //获取当前match_id
  680. $match_ids = [];
  681. foreach($matchData as $k=>$v){
  682. $match_ids[] = $v['match_id'];
  683. }
  684. //获取下赛事赔率
  685. $oddsData = lm($model_odds,'Sports')
  686. ->select('id','match_id')
  687. ->whereIn('match_id',$match_ids)
  688. ->get()
  689. ->toArray();
  690. //根据match_id 去重
  691. $oddsData = $this->commonFunction->array_unset_tt($oddsData,'match_id');
  692. sort($oddsData);
  693. //如果赔率为空,则返回空
  694. if(empty($oddsData)) return $oddsData;
  695. $matchData_new = [];
  696. foreach($matchData as $k=>$v){
  697. foreach($oddsData as $kk=>$vv){
  698. if($v['match_id'] == $vv['match_id']){
  699. $matchData_new[] = $matchData[$k];
  700. }
  701. }
  702. }
  703. //===赛事空赔率 处理end ===
  704. //获取各球类默认赔率
  705. $game_code = $_REQUEST['game_code'];
  706. switch ($game_code) {
  707. case 'zq'://足球
  708. $matchData = $this->getOddsData->getOddsZQ($matchData_new, $model_odds, $source,$oddsTypeWhere);
  709. break;
  710. case 'lq'://篮球
  711. $matchData = $this->getOddsData->getOddsLQ($matchData_new, $model_odds, $source,$oddsTypeWhere);
  712. break;
  713. case 'wq'://网球
  714. $matchData = $this->getOddsData->getOddsWQ($matchData_new, $model_odds, $source,$oddsTypeWhere);
  715. break;
  716. case 'bq'://棒球
  717. $matchData = $this->getOddsData->getOddsBQ($matchData_new, $model_odds, $source,$oddsTypeWhere);
  718. break;
  719. }
  720. $leagueData->matchNum = count($matchData);
  721. $leagueData->matchData = $matchData;
  722. return $leagueData;
  723. }
  724. /**
  725. * @param $source 数据源
  726. * @param $where 该状态 查询条件
  727. * @return array
  728. * @throws \Exception
  729. * 获取所有即将开赛 数据
  730. */
  731. public function getAllSoon($source,$where){
  732. $game = lm('GameType', 'Sports')->select('id','game_name','game_code','game_ico_url')->where('status',1)->get()->toArray();
  733. //获取当前美东时间
  734. $s_time = strtotime($this->commonFunction->qgmdate('Y-m-d H:i:s', '', -4));
  735. $data=[];
  736. foreach ($game as $key=>$item){
  737. if($item['game_code'] !='gj'){
  738. $model = $this->commonFunction->getModels($item['game_code']);
  739. $matchData = lm($model['model_match'], 'Sports')
  740. ->select('id as match_id','home_team','guest_team','match_time','us_time')
  741. ->where($where)
  742. ->orderBy('match_time','asc')
  743. ->get()->toArray();
  744. $matchNum = count($matchData);
  745. $matchData = array_slice($matchData,0,6);
  746. foreach ($matchData as $key1 => $item1){
  747. //获取等待时间
  748. $wait_time = ceil(((strtotime($item1['us_time']))-$s_time)/60);
  749. $matchData[$key1]['wait_time'] = $wait_time;
  750. }
  751. if($matchNum > 0){
  752. $data[$item['game_code']]['matchData'] = $matchData;
  753. $data[$item['game_code']]['matchNum'] = $matchNum;
  754. $data[$item['game_code']]['gameName'] = $item['game_name'];
  755. $data[$item['game_code']]['gameCode'] = $item['game_code'];
  756. }
  757. }
  758. }
  759. return $data;
  760. }
  761. /**
  762. * 获取欧冠 各状态赛事数据
  763. */
  764. public function getUEFAChampions($source){
  765. //根据搜索查询
  766. if(!empty($_GET['search'])){
  767. $search = $_GET['search'];
  768. }
  769. $model = $this->commonFunction->getModels('gj',1);
  770. $model_league = $model['model_league'];
  771. $leagueData = lm($model_league,'Sports')
  772. ->select('name_chinese','id as lg_id','last_time')
  773. ->where($model_league.'.name_chinese','欧洲冠军杯')
  774. ->first();
  775. //获取滚球数据
  776. $StRollBall = $this->getUEFAStRollBall($model,'StRollBall',$source,$leagueData->lg_id,$search);
  777. //获取今日数据
  778. $StToday = $this->getUEFAStToday($model,'StToday',$source,$leagueData->lg_id,$search);
  779. //获取早盘数据
  780. $StMorningPlate = $this->getUEFAStMorningPlate($model,'StMorningPlate',$source,$leagueData->lg_id,$search);
  781. //获取冠军盘口数据
  782. $StChampion = $this->getUEFAStChampion($model,'StChampion',$source,$leagueData->lg_id,$leagueData->last_time);
  783. $data = [
  784. 'lg_id' => $leagueData->lg_id,
  785. 'leagueName'=> $leagueData->name_chinese,
  786. 'StRollBall'=>[//滚球数据
  787. 'typeName'=>'滚球',
  788. 'matchNum'=>count($StRollBall),
  789. 'matchData'=>$StRollBall
  790. ],
  791. 'StToday'=>[//今日数据
  792. 'typeName'=>'今日',
  793. 'matchNum'=>count($StToday),
  794. 'matchData'=>$StToday
  795. ],
  796. 'StMorningPlate'=>[//早盘数据
  797. 'typeName'=>'早盘',
  798. 'matchNum'=>count($StMorningPlate),
  799. 'matchData'=>$StMorningPlate
  800. ],
  801. 'StChampion'=>[//冠军盘口
  802. 'typeName'=>'冠军盘口',
  803. 'matchNum'=>count($StChampion),
  804. 'matchData'=>$StChampion
  805. ]
  806. ];
  807. return $data;
  808. }
  809. /**
  810. * 获取欧冠 滚球数据
  811. */
  812. public function getUEFAStRollBall($model,$type_code,$source,$lg_id,$search=''){
  813. $model_match = $model['model_match'];
  814. $model_odds = $model['model_odds'];
  815. $model_result = $model['model_result'];
  816. $where = $this->commonFunction->getState($type_code,$model_match);
  817. $matchData = lm($model_match,"Sports")
  818. ->leftjoin($model_result,$model_result.'.match_id',$model_match.'.id')
  819. ->select($model_match.'.id as match_id',$model_match.'.tag','match_date',$model_match.'.match_time',$model_match.'.home_team',$model_match.'.guest_team','home_score','guest_score',$model_result.'.match_time as a_time','match_process')
  820. ->where($model_match.'.lg_id',$lg_id)
  821. ->where($where)
  822. ->where(function($query)use ($model_match,$search){
  823. $query->where($model_match.'.home_team','like','%'.$search.'%')
  824. ->orWhere(function($query)use ($model_match,$search) {
  825. $query->where($model_match . '.guest_team', 'like', '%' . $search . '%');
  826. });
  827. })
  828. ->get()
  829. ->toarray();
  830. //获取赛事id
  831. $match_ids = [];
  832. foreach ($matchData as $k => $v){
  833. $match_ids[] = $v['match_id'];
  834. }
  835. //获取赛事下滚球默认赔率
  836. $oddsData = ZQoddsModel::getMatchOdds($source,$model,$match_ids);
  837. foreach ($matchData as $k=>$v){
  838. //获取赛事下赔率并且分组
  839. $capot = [];
  840. $concede_size = [];
  841. foreach ($oddsData as $kk=>$vv){
  842. if ($vv['match_id'] == $v['match_id'] and $vv['sort']==0) {
  843. if($vv['p_code'] == 'concede_size'){
  844. $concede_size[] = $vv;
  845. }
  846. if($vv['p_code'] == 'capot'){
  847. $capot[] = $vv;
  848. }
  849. }
  850. }
  851. $matchData[$k]['oddsData'] = [$concede_size,$capot];
  852. }
  853. return $matchData;
  854. }
  855. /**
  856. * 获取欧冠 今日数据
  857. */
  858. public function getUEFAStToday($model,$type_code,$source,$lg_id,$search=''){
  859. $model_match = $model['model_match'];
  860. $model_odds = $model['model_odds'];
  861. $where = $this->commonFunction->getState($type_code);
  862. $matchData = lm($model_match,'Sports')
  863. ->select('id as match_id','match_date','match_time','tag','home_team','guest_team')
  864. ->where($where)
  865. ->where('lg_id',$lg_id)
  866. ->where(function($query)use ($model_match,$search){
  867. $query->where($model_match.'.home_team','like','%'.$search.'%')
  868. ->orWhere(function($query)use ($model_match,$search) {
  869. $query->where($model_match . '.guest_team', 'like', '%' . $search . '%');
  870. });
  871. })
  872. ->get()->toArray();
  873. //获取赛事id
  874. $match_ids = [];
  875. foreach ($matchData as $k => $v){
  876. $match_ids[] = $v['match_id'];
  877. }
  878. //获取赔率数据
  879. $oddsData = lm($model_odds, "Sports")
  880. ->select( 'id','p_code', 'odds_code','odds_only','status', 'odds', 'condition', 'sort','match_id')
  881. ->whereIn('match_id', $match_ids)
  882. ->where(['status'=>0])
  883. ->groupBy($model_odds . '.id','p_code', 'odds_code','odds_only', $model_odds . '.status', 'odds', 'condition', 'sort','match_id')
  884. ->orderBy($model_odds . '.id','desc')
  885. ->get()
  886. ->toarray();
  887. foreach ($matchData as $k=>$v){
  888. foreach ($oddsData as $kk=>$vv){
  889. if($v['match_id'] == $vv['match_id']){
  890. $matchData[$k]['oddsData'][] = $vv;
  891. }
  892. }
  893. }
  894. return $matchData;
  895. }
  896. /**
  897. * 获取欧冠 早盘数据
  898. */
  899. public function getUEFAStMorningPlate($model,$type_code,$source,$lg_id,$search=''){
  900. $model_match = $model['model_match'];
  901. $model_odds = $model['model_odds'];
  902. $where = $this->commonFunction->getState($type_code);
  903. $matchData = lm($model_match,'Sports')
  904. ->select('id as match_id','match_date','match_time','tag','home_team','guest_team')
  905. ->where($where)
  906. ->where('lg_id',$lg_id)
  907. ->where(function($query)use ($model_match,$search){
  908. $query->where($model_match.'.home_team','like','%'.$search.'%')
  909. ->orWhere(function($query)use ($model_match,$search) {
  910. $query->where($model_match . '.guest_team', 'like', '%' . $search . '%');
  911. });
  912. })
  913. ->get()->toArray();
  914. $data = $this->getOddsData->getOddsZQ($matchData,$model_odds,$source,[]);
  915. return $data;
  916. }
  917. /**
  918. * 获取 欧冠 冠军盘口数据
  919. */
  920. public function getUEFAStChampion($model,$type_code,$source,$lg_id,$last_time=''){
  921. $model_odds = $model['model_odds'];
  922. $where = $this->commonFunction->getState($type_code);
  923. $championData = lm($model_odds, 'Sports')
  924. ->select("id","lg_id","match_id","p_code","odds_code","team","odds","sort","status","odds_only")
  925. ->where('lg_id',$lg_id)
  926. ->where($where)
  927. ->where(['status'=>0])
  928. ->groupBy("id","lg_id","match_id","p_code","odds_code","team","odds","sort","status","odds_only")
  929. ->get()->toArray();
  930. //按p_code分组
  931. $p_code=array();
  932. foreach($championData as $k=>$v){
  933. $p_code[$v['p_code']][]=$v;
  934. }
  935. $data = [];
  936. foreach ($p_code as $k1=>$v1){
  937. foreach ($v1 as $k2=>$v2){
  938. $data[$v2['p_code']]['last_time'] =$last_time;
  939. $data[$v2['p_code']][$v2['odds_code']][] = $v2;
  940. }
  941. }
  942. return $data;
  943. }
  944. }