MatchVer.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <?php
  2. namespace App\Sports\Controller;
  3. use BaseController\Controller;
  4. use Biz\Account\AccountManager;
  5. /**
  6. * 赛事数据验证
  7. * Tank.peng
  8. * 2019/11/6
  9. */
  10. class MatchVer extends Controller
  11. {
  12. public function init() {
  13. $this->time = date('Y-m-d H:i:s',time());
  14. $this->accountManager = new AccountManager();
  15. $this->commonFunction = C()->get('commonFunction');
  16. }
  17. /**
  18. * 验证 赛事赔率/比分 是否发生变更
  19. */
  20. public function VerOddsScore(){
  21. /*
  22. //拼装请求数据
  23. $data = [
  24. [
  25. 'game_code'=>'zq',//球类代码
  26. 'match_id'=>123,//赛事id
  27. 'home_score'=>1,//主队得分/进球 如果是滚球让球
  28. 'guest_score'=>2,//客队得分/进球 如果是滚球让球
  29. 'odds_only'=>'34f8e550779c6446c05d2dd2bb969631'//赔率uuid
  30. ],
  31. [
  32. 'game_code'=>'lq',
  33. 'match_id'=>123,
  34. 'home_score'=>1,
  35. 'guest_score'=>2,
  36. 'odds_only'=>'5c890c276384c40648760233194067b9'
  37. ]
  38. ];
  39. */
  40. //获取 查询数据
  41. $data_json = $_REQUEST['data'];
  42. // $token = $_REQUEST['token'];
  43. // if(empty($data_json)){
  44. // Render('', '51029',lang('Errors','Api')->get('error-51029'));
  45. // }
  46. //验证用户token
  47. // $this->getAgent($token);
  48. //数据转arr
  49. $data_arr = json_decode($data_json,true);
  50. if(empty($data_arr)) Render('', '10030', lang('Errors','Sports')->get('error-10030'));
  51. //循环处理 根据球类分组
  52. //足球 赛事数据
  53. $zq_data = [];
  54. //篮球 赛事数据
  55. $lq_data = [];
  56. //网球 赛事数据
  57. $wq_data = [];
  58. //棒球 赛事数据
  59. $bq_data = [];
  60. foreach($data_arr as $k=>$v){
  61. //序号 赋值
  62. $v['sort'] = $k;
  63. //状态 默认0 待处理 1正常 2赛事状态异常 3赔率异常 4赛事比分有更新
  64. $v['status'] = 1;
  65. //异常提示
  66. $v['ver_mark'] = '正常';
  67. //足球
  68. if($v['game_code'] == 'zq'){
  69. $zq_data[] = $v;
  70. }
  71. //篮球
  72. if($v['game_code'] == 'lq'){
  73. $lq_data[] = $v;
  74. }
  75. //网球
  76. if($v['game_code'] == 'wq'){
  77. $wq_data[] = $v;
  78. }
  79. //棒球
  80. if($v['game_code'] == 'bq'){
  81. $bq_data[] = $v;
  82. }
  83. $data_arr[$k] = $v;
  84. }
  85. //处理 足球
  86. $zq_odd_err = [];
  87. if(!empty($zq_data)){
  88. $zq_odd_err = $this->verOddsData('zq',$zq_data);
  89. }
  90. //处理 篮球
  91. $lq_odd_err = [];
  92. if(!empty($lq_data)){
  93. $lq_odd_err = $this->verOddsData('lq',$lq_data);
  94. }
  95. //处理 网球
  96. $wq_odd_err = [];
  97. if(!empty($wq_data)){
  98. $wq_odd_err = $this->verOddsData('wq',$wq_data);
  99. }
  100. //处理 棒球
  101. $bq_odd_err = [];
  102. if(!empty($bq_data)){
  103. $bq_odd_err = $this->verOddsData('bq',$bq_data);
  104. }
  105. //合并各球类异常投注项
  106. $all_err = array_merge($zq_odd_err,$lq_odd_err,$wq_odd_err,$bq_odd_err);
  107. //如果有异常投注数据
  108. if(!empty($all_err)){
  109. //合并 投注赔率数据
  110. foreach($data_arr as $k=>$v){
  111. foreach($all_err as $kk=>$vv){
  112. if($v['sort'] == $vv['sort']){
  113. $data_arr[$k] = $vv;
  114. }
  115. }
  116. }
  117. }else{
  118. $data_arr = 'ok';
  119. }
  120. //验证比分是否发生变化
  121. Render($data_arr, '1', lang('Tips','Sports')->get('success'));
  122. }
  123. /**
  124. * 验证投注内容
  125. */
  126. public function verOddsData($game_code,$oddsData){
  127. //获取model
  128. $getModels = $this->commonFunction->getModels($game_code);
  129. //获取赛事id
  130. $match_ids = array_column($oddsData,'match_id');
  131. //获取赔率odds_only
  132. $odds_onlys = array_column($oddsData,'odds_only');
  133. //比分正常 投注项
  134. $score_pass = [];
  135. //比分异常 投注项
  136. $score_err = [];
  137. //玩法赔率正常 投注项
  138. $odds_pass = [];
  139. //玩法赔率 异常 投注项
  140. $odds_err = [];
  141. //赛事状态异常的 投注项
  142. $status_err = [];
  143. //赛事状态正常的 投注项
  144. $status_pass = [];
  145. //根据赛事id 获取赛事状态
  146. $match_status = $this->getMatchStatus($match_ids,$getModels);
  147. //验证赛事状态是否异常
  148. if(!empty($match_status)){
  149. foreach($match_status as $k=>$v){
  150. foreach($oddsData as $kk=>$vv){
  151. if($v['match_id'] == $vv['match_id'] and $v['status'] > 1){
  152. $vv['status'] = 3;//赛事状态异常
  153. $vv['ver_mark'] = '玩法盘口已关闭';
  154. $status_err[] = $vv;
  155. //排除当前投注项
  156. unset($oddsData[$kk]);
  157. }
  158. }
  159. }
  160. //当前正常投注项
  161. $status_pass = $oddsData;
  162. }
  163. //如果 还有投注项 验证玩法赔率
  164. if(!empty($status_pass)){
  165. //根据赔率uuid 验证是否存在
  166. $odds_data = $this->getOdds($odds_onlys,$getModels);
  167. foreach($status_pass as $k=>$v){
  168. if(!empty($odds_data)){
  169. foreach($odds_data as $kk=>$vv){
  170. if($v['odds_only'] == $vv['odds_only']){
  171. $odds_pass[] = $v;
  172. //排除当前投注项
  173. unset($status_pass[$k]);
  174. }
  175. }
  176. }
  177. }
  178. //赋值异常 投注
  179. if(!empty($status_pass)){
  180. foreach($status_pass as $k=>$v){
  181. $v['status'] = 4;//赔率数据异常
  182. $v['ver_mark'] = '赔率有更新';
  183. $odds_err[] = $v;
  184. }
  185. }
  186. }
  187. //如果 还有投注项 验证赛事比分
  188. if(!empty($odds_pass)){
  189. //根据赛事id 获取赛事比分
  190. $match_score = $this->getMatchScore($match_ids,$getModels,$game_code);
  191. foreach($odds_pass as $k=>$v){
  192. foreach($match_score as $kk=>$vv){
  193. //获取异常
  194. if($v['match_id'] == $vv->match_id ){
  195. if($v['home_score'] != $vv->home_score || $v['guest_score'] != $vv->guest_score){
  196. $v['status'] = 2;//比分数据异常
  197. $v['ver_mark'] = '比分发生变化';
  198. $score_err[] = $v;
  199. unset($odds_pass[$k]);
  200. }
  201. }
  202. }
  203. }
  204. //赋值正常 投注
  205. $score_pass = $odds_pass;
  206. }
  207. //合并以上所有异常
  208. $score_err = [];
  209. $all_err = array_merge_recursive($status_err,$odds_err,$score_err);
  210. return $all_err;
  211. }
  212. /**
  213. * 获取各球类 指定赛事 状态
  214. */
  215. public function getMatchStatus($match_ids,$getModels){
  216. $match_model = $getModels['model_match'];
  217. $match_status = lm($match_model, 'Sports')
  218. ->select('id as match_id','status')
  219. ->whereIn('id',$match_ids)
  220. ->get()
  221. ->toArray();
  222. return $match_status;
  223. }
  224. /**
  225. * 获取各球类 指定赛事 比分
  226. */
  227. public function getMatchScore($match_ids,$getModels,$game_code){
  228. $match_ids_str = implode(",", $match_ids);
  229. $result_record = $getModels['model_result_record'];
  230. //如果是网球
  231. if($game_code == 'wq'){
  232. $sql = "select a.match_id,a.home_player_score as home_score,a.guest_player_score as guest_score,a.match_time as a_time,a.match_process,a.result_mark from $result_record a,
  233. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  234. where a.match_id = b.match_id and a.id = b.id ";
  235. }else
  236. //如果是棒球
  237. if($game_code == 'bq' || $game_code == 'lq'){
  238. $sql = "select a.match_id,a.home_score,a.guest_score,a.match_time as a_time,a.match_process,a.result_mark from $result_record a,
  239. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  240. where a.match_id = b.match_id and a.id = b.id ";
  241. }else{
  242. //其他球类
  243. $sql = "select a.match_id,a.home_score,a.guest_score,a.match_time as a_time,a.match_process from $result_record a,
  244. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  245. where a.match_id = b.match_id and a.id = b.id ";
  246. }
  247. //查询 赛事结果记录最新的一条
  248. $match_result_record = S ('DB')->select ($sql);
  249. return $match_result_record;
  250. }
  251. /**
  252. * 获取存在赔率
  253. */
  254. public function getOdds($odds_onlys,$getModels){
  255. $model_odds = $getModels['model_odds'];
  256. $odds_data = lm($model_odds,'Sports')
  257. ->select('odds_only')
  258. ->whereIn('odds_only',$odds_onlys)
  259. ->get()
  260. ->toArray();
  261. return $odds_data;
  262. }
  263. /**
  264. * token获取用户详情
  265. */
  266. public function getAgent($token = '') {
  267. $checkToken = $this->accountManager->checkEffectiveTime($token);
  268. if ($checkToken['status'] != 1) {
  269. Render($checkToken['data'], $checkToken['status'], lang('commons')->get('user does login'));
  270. };
  271. }
  272. }