MatchVer.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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)||empty($token)){
  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. }
  118. //验证比分是否发生变化
  119. Render($data_arr, '1', lang('Tips','Sports')->get('success'));
  120. }
  121. /**
  122. * 验证投注内容
  123. */
  124. public function verOddsData($game_code,$oddsData){
  125. //获取model
  126. $getModels = $this->commonFunction->getModels($game_code);
  127. //获取赛事id
  128. $match_ids = array_column($oddsData,'match_id');
  129. //获取赔率odds_only
  130. $odds_onlys = array_column($oddsData,'odds_only');
  131. //比分正常 投注项
  132. $score_pass = [];
  133. //比分异常 投注项
  134. $score_err = [];
  135. //玩法赔率正常 投注项
  136. $odds_pass = [];
  137. //玩法赔率 异常 投注项
  138. $odds_err = [];
  139. //赛事状态异常的 投注项
  140. $status_err = [];
  141. //赛事状态正常的 投注项
  142. $status_pass = [];
  143. //根据赛事id 获取赛事状态
  144. $match_status = $this->getMatchStatus($match_ids,$getModels);
  145. //验证赛事状态是否异常
  146. if(!empty($match_status)){
  147. foreach($match_status as $k=>$v){
  148. foreach($oddsData as $kk=>$vv){
  149. if($v['match_id'] == $vv['match_id'] and $v['status'] > 1){
  150. $vv['status'] = 2;//赛事状态异常
  151. $vv['ver_mark'] = '赛事状态变更或数据异常';
  152. $status_err[] = $vv;
  153. //排除当前投注项
  154. unset($oddsData[$kk]);
  155. }
  156. }
  157. }
  158. //当前正常投注项
  159. $status_pass = $oddsData;
  160. }
  161. //如果 还有投注项 验证玩法赔率
  162. if(!empty($status_pass)){
  163. //根据赔率uuid 验证是否存在
  164. $odds_data = $this->getOdds($odds_onlys,$getModels);
  165. foreach($status_pass as $k=>$v){
  166. if(!empty($odds_data)){
  167. foreach($odds_data as $kk=>$vv){
  168. if($v['odds_only'] == $vv['odds_only']){
  169. $odds_pass[] = $v;
  170. //排除当前投注项
  171. unset($status_pass[$k]);
  172. }
  173. }
  174. }
  175. }
  176. //赋值异常 投注
  177. if(!empty($status_pass)){
  178. foreach($status_pass as $k=>$v){
  179. $v['status'] = 3;//赔率数据异常
  180. $v['ver_mark'] = '玩法盘口已关闭或赔率有更新';
  181. $odds_err[] = $v;
  182. }
  183. }
  184. }
  185. //如果 还有投注项 验证赛事比分
  186. if(!empty($odds_pass)){
  187. //根据赛事id 获取赛事比分
  188. $match_score = $this->getMatchScore($match_ids,$getModels,$game_code);
  189. foreach($odds_pass as $k=>$v){
  190. foreach($match_score as $kk=>$vv){
  191. //获取异常
  192. if($v['match_id'] == $vv->match_id ){
  193. if($v['home_score'] != $vv->home_score || $v['guest_score'] != $vv->guest_score){
  194. $v['status'] = 4;//比分数据异常
  195. $v['ver_mark'] = '进球/比分有变更或数据异常';
  196. $score_err[] = $v;
  197. unset($odds_pass[$k]);
  198. }
  199. }
  200. }
  201. }
  202. //赋值正常 投注
  203. $score_pass = $odds_pass;
  204. }
  205. //合并以上所有异常
  206. $all_err = array_merge_recursive($status_err,$odds_err,$score_err);
  207. return $all_err;
  208. }
  209. /**
  210. * 获取各球类 指定赛事 状态
  211. */
  212. public function getMatchStatus($match_ids,$getModels){
  213. $match_model = $getModels['model_match'];
  214. $match_status = lm($match_model, 'Sports')
  215. ->select('id as match_id','status')
  216. ->whereIn('id',$match_ids)
  217. ->get()
  218. ->toArray();
  219. return $match_status;
  220. }
  221. /**
  222. * 获取各球类 指定赛事 比分
  223. */
  224. public function getMatchScore($match_ids,$getModels,$game_code){
  225. $match_ids_str = implode(",", $match_ids);
  226. $result_record = $getModels['model_result_record'];
  227. //如果是网球
  228. if($game_code == 'wq'){
  229. $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,
  230. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  231. where a.match_id = b.match_id and a.id = b.id ";
  232. }else
  233. //如果是棒球
  234. if($game_code == 'bq' || $game_code == 'lq'){
  235. $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,
  236. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  237. where a.match_id = b.match_id and a.id = b.id ";
  238. }else{
  239. //其他球类
  240. $sql = "select a.match_id,a.home_score,a.guest_score,a.match_time as a_time,a.match_process from $result_record a,
  241. (select match_id,max(id) id from $result_record where match_id IN ($match_ids_str) group by match_id)b
  242. where a.match_id = b.match_id and a.id = b.id ";
  243. }
  244. //查询 赛事结果记录最新的一条
  245. $match_result_record = S ('DB')->select ($sql);
  246. return $match_result_record;
  247. }
  248. /**
  249. * 获取存在赔率
  250. */
  251. public function getOdds($odds_onlys,$getModels){
  252. $model_odds = $getModels['model_odds'];
  253. $odds_data = lm($model_odds,'Sports')
  254. ->select('odds_only')
  255. ->whereIn('odds_only',$odds_onlys)
  256. ->get()
  257. ->toArray();
  258. return $odds_data;
  259. }
  260. /**
  261. * token获取用户详情
  262. */
  263. public function getAgent($token = '') {
  264. $checkToken = $this->accountManager->checkEffectiveTime($token);
  265. if ($checkToken['status'] != 1) {
  266. Render($checkToken['data'], $checkToken['status'], lang('commons')->get('user does login'));
  267. };
  268. }
  269. }