Common.php 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866
  1. <?php
  2. namespace App\Lib\Biz\Sport;
  3. use App\Http\Response\Response;
  4. use Log;
  5. use App\Http\Model\StZqMatch;
  6. use App\Http\Model\StZqLeague;
  7. use App\Http\Model\StZqLeagueResult;
  8. use App\Http\Model\StZqLocalLeague;
  9. use App\Http\Model\StZqLocalMatch;
  10. use App\Http\Model\StZqOdds;
  11. use App\Http\Model\StZqOddsRecord;
  12. use App\Http\Model\StZqResult;
  13. use App\Http\Model\StZqResultRecord;
  14. use App\Http\Model\StZqBroadcast;
  15. use App\Http\Model\StZqResultExpress;
  16. use App\Http\Model\StLqMatch;
  17. use App\Http\Model\StLqLeague;
  18. use App\Http\Model\StLqLeagueResult;
  19. use App\Http\Model\StLqLocalLeague;
  20. use App\Http\Model\StLqLocalMatch;
  21. use App\Http\Model\StLqOdds;
  22. use App\Http\Model\StLqOddsRecord;
  23. use App\Http\Model\StLqResult;
  24. use App\Http\Model\StLqResultRecord;
  25. use App\Http\Model\StLqBroadcast;
  26. use App\Http\Model\StLqResultExpress;
  27. use App\Http\Model\StWqResultRecord;
  28. use App\Http\Model\StWqMatch;
  29. use App\Http\Model\StWqLeague;
  30. use App\Http\Model\StWqLeagueResult;
  31. use App\Http\Model\StWqLocalLeague;
  32. use App\Http\Model\StWqLocalMatch;
  33. use App\Http\Model\StWqOdds;
  34. use App\Http\Model\StWqOddsRecord;
  35. use App\Http\Model\StWqResult;
  36. use App\Http\Model\StWqBroadcast;
  37. use App\Http\Model\StWqResultExpress;
  38. use App\Http\Model\StBqResultRecord;
  39. use App\Http\Model\StBqMatch;
  40. use App\Http\Model\StBqLeague;
  41. use App\Http\Model\StBqLeagueResult;
  42. use App\Http\Model\StBqLocalLeague;
  43. use App\Http\Model\StBqLocalMatch;
  44. use App\Http\Model\StBqOdds;
  45. use App\Http\Model\StBqOddsRecord;
  46. use App\Http\Model\StBqResult;
  47. use App\Http\Model\StBqBroadcast;
  48. use App\Http\Model\StBqResultExpress;
  49. class Common
  50. {
  51. function checkDebug()
  52. {
  53. return (isset($_GET['debug']) && intval($_GET['debug']) == -99999) || APP_DEBUG == 1 ? 1 : 0;
  54. }
  55. function View($Path = "")
  56. {
  57. if (!$Path) {
  58. global $ViewPath;
  59. $ViewPath = explode("\\", $ViewPath);
  60. $ViewPath[3] = explode("Controller", $ViewPath[3]);
  61. $ViewPath[3] = $ViewPath[3][0];
  62. return APP_PATH . "/" . $ViewPath[1] . "/View/" . $ViewPath[3] . "/" . $ViewPath[4] . ".blade.php";
  63. } else {
  64. return APP_PATH . "/" . $Path . ".blade.php";
  65. }
  66. }
  67. function arrayToOptions($data, $key, $val)
  68. {
  69. $options = array();
  70. if (is_array($data) && count($data)) {
  71. foreach ($data as $k => $value) {
  72. $options[$value[$key]] = $value[$val];
  73. }
  74. }
  75. return $options;
  76. }
  77. function M($TABLE_NAME = "")
  78. {
  79. return new DB($TABLE_NAME);
  80. }
  81. function checkClose()
  82. {
  83. if (file_exists(ROOT_PATH . '/Cache/system.lock')) {
  84. if (is_mobile()) {
  85. return appExec("Mobile", "Weihu", "index");
  86. } else {
  87. return appExec("home", "weihu", "index");
  88. }
  89. }
  90. }
  91. /**
  92. * 发布消息
  93. *
  94. * @param integer $status
  95. * @param string $msg
  96. * @param string $data
  97. * @return void
  98. */
  99. function publishNotify($channel, $status = 1, $data = '')
  100. {
  101. // toLog('publishNotify-'.$channel.'+++'.$data);
  102. C()->get('msg')->publish($channel, $data);
  103. }
  104. /**
  105. * 数组分类排序
  106. * @param [array] $columnsArr [需要进行排序的数组]
  107. * @param [int] $plmid [所属分类ID]
  108. */
  109. function getColumns($columnsArr, $plmid)
  110. {
  111. $menu = array();
  112. foreach ($columnsArr as $v) {
  113. if ($v['plmid'] == $plmid) {
  114. $menu[] = $v;
  115. $a = getColumns($columnsArr, $v['lmid']);
  116. foreach ($a as $vv) {
  117. $menu[] = $vv;
  118. }
  119. }
  120. }
  121. return $menu;
  122. }
  123. /**
  124. * 获取客户端真实IP
  125. */
  126. function GETIP()
  127. {
  128. global $ip;
  129. if (getenv("HTTP_CLIENT_IP")) {
  130. $ip = getenv("HTTP_CLIENT_IP");
  131. } else if (getenv("HTTP_X_FORWARDED_FOR")) {
  132. $ip = getenv("HTTP_X_FORWARDED_FOR");
  133. } else if (getenv("REMOTE_ADDR")) {
  134. $ip = getenv("REMOTE_ADDR");
  135. } else {
  136. $ip = "Unknow";
  137. }
  138. return $ip;
  139. }
  140. function dump($data, $exit = 1)
  141. {
  142. echo "<pre>";
  143. print_r($data);
  144. echo "</pre>";
  145. if ($exit) {
  146. exit;
  147. }
  148. }
  149. function OrderID($prefix = '')
  150. {
  151. $num = mt_rand(100, 999);
  152. list($s, $m) = explode(' ', microtime());
  153. $order = date("YmdHis") . ($s * 1000000) . $num;
  154. return $prefix . $order;
  155. }
  156. /**
  157. * 容器
  158. */
  159. function C()
  160. {
  161. static $c = array();
  162. if (!isset($c['container'])) {
  163. $c['container'] = new \System\Di();
  164. }
  165. return $c['container'];
  166. }
  167. /**
  168. * 全局变量快捷操作
  169. * @param [type] $key [description]
  170. * @param [type] $value [description]
  171. */
  172. function S($key, $value = null)
  173. {
  174. if ($value != null) {
  175. $GLOBALS[$key] = $value;
  176. }
  177. if (isset($GLOBALS[$key])) {
  178. return $GLOBALS[$key];
  179. }
  180. }
  181. /**
  182. * 载入模型
  183. * @param [type] $name [description]
  184. * @param string $proj [description]
  185. * @return [type] [description]
  186. */
  187. function lm($name, $proj = '')
  188. {
  189. $proj = empty($proj) ? S('CUR_PROJECT') : $proj;
  190. if (empty($proj)) {
  191. throw new \Exception("项目{$proj}不存在", 1);
  192. }
  193. $cls = "\\App\\" . ucfirst($proj) . "\\Model\\" . ucfirst($name);
  194. if (!class_exists($cls)) {
  195. return;
  196. }
  197. $key = 'model_' . $name . $proj;
  198. C()->shared($key, $cls);
  199. return C()->get($key);
  200. }
  201. /**
  202. * 载入语言包
  203. * @param string $key 语言项
  204. * @param string $file 语言文件名
  205. * @param string $proj 项目名称
  206. * @return [type] [description]
  207. */
  208. function lang($file = '', $proj = '')
  209. {
  210. $proj = empty($proj) ? S('CUR_PROJECT') : $proj;
  211. $file = empty($file) ? S('CUR_CONTROLLER') : $file;
  212. $ckey = "Lang_{$proj}_{$file}";
  213. if (C()->has($ckey)) {
  214. return C()->get($ckey);
  215. } else {
  216. C()->shared($ckey, function () use ($proj, $file) {
  217. $file = ucfirst($file);
  218. $proj = ucfirst($proj);
  219. $lang = new \System\Lang();
  220. $lang_files = array();
  221. if (S('CUR_PROJECT') == $proj && S('CUR_CONTROLLER') == $file) {
  222. $lang_files[] = ROOT_PATH . "/Application/Commons/Lang/Common.php";
  223. $lang_files[] = ROOT_PATH . "/Application/{$proj}/Lang/Common.php";
  224. }
  225. $lang_files[] = ROOT_PATH . "/Application/{$proj}/Lang/{$file}.php";
  226. $data = array();
  227. foreach ($lang_files as $v) {
  228. if (file_exists($v)) {
  229. $data2 = include $v;
  230. if (is_array($data2)) {
  231. $data = array_merge($data, $data2);
  232. }
  233. }
  234. }
  235. $lang->load($data);
  236. return $lang;
  237. });
  238. return C()->get($ckey);
  239. }
  240. }
  241. /**
  242. * 标签替换
  243. *
  244. * @param [type] $message
  245. * @param array $data
  246. * @param string $tag
  247. * @return void
  248. */
  249. function parseTag($message, $data = array(), $tag = '#')
  250. {
  251. if (is_array($data) && count($data) > 0) {
  252. foreach ($data as $k => $v) {
  253. $message = str_replace($tag . $k . $tag, $v, $message);
  254. }
  255. }
  256. return $message;
  257. }
  258. function appExec($proj, $ctrl, $method, $exec = 0)
  259. {
  260. $proj = ucfirst($proj);
  261. $ctrl = ucfirst($ctrl);
  262. $method = ucfirst($method);
  263. S('CUR_PROJECT', $proj);
  264. S('CUR_CONTROLLER', $ctrl);
  265. S('CUR_METHOD', $method);
  266. checkPlatform();
  267. toDomain();
  268. //设置REMOTE_KEY
  269. lm('setinfo', 'commons')->setKey();
  270. $cls = "\\App\\{$proj}\\Controller\\{$ctrl}";
  271. C()->set($ctrl, $cls);
  272. $cls = C()->get($ctrl);
  273. if (!$cls) {
  274. exit("404 NOT FOUND");
  275. }
  276. if ($exec) {
  277. $result = $cls->$method();
  278. if (!empty($result)) {
  279. Render($result);
  280. }
  281. }
  282. if (method_exists($cls, $method)) {
  283. $result = $cls->$method();
  284. if (!empty($result)) {
  285. Render($result);
  286. }
  287. } else {
  288. exit("404 METHOD NOT FOUND");
  289. }
  290. }
  291. /**
  292. * UUID 生成
  293. */
  294. function UUID()
  295. {
  296. $prefix = '';
  297. $uuid = '';
  298. $str = md5(uniqid(mt_rand(), true));
  299. $uuid = substr($str, 0, 8) . '-';
  300. $uuid .= substr($str, 8, 4) . '-';
  301. $uuid .= substr($str, 12, 4) . '-';
  302. $uuid .= substr($str, 16, 4) . '-';
  303. $uuid .= substr($str, 20, 12);
  304. return $prefix . $uuid;
  305. }
  306. /**
  307. *密码加密码
  308. */
  309. function GenEncryption()
  310. {
  311. srand((double)microtime() * 1000000); //create a random number feed.
  312. $ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
  313. $list = explode(",", $ychar);
  314. $authnum = "";
  315. for ($i = 0; $i < 6; $i++) {
  316. $randnum = rand(0, 61); // 10+26;
  317. $authnum .= $list[$randnum];
  318. }
  319. return $authnum;
  320. }
  321. //密码加密
  322. function GenPassword($password)
  323. {
  324. $Enc = GenEncryption();
  325. $Pwd = md5(md5($Enc . $password));
  326. return array("encryption" => $Enc, "password" => $Pwd);
  327. }
  328. //密码验证
  329. function VerPassword($identity, $password)
  330. {
  331. $account = M("account_password")->where("account_identity = '$identity' and", "status = ", '1')->select("encryption,account_password")->find();
  332. $VerPwd = md5(md5($account["encryption"] . $password));
  333. if ($VerPwd == $account["account_password"]) {
  334. unset($account);
  335. unset($VerPwd);
  336. return true;
  337. } else {
  338. unset($account);
  339. unset($VerPwd);
  340. return false;
  341. }
  342. }
  343. /**
  344. * Json return
  345. * @param string $data [description]
  346. * @param string $status [description]
  347. * @param string $msg [description]
  348. * @param string $method [description]
  349. */
  350. function JsonReturn($data = "", $status = "200", $msg = "", $method = "")
  351. {
  352. // header("Content-type:application/json;charset:utf-8");
  353. // header('content-type:text/html; charset=utf-8');
  354. if (isset($_REQUEST['crossdomain']) && !empty($_REQUEST['crossdomain'])) {
  355. header("Access-Control-Allow-Origin:{$_REQUEST['crossdomain']}");
  356. } else {
  357. header("Access-Control-Allow-Origin:*");
  358. }
  359. header('Access-Control-Allow-Methods:POST,GET,PUT,DELETE,OPTIONS');
  360. header('Access-Control-Allow-Credentials:true');
  361. $retdata = array("status" => $status, "msg" => $msg, "data" => $data);
  362. $devicetype = isset($_REQUEST['devicetype']) ? trim($_REQUEST['devicetype']) : '';
  363. if (!empty($devicetype) && in_array($devicetype, array('ios', 'android'))) {
  364. $path = S('CUR_PROJECT') . '/' . S('CUR_CONTROLLER') . '/' . S('CUR_METHOD');
  365. $retdata = C()->get($devicetype . "Result")->update($path, $retdata);
  366. }
  367. if ($method == '') {
  368. //dump($devicetype);
  369. echo(json_encode($retdata, JSON_UNESCAPED_UNICODE));
  370. } else {
  371. echo($method . "(" . json_encode($retdata, JSON_UNESCAPED_UNICODE) . ")");
  372. }
  373. }
  374. function XmlReturn($data = "", $status = 200, $msg = '')
  375. {
  376. // header("Content-type:text/xml;charset:utf-8");
  377. $xml = '<?xml version="1.0" encoding="utf-8"?>';
  378. $xml .= "<root>";
  379. $xml .= '<status>' . $status . '</status>';
  380. $xml .= '<msg>' . $msg . '</msg>';
  381. $xml .= "<rows>";
  382. $xml .= toXml($data);
  383. $xml .= "</rows>";
  384. $xml .= "</root>";
  385. echo($xml);
  386. }
  387. function toXml($data)
  388. {
  389. // print_r($data);
  390. $xml = '';
  391. if (is_array($data) && count($data) > 0) {
  392. foreach ($data as $k => $v) {
  393. $key = $k;
  394. if (is_numeric($k)) {
  395. $key = 'data';
  396. }
  397. if (is_array($v)) {
  398. $xml .= "<{$key}>" . toXml($v) . "</{$key}>";
  399. continue;
  400. }
  401. if (is_string($v)) {
  402. $xml .= "<{$key}>{$v}</{$key}>";
  403. }
  404. }
  405. }
  406. return $xml;
  407. }
  408. function WriteLog($Log)
  409. {
  410. $logger = new Logger('LOGGS');
  411. $logURI = "Cache/log/" . date("Y-m-d-H-i") . ".log";
  412. $logger->pushHandler(new StreamHandler($logURI, Logger::DEBUG));
  413. $logger->pushHandler(new FirePHPHandler());
  414. $logger->addInfo(var_export($Log, 1));
  415. }
  416. /**
  417. * 计算当前用时
  418. *
  419. * @param string $runName
  420. * @param integer $return
  421. * @return void
  422. */
  423. function computeTime($runName = '', $return = 0, $start = 1)
  424. {
  425. $curTime = get_millisecond();
  426. $numTime = $curTime - (intval($GLOBALS['startTime']) * 1000);
  427. if ($return) {
  428. return array('curTime' => $curTime, 'numTime' => $numTime, 'runName' => $runName);
  429. } else {
  430. echo "<pre>执行{$runName} 功能,当前时间为:{$curTime},累积用时: {$numTime}</pre>";
  431. return;
  432. }
  433. }
  434. function get_millisecond()
  435. {
  436. list($usec, $sec) = explode(" ", microtime());
  437. $msec = round($usec * 1000);
  438. return $sec . $msec;
  439. }
  440. function toLog($text, $rewrite = 0)
  441. {
  442. $data = "=============" . date("Y-m-d H:i", time()) . "==========================================" . chr(13);
  443. $data .= var_export($text, 1) . chr(13);
  444. $data .= "======================================================================================" . chr(13);
  445. $data = iconv('utf-8', 'gb2312', $data);
  446. if ($rewrite) {
  447. file_put_contents(ROOT_PATH . '/logs.txt', $data);
  448. } else {
  449. file_put_contents(ROOT_PATH . '/logs.txt', $data, FILE_APPEND);
  450. }
  451. }
  452. /**
  453. * 发送数据到前台,根据请求的数据格式返回相应的数据
  454. * @param [type] $data [description]
  455. * @param string $status [description]
  456. * @param string $msg [description]
  457. */
  458. function Render($data, $status = "1", $msg = "", $method = '')
  459. {
  460. $format = S('CUR_RETURN_FORMAT');
  461. $msg = empty($msg) ? lang('errors', 'api')->get('error' . $status) : $msg;
  462. if (empty($format) || $format == 'json') {
  463. JsonReturn($data, $status, $msg);
  464. }
  465. if ($format == 'xml') {
  466. XmlReturn($data, $status, $msg);
  467. }
  468. exit;
  469. }
  470. function _beginTransaction()
  471. {
  472. S('DB')->beginTransaction();
  473. }
  474. function _rollBack()
  475. {
  476. S('DB')->rollBack();
  477. }
  478. function _commit()
  479. {
  480. S('DB')->commit();
  481. }
  482. /**
  483. * 服务
  484. *
  485. * @param string 服务名称
  486. * @param array $params
  487. * @return void
  488. */
  489. function SRV($name, $params = array())
  490. {
  491. return C()->get($name)->update($params);
  492. }
  493. /**
  494. * 是否验证token过期
  495. *
  496. * @return bool
  497. */
  498. function isCheckToken()
  499. {
  500. $result = true;
  501. $allowMethod = include ROOT_PATH . "/Config/AllowMethod.php";
  502. $key = S('CUR_PROJECT') . '/' . S('CUR_CONTROLLER') . '/' . S('CUR_METHOD');
  503. if ($allowMethod[$key] == 1) {
  504. $result = false;
  505. }
  506. return $result;
  507. }
  508. function checkPlatform()
  509. {
  510. if (isset($_GET['platform'])) {
  511. $_SESSION['platform'] = $_GET['platform'] == 'wap' ? 1 : 0;
  512. }
  513. if (isset($_GET['clearPlatform']) && intval($_GET['clearPlatform']) == 1) {
  514. $_SESSION['platform'] = null;
  515. }
  516. }
  517. function is_mobile()
  518. {
  519. if (isset($_SESSION['platform']) && $mobile = intval($_SESSION['platform']) > 0) {
  520. return $mobile == 1 ? true : false;
  521. }
  522. $user_agent = $_SERVER['HTTP_USER_AGENT'];
  523. $mobile_agents = Array("240x320", "acer", "acoon", "acs-", "abacho", "ahong", "airness", "alcatel", "amoi", "android", "anywhereyougo.com", "applewebkit/525", "applewebkit/532", "asus", "audio", "au-mic", "avantogo", "becker", "benq", "bilbo", "bird", "blackberry", "blazer", "bleu", "cdm-", "compal", "coolpad", "danger", "dbtel", "dopod", "elaine", "eric", "etouch", "fly ", "fly_", "fly-", "go.web", "goodaccess", "gradiente", "grundig", "haier", "hedy", "hitachi", "htc", "huawei", "hutchison", "inno", "ipad", "ipaq", "ipod", "jbrowser", "kddi", "kgt", "kwc", "lenovo", "lg ", "lg2", "lg3", "lg4", "lg5", "lg7", "lg8", "lg9", "lg-", "lge-", "lge9", "longcos", "maemo", "mercator", "meridian", "micromax", "midp", "mini", "mitsu", "mmm", "mmp", "mobi", "mot-", "moto", "nec-", "netfront", "newgen", "nexian", "nf-browser", "nintendo", "nitro", "nokia", "nook", "novarra", "obigo", "palm", "panasonic", "pantech", "philips", "phone", "pg-", "playstation", "pocket", "pt-", "qc-", "qtek", "rover", "sagem", "sama", "samu", "sanyo", "samsung", "sch-", "scooter", "sec-", "sendo", "sgh-", "sharp", "siemens", "sie-", "softbank", "sony", "spice", "sprint", "spv", "symbian", "tablet", "talkabout", "tcl-", "teleca", "telit", "tianyu", "tim-", "toshiba", "tsm", "up.browser", "utec", "utstar", "verykool", "virgin", "vk-", "voda", "voxtel", "vx", "wap", "wellco", "wig browser", "wii", "windows ce", "wireless", "xda", "xde", "zte");
  524. $is_mobile = false;
  525. foreach ($mobile_agents as $device) {
  526. if (stristr($user_agent, $device)) {
  527. $is_mobile = true;
  528. break;
  529. }
  530. }
  531. return $is_mobile;
  532. }
  533. function toDomain()
  534. {
  535. $domain = $_SERVER['HTTP_HOST'];
  536. $config = include ROOT_PATH . '/Config/Domain.php';
  537. $is_mobile = is_mobile();
  538. $curDomain = $old_domain = $domain;
  539. if (is_array($config) && count($config) > 0) {
  540. $domains = array();
  541. $domains[] = $domain;
  542. if ($is_mobile) {
  543. $domains[] = str_replace('www.', 'm.', $domain);
  544. $domains[] = 'm.' . $domain;
  545. } else {
  546. $domains[] = str_replace('m.', '', $domain);
  547. $domains[] = str_replace('m.', 'www.', $domain);
  548. }
  549. foreach ($domains as $key => $value) {
  550. if (isset($config[$value])) {
  551. $v = $config[$value];
  552. if ($v == 'pay') {
  553. return;
  554. }
  555. if ($is_mobile) {
  556. if ($v == 'pc') {
  557. continue;
  558. }
  559. } else {
  560. if ($v != 'pc') {
  561. continue;
  562. }
  563. }
  564. $curDomain = $value;
  565. // $_SESSION['domain']=$value;
  566. }
  567. }
  568. }
  569. // echo $curDomain;
  570. if ($is_mobile) {
  571. if (S('CUR_PROJECT') == 'Home') {
  572. header("Location:http://" . $curDomain . "/m");
  573. //header("Location:http://" . $curDomain . "/mobile-index/index");
  574. }
  575. } else {
  576. if (S('CUR_PROJECT') == 'Mobile') {
  577. header("Location:http://" . $curDomain . "/home-index/index");
  578. }
  579. }
  580. /**
  581. * 数据签名认证
  582. * @param array $data 被认证的数据
  583. * @return string 签名
  584. */
  585. function data_auth_sign($data)
  586. {
  587. //数据类型检测
  588. if (!is_array($data)) {
  589. $data = (array)$data;
  590. }
  591. ksort($data); //排序
  592. $code = http_build_query($data); //url编码并生成query字符串
  593. $sign = sha1($code); //生成签名
  594. return $sign;
  595. }
  596. /*
  597. * 判断用户是否登录
  598. * */
  599. function isLogin($str = '', $type = 'agent')
  600. {
  601. $session = $_SESSION[$type . 'Info'];
  602. if (empty($session)) {
  603. return null;
  604. }
  605. if ($type == 'agent') {
  606. if ($str == 'name') {
  607. return $session['agent_user'];
  608. }
  609. if ($str == 'uid') {
  610. return $session['user_identity'];
  611. }
  612. }
  613. }
  614. }
  615. function jump($url)
  616. {
  617. header('Location:' . $url);
  618. }
  619. //手机中间星号
  620. function phoneHide($phone)
  621. {
  622. if (!empty($phone)) {
  623. $phone = substr_replace($phone, '****', 3, 4);
  624. }
  625. return $phone;
  626. }
  627. /**
  628. * @param $game_code 球类代码
  629. * @param int $isJoin 是否用于join
  630. * @return array
  631. * @throws Exception
  632. * 根据球类代码 定义相关model
  633. */
  634. static function getModels($game_code, $isJoin = 1)
  635. {
  636. // 获取不同球类model
  637. if ($isJoin == 1) {
  638. switch ($game_code) {
  639. case 'zq':
  640. $model_league = new StZqLeague;
  641. $model_match = new StZqMatch;
  642. $model_odds = new StZqOdds;
  643. $model_odds_record = new StZqOddsRecord;
  644. $model_result = new StZqResult;
  645. $model_result_record = new StZqResultRecord;
  646. $model_league_result = new StZqLeagueResult;
  647. $model_local_league = new StZqLocalLeague;
  648. $model_local_match = new StZqLocalMatch;
  649. $model_broadcast = new StZqBroadcast;
  650. $model_result_express = new StZqResultExpress;
  651. break;
  652. case 'lq':
  653. $model_league = new StLqLeague;
  654. $model_match = new StLqMatch;
  655. $model_odds = new StLqOdds;
  656. $model_odds_record = new StLqOddsRecord;
  657. $model_result = new StLqResult;
  658. $model_result_record = new StLqResultRecord;
  659. $model_league_result = new StLqLeagueResult;
  660. $model_local_league = new StLqLocalLeague;
  661. $model_local_match = new StLqLocalMatch;
  662. $model_broadcast = new StLqBroadcast;
  663. $model_result_express = new StLqResultExpress;
  664. break;
  665. case 'wq':
  666. $model_league = new StWqLeague;
  667. $model_match = new StWqMatch;
  668. $model_odds = new StWqOdds;
  669. $model_odds_record = new StWqOddsRecord;
  670. $model_result = new StWqResult;
  671. $model_result_record = new StWqResultRecord;
  672. $model_league_result = new StWqLeagueResult;
  673. $model_local_league = new StWqLocalLeague;
  674. $model_local_match = new StWqLocalMatch;
  675. $model_broadcast = new StWqBroadcast;
  676. $model_result_express = new StWqResultExpress;
  677. break;
  678. case 'bq':
  679. $model_league = new StBqLeague;
  680. $model_match = new StBqMatch;
  681. $model_odds = new StBqOdds;
  682. $model_odds_record = new StBqOddsRecord;
  683. $model_result = new StBqResult;
  684. $model_result_record = new StBqResultRecord;
  685. $model_league_result = new StBqLeagueResult;
  686. $model_local_league = new StBqLocalLeague;
  687. $model_local_match = new StBqLocalMatch;
  688. $model_broadcast = new StBqBroadcast;
  689. $model_result_express = new StBqResultExpress;
  690. break;
  691. default:
  692. throw new \Exception(Response::generate(Response::ABNORMAL));
  693. }
  694. }
  695. $data = [
  696. 'model_league' => $model_league,//联赛
  697. 'model_match' => $model_match,//赛事
  698. 'model_odds' => $model_odds,//赔率
  699. 'model_result' => $model_result,//赛事结果
  700. 'model_odds_record' => $model_odds_record,//赔率记录
  701. 'model_result_record' => $model_result_record,//赛事结果记录
  702. 'model_league_result' => $model_league_result,//联赛结果
  703. 'model_local_league' => $model_local_league,//本地关联联赛
  704. 'model_local_match' => $model_local_match,//本地关联赛事
  705. 'model_broadcast' => $model_broadcast, //直播数据接口
  706. 'model_result_express' => $model_result_express,//赛果数据
  707. ];
  708. return $data;
  709. }
  710. /**
  711. * @param $type_code
  712. * @return array
  713. * @throws \Exception
  714. * 获取不同状态下的 查询条件
  715. */
  716. function getState($type_code, $model_match = '')
  717. {
  718. if ($model_match == '') {
  719. switch ($type_code) {
  720. case 'StRollBall'://滚球 正在进行
  721. $where = [
  722. ['status', '=', '1'],
  723. ];
  724. break;
  725. case 'StSoon'://即将 今日两小时内开始
  726. $where = [
  727. ['status', '=', '0'],
  728. ['match_date', '=', date("Y-m-d")],
  729. ['match_time', '<', date("H:i:s", strtotime("+2 hour"))],
  730. ['match_time', '>', date("H:i:s", time())]
  731. ];
  732. break;
  733. case 'StToday'://今日 今日未开始未结束
  734. $where = [
  735. ['match_date', '=', date("Y-m-d")],
  736. ['match_time', '>', date("H:i:s", time())],
  737. ];
  738. break;
  739. case 'StMorningPlate'://早盘
  740. $where = [
  741. ['is_morningplate', '=', 1],
  742. ['us_time', '>', $this->qgmdate('Y-m-d H:i:s', '', -4)],
  743. ];
  744. break;
  745. case 'StStringScene'://串场
  746. $where = [
  747. ['is_stringscene', '=', 1],
  748. ['us_time', '>', $this->qgmdate('Y-m-d H:i:s', '', -4)],
  749. ];
  750. break;
  751. case 'StChampion'://冠军
  752. $where = [
  753. 'type' => 1
  754. ];
  755. break;
  756. default:
  757. throw new \Exception(Render([], '10002', lang('Tips', 'Sports')->get('PARAM_ERROR')));
  758. }
  759. } else {
  760. switch ($type_code) {
  761. case 'StRollBall'://滚球 正在进行
  762. $where = [
  763. [$model_match . '.status', '=', '1'],
  764. ];
  765. break;
  766. case 'StSoon'://即将 今日两小时内开始
  767. $where = [
  768. [$model_match . '.status', '=', '0'],
  769. [$model_match . '.match_date', '=', date("Y-m-d")],
  770. [$model_match . '.match_time', '<', date("H:i:s", strtotime("+2 hour"))],
  771. [$model_match . '.match_time', '>', date("H:i:s", time())]
  772. ];
  773. break;
  774. case 'StToday'://今日 今日未开始未结束
  775. $where = [
  776. [$model_match . '.match_date', '=', date("Y-m-d")],
  777. [$model_match . '.match_time', '>', date("H:i:s", time())],
  778. ];
  779. break;
  780. case 'all'://所有赛事
  781. $where = [
  782. [$model_match . '.status', '<', '2'],
  783. ];
  784. break;
  785. case 'StMorningPlate'://早盘
  786. $where = [
  787. [$model_match . '.is_morningplate', '=', 1],
  788. [$model_match . '.us_time', '>', self::qgmdate('Y-m-d H:i:s', '', -4)],
  789. ];
  790. break;
  791. case 'StStringScene'://串场 查询串场状态为1 开赛时间大于当前时间
  792. $where = [
  793. [$model_match . '.is_stringscene', '=', 1],
  794. [$model_match . '.us_time', '>', self::qgmdate('Y-m-d H:i:s', '', -4)],
  795. ];
  796. break;
  797. case 'StChampion'://冠军
  798. $where = [
  799. 'type' => 1
  800. ];
  801. break;
  802. default:
  803. throw new \Exception(Render([], '10002', lang('Tips', 'Sports')->get('PARAM_ERROR')));
  804. }
  805. }
  806. return $where;
  807. }
  808. /**
  809. * @param $data
  810. * @return array
  811. * 处理当国家下无联赛数据 删除该数组
  812. */
  813. function handleArr($data)
  814. {
  815. $hData = [];
  816. foreach ($data as $key => $v) {
  817. if (empty($v['league_count'])) {
  818. $v = [];
  819. }
  820. $hData[] = $v;
  821. }
  822. foreach ($hData as $k => $v) {
  823. if (empty($v)) {
  824. unset($hData[$k]);
  825. }
  826. }
  827. foreach ($hData as $k => $v) {
  828. $v['league_count'] = array_values($v['league_count']);
  829. $hData[$k] = $v;
  830. }
  831. return array_values($hData);
  832. }
  833. /**
  834. * @param $arr
  835. * @param $key
  836. * @return array
  837. * 去除二维数组重复项
  838. */
  839. function array_unset_tt($arr, $key)
  840. {
  841. //建立一个目标数组
  842. $res = array();
  843. foreach ($arr as $value) {
  844. //查看有没有重复项
  845. if (isset($res[$value[$key]])) {
  846. unset($value[$key]); //有:销毁
  847. } else {
  848. $res[$value[$key]] = $value;
  849. }
  850. }
  851. return $res;
  852. }
  853. /**
  854. * 处理冠军盘口 数组结构
  855. */
  856. function array_gj_tt($data, $oddsData)
  857. {
  858. foreach ($data as $k => &$v) {
  859. foreach ($v['league_count'] as $kk => &$vv) {
  860. foreach ($oddsData as $kkk => $vvv) {
  861. if ($vv['lg_id'] == $vvv['lg_id']) {
  862. $vv['oddsData'][] = $vvv;
  863. }
  864. }
  865. if ($vv['oddsData']) {
  866. $vv['oddsData'] = $this->array_unset_tt($vv['oddsData'], 'p_code');
  867. $vv['count'] = count($vv['oddsData']);
  868. unset($vv['oddsData']);
  869. }
  870. if (count($vv) == 5) {
  871. unset($v['league_count'][$kk]);
  872. }
  873. }
  874. $v['league_count'] = array_values($v['league_count']);
  875. if (empty($v['league_count'])) {
  876. unset($data[$k]);
  877. }
  878. }
  879. return array_values($data);
  880. }
  881. /**
  882. * 处理冠军以外 数组结构
  883. */
  884. function array_other_tt($data, $matchData)
  885. {
  886. foreach ($data as $k => &$v) {
  887. foreach ($v['league_count'] as $kk => &$vv) {
  888. foreach ($matchData as $kkk => $vvv) {
  889. if ($vv['lg_id'] == $vvv['lg_id']) {
  890. $vv['matchData'][] = $vvv;
  891. }
  892. }
  893. if ($vv['matchData']) {
  894. $vv['matchData'] = $this->array_unset_tt($vv['matchData'], 'match_id');
  895. $vv['count'] = count($vv['matchData']);
  896. unset($vv['matchData']);
  897. }
  898. if (count($vv) == 5) {
  899. unset($v['league_count'][$kk]);
  900. }
  901. }
  902. $v['league_count'] = array_values($v['league_count']);
  903. if (empty($v['league_count'])) {
  904. unset($data[$k]);
  905. }
  906. }
  907. return array_values($data);
  908. }
  909. /**
  910. * 时间格式化
  911. * @param string $dateformat 时间格式
  912. * @param int $timestamp 时间戳
  913. * @param int $timeoffset 时区偏差 默认8 北京时间 -4美东时间
  914. * @return string
  915. */
  916. public static function qgmdate($dateformat = 'Y-m-d H:i:s', $timestamp = '', $timeoffset = 8, $type = '')
  917. {
  918. if (empty($timestamp)) {
  919. $timestamp = time();
  920. }
  921. $result = gmdate($dateformat, $timestamp + $timeoffset * 3600);
  922. return $result;
  923. }
  924. /**
  925. * 判断二维数组是否包含一维数组
  926. * @param mixed $arr 查询条件
  927. * @param mixed $arrs 运动类型
  928. * @return string
  929. */
  930. function judgeEqual($arr, $arrs)
  931. {
  932. foreach ($arrs as $value) {
  933. if (count($value) === count($arr)) {
  934. $a = 0;
  935. foreach ($value as $key => $v) {
  936. $a++;
  937. if ($v != $arr[$key]) {
  938. break;
  939. }
  940. if ($a == count($key)) { // 到最后一个元素都没有出现不相等,就说明这两个数组相等。
  941. return true;
  942. }
  943. }
  944. }
  945. }
  946. return false;
  947. }
  948. // 排列
  949. function arrangement($a, $m)
  950. {
  951. $r = array();
  952. $n = count($a);
  953. if ($m <= 0 || $m > $n) {
  954. return $r;
  955. }
  956. for ($i = 0; $i < $n; $i++) {
  957. $b = $a;
  958. $t = array_splice($b, $i, 1);
  959. if ($m == 1) {
  960. $r[] = $t;
  961. } else {
  962. $c = $this->arrangement($b, $m - 1);
  963. foreach ($c as $v) {
  964. $r[] = array_merge($t, $v);
  965. }
  966. }
  967. }
  968. return $r;
  969. }
  970. // 组合
  971. function combination($a, $m)
  972. {
  973. $r = array();
  974. $n = count($a);
  975. if ($m <= 0 || $m > $n) {
  976. return $r;
  977. }
  978. for ($i = 0; $i < $n; $i++) {
  979. $t = array($a[$i]);
  980. if ($m == 1) {
  981. $r[] = $t;
  982. } else {
  983. $b = array_slice($a, $i + 1);
  984. $c = $this->combination($b, $m - 1);
  985. foreach ($c as $v) {
  986. $r[] = array_merge($t, $v);
  987. }
  988. }
  989. }
  990. return $r;
  991. }
  992. // 阶乘
  993. function factorial($n)
  994. {
  995. return array_product(range(1, $n));
  996. }
  997. // 排列数
  998. function A1($n, $m)
  999. {
  1000. return factorial($n) / factorial($n - $m);
  1001. }
  1002. // 组合数
  1003. function C1($n, $m)
  1004. {
  1005. return A1($n, $m) / factorial($m);
  1006. }
  1007. /**
  1008. * @param $lg_id 数据源 联赛id
  1009. * @param $source 数据源
  1010. * @param $lg_data 本地关联记录
  1011. * @return bool|mixed 成功 返回本地联赛id
  1012. *
  1013. * 验证本地联赛中是否存在 用于写入联赛/赛事数据验证
  1014. */
  1015. static function ver_league($lg_id, $source, $lg_data)
  1016. {
  1017. foreach ($lg_data as $item) {
  1018. if (!is_array($item)) return false;
  1019. if ($item['others_lg_id'] == $lg_id and $item['source'] == $source) return $item['lg_id'];
  1020. }
  1021. return false;
  1022. }
  1023. /**
  1024. * @param $match_id 数据源 赛事id
  1025. * @param $source 数据源
  1026. * @param $match_data 本地赛事记录
  1027. * @return bool|mixed 成功返回本地赛事id
  1028. * 验证本地赛事记录是否存在
  1029. */
  1030. static function ver_match($match_id, $source, $match_data)
  1031. {
  1032. foreach ($match_data as $item) {
  1033. if (!is_array($item)) return false;
  1034. if ($item['others_match_id'] == $match_id and $item['source'] == $source) return $item['match_id'];
  1035. }
  1036. return false;
  1037. }
  1038. /**
  1039. * @param $sole 唯一标识
  1040. * @param $source 数据源
  1041. * @param $odds_data 赔率数据
  1042. * @return bool|mixed 成功返回 赔率id
  1043. * 验证赔率
  1044. */
  1045. static function ver_odds($sole, $source, $odds_data)
  1046. {
  1047. foreach ($odds_data as $item) {
  1048. if (!is_array($item)) return false;
  1049. if ($item['sole'] == $sole and $item['source'] == $source) return $item['id'];
  1050. }
  1051. return false;
  1052. }
  1053. /**
  1054. * @param $odds_only 匹配更新
  1055. * @param $source 数据源
  1056. * @param $odds_record_data 赔率记录数据
  1057. * @return bool|mixed 成功返回 赔率记录id
  1058. * 验证赔率记录
  1059. */
  1060. static function ver_odds_record($odds_only, $source, $odds_record_data)
  1061. {
  1062. foreach ($odds_record_data as $item) {
  1063. if (!is_array($item)) return false;
  1064. if ($item['odds_only'] == $odds_only and $item['source'] == $source) return $item['id'];
  1065. }
  1066. return false;
  1067. }
  1068. /**
  1069. * 二维数组根据某个字段去重
  1070. * @param array $array 二维数组
  1071. * @para array 去重后的数组
  1072. */
  1073. static function uniquArr($array, $key)
  1074. {
  1075. $result = array();
  1076. foreach ($array as $k => $val) {
  1077. $code = false;
  1078. foreach ($result as $_val) {
  1079. if ($_val[$key] == $val[$key]) {
  1080. $code = true;
  1081. break;
  1082. }
  1083. }
  1084. if (!$code) {
  1085. $result[] = $val;
  1086. }
  1087. }
  1088. return $result;
  1089. }
  1090. /**
  1091. * 二维数组 按指定键去重
  1092. */
  1093. static function uniquArrV2($array, $key)
  1094. {
  1095. $result = [];
  1096. foreach ($array as $val) {
  1097. $keyval = $val[$key];
  1098. if (!isset($result[$keyval])) {
  1099. $result[$keyval] = $val;
  1100. }
  1101. }
  1102. return array_values($result);
  1103. }
  1104. /**
  1105. * 按字段 搜索 二维数组
  1106. */
  1107. static function searcharray($value, $key, $array, $r_key = '')
  1108. {
  1109. foreach ($array as $k => $val) {
  1110. if ($val[$key] == $value) {
  1111. return $val[$r_key];
  1112. }
  1113. }
  1114. return null;
  1115. }
  1116. /**
  1117. * 滚球投注 危险球审核
  1118. * $bet_match 投注赛事数据
  1119. * $result_match_r 投注赛事结果记录
  1120. */
  1121. static function WARN_CHECK($bet_match = '', $result_match = [])
  1122. {
  1123. /*
  1124. 危险球定义:
  1125. 1.角球
  1126. 2. 12码罚球
  1127. 3.自由球(攻方在守方禁区附近的自由球)
  1128. 4.掷入球(攻方靠近守方禁区的掷入球)
  1129. 5.一队向另一队禁区附近进攻
  1130. ...
  1131. 危险球审核时间:
  1132. 下注成功后60~90秒
  1133. */
  1134. $defdata = [
  1135. 'code' => 1,
  1136. 'warn_more' => '',
  1137. ];
  1138. if (!empty($bet_match) and !empty($result_match)) {
  1139. //获取投注时间 时间戳
  1140. $bet_time = strtotime($bet_match->ctime);
  1141. //取出所有有危险球的数据
  1142. $warn_more = trim($result_match[0]->warn_more);
  1143. //当值为默认值时,表示没有危险球,不用再作判断了
  1144. if ($warn_more == '[{"timei":"1970-1-1 0:0:1","rtype":0}]' || $warn_more == '' || $warn_more == '[]') {
  1145. return $defdata;
  1146. }
  1147. //json转数组
  1148. $warn_more = json_decode($warn_more, true);
  1149. foreach ($warn_more as $k => $v) {
  1150. //获取危险球出现时间 转时间戳
  1151. $warn_time = strtotime($v['timei']);
  1152. if (($warn_time - $bet_time) < 90 && ($warn_time - $bet_time) >= 0) {
  1153. $data = [
  1154. 'code' => -1,
  1155. 'warn_more' => $v
  1156. ];
  1157. return $data;
  1158. }
  1159. }
  1160. return $defdata;
  1161. }
  1162. }
  1163. //写入赛事数据日志文件
  1164. static function SET_SPORTS_RECORD($game_code, $getData = [], $title, $msg)
  1165. {
  1166. //中文不转义
  1167. $json_data = json_encode($getData, JSON_UNESCAPED_UNICODE);
  1168. Log::getMonolog()->popHandler();
  1169. Log::useFiles(storage_path('logs/set_sports_record/' . date('Y-m-d', time()) . '/' . $game_code . '/' . $title . '.log'), 'info');
  1170. Log::info('--->msg:' . $msg . ';data:' . $json_data);
  1171. }
  1172. //写入赛事数据日志文件
  1173. static function SET_NOMAM_RECORD($msg, $getData = [], $fileName = '')
  1174. {
  1175. $json_data = json_encode($getData, JSON_UNESCAPED_UNICODE);
  1176. Log::getMonolog()->popHandler();
  1177. if ($fileName) {
  1178. $lastfileName = date('Y-m', time()) . '_' . $fileName . '.log';
  1179. } else {
  1180. $lastfileName = date('Y-m', time()) . '.log';
  1181. }
  1182. Log::useFiles(storage_path('logs/' . $lastfileName), 'info');
  1183. Log::info($msg . ' -- ' . $json_data);
  1184. }
  1185. /*
  1186. * 根据二维数组某个字段的值查找数组
  1187. * $array 数组
  1188. * 查询字段
  1189. * $value 字段值
  1190. */
  1191. static function filter_by_value($array_l, $index, $value)
  1192. {
  1193. $data_json = json_encode($array_l);
  1194. $array = json_decode($data_json, true);
  1195. if (is_array($array) && count($array) > 0) {
  1196. foreach (array_keys($array) as $key) {
  1197. $temp[$key] = $array[$key][$index];
  1198. if ($temp[$key] == $value) {
  1199. $newarray = $array[$key];
  1200. return $newarray;
  1201. }
  1202. }
  1203. }
  1204. return [];
  1205. }
  1206. //http 请求
  1207. public static function https_request($curl, $data=null, $https=true, $method='post'){
  1208. $ch = curl_init();//初始化
  1209. curl_setopt($ch, CURLOPT_URL, $curl);//设置访问的URL
  1210. curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
  1211. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
  1212. if($https){
  1213. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不做服务器认证
  1214. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不做客户端认证
  1215. }
  1216. if($method == 'post'){
  1217. curl_setopt($ch, CURLOPT_POST, true);//设置请求是POST方式
  1218. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置POST请求的数据
  1219. }
  1220. $str = curl_exec($ch);//执行访问,返回结果
  1221. curl_close($ch);//关闭curl,释放资源
  1222. return $str;
  1223. }
  1224. //根据球类追加限定玩法
  1225. public static function getOddsPcode($game_code = 'zq'){
  1226. $p_code = [];
  1227. if($game_code == 'zq'){
  1228. $p_code = ['C','B','TG','CB','TB','GS','CO','TS'];
  1229. }
  1230. if($game_code == 'lq'){
  1231. $p_code = ['LN','C','TN','TS','TB','CO'];
  1232. }
  1233. if($game_code == 'wq'){
  1234. $p_code = ['LB','TN','TS','B','LD','C'];
  1235. }
  1236. if($game_code == 'bq'){
  1237. $p_code = ['CO','C','TN','TS'];
  1238. }
  1239. return $p_code;
  1240. }
  1241. /**
  1242. * 赛事下注单作废处理
  1243. */
  1244. public static function HandleInvalid($data=[],$match_id='',$match_status='',$game_code=''){
  1245. //===作废处理===
  1246. $moneyBuyMatch = new \App\Models\MoneyBuyMatch();
  1247. //获取赛事下所有单式注单
  1248. $select = ['money_buy_simplex.order_id', 'money_buy_simplex.match_id', 'money_buy_simplex.account_identity', 'money_buy_simplex.account_name','money_buy_simplex.money', 'money_buy_simplex.gain_money', 'money_buy_simplex.status', 'money_buy_simplex.settle_status', 'money_buy_simplex.game_status', 'money_buy_simplex.batch_id','money_buy_match.odds_code','money_buy_match.result','st_odds_code.odds_name'];
  1249. //obj
  1250. $match_order_sim_obj = $moneyBuyMatch->allsimplexorder($match_id,$game_code,$select);
  1251. //获取赛事下所有串式注单
  1252. $select = ['money_buy_str.order_id', 'money_buy_match.match_id', 'money_buy_str.account_identity', 'money_buy_str.account_name','money_buy_str.money', 'money_buy_str.gain_money','money_buy_str.status','money_buy_str.settle_status','money_buy_str.game_status','st_odds_code.odds_name','money_buy_match.odds_code','money_buy_match.result',];
  1253. //obj
  1254. $match_order_str_obj = $moneyBuyMatch->allstrorder($match_id,$game_code,$select);
  1255. //如果赛事下有 单式 注单
  1256. $oddsData_sim = [];
  1257. $oddsData_sim_settle = [];
  1258. if(count($match_order_sim_obj) > 0 ){
  1259. //获取单式注单中 待处理注单
  1260. $oddsData_sim = self::getOrderData($data,$match_order_sim_obj,$game_code);
  1261. $oddsData_sim_settle = $oddsData_sim['settle'];
  1262. $oddsData_sim = $oddsData_sim['invalid'];
  1263. }
  1264. //如果赛事下有 串式 注单
  1265. $oddsData_str = [];
  1266. $oddsData_str_settle = [];
  1267. if(count($match_order_str_obj) > 0){
  1268. //获取串式注单中 待处理注单
  1269. $oddsData_str = self::getOrderData($data,$match_order_str_obj,$game_code);
  1270. $oddsData_str_settle = $oddsData_str['settle'];
  1271. $oddsData_str = $oddsData_str['invalid'];
  1272. }
  1273. //修改赛事结果后注单状态修改为未结算
  1274. $upapp = new \App\Models\SportsNoteList();
  1275. $upapp->settleorder($match_id,$oddsData_sim_settle,$oddsData_str_settle,$game_code);
  1276. //如果是已结算赛事
  1277. if($match_status == 3){
  1278. //合并上半场/全场 待处理 单式+串式订单
  1279. $oddsData = array_merge($oddsData_sim,$oddsData_str);
  1280. //去重
  1281. $oddsData = self::uniquArrV2($oddsData,'order_id');
  1282. if(count($oddsData) > 0){
  1283. $url = 'http://stadmin.bocai108.com:9094/UnsetOneOrder';
  1284. $data_up = [
  1285. 'token'=>session('adminInfo.token'),
  1286. 'game_code'=>$game_code,
  1287. 'match_id'=>$match_id,
  1288. ];
  1289. //返回请求状态码
  1290. $set_status = [];
  1291. foreach($oddsData as $k=>$v){
  1292. $data_up['order_id'] = $v['order_id'];
  1293. $ret_json = self::https_request($url,$data_up);
  1294. $ret_arr = json_decode($ret_json,true);
  1295. $set_status[] = $ret_arr['status'];
  1296. }
  1297. //如果返回结果中有 0,则返回失败
  1298. if(in_array(0,$set_status)){
  1299. return responseToJson(-20003);
  1300. }
  1301. }
  1302. }else{
  1303. //未结算赛事 处理 下单式注单作废,串关注单下此赛事按平局处理
  1304. if(count($oddsData_str) > 0){
  1305. $oddsData_str = $oddsData_str;
  1306. }
  1307. $type = 1;
  1308. $upapp->delorder($match_id,$game_code,$oddsData_sim,$oddsData_str,$type);
  1309. }
  1310. //=== end ===
  1311. }
  1312. /**
  1313. * 获取赛事下 符合条件 待处理注单
  1314. */
  1315. public static function getOrderData($data,$match_order,$game_code){
  1316. //===足球===
  1317. if($game_code == 'zq'){
  1318. //上半场(作废)
  1319. $matchOdds_h = [];
  1320. //上半场(待结算)
  1321. $matchOdds_half = [];
  1322. //全场(作废)
  1323. $matchOdds_f = [];
  1324. //全场(待结算)
  1325. $matchOdds_fall = [];
  1326. foreach($match_order as $k=>$v){
  1327. //上半场条件
  1328. if($data['half']['home'] == -1 and $data['half']['guest'] == -1){
  1329. if($v->status == 1){
  1330. $matchOdds_h[] = self::getOrderJC('上半场',$v);
  1331. }
  1332. }else{
  1333. $matchOdds_half[] = self::getOrderJC('上半场',$v);
  1334. }
  1335. //全场条件
  1336. if($data['all']['home'] == -1 and $data['all']['guest'] == -1){
  1337. if($v->status == 1){
  1338. $matchOdds_f[] = self::getOrderJC('全场',$v);
  1339. }
  1340. }
  1341. else{
  1342. $matchOdds_fall[] = self::getOrderJC('全场',$v);
  1343. }
  1344. }
  1345. //合并待处理 注单
  1346. $orderData['invalid'] = array_merge($matchOdds_h,$matchOdds_f);
  1347. $orderData['settle'] = array_merge($matchOdds_half,$matchOdds_fall);
  1348. }
  1349. //====end===
  1350. //==篮球===
  1351. if($game_code == 'lq'){
  1352. //第一节(作废)
  1353. $matchOdds_o = [];
  1354. //第一节(待结算)
  1355. $matchOdds_one = [];
  1356. //第二节(作废)
  1357. $matchOdds_t = [];
  1358. //第二节(待结算)
  1359. $matchOdds_two = [];
  1360. //第三节(作废)
  1361. $matchOdds_s = [];
  1362. //第三节(待结算)
  1363. $matchOdds_three = [];
  1364. //第四节(作废)
  1365. $matchOdds_f = [];
  1366. //第四节(待结算)
  1367. $matchOdds_four = [];
  1368. //上半场(作废)
  1369. $matchOdds_hh = [];
  1370. //上半场(待结算)
  1371. $matchOdds_half = [];
  1372. //下半场(作废)
  1373. $matchOdds_ll = [];
  1374. //下半场(待结算)
  1375. $matchOdds_next = [];
  1376. //全场(作废)
  1377. $matchOdds_ff = [];
  1378. //全场(待结算)
  1379. $matchOdds_fall = [];
  1380. foreach($match_order as $k=>$v){
  1381. //第一节条件
  1382. if($data[1]['home'] == -1 and $data[1]['guest'] == -1){
  1383. if($v->status == 1){
  1384. $matchOdds_o[] = self::getOrderJC('一节',$v);
  1385. }
  1386. }else{
  1387. $matchOdds_one[] = self::getOrderJC('一节',$v);
  1388. }
  1389. //第二节条件
  1390. if($data[2]['home'] == -1 and $data[2]['guest'] == -1){
  1391. if($v->status == 1){
  1392. $matchOdds_t[] = self::getOrderJC('二节',$v);
  1393. }
  1394. }else{
  1395. $matchOdds_two[] = self::getOrderJC('二节',$v);
  1396. }
  1397. //第三节条件
  1398. if($data[3]['home'] == -1 and $data[3]['guest'] == -1){
  1399. if($v->status == 1){
  1400. $matchOdds_s[] = self::getOrderJC('三节',$v);
  1401. }
  1402. }else{
  1403. $matchOdds_three[] = self::getOrderJC('三节',$v);
  1404. }
  1405. //第四节条件
  1406. if($data[4]['home'] == -1 and $data[4]['guest'] == -1){
  1407. if($v->status == 1){
  1408. $matchOdds_f[] = self::getOrderJC('四节',$v);
  1409. }
  1410. }else{
  1411. $matchOdds_four[] = self::getOrderJC('四节',$v);
  1412. }
  1413. //上半场条件
  1414. if($data[5]['home'] == -1 and $data[5]['guest'] == -1){
  1415. if($v->status == 1){
  1416. $matchOdds_hh[] = self::getOrderJC('上半场',$v);
  1417. }
  1418. }else{
  1419. $matchOdds_half[] = self::getOrderJC('上半场',$v);
  1420. }
  1421. //下半场条件
  1422. if($data[6]['home'] == -1 and $data[6]['guest'] == -1){
  1423. if($v->status == 1){
  1424. $matchOdds_ll[] = self::getOrderJC('下半场',$v);
  1425. }
  1426. }else{
  1427. $matchOdds_next[] = self::getOrderJC('下半场',$v);
  1428. }
  1429. //全场条件
  1430. if($data['all']['home'] == -1 and $data['all']['guest'] == -1){
  1431. if($v->status == 1){
  1432. $matchOdds_ff[] = self::getOrderJC('全场',$v);
  1433. $matchOdds_ff[] = self::getOrderJC('最后一位数',$v);
  1434. }
  1435. }else{
  1436. $matchOdds_fall[] = self::getOrderJC('全场',$v);
  1437. $matchOdds_fall[] = self::getOrderJC('最后一位数',$v);
  1438. }
  1439. }
  1440. //合并待处理 注单
  1441. $orderData['invalid'] = array_merge($matchOdds_o,$matchOdds_t,$matchOdds_s,$matchOdds_f,$matchOdds_hh,$matchOdds_ll,$matchOdds_ff);
  1442. $orderData['settle'] = array_merge($matchOdds_one,$matchOdds_two,$matchOdds_three,$matchOdds_four,$matchOdds_half,$matchOdds_next,$matchOdds_fall);
  1443. }
  1444. //===end===
  1445. //===网球===
  1446. if($game_code == 'wq'){
  1447. //第一盘(作废)
  1448. $matchOdds_o = [];
  1449. //第一盘(待结算)
  1450. $matchOdds_one = [];
  1451. //第二盘(作废)
  1452. $matchOdds_t = [];
  1453. //第二盘(待结算)
  1454. $matchOdds_two = [];
  1455. //第三盘(作废)
  1456. $matchOdds_s = [];
  1457. //第三盘(待结算)
  1458. $matchOdds_three = [];
  1459. //第四盘(作废)
  1460. $matchOdds_fo = [];
  1461. //第四盘(待结算)
  1462. $matchOdds_four = [];
  1463. //第五盘(作废)
  1464. $matchOdds_fi = [];
  1465. //第五盘(待结算)
  1466. $matchOdds_five = [];
  1467. //全场(作废)
  1468. $matchOdds_ff = [];
  1469. //全场(待结算)
  1470. $matchOdds_fall = [];
  1471. foreach($match_order as $k=>$v){
  1472. //第一盘条件
  1473. if($data[1]['home'] == -1 and $data[1]['guest'] == -1){
  1474. if($v->status == 1){
  1475. $matchOdds_o[] = self::getOrderJC('一盘',$v);
  1476. }
  1477. }else{
  1478. $matchOdds_one[] = self::getOrderJC('一盘',$v);
  1479. }
  1480. //第二盘条件
  1481. if($data[2]['home'] == -1 and $data[2]['guest'] == -1){
  1482. if($v->status == 1){
  1483. $matchOdds_t[] = self::getOrderJC('二盘',$v);
  1484. }
  1485. }else{
  1486. $matchOdds_two[] = self::getOrderJC('二盘',$v);
  1487. }
  1488. //第三盘条件
  1489. if($data[3]['home'] == -1 and $data[3]['guest'] == -1){
  1490. if($v->status == 1){
  1491. $matchOdds_s[] = self::getOrderJC('三盘',$v);
  1492. }
  1493. }else{
  1494. $matchOdds_three[] = self::getOrderJC('三盘',$v);
  1495. }
  1496. //第四盘条件
  1497. if($data[4]['home'] == -1 and $data[4]['guest'] == -1){
  1498. if($v->status == 1){
  1499. $matchOdds_fo[] = self::getOrderJC('四盘',$v);
  1500. }
  1501. }else{
  1502. $matchOdds_four[] = self::getOrderJC('四盘',$v);
  1503. }
  1504. //第五盘条件
  1505. if($data[5]['home'] == -1 and $data[5]['guest'] == -1){
  1506. if($v->status == 1){
  1507. $matchOdds_fi[] = self::getOrderJC('五盘',$v);
  1508. }
  1509. }else{
  1510. $matchOdds_five[] = self::getOrderJC('五盘',$v);
  1511. }
  1512. //全场条件
  1513. if($data['all']['home'] == -1 and $data['all']['guest'] == -1){
  1514. if($v->status == 1){
  1515. $matchOdds_ff[] = self::getOrderJC('让盘',$v);
  1516. $matchOdds_ff[] = self::getOrderJC('让局',$v);
  1517. $matchOdds_ff[] = self::getOrderJC('总局数',$v);
  1518. $matchOdds_ff[] = self::getOrderJC('冠军',$v);
  1519. }
  1520. }else{
  1521. $matchOdds_fall[] = self::getOrderJC('让盘',$v);
  1522. $matchOdds_fall[] = self::getOrderJC('让局',$v);
  1523. $matchOdds_fall[] = self::getOrderJC('总局数',$v);
  1524. $matchOdds_fall[] = self::getOrderJC('冠军',$v);
  1525. }
  1526. }
  1527. //合并待处理 注单
  1528. $orderData['invalid'] = array_merge($matchOdds_o,$matchOdds_t,$matchOdds_s,$matchOdds_fo,$matchOdds_fi,$matchOdds_ff);
  1529. $orderData['settle'] = array_merge($matchOdds_one,$matchOdds_two,$matchOdds_three,$matchOdds_four,$matchOdds_five,$matchOdds_fall);
  1530. }
  1531. //===end===
  1532. //===棒球===
  1533. if($game_code == 'bq'){
  1534. //第一局(作废)
  1535. $matchOdds_o = [];
  1536. //第一局(待结算)
  1537. $matchOdds_one = [];
  1538. //第二局(作废)
  1539. $matchOdds_t = [];
  1540. //第二局(待结算)
  1541. $matchOdds_two = [];
  1542. //第三局(作废)
  1543. $matchOdds_th = [];
  1544. //第三局(待结算)
  1545. $matchOdds_three = [];
  1546. //第四局(作废)
  1547. $matchOdds_fo = [];
  1548. //第四局(待结算)
  1549. $matchOdds_four = [];
  1550. //第五局(作废)
  1551. $matchOdds_fi = [];
  1552. //第五局(待结算)
  1553. $matchOdds_five = [];
  1554. //第六局(作废)
  1555. $matchOdds_si = [];
  1556. //第六局(待结算)
  1557. $matchOdds_six = [];
  1558. //第七局(作废)
  1559. $matchOdds_se = [];
  1560. //第七局(待结算)
  1561. $matchOdds_seven = [];
  1562. //第八局(作废)
  1563. $matchOdds_e = [];
  1564. //第八局(待结算)
  1565. $matchOdds_eight = [];
  1566. //第九局(作废)
  1567. $matchOdds_n = [];
  1568. //第九局(待结算)
  1569. $matchOdds_nine = [];
  1570. //其他(作废)
  1571. $matchOdds_ot = [];
  1572. //其他(待结算)
  1573. $matchOdds_other = [];
  1574. //前五局(作废)
  1575. $matchOdds_five = [];
  1576. //前五局(待结算)
  1577. $matchOdds_fives = [];
  1578. //全场(作废)
  1579. $matchOdds_ff = [];
  1580. //全场(待结算)
  1581. $matchOdds_fall = [];
  1582. foreach($match_order as $k=>$v){
  1583. //第一局条件
  1584. if($data[1]['home'] == -1 and $data[1]['guest'] == -1){
  1585. if($v->status == 1){
  1586. $matchOdds_o[] = self::getOrderJC('第一局',$v);
  1587. }
  1588. }else{
  1589. $matchOdds_one[] = self::getOrderJC('第一局',$v);
  1590. }
  1591. //第二局条件
  1592. if($data[2]['home'] == -1 and $data[2]['guest'] == -1){
  1593. if($v->status == 1){
  1594. $matchOdds_t[] = self::getOrderJC('第二局',$v);
  1595. }
  1596. }else{
  1597. $matchOdds_two[] = self::getOrderJC('第二局',$v);
  1598. }
  1599. //第三局条件
  1600. if($data[3]['home'] == -1 and $data[3]['guest'] == -1){
  1601. if($v->status == 1){
  1602. $matchOdds_th[] = self::getOrderJC('第三局',$v);
  1603. }
  1604. }else{
  1605. $matchOdds_three[] = self::getOrderJC('第三局',$v);
  1606. }
  1607. //第四局条件
  1608. if($data[4]['home'] == -1 and $data[4]['guest'] == -1){
  1609. if($v->status == 1){
  1610. $matchOdds_fo[] = self::getOrderJC('第四局',$v);
  1611. }
  1612. }else{
  1613. $matchOdds_four[] = self::getOrderJC('第四局',$v);
  1614. }
  1615. //第五局条件
  1616. if($data[5]['home'] == -1 and $data[5]['guest'] == -1){
  1617. if($v->status == 1){
  1618. $matchOdds_fi[] = self::getOrderJC('第五局',$v);
  1619. }
  1620. }else{
  1621. $matchOdds_five[] = self::getOrderJC('第五局',$v);
  1622. }
  1623. //第六局条件
  1624. if($data[6]['home'] == -1 and $data[6]['guest'] == -1){
  1625. if($v->status == 1){
  1626. $matchOdds_si[] = self::getOrderJC('第六局',$v);
  1627. }
  1628. }else{
  1629. $matchOdds_six[] = self::getOrderJC('第六局',$v);
  1630. }
  1631. //第七局条件
  1632. if($data[7]['home'] == -1 and $data[7]['guest'] == -1){
  1633. if($v->status == 1){
  1634. $matchOdds_se[] = self::getOrderJC('第七局',$v);
  1635. }
  1636. }else{
  1637. $matchOdds_seven[] = self::getOrderJC('第七局',$v);
  1638. }
  1639. //第八局条件
  1640. if($data[8]['home'] == -1 and $data[8]['guest'] == -1){
  1641. if($v->status == 1){
  1642. $matchOdds_e[] = self::getOrderJC('第八局',$v);
  1643. }
  1644. }else{
  1645. $matchOdds_eight[] = self::getOrderJC('第八局',$v);
  1646. }
  1647. //第九局条件
  1648. if($data[9]['home'] == -1 and $data[9]['guest'] == -1){
  1649. if($v->status == 1){
  1650. $matchOdds_n[] = self::getOrderJC('第九局',$v);
  1651. }
  1652. }else{
  1653. $matchOdds_nine[] = self::getOrderJC('第九局',$v);
  1654. }
  1655. //其他条件
  1656. if($data['other']['home'] == -1 and $data['other']['guest'] == -1){
  1657. if($v->status == 1){
  1658. $matchOdds_ot[] = self::getOrderJC('其他',$v);
  1659. }
  1660. }else{
  1661. $matchOdds_other[] = self::getOrderJC('其他',$v);
  1662. }
  1663. //前五局条件
  1664. if($data['five']['home'] == -1 and $data['five']['guest'] == -1){
  1665. if($v->status == 1){
  1666. $matchOdds_five[] = self::getOrderJC('前5局',$v);
  1667. }
  1668. }else{
  1669. $matchOdds_fives[] = self::getOrderJC('前5局',$v);
  1670. }
  1671. //全场条件
  1672. if($data['all']['home'] == -1 and $data['all']['guest'] == -1){
  1673. if($v->status == 1){
  1674. $matchOdds_ff[] = self::getOrderJC('全场',$v);
  1675. }
  1676. }else{
  1677. $matchOdds_fall[] = self::getOrderJC('全场',$v);
  1678. }
  1679. }
  1680. //合并待处理 注单
  1681. $orderData['invalid'] = array_merge($matchOdds_o,$matchOdds_t,$matchOdds_th,$matchOdds_fo,$matchOdds_fi,$matchOdds_si,$matchOdds_se,$matchOdds_e,$matchOdds_n,$matchOdds_ot,$matchOdds_five,$matchOdds_ff);
  1682. $orderData['settle'] = array_merge($matchOdds_one,$matchOdds_two,$matchOdds_three,$matchOdds_four,$matchOdds_five,$matchOdds_six,$matchOdds_seven,$matchOdds_eight,$matchOdds_nine,$matchOdds_other,$matchOdds_fives,$matchOdds_fall);
  1683. }
  1684. //===end===
  1685. return $orderData;
  1686. }
  1687. /**
  1688. * 匹配各进程注单
  1689. * $str str 搜索关键字
  1690. * $v arr 注单数据
  1691. */
  1692. public static function getOrderJC($str,$v){
  1693. $tmparray = explode($str,$v->odds_name);
  1694. if(count($tmparray) > 1){
  1695. return $v;
  1696. }
  1697. }
  1698. /**
  1699. * 匹配字符串中 是否包含某个字符串
  1700. * $strAll str 目标字符串
  1701. * $needle str 搜索字符串
  1702. */
  1703. public static function checkstr($strAll,$needle){
  1704. $tmparray = explode($needle,$strAll);
  1705. if(count($tmparray)>1){
  1706. return 1;
  1707. } else{
  1708. return 0;
  1709. }
  1710. }
  1711. }
  1712. ?>