statistics.php 170 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368
  1. <?php
  2. /**
  3. * 统计相关
  4. * 新用户, 在线,在玩,留存等
  5. * 区分IOS和Android, 以及FB和游客
  6. */
  7. class ModelStatistics
  8. {
  9. private $_lidEnd = 2;
  10. public $levelRange = [];
  11. public $addressList = [
  12. 'TH'=>'泰国',
  13. 'DE'=>'德国',
  14. 'FR'=>'法国',
  15. 'GB'=>'英国',
  16. 'US'=>'美利坚合众国',
  17. 'IT'=>'意大利',
  18. 'RO'=>'罗马尼亚',
  19. 'NO'=>'挪威',
  20. 'BR'=>'巴西',
  21. 'IN'=>'印度',
  22. 'AT'=>'奥地利',
  23. 'ES'=>'西班牙',
  24. 'BE'=>'比利时',
  25. ];
  26. /********新注册玩家key(newPlayerAndroidFb newPlayIosVisitor)******/
  27. protected $newPlayerKeyList = array(
  28. 1 => array(//玩家类型1FB 2游客 3LINE 4华为
  29. 1 => 'NPAFB', //1安卓 2IOS
  30. 2 => 'NPIFB',
  31. ),
  32. 2 => array(
  33. 1 => 'NPAV', //1安卓 2IOS
  34. 2 => 'NPIV',
  35. ),
  36. 3 => array(
  37. 1 => 'NPAL', //1安卓 2IOS
  38. 2 => 'NPIL',
  39. ),
  40. 4 => array(
  41. 1 => 'NPAH',//华为
  42. 2 => 'NPIH',
  43. ),
  44. 5 => array(
  45. 1 => 'NPAK',//靠谱
  46. 2 => 'NPIK'
  47. ),
  48. 6 => array(
  49. 1 => 'NPAVK',//俄语的安卓VK
  50. 2 => 'NPIVK' //俄语的苹果VK
  51. ),
  52. 7 => array(
  53. 1 => 'NPAOS',//华为海外
  54. 2 => 'NPIOS'
  55. )
  56. );
  57. /********新注册玩家key END ******/
  58. /********登陆玩家key(loginAndroidFb loginIosVisitor)*****/
  59. protected $loginPlayerKeyList = array(
  60. 1 => array(//玩家类型1FB 2游客 3LINE 4华为
  61. 1 => 'LIAFB', //1安卓 2IOS
  62. 2 => 'LIIFB',
  63. ),
  64. 2 => array(//
  65. 1 => 'LIAV', //1安卓 2IOS
  66. 2 => 'LIIV',
  67. ),
  68. // 3 => array(
  69. // 1 => 'LIAL', //1安卓 2IOS
  70. // 2 => 'LIIL',
  71. // ),
  72. // 4 => array(
  73. // 1 => 'LIAH',
  74. // 2 => 'LIIH',
  75. // ),
  76. // 5 => array(
  77. // 1 =>'LIAK',//靠谱
  78. // 2 => 'LIIK'
  79. // ),
  80. // 6 => array(
  81. // 1 => 'LIAVK',//俄语的安卓VK
  82. // 2 => 'LIIVK' //俄语的苹果VK
  83. // ),
  84. // 7 => array(
  85. // 1 => 'LIAOS',//华为海外
  86. // 2 => 'LIIOS'
  87. // )
  88. );
  89. /********登陆玩家key END *****/
  90. protected $currentTime;//当前时间
  91. protected $timeout;//过期时间
  92. protected $payBlackList;
  93. public function __construct()
  94. {
  95. $this->currentTime = date('Ymd', time());
  96. $this->timeout = strtotime('+365 day 23:59:59');
  97. }
  98. public function getLevelRange(){
  99. $this->levelRange =[];
  100. $maxLevel = intval(oo::commonOprModel('readconfig')->getCon('basic','curMaxLevel'))??130;
  101. for($i=1;$i<=$maxLevel;$i++){
  102. $this->levelRange[] =$i;
  103. }
  104. return $this->levelRange;
  105. }
  106. /**
  107. * 记录所有api请求
  108. * @param string $mod
  109. * @Deprecated 暂停该方法调用,不记录日志了
  110. * @Deprecated
  111. */
  112. public function apiRequestLog($mod, $act){
  113. return;
  114. //if($mod && $act){
  115. // $key = okeys::apiRequestLog();
  116. // oo::commonOprRedis('statistics')->zIncrBy($key, 1, $mod.":".$act);//新增请求参数
  117. // if(oo::commonOprRedis('statistics')->zSize($key) <= 2){
  118. // oo::commonOprRedis('statistics')->expireAt($key,strtotime('+1 day 23:59:59')+oo::redisRandomExpire());
  119. // }
  120. //}
  121. }
  122. /**
  123. * api记录从缓存入库
  124. * @Deprecated 暂停该方法调用,不记录日志了
  125. */
  126. public function apiRequestToDb() {
  127. return;
  128. $key = okeys::apiRequestLog(false);
  129. $arr = oo::commonOprRedis('statistics')->ZrevRange($key, 0, -1, true);
  130. $table = otable::apiReqLog();
  131. if(empty($arr)){
  132. return;
  133. }
  134. $sql = "INSERT INTO {$table}(service, act, num, min) VALUES";
  135. $tmp = explode(':', $key);
  136. if(empty($tmp[1])){
  137. return;
  138. }
  139. //删除key
  140. oo::commonOprRedis('statistics')->delete($key);
  141. $min = date('Y').$tmp[1];
  142. $flag = 0;
  143. foreach($arr as $k => $v){
  144. $tmp = explode(':', $k);
  145. //1000以下的不记录日志
  146. if(empty($tmp[1]) || $v < 1000){
  147. continue;
  148. }
  149. $flag = 1;
  150. $sql .= "('{$tmp[0]}', '{$tmp[1]}', '{$v}', '{$min}'),";
  151. }
  152. if($flag){
  153. $sql = rtrim($sql, ',');
  154. oo::commonOprDb('statistics')->query($sql);
  155. }
  156. }
  157. /**
  158. * 统计新用户
  159. * redis集合
  160. * @param int $uid
  161. * @param int $type 类型 1FB 2游客,默认FB
  162. * @param int $device 设备 1安卓 2IOS, 默认安卓
  163. * @param int $sid 包
  164. * @param int $gameid 游戏ID,当有多个游戏版本时, 默认为1
  165. */
  166. public function newPlayer($uid, $type = 1, $device = 1, $sid = 0, $gameid = 1)
  167. {
  168. $currentTime = date('Ymd', time());
  169. $timeout = strtotime('+365 day 23:59:59')+oo::redisRandomExpire();
  170. $key = $this->newPlayerKeyList[$type][$device].':'.$sid.'_'.$gameid.':'.$currentTime;
  171. oo::commonOprRedis('statistics')->sAdd($key, $uid);//插入新玩家
  172. oo::commonOprRedis('statistics')->expireAt($key, $timeout);
  173. $this->loginPlayer($uid, $type, $device, $sid, $gameid);//同时加入在线集合
  174. }
  175. /**
  176. * 统计登陆玩家
  177. * redis集合
  178. * @param int $uid
  179. * @param int $type 类型 1FB 2游客,3line用户 默认FB
  180. * @param int $device 设备 1安卓 2IOS, 默认安卓
  181. * @param int $sid 包 1安卓 2IOS
  182. * @param int $gameid 游戏ID,当有多个游戏版本时, 默认为1
  183. */
  184. public function loginPlayer($uid, $type = 1, $device = 1, $sid = 0, $gameid = 1)
  185. {
  186. $currentTime = date('Ymd', time());
  187. $timeout = strtotime('+365 day 23:59:59')+oo::redisRandomExpire();
  188. $key = $this->loginPlayerKeyList[$type][$device].':'.$sid.'_'.$gameid.':'.$currentTime;
  189. oo::commonOprRedis('statistics')->sAdd($key, $uid);
  190. oo::commonOprRedis('statistics')->expireAt($key, $timeout);
  191. }
  192. /**
  193. * 登录的设备记录--(wsc-7.6无用待删除)
  194. * @param $mobile_request
  195. * @param int $type 1 登录 2 新增登录
  196. */
  197. public function loginDevice($mobile_request, $type = 1)
  198. {
  199. $date = date('Ymd');
  200. $key = $this->loginDeviceKey($date, $type);
  201. oo::commonOprRedis('statistics')->sAdd($key, $mobile_request);
  202. oo::commonOprRedis('statistics')->expireAt($key,strtotime('+39 day 23:59:59')+oo::redisRandomExpire());
  203. }
  204. //(wsc-7.6无用待删除)
  205. public function loginDeviceKey($date, $type = 1)
  206. {
  207. $type == 1 ? $key = 'LOGINDEVICE:'.$date : $key = 'NEWDEVICE:'.$date;
  208. return $key;
  209. }
  210. /**
  211. * 记录用户的国家
  212. * @param $uid
  213. * @param $counntry
  214. * @return bool
  215. */
  216. public function loginCountry($uid, $country)
  217. {
  218. //记录玩家国家
  219. $key = okeys::usercountry($country);
  220. oo::commonOprRedis('common')->sAdd($key, $uid);
  221. //记录国家列表
  222. $countryListKey = okeys::countrylist();
  223. oo::commonOprRedis('common')->sAdd($countryListKey, $country);
  224. return true;
  225. }
  226. /********************数据入库统计 Start******************************/
  227. /**
  228. * 每日新注册玩家
  229. */
  230. public function newPlayertoDb($time = null)
  231. {
  232. $time = $time ?? strtotime('-1 day');
  233. $yesterday = date( 'Ymd', $time);
  234. $num = array();//安卓,IOS,数据统计
  235. $sidList = $this->getSidList();
  236. $allPlayerArr = [];
  237. foreach ($sidList as $sid) {
  238. for ($i=1; $i <= $this->_lidEnd; $i++) {
  239. for ($j=1; $j <= 2; $j++) {
  240. $key = $this->newPlayerKeyList[$i][$j].':'.$sid.'_1:'.$yesterday;
  241. $num[$i][$j] = intval(oo::commonOprRedis('statistics')->sSize($key));
  242. //所有包的按每一类用户的汇总
  243. $tmpNum = $allPlayerArr[$i][$j] ?? 0;
  244. $allPlayerArr[$i][$j] = $num[$i][$j] + $tmpNum;
  245. }
  246. }
  247. $pn_af = $num[1][1]; //安卓FB玩家
  248. $pn_av = $num[2][1]; //安卓游客玩家
  249. $pn_if = $num[1][2]; //IOS_FB玩家
  250. $pn_iv = $num[2][2]; //IOS_游客玩家
  251. $pn_al = 0;//$num[3][1]; //安卓LINE玩家
  252. $pn_il = 0;//$num[3][2]; //IOS LINE玩家
  253. $pn_ah = 0;//$num[4][1]; //安卓华为玩家
  254. $pn_ak = 0;//$num[5][1]; //安卓靠谱玩家
  255. $pn_avk = 0;//$num[6][1]; //安卓VK玩家
  256. $pn_ivk = 0;//$num[6][2]; //苹果VK玩家
  257. $pn_hwos = 0;//$num[7][1];//安卓华为海外
  258. $total = $pn_af + $pn_av + $pn_if + $pn_iv + $pn_al + $pn_il + $pn_ah + $pn_ak + $pn_avk + $pn_ivk + $pn_hwos;
  259. $table = otable::sta_np();
  260. $sql = " INSERT INTO {$table}(id, ordertime, pn_af, pn_av, pn_if, pn_iv, gameid, pn_al, pn_il, pn_ah, pn_ak, pn_avk, pn_ivk, pn_hwos, total, sid) VALUES(NULL, {$time}, {$pn_af}, {$pn_av}, {$pn_if}, {$pn_iv}, 1, {$pn_al}, {$pn_il}, {$pn_ah}, {$pn_ak}, {$pn_avk}, {$pn_ivk}, {$pn_hwos}, {$total}, {$sid}) ";
  261. $rs = oo::commonOprDb('statistics')->query($sql);
  262. if( !$rs ){
  263. oo::logs()->debug3($sql, 'newPlayertoDb_Error.log');
  264. }
  265. }
  266. //为了去掉重复的uid来统计所有包登录人数总数
  267. $pn_af = $allPlayerArr[1][1]; //安卓FB玩家
  268. $pn_av = $allPlayerArr[2][1]; //安卓游客玩家
  269. $pn_if = $allPlayerArr[1][2]; //IOS_FB玩家
  270. $pn_iv = $allPlayerArr[2][2]; //IOS_游客玩家
  271. $pn_al = 0;//$allPlayerArr[3][1]; //IOS_LINE玩家
  272. $pn_il = 0;//$allPlayerArr[3][2]; //IOS_LINE玩家
  273. $pn_ah = 0;//$allPlayerArr[4][1]; //安卓华为玩家
  274. $pn_ak = 0;//$allPlayerArr[5][1]; //安卓靠谱玩家
  275. $pn_avk = 0;//$allPlayerArr[6][1]; //安卓VK玩家
  276. $pn_ivk = 0;//$allPlayerArr[6][2]; //苹果VK玩家
  277. $pn_hwos = 0;//$allPlayerArr[7][1];//安卓华为海外玩家
  278. //vivo新增
  279. $vivo_android = $vivo_ios = 0;
  280. // $tb = otable::userinfo(1);
  281. // $start_time = strtotime('-1 days 0:0:0');
  282. // $end_time = strtotime('-1 days 23:59:59');
  283. // $sql = "SELECT COUNT(*) AS count FROM {$tb} WHERE channel = 1 AND createtime >= {$start_time} AND createtime <= {$end_time}";
  284. // $ret = oo::commonOprDb('userinfo')->getOne($sql,1);
  285. // if(!empty($ret['count'])){
  286. // $vivo_android = $ret['count'];
  287. // }
  288. $total = $pn_af + $pn_av + $pn_if + $pn_iv + $pn_al + $pn_il + $pn_ah + $pn_ak + $pn_avk + $pn_ivk + $pn_hwos;
  289. $table = otable::sta_np();
  290. $sql = " INSERT INTO {$table}(id, ordertime, pn_af, pn_av, pn_if, pn_iv, gameid, pn_al, pn_il, pn_ah, pn_ak, pn_avk, pn_ivk, pn_hwos, total, sid, vivo_android, vivo_ios) VALUES(NULL, {$time}, {$pn_af}, {$pn_av}, {$pn_if}, {$pn_iv}, 1, {$pn_al}, {$pn_il},{$pn_ah}, {$pn_ak}, {$pn_avk}, {$pn_ivk}, {$pn_hwos}, {$total}, 999, {$vivo_android}, {$vivo_ios}) ";
  291. $rs = oo::commonOprDb('statistics')->query($sql);
  292. if( !$rs ){
  293. oo::logs()->debug3($sql, 'newPlayertoDb_Error.log');
  294. }
  295. }
  296. /**
  297. * 每日登陆玩家
  298. */
  299. public function loginPlayertoDb()
  300. {
  301. $time = strtotime("-1 day");
  302. $yesterday = date( 'Ymd', $time );
  303. $num = array();//安卓,IOS,数据统计
  304. //包列表
  305. $sidList = $this->getSidList();
  306. $allPlayerArr = [];
  307. foreach ($sidList as $sid) {
  308. for ($i=1; $i <= $this->_lidEnd; $i++) {
  309. for ($j=1; $j <= 2; $j++) {
  310. $key = $this->loginPlayerKeyList[$i][$j].':'.$sid.'_1:'.$yesterday;
  311. //获取所有sid的登录用户
  312. $tmpArr = oo::commonOprRedis('statistics')->sMembers($key);
  313. if($this->loginPlayerKeyList[$i][$j] == 'LIIFB'){
  314. $key = 'IIFB:'.$sid.'_1:'.$yesterday;
  315. $members = oo::commonOprRedis('statistics')->sMembers($key);
  316. $tmpArr = array_merge($tmpArr, $members);
  317. }
  318. $tmpArr = array_unique($tmpArr);
  319. $num[$i][$j] = intval(count($tmpArr));
  320. !isset($allPlayerArr[$i][$j]) && $allPlayerArr[$i][$j] = [];
  321. $allPlayerArr[$i][$j] = array_keys(array_flip($allPlayerArr[$i][$j]) + array_flip($tmpArr));
  322. }
  323. }
  324. $login_af = $num[1][1]; //安卓FB玩家
  325. $login_av = $num[2][1]; //安卓游客玩家
  326. $login_if = $num[1][2]; //IOS_FB玩家
  327. $login_iv = $num[2][2]; //IOS_游客玩家
  328. $login_al = 0;//$num[3][1]; //IOS_LINE玩家
  329. $login_il = 0;//$num[3][2]; //IOS_LINE玩家
  330. $login_ah = 0;//$num[4][1]; //安卓华为玩家
  331. $login_ak = 0;//$num[5][1]; //安卓靠谱玩家
  332. $login_avk = 0;//$num[6][1]; //安卓VK玩家
  333. $login_ivk = 0;//$num[6][2]; //苹果VK玩家
  334. $login_hwos = 0;//$num[7][1];//安卓华为海外
  335. $total = $login_af + $login_av + $login_if + $login_iv + $login_al + $login_il + $login_ah + $login_ak + $login_avk + $login_ivk + $login_hwos;
  336. $table = otable::sta_lp();
  337. $sql = " INSERT INTO {$table}(id, ordertime, login_af, login_av, login_if, login_iv, gameid, login_al, login_il, login_ah, login_ak, login_avk, login_ivk, login_hwos, total, sid) VALUES(NULL, {$time}, {$login_af}, {$login_av}, {$login_if}, {$login_iv}, 1, {$login_al}, {$login_il},{$login_ah}, {$login_ak}, {$login_avk},{$login_ivk}, {$login_hwos}, {$total}, {$sid}) ";
  338. $rs = oo::commonOprDb('statistics')->query($sql);
  339. if( !$rs ){
  340. oo::logs()->debug3($sql, 'loginPlayertoDb_Error.log');
  341. }
  342. }
  343. //为了去掉重复的uid来统计所有包登录人数总数
  344. $login_af = count($allPlayerArr[1][1]); //安卓FB玩家
  345. $login_av = count($allPlayerArr[2][1]); //安卓游客玩家
  346. $login_if = count($allPlayerArr[1][2]); //IOS_FB玩家
  347. $login_iv = count($allPlayerArr[2][2]); //IOS_游客玩家
  348. $login_al = 0;//count($allPlayerArr[3][1]); //IOS_LINE玩家
  349. $login_il = 0;//count($allPlayerArr[3][2]); //IOS_LINE玩家
  350. $login_ah = 0;//count($allPlayerArr[4][1]); //安卓华为玩家
  351. $login_ak = 0;//count($allPlayerArr[5][1]); //安卓靠谱玩家
  352. $login_avk = 0;//count($allPlayerArr[6][1]); //安卓VK玩家
  353. $login_ivk = 0;//count($allPlayerArr[6][2]); //苹果VK玩家
  354. $login_hwos = 0;//count($allPlayerArr[7][1]);//安卓华为海外
  355. //vivo新增
  356. $vivo_android = $vivo_ios = 0;
  357. // $tb = otable::userinfo(1);
  358. // $start_time = strtotime('-1 days 0:0:0');
  359. // $end_time = strtotime('-1 days 23:59:59');
  360. // $sql = "SELECT COUNT(*) AS count FROM {$tb} WHERE channel = 1 AND lasttime >= {$start_time} AND lasttime <= {$end_time}";
  361. // $ret = oo::commonOprDb('userinfo')->getOne($sql,1);
  362. // if(!empty($ret['count'])){
  363. // $vivo_android = $ret['count'];
  364. // }
  365. $total = $login_af + $login_av + $login_if + $login_iv + $login_al + $login_il + $login_ah + $login_ak + $login_avk + $login_ivk + $login_hwos;
  366. $table = otable::sta_lp();
  367. $sql = " INSERT INTO {$table}(id, ordertime, login_af, login_av, login_if, login_iv, gameid, login_al, login_il, login_ah, login_ak, login_avk, login_ivk, login_hwos, total, sid, vivo_android, vivo_ios) VALUES(NULL, {$time}, {$login_af}, {$login_av}, {$login_if}, {$login_iv}, 1, {$login_al}, {$login_il}, {$login_ah}, {$login_ak}, {$login_avk}, {$login_ivk}, {$login_hwos}, {$total}, 999, {$vivo_android}, {$vivo_ios}) ";
  368. $rs = oo::commonOprDb('statistics')->query($sql);
  369. if( !$rs ){
  370. oo::logs()->debug3($sql, 'loginPlayertoDb_Error.log');
  371. }
  372. }
  373. /**
  374. * Notes:设置每日登陆新增等缓存记录过期
  375. * User: wsc
  376. * Time: 2022/1/6 12:07
  377. */
  378. public function expireloginPlayer(){
  379. $d = date("Ymd",strtotime("-1 day"));
  380. $arr = [
  381. "NPAFB:1_1:{$d}", //新增安卓FB
  382. "NPIFB:2_1:{$d}", //新增ios FB
  383. "NPAV:1_1:{$d}", //新增安卓游客
  384. "NPIV:2_1:{$d}", //新增ios 游客
  385. "LIAFB:1_1:{$d}", //安卓FB DAU
  386. "LIIFB:2_1:{$d}", //ios FB DAU
  387. "LIAV:1_1:{$d}", //安卓游客 DAU
  388. "LIIV:2_1:{$d}", //ios 游客 DAU
  389. "IIFB:2_1:{$d}",//ios FB DAU (错误存储)
  390. ];
  391. foreach ($arr as $key){
  392. $list2 = oo::commonOprRedis('statistics')->sMembers($key);
  393. $listStr="";
  394. if(!empty($list2)){
  395. $listStr = implode(",",$list2);
  396. }
  397. $data = ["date"=>$d,"type"=>$key,"uidlist"=>$listStr];
  398. $inseretData = funs::db_insertSQL("t_loginplayer_log",$data);
  399. $ret =oo::commonOprDb('api_log')->query($inseretData,1 );
  400. }
  401. foreach ($arr as $ke){
  402. oo::commonOprRedis('statistics')->expire($ke,7*86400);
  403. }
  404. }
  405. /**
  406. * 每日新注册玩家按国家统计
  407. */
  408. public function newPlayerCountrytoDb()
  409. {
  410. $time = strtotime('-1 day');
  411. $yesterday = date( 'Ymd', $time);
  412. $newPlayer = $this->getAllPlayer($yesterday, 1);//新注册玩家
  413. $newPlayerNum = is_array($newPlayer) ? count($newPlayer) : 0;
  414. $countryListKey = okeys::countrylist();
  415. $countryList = oo::commonOprRedis('common')->sMembers($countryListKey);
  416. $total = $num = 0;
  417. $now = time();
  418. $table = otable::sta_country();
  419. if(!empty($countryList)){
  420. foreach ($countryList as $city){
  421. $usercountryKey = okeys::usercountry($city);
  422. $userData = oo::commonOprRedis('common')->sMembers($usercountryKey);
  423. $intersect = array_intersect($newPlayer, $userData);
  424. $num = is_array($intersect) ? count($intersect) : 0;
  425. $total += $num;
  426. $sql = " INSERT INTO {$table}(country, num, flag, createtime) VALUES('{$city}', $num, 1, $now) ";
  427. $rs = oo::commonOprDb('statistics')->query($sql);
  428. if( !$rs ){
  429. oo::logs()->debug3($sql, 'newPlayerCountrytoDb_Error.log');
  430. }
  431. }
  432. }
  433. if($newPlayerNum > $total){
  434. $tmpNum = $newPlayerNum - $total;
  435. $tmpcity = 'other';
  436. $sql = " INSERT INTO {$table}(country, num, flag, createtime) VALUES('{$tmpcity}', $tmpNum, 1, $now) ";
  437. $rs = oo::commonOprDb('statistics')->query($sql);
  438. if( !$rs ){
  439. oo::logs()->debug3($sql, 'newPlayerCountrytoDb_Error.log');
  440. }
  441. }
  442. return true;
  443. }
  444. /**
  445. * 每日新注册玩家按国家统计
  446. */
  447. public function loginPlayerCountrytoDb()
  448. {
  449. $time = strtotime('-1 day');
  450. $yesterday = date( 'Ymd', $time);
  451. $newPlayer = $this->getAllPlayer($yesterday, 2);//登录玩家
  452. $newPlayerNum = is_array($newPlayer) ? count($newPlayer) : 0;
  453. $countryListKey = okeys::countrylist();
  454. $countryList = oo::commonOprRedis('common')->sMembers($countryListKey);
  455. $total = $num = 0;
  456. $now = time();
  457. $table = otable::sta_country();
  458. if(!empty($countryList)){
  459. foreach ($countryList as $city){
  460. $usercountryKey = okeys::usercountry($city);
  461. $userData = oo::commonOprRedis('common')->sMembers($usercountryKey);
  462. $intersect = array_intersect($newPlayer, $userData);
  463. $num = is_array($intersect) ? count($intersect) : 0;
  464. $total += $num;
  465. $sql = " INSERT INTO {$table}(country, num, flag, createtime) VALUES('{$city}', $num, 2, $now) ";
  466. $rs = oo::commonOprDb('statistics')->query($sql);
  467. if( !$rs ){
  468. oo::logs()->debug3($sql, 'newPlayerCountrytoDb_Error.log');
  469. }
  470. }
  471. }
  472. if($newPlayerNum > $total){
  473. $tmpNum = $newPlayerNum - $total;
  474. $tmpcity = 'other';
  475. $sql = " INSERT INTO {$table}(country, num, flag, createtime) VALUES('{$tmpcity}', $tmpNum, 2, $now) ";
  476. $rs = oo::commonOprDb('statistics')->query($sql);
  477. if( !$rs ){
  478. oo::logs()->debug3($sql, 'newPlayerCountrytoDb_Error.log');
  479. }
  480. }
  481. return true;
  482. }
  483. /********************数据入库统计 End******************************/
  484. /**
  485. * 事件统计
  486. */
  487. public function event($param)
  488. {
  489. if (!is_array($param)) {
  490. return false;
  491. }
  492. $uid = reset($param);
  493. $actid = end($param);
  494. $date = date('Ymd');
  495. $expireDate = strtotime(' +7 days ')+oo::redisRandomExpire();
  496. $keyUid = okeys::eventActUser($actid);
  497. $keyAct = okeys::eventAct($actid);
  498. oo::commonOprRedis('statistics')->sAdd($keyUid, $uid);
  499. oo::commonOprRedis('statistics')->incr($keyAct);
  500. oo::commonOprRedis('statistics')->expireAt($keyUid, $expireDate);
  501. oo::commonOprRedis('statistics')->expireAt($keyAct, $expireDate);
  502. }
  503. /**
  504. * 运行自动报表统计
  505. * @return bool
  506. */
  507. public function reportToDB()
  508. {
  509. $this->payBlackList['uid'] = oo::commonOprModel("config")->payWhiteList();
  510. $data = array('date'=>0, 'dau' => 0, 'new_player' => 0, 'pay_num' => 0, 'revenue' => 0, 'remain_new_last' => 0, 'remain_live_last' => 0, 'broke_rate' => 0);
  511. $paymentTable = otable::summarylist();
  512. $reportTable = otable::report();
  513. $lastDate = date('Ymd', strtotime('-1 day'));
  514. $stime = strtotime('-1 day 0:0:1');
  515. $etime = strtotime('-1 day 23:59:59');
  516. $data['date'] = $lastDate;
  517. //每日登陆玩家总数
  518. $infoLogin = $this->getOneLoginPlayer($stime, $etime);
  519. if ($infoLogin) {
  520. $data['dau'] = $infoLogin['total'];
  521. }
  522. //每日新增总数
  523. $infoNew = $this->getOneNewPlayer($stime, $etime);
  524. if ($infoNew) {
  525. $data['new_player'] = $infoNew['total'];
  526. }
  527. //每日成功订单总数 每日成功订单数额
  528. $blackUidArr = $this->payBlackList['uid'];
  529. $blackUidStr = implode(',', $blackUidArr);
  530. $sqlPayment = " SELECT SUM(sl_pusd) AS p FROM {$paymentTable} WHERE sl_status=2 AND sl_sid != -1 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) ";
  531. $infoPayment = oo::commonOprDb('payment')->getOne($sqlPayment, 1);
  532. if( $infoPayment ){
  533. $data['revenue'] = floatval($infoPayment['p']);
  534. }
  535. //昨日的支付人数
  536. // $sqlPaymentPerson = " SELECT COUNT(1) as uidNum FROM ( SELECT COUNT(sl_uid) AS uid FROM {$paymentTable} WHERE sl_status=2 AND sl_sid != -1 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) GROUP BY sl_uid ) as aa";
  537. // $infoPaymentPerson = oo::commonOprDb('payment')->getOne($sqlPaymentPerson, 1);
  538. // $data['pay_num'] = intval($infoPaymentPerson['uidNum'] ?? 0);
  539. $payNum = 0;
  540. $payUidList = [];
  541. $sqlPaymentPerson = " SELECT sl_uid AS uid FROM {$paymentTable} WHERE sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) ";
  542. $payRet = oo::commonOprDb('payment')->getAll($sqlPaymentPerson, 1);
  543. foreach ($payRet as $value) {
  544. $uid = $value['uid'];
  545. if(!in_array($uid, $payUidList)) {
  546. $payNum++;
  547. array_push($payUidList, $uid);
  548. }
  549. }
  550. $data['pay_num'] = intval($payNum ?? 0);
  551. //首充用户
  552. $firstPayPlayerNum = 0;
  553. if(!empty($payUidList)) {
  554. $time = strtotime($lastDate.'0:0:0');
  555. foreach ($payUidList as $vuid) {
  556. $checkBought = $this->checkPayFirst($vuid, $time);
  557. $checkBought && $firstPayPlayerNum++ ;
  558. }
  559. }
  560. $data['first_pay'] = $firstPayPlayerNum;
  561. //获取当天的最大在线数
  562. $date = date('Ymd', strtotime("-1 day"));
  563. $maxnumKey = okeys::onlineusermaxnum($date);
  564. $maxOnlineNum = intval(oo::commonOprRedis('statistics')->get($maxnumKey));
  565. $data['max_online_num'] = $maxOnlineNum;
  566. $days1ago = date('Ymd', strtotime('-1 days'));
  567. $days2ago = date('Ymd', strtotime('-2 days'));
  568. $yesterdayPlayer = $this->getAllPlayer($days1ago, 2);//昨日登陆玩家
  569. $last2daysLoginPlayer = $this->getAllPlayer($days2ago, 2);//前日登陆玩家
  570. $last2daysPlayer = $this->getAllPlayer($days2ago, 1);//前日新增玩家
  571. //次日新增留存
  572. $intersect1dayPlay = array_intersect($yesterdayPlayer, $last2daysPlayer);//交集玩家
  573. $data['remain_new_last'] = empty(count($last2daysPlayer)) ? 0 : count($intersect1dayPlay) * 100 / count($last2daysPlayer);//次日留存率
  574. //次日活跃留存
  575. $intersect1dayLoginPlay = array_intersect($yesterdayPlayer, $last2daysLoginPlayer);//交集玩家
  576. $data['remain_live_last'] = empty(count($last2daysLoginPlayer)) ? 0 : count($intersect1dayLoginPlay) * 100 / count($last2daysLoginPlayer);//次日留存率
  577. $tb = otable::BaseDataSta();
  578. $sql = "SELECT * FROM {$tb} WHERE date='{$lastDate}'";
  579. $ret = oo::commonOprDb('statistics')->getOne($sql,MYSQLI_ASSOC);
  580. if(!empty($ret)){
  581. $data['user_time'] = "'{$ret['loginAvg']}'";
  582. $data['arpu'] = $ret['payARPU'];
  583. $data['arppu'] = $ret['payARPPU'];
  584. $data['pay_rate'] = "'{$ret['payRate']}'";
  585. $data['net_new_player'] = $data['new_player'];
  586. $data['net_new_player_rate'] = 100;
  587. }
  588. //广告数据
  589. $date = date('Ymd', time());
  590. $table = otable::advertisementSta();
  591. $sql = "SELECT * FROM {$table} WHERE date IN ({$date})";
  592. $ret = oo::commonOprDb('statistics')->getOne($sql,MYSQLI_ASSOC);
  593. if(!empty($ret)){
  594. $temp = json_decode($ret['click'],true);
  595. //兼容旧数据
  596. if(isset($temp['android']) && isset($temp['ios'])){
  597. $ad_apply_count = array_sum($temp['android']) + array_sum($temp['ios']);
  598. }else{
  599. $ad_apply_count = array_sum($temp);
  600. }
  601. $temp = json_decode($ret['play'],true);
  602. //兼容旧数据
  603. if(isset($temp['android']) && isset($temp['ios'])){
  604. $ad_count = array_sum($temp['android']) + array_sum($temp['ios']);
  605. }else{
  606. $ad_count = array_sum($temp);
  607. }
  608. $temp = json_decode($ret['success'],true);
  609. $ad_success_count = array_sum($temp['android']) + array_sum($temp['ios']);
  610. $data['ad_apply_count'] = $ad_apply_count;//广告请求次数
  611. $data['ad_count'] = $ad_count;//广告展示次数
  612. $data['ad_success_count'] = $ad_success_count;//广告完成次数
  613. $data['ad_user_num'] = 0;//广告观看人数
  614. }
  615. $setStrKey = implode(',', array_keys($data));
  616. $setStrValue = implode(',', $data);
  617. $sql = " INSERT INTO {$reportTable} ($setStrKey) VALUES ($setStrValue)";
  618. oo::commonOprDb('statistics')->query($sql);
  619. return true;
  620. }
  621. /**
  622. * 运行自动报表统计(wsc-7.6弃用,功能由reportToDB完成)
  623. * @return bool
  624. */
  625. public function basicReportToDB()
  626. {
  627. $this->payBlackList['uid'] = oo::commonOprModel("config")->payWhiteList();
  628. $data = array('date' => 0, 'dau' => 0, 'new_player' => 0, 'pay_num' => 0, 'revenue' => 0);
  629. $paymentTable = otable::summarylist();
  630. $bcreportTable = otable::basicreport();
  631. $lastDate = date('Ymd', strtotime('-1 day'));
  632. $stime = strtotime('-1 day 0:0:1');
  633. $etime = strtotime('-1 day 23:59:59');
  634. $data['date'] = $lastDate;
  635. //每日登陆玩家总数
  636. $infoLogin = $this->getOneLoginPlayer($stime, $etime);
  637. if ($infoLogin) {
  638. $data['dau'] = $infoLogin['total'];
  639. }
  640. //每日新增总数
  641. $infoNew = $this->getOneNewPlayer($stime, $etime);
  642. if ($infoNew) {
  643. $data['new_player'] = $infoNew['total'];
  644. }
  645. //每日成功订单总数 每日成功订单数额
  646. $blackUidArr = $this->payBlackList['uid'];
  647. $blackUidStr = implode(',', $blackUidArr);
  648. $sqlPayment = " SELECT SUM(sl_pusd) AS p FROM {$paymentTable} WHERE sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) ";
  649. $infoPayment = oo::commonOprDb('payment')->getOne($sqlPayment, 1);
  650. if ($infoPayment) {
  651. $data['revenue'] = floatval($infoPayment['p']);
  652. }
  653. //昨日的支付人数
  654. $payNum = 0;
  655. $payUidList = [];
  656. $sqlPaymentPerson = " SELECT sl_uid AS uid FROM {$paymentTable} WHERE sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) ";
  657. $payRet = oo::commonOprDb('payment')->getAll($sqlPaymentPerson, 1);
  658. foreach ($payRet as $value) {
  659. $uid = $value['uid'];
  660. if(!in_array($uid, $payUidList)) {
  661. $payNum++;
  662. array_push($payUidList, $uid);
  663. }
  664. }
  665. $data['pay_num'] = intval($payNum ?? 0);
  666. //首充用户
  667. $firstPayPlayerNum = 0;
  668. if(!empty($payUidList)) {
  669. $time = strtotime($lastDate.'0:0:0');
  670. foreach ($payUidList as $vuid) {
  671. $checkBought = $this->checkPayFirst($vuid, $time);
  672. $checkBought && $firstPayPlayerNum++ ;
  673. }
  674. }
  675. $data['first_pay'] = $firstPayPlayerNum;
  676. // //登录和新增登录设备数
  677. // $loginDeviceKey = $this->loginDeviceKey($lastDate, 1);//登录的设备数
  678. // $data['login_device'] = oo::commonOprRedis('statistics')->sSize($loginDeviceKey);
  679. //
  680. // $newLoginDeviceKey = $this->loginDeviceKey($lastDate, 2);//新登录的设备数
  681. // $data['newlogin_device'] = oo::commonOprRedis('statistics')->sSize($newLoginDeviceKey);
  682. $data['createtime'] = time();
  683. //获取当天的最大在线数
  684. $date = date('Ymd', strtotime("-1 day"));
  685. $maxnumKey = okeys::onlineusermaxnum($date);
  686. $maxOnlineNum = intval(oo::commonOprRedis('statistics')->get($maxnumKey));
  687. $data['max_online_num'] = $maxOnlineNum;
  688. // //设备次留
  689. // $days1ago = date('Ymd', strtotime("-1 day"));
  690. // $days2ago = date('Ymd', strtotime('-2 day'));
  691. //
  692. // ////次日新增留存 比如今天29号 就计算28号的次日留存 那么新增玩家从27号算,
  693. // $yesterdayPlayer = $this->getAllDevicePlayer($days1ago, 1);//登陆玩家
  694. // $last2daysPlayer = $this->getAllDevicePlayer($days2ago, 2);//新增玩家
  695. //
  696. // $intersect1dayPlay = array_intersect($yesterdayPlayer, $last2daysPlayer);//交集玩家
  697. // $tempDay1Remain = empty(count($last2daysPlayer)) ? 0 : count($intersect1dayPlay) / count($last2daysPlayer);//次日留存率
  698. // $data['remain_device'] = round($tempDay1Remain, 4)*100;//次日留存率
  699. $setStrKey = implode(',', array_keys($data));
  700. $setStrValue = implode(',', $data);
  701. $sql = " INSERT INTO {$bcreportTable} (id,$setStrKey) VALUES (NULL, $setStrValue)";
  702. oo::commonOprDb('statistics')->query($sql);
  703. return true;
  704. }
  705. //(wsc-7.6-无用待删除)
  706. public function getAllDevicePlayer($date, $type)
  707. {
  708. $loginDeviceKey = oo::commonOprModel('statistics')->loginDeviceKey($date, $type);
  709. $data = oo::commonOprRedis('statistics')->sMembers($loginDeviceKey);
  710. return $data;
  711. }
  712. /**
  713. * 查询是否是首次充值
  714. * @param $uid
  715. * @param $time
  716. * @return bool
  717. */
  718. public function checkPayFirst($uid, $time)
  719. {
  720. empty($time) && $time = strtotime('0:0:0') ;
  721. $table = otable::payment($uid);
  722. $sql = "SELECT pid FROM {$table} WHERE uid = {$uid} AND status = 2 AND pay_time < {$time} LIMIT 1 ";
  723. $ret = oo::commonOprDb('payment')->getOne($sql, MYSQLI_ASSOC);
  724. $pay = true;
  725. if( !empty($ret) ){
  726. $pay = false;
  727. }
  728. return $pay;
  729. }
  730. /**
  731. * 获取一条登录的数据
  732. * @param $stime
  733. * @param $etime
  734. * @return mixed
  735. */
  736. public function getOneLoginPlayer($stime, $etime)
  737. {
  738. $loginplayerTable = otable::sta_lp();
  739. //每日登陆玩家总数
  740. $sqlLogin = "SELECT * FROM {$loginplayerTable} WHERE ordertime >= {$stime} AND ordertime <= {$etime} AND sid = 999 LIMIT 1";
  741. $infoLogin = oo::commonOprDb('statistics')->getOne($sqlLogin, 1);
  742. return $infoLogin;
  743. }
  744. /**
  745. * 获取一条新增的用户数
  746. * @param $stime
  747. * @param $etime
  748. * @return mixed
  749. */
  750. public function getOneNewPlayer($stime, $etime)
  751. {
  752. $newplayerTable = otable::sta_np();
  753. //每日新增总数
  754. $sqlNew = " SELECT * FROM {$newplayerTable} WHERE ordertime >= {$stime} AND ordertime <= {$etime} AND sid = 999 LIMIT 1 ";
  755. $infoNew = oo::commonOprDb('statistics')->getOne($sqlNew, 1);
  756. return $infoNew;
  757. }
  758. /**
  759. * Notes:
  760. * User: wsc
  761. * Time: 2020/11/10 20:55
  762. * @param $date string (20201110)|array[20201109,20201110]
  763. * @param $type int 1新用户 2所有
  764. * @param int $sidList int(1安卓,2ios,999所有)|array[1,2]
  765. * @return array
  766. */
  767. public function getAllPlayer($date, $type, $sidList = 0)
  768. {
  769. //登陆和新增相关key
  770. $newPlayerKeyList = $this->newPlayerKeyList;
  771. $loginPlayerKeyList = $this->loginPlayerKeyList;
  772. $arr = ($type == 1) ? $newPlayerKeyList : $loginPlayerKeyList;
  773. $total = array();//人数0
  774. //如果sidList为空或者为999,则默认全部的sid
  775. if(empty($sidList) || is_array($sidList) && in_array(999, $sidList)) {
  776. //包列表
  777. $sidList = $this->getSidList();
  778. }else {
  779. if(!is_array($sidList)) {
  780. $sidList = array($sidList);
  781. }
  782. }
  783. foreach ($sidList as $sid) {
  784. if(is_array($date)){
  785. foreach ($date as $k=>$v){
  786. $tmpArr = $this->getAllPlayerOnce($arr, $v, $sid);
  787. $total = array_merge($tmpArr, $total);
  788. }
  789. }else{
  790. $tmpArr = $this->getAllPlayerOnce($arr, $date, $sid);
  791. $total = array_merge($tmpArr, $total);
  792. }
  793. }
  794. $total = array_filter($total);//去掉空元素
  795. return array_unique($total);
  796. }
  797. /**
  798. * 获取一个sid的玩家id列表
  799. * @param $arr
  800. * @param $date
  801. * @param $sid
  802. * @return array
  803. */
  804. private function getAllPlayerOnce($arr, $date, $sid)
  805. {
  806. $redisConfig = 'statistics';
  807. if(strtotime($date) <= 1593647999){
  808. $redisConfig = 'Userinfo';
  809. }
  810. $total = [];
  811. $logTb = 'crazygod_api_log.t_loginplayer_log';
  812. for ($i=1; $i <= $this->_lidEnd; $i++) {
  813. for ($j=1; $j <= 2; $j++) {
  814. $key = $arr[$i][$j].':'.$sid.'_1:'.$date;
  815. $members = oo::commonOprRedis($redisConfig)->sMembers($key);
  816. // if(empty($members)){//找不到历史取库数据
  817. // $sql = "SELECT * FROM {$logTb} where type='{$key}'";
  818. // $one = oo::commonOprDb('api_log')->getOne($sql,1);
  819. // if(!empty($one)&&!empty($one['uidlist'])){
  820. // $members = explode(',',$one['uidlist']);
  821. // }
  822. // }
  823. $total = array_merge($total, $members);
  824. if($arr[$i][$j] == 'LIIFB'){
  825. $key = 'IIFB:'.$sid.'_1:'.$date;
  826. $members = oo::commonOprRedis($redisConfig)->sMembers($key);
  827. // if(empty($members)){//找不到历史取库数据
  828. // $sql = "SELECT * FROM {$logTb} where type='{$key}'";
  829. // $one = oo::commonOprDb('api_log')->getOne($sql,1);
  830. // if(!empty($one)&&!empty($one['uidlist'])){
  831. // $members = explode(',',$one['uidlist']);
  832. // }
  833. // }
  834. $total = array_merge($total, $members);
  835. }
  836. }
  837. }
  838. return $total;
  839. }
  840. /**
  841. * 计算所有玩家总数
  842. * type 1 新注册 其他登陆
  843. */
  844. public function getTotalPlayers($date, $type, $sidList = 0)
  845. {
  846. //登陆和新增相关key
  847. $newPlayerKeyList = $this->newPlayerKeyList;
  848. $loginPlayerKeyList = $this->loginPlayerKeyList;
  849. $arr = ($type == 1) ? $newPlayerKeyList : $loginPlayerKeyList;
  850. $total = 0;//人数0
  851. //如果sidList为空或者为999,则默认全部的sid
  852. if(empty($sidList) || is_array($sidList) && in_array(999, $sidList)) {
  853. //包列表
  854. $sidList = $this->getSidList();
  855. }else {
  856. if(!is_array($sidList)) {
  857. $sidList = array($sidList);
  858. }
  859. }
  860. foreach ($sidList as $sid) {
  861. $total += $this->getSidTotalPlayers($arr, $date, $sid);
  862. }
  863. return $total;
  864. }
  865. /**
  866. * 获取sid玩家总人数
  867. * @param array $arr
  868. * @param string $date
  869. * @return int $sid
  870. * @return int
  871. */
  872. private function getSidTotalPlayers($arr, $date, $sid){
  873. $redisConfig = 'statistics';
  874. if(strtotime($date) <= 1593647999){
  875. $redisConfig = 'Userinfo';
  876. }
  877. $total = 0;
  878. for ($i=1; $i <= $this->_lidEnd; $i++) {
  879. for ($j=1; $j <= 2; $j++) {
  880. $key = $arr[$i][$j].':'.$sid.'_1:'.$date;
  881. $total += oo::commonOprRedis($redisConfig)->sSize($key);
  882. }
  883. }
  884. return $total;
  885. }
  886. /**
  887. * 获取该时间到现在为止的用户和sid的对应关系
  888. * @param $time
  889. * @return array
  890. */
  891. public function getUserSidList($time)
  892. {
  893. if(empty($time)) {
  894. return [];
  895. }
  896. $table = otable::xg_push();
  897. $sql = " SELECT uid, sid FROM {$table} WHERE updatetime >= {$time} ";
  898. $ret = oo::commonOprDb('common')->getAll($sql, 1);
  899. $userList = [];
  900. //获取用户和sid对应
  901. if(!empty($ret)) {
  902. foreach ($ret as $v) {
  903. $userList[$v['uid']] = $v['sid'];
  904. }
  905. }
  906. return $userList;
  907. }
  908. /**
  909. * 获取sid的列表
  910. * @return array
  911. */
  912. public function getSidList()
  913. {
  914. $sidConfig = oo::$config;
  915. $sidList = array_keys($sidConfig['sidlist']);
  916. return $sidList;
  917. }
  918. /**
  919. * 同步登录和注册的redis数据
  920. * @param int $state
  921. * @return bool
  922. */
  923. public function sycnLoginData($state = 1)
  924. {
  925. if($state == 1) {
  926. $keyList = $this->loginPlayerKeyList;
  927. }else {
  928. $keyList = $this->newPlayerKeyList;
  929. }
  930. $today = time();
  931. $tmpDay = strtotime("-41 days");
  932. $dayList = $this->getDays($tmpDay, $today, 2);
  933. //循环41天,把之前的登录和注册的人数按sid区分
  934. foreach ($keyList as $val) {
  935. foreach ($val as $device => $keyV) {
  936. $device == 1 ? $sid = 1 : $sid = 2;
  937. foreach ($dayList as $day) {
  938. //把旧的key的值复制到新的key
  939. $keyOld = $keyV.':'.'1:'.$day;
  940. oo::logs()->debug3('oldkey:'.$keyOld, 'statistics.php');
  941. $keyNew = $keyV.':'.$sid.'_1:'.$day;
  942. $ttl = oo::commonOprRedis('statistics')->ttl($keyOld);
  943. if($ttl > 0) {
  944. oo::commonOprRedis('statistics')->sUnionStore($keyNew, $keyOld);
  945. oo::commonOprRedis('statistics')->expire($keyNew, $ttl);
  946. }
  947. }
  948. }
  949. }
  950. return true;
  951. }
  952. /**
  953. * 计算天数差
  954. * $format = 1 Y-m-d else Ymd
  955. */
  956. public function getDays($day1, $day2, $format = 1)
  957. {
  958. $second1 = $day1;
  959. $second2 = $day2;
  960. if ($second1 < $second2) {
  961. $tmp = $second2;
  962. $second2 = $second1;
  963. $second1 = $tmp;
  964. }
  965. $days = ($second1 - $second2) / 86400;
  966. $dayList = array();
  967. for ($i=0; $i <= $days ; $i++) {
  968. if($format == 1) {
  969. $dayList[] = date('Y-m-d', $second2 + 86400*$i);
  970. }else {
  971. $dayList[] = date('Ymd', $second2 + 86400*$i);
  972. }
  973. }
  974. return $dayList;
  975. }
  976. /**
  977. * 获取新增用户的key list
  978. * @return array
  979. */
  980. public function getNewPlayerKeyList()
  981. {
  982. return $this->newPlayerKeyList;
  983. }
  984. public function getLidEnd()
  985. {
  986. return $this->_lidEnd;
  987. }
  988. /**
  989. * 更新ltv数据
  990. * @return bool
  991. */
  992. public function updateLTV($flag = 1)
  993. {
  994. set_time_limit(0);
  995. $table = otable::ltvStatistics();
  996. $dateTmp = date('Ymd', strtotime("-0 days"));
  997. $date1 = date('Ymd', strtotime("$dateTmp -1 days"));//从昨天算新增1天
  998. $date3 = date('Ymd', strtotime("$dateTmp -3 days"));//从昨天算新增3天
  999. $date7 = date('Ymd', strtotime("$dateTmp -7 days"));//从昨天算新增7天
  1000. $date30 = date('Ymd', strtotime("$dateTmp -30 days"));//从昨天算新增30天
  1001. $date60 = date('Ymd', strtotime("$dateTmp -60 days"));//从昨天算新增60天
  1002. $date90 = date('Ymd', strtotime("$dateTmp -90 days"));//从昨天算新增90天
  1003. $sidList = [];
  1004. $platStr = '';
  1005. switch ($flag){
  1006. case 2://安卓
  1007. $sidList = oo::$config['androidSidList'];
  1008. $platStr = ' AND login_plat != 2 ';
  1009. break;
  1010. case 3://IOS
  1011. $sidList = oo::$config['iosSidList'];
  1012. $platStr = ' AND login_plat = 2 ';
  1013. break;
  1014. default:
  1015. break;
  1016. }
  1017. $newPlayer1 = $this->getAllPlayer($date1, 1, $sidList);//前天新增用户
  1018. $newPlayer3 = $this->getAllPlayer($date3, 1, $sidList);//7天前新增用户
  1019. $newPlayer7 = $this->getAllPlayer($date7, 1, $sidList);//7天前新增用户
  1020. $newPlayer30 = $this->getAllPlayer($date30, 1, $sidList);//30天前新增用户
  1021. $newPlayer60 = $this->getNewPlayerList($date60, $platStr);//60天前新增用户 --由于redis只记录了49天的新用户
  1022. $newPlayer90 = $this->getNewPlayerList($date90, $platStr);//90天前新增用户
  1023. $newPlayerNum1 = count($newPlayer1);
  1024. $newPlayerNum3 = count($newPlayer3);
  1025. $newPlayerNum7 = count($newPlayer7);
  1026. $newPlayerNum30 = count($newPlayer30);
  1027. $newPlayerNum60 = count($newPlayer60);
  1028. $newPlayerNum90 = count($newPlayer90);
  1029. $payBlackList = [];
  1030. $payBlackList['uid'] = oo::commonOprModel("config")->payWhiteList();
  1031. $payBlackUidList = $payBlackList['uid'] ?? [];
  1032. $now = time();
  1033. //写入1天前的数据
  1034. $ltvData1 = $this->getLTVData($newPlayer1, 1, $date1, $payBlackUidList);
  1035. $payAmount1Day = floatval($ltvData1['payAmount']);
  1036. $newPayNum1 = intval($ltvData1['newPayNum']);
  1037. $ltv1 = empty($newPlayerNum1) ? 0 : round($payAmount1Day * 1.0 / $newPlayerNum1, 3);
  1038. $insertSql = "INSERT INTO {$table} (date, new_num, ltv1,new_pay_amount1, new_pay_num1, ltv3, new_pay_amount3, new_pay_num3, ltv7, new_pay_amount7, new_pay_num7, ltv30, new_pay_amount30, new_pay_num30, createtime, updatetime, flag) VALUES ({$date1}, {$newPlayerNum1}, {$ltv1}, {$payAmount1Day}, {$newPayNum1}, 0, 0, 0, 0, 0, 0, 0, 0, 0, $now, $now, {$flag})";
  1039. $ret2 = oo::commonOprDb('statistics')->query($insertSql);
  1040. if($ret2 < 1){
  1041. oo::logs()->debug3('insertSql:'.$insertSql, 'ltvstatisticsFail.php');
  1042. }
  1043. //写入ltv3
  1044. $ltvData3 = $this->getLTVData($newPlayer3, 3, $date1, $payBlackUidList);
  1045. $payAmount3Day = floatval($ltvData3['payAmount']);
  1046. $newPayNum3 = intval($ltvData3['newPayNum']);
  1047. $ltv3 = empty($newPlayerNum3) ? 0 : round($payAmount3Day * 1.0 / $newPlayerNum3, 3);
  1048. $updateSql3 = "UPDATE {$table} SET ltv3 = {$ltv3}, new_pay_amount3 = {$payAmount3Day},new_pay_num3 = {$newPayNum3}, updatetime = {$now} WHERE date = {$date3} AND flag = {$flag} LIMIT 1";
  1049. $ret3 = oo::commonOprDb('statistics')->query($updateSql3);
  1050. if($ret3 < 1){
  1051. oo::logs()->debug3('updateSql3:'.$updateSql3, 'ltvstatisticsFail.php');
  1052. }
  1053. //写入ltv7
  1054. $ltvData7 = $this->getLTVData($newPlayer7, 7, $date1, $payBlackUidList);
  1055. $payAmount7Day = floatval($ltvData7['payAmount']);
  1056. $newPayNum7 = intval($ltvData7['newPayNum']);
  1057. $ltv7 = empty($newPlayerNum7) ? 0 : round($payAmount7Day * 1.0 / $newPlayerNum7, 3);
  1058. $updateSql7 = "UPDATE {$table} SET ltv7 = {$ltv7}, new_pay_amount7 = {$payAmount7Day},new_pay_num7 = {$newPayNum7}, updatetime = {$now} WHERE date = {$date7} AND flag = {$flag} LIMIT 1";
  1059. $ret7 = oo::commonOprDb('statistics')->query($updateSql7);
  1060. if($ret7 < 1){
  1061. oo::logs()->debug3('updateSql7:'.$updateSql7, 'ltvstatisticsFail.php');
  1062. }
  1063. //写入ltv30
  1064. $ltvData30 = $this->getLTVData($newPlayer30, 30, $date1, $payBlackUidList);
  1065. $payAmount30Day = floatval($ltvData30['payAmount']);
  1066. $newPayNum30 = intval($ltvData30['newPayNum']);
  1067. $ltv30 = empty($newPlayerNum30) ? 0 : round($payAmount30Day * 1.0 / $newPlayerNum30, 3);
  1068. $updateSql30 = "UPDATE {$table} SET ltv30 = {$ltv30}, new_pay_amount30 = {$payAmount30Day},new_pay_num30 = {$newPayNum30},updatetime = {$now} WHERE date = {$date30} AND flag = {$flag} LIMIT 1 ";
  1069. $ret30 = oo::commonOprDb('statistics')->query($updateSql30);
  1070. if($ret30 < 1){
  1071. oo::logs()->debug3('updateSql30:'.$updateSql30, 'ltvstatisticsFail.php');
  1072. }
  1073. //写入ltv60
  1074. $ltvData60 = $this->getLTVData($newPlayer60, 60, $date1, $payBlackUidList);
  1075. $payAmount60Day = floatval($ltvData60['payAmount']);
  1076. $newPayNum60 = intval($ltvData60['newPayNum']);
  1077. $ltv60 = empty($newPlayerNum60) ? 0 : round($payAmount60Day * 1.0 / $newPlayerNum60, 3);
  1078. $updateSql60 = "UPDATE {$table} SET ltv60 = {$ltv60}, new_pay_amount60 = {$payAmount60Day},new_pay_num60 = {$newPayNum60},updatetime = {$now} WHERE date = {$date60} AND flag = {$flag} LIMIT 1 ";
  1079. $ret60 = oo::commonOprDb('statistics')->query($updateSql60);
  1080. if($ret60 < 1){
  1081. oo::logs()->debug3('updateSql60:'.$updateSql60, 'ltvstatisticsFail.php');
  1082. }
  1083. //写入ltv90
  1084. $ltvData90 = $this->getLTVData($newPlayer90, 90, $date1, $payBlackUidList);
  1085. $payAmount90Day = floatval($ltvData90['payAmount']);
  1086. $newPayNum90 = intval($ltvData90['newPayNum']);
  1087. $ltv90 = empty($newPlayerNum90) ? 0 : round($payAmount90Day * 1.0 / $newPlayerNum90, 3);
  1088. $updateSql90 = "UPDATE {$table} SET ltv90 = {$ltv90}, new_pay_amount90 = {$payAmount90Day},new_pay_num90 = {$newPayNum90},updatetime = {$now} WHERE date = {$date90} AND flag = {$flag} LIMIT 1 ";
  1089. $ret90 = oo::commonOprDb('statistics')->query($updateSql90);
  1090. if($ret90 < 1){
  1091. oo::logs()->debug3('updateSql90:'.$updateSql90, 'ltvstatisticsFail.php');
  1092. }
  1093. return true;
  1094. }
  1095. /**
  1096. * 获取登录用户
  1097. * @param $loginUserList
  1098. * @param $date
  1099. * @return int
  1100. */
  1101. public function getLoginNum($loginUserList, $date, $daysBegin, $daysEnd, $newPlayer)
  1102. {
  1103. $loginListTmp = [];
  1104. //统计第二天到第七天的登录人数
  1105. for ($i=$daysBegin; $i < $daysEnd; $i++){
  1106. $dateTmp = date('Ymd', strtotime("$date +$i days"));
  1107. $loginPlayer = $loginUserList[$dateTmp] ?? [];
  1108. $newLoginPlayer = array_intersect($newPlayer, $loginPlayer);
  1109. if(!is_array($newLoginPlayer)){
  1110. $newLoginPlayer = array($newLoginPlayer);
  1111. }
  1112. $loginListTmp = array_merge($newLoginPlayer, $loginListTmp);
  1113. }
  1114. $loginListTmp = empty($loginListTmp) ? [] : array_unique($loginListTmp);
  1115. $loginPlayer = count($loginListTmp);
  1116. return $loginPlayer;
  1117. }
  1118. /**
  1119. * 更新付费用户数据
  1120. * @return bool
  1121. */
  1122. public function updatePayRemain($flag = 1, $day=0)
  1123. {
  1124. set_time_limit(0);
  1125. ini_set('memory_limit', '2048M');
  1126. $table = otable::payremainStatistics();
  1127. $dateTmp = date('Ymd', strtotime("-$day days"));
  1128. $date1 = date('Ymd', strtotime("$dateTmp -1 days"));//从昨天算新增1天
  1129. $date3 = date('Ymd', strtotime("$dateTmp -3 days"));//从昨天算新增3天
  1130. $date7 = date('Ymd', strtotime("$dateTmp -7 days"));//从昨天算新增7天
  1131. $date15 = date('Ymd', strtotime("$dateTmp -15 days"));//从昨天算新增15天
  1132. $date30 = date('Ymd', strtotime("$dateTmp -30 days"));//从昨天算新增30天
  1133. $date60 = date('Ymd', strtotime("$dateTmp -60 days"));//从昨天算新增60天
  1134. $date90 = date('Ymd', strtotime("$dateTmp -90 days"));//从昨天算新增90天
  1135. $date120 = date('Ymd', strtotime("$dateTmp -120 days"));//从昨天算新增120天
  1136. $date180 = date('Ymd', strtotime("$dateTmp -180 days"));//从昨天算新增180天
  1137. $sidList = [];
  1138. $platStr = '';
  1139. switch ($flag){
  1140. case 2://安卓
  1141. $sidList = oo::$config['androidSidList'];
  1142. $platStr = ' AND login_plat != 2 ';
  1143. break;
  1144. case 3://IOS
  1145. $sidList = oo::$config['iosSidList'];
  1146. $platStr = ' AND login_plat = 2 ';
  1147. break;
  1148. default:
  1149. break;
  1150. }
  1151. $payBlackList = [];
  1152. $payBlackList['uid'] = oo::commonOprModel("config")->payWhiteList();
  1153. $payBlackUidList = $payBlackList['uid'] ?? [];
  1154. $newPlayer1 = $this->getAllPlayer($date1, 1, $sidList);//1天前新增用户
  1155. $newPlayer3 = $this->getAllPlayer($date3, 1, $sidList);//3天前新增用户
  1156. $newPlayer7 = $this->getAllPlayer($date7, 1, $sidList);//7天前新增用户
  1157. $newPlayer15 = $this->getAllPlayer($date15, 1, $sidList);//15天新增用户
  1158. $newPlayer30 = $this->getAllPlayer($date30, 1, $sidList);//30天新增用户
  1159. $newPlayer60 = $this->getNewPlayerList($date60, $platStr);//60天前新增用户 --由于redis只记录了49天的新用户
  1160. $newPlayer90 = $this->getNewPlayerList($date90, $platStr);//60天前新增用户 --由于redis只记录了49天的新用户
  1161. $newPlayer120 = $this->getNewPlayerList($date120, $platStr);//120天前新增用户
  1162. $newPlayer180 = $this->getNewPlayerList($date180, $platStr);//180天前新增用户
  1163. $newPayUserList1 = $this->getNewPayUser($date1, $newPlayer1, $payBlackUidList);//该天发付费用户
  1164. $newPayUserList3 = $this->getNewPayUser($date3, $newPlayer3, $payBlackUidList);
  1165. $newPayUserList7 = $this->getNewPayUser($date7, $newPlayer7, $payBlackUidList);
  1166. $newPayUserList15 = $this->getNewPayUser($date15, $newPlayer15, $payBlackUidList);
  1167. $newPayUserList30 = $this->getNewPayUser($date30, $newPlayer30, $payBlackUidList);
  1168. $newPayUserList60 = $this->getNewPayUser($date60, $newPlayer60, $payBlackUidList);
  1169. $newPayUserList90 = $this->getNewPayUser($date90, $newPlayer90, $payBlackUidList);
  1170. $newPayUserList120 = $this->getNewPayUser($date120, $newPlayer120, $payBlackUidList);
  1171. $newPayUserList180 = $this->getNewPayUser($date180, $newPlayer180, $payBlackUidList);
  1172. $newPayNum1 = count($newPayUserList1);
  1173. $now = time();
  1174. //写入1天前的数据
  1175. $insertSql = "INSERT INTO {$table} (date, payNum, dauNum_3,payNum_3, payAmount_3,dauNum_7,payNum_7, payAmount_7,dauNum_15,payNum_15, payAmount_15,dauNum_30,payNum_30, payAmount_30,dauNum_60,payNum_60, payAmount_60,dauNum_120,payNum_120, payAmount_120, createtime, flag) VALUES ({$date1}, {$newPayNum1}, 0, 0, 0, 0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0, $now,{$flag})";
  1176. $ret2 = oo::commonOprDb('statistics')->query($insertSql);
  1177. if($ret2 < 1){
  1178. oo::logs()->debug3('insertSql:'.$insertSql, 'payremainstatisticsFail.php');
  1179. }
  1180. //获取登录数据
  1181. $loginUserList = [];
  1182. for($j=179; $j > 0; $j--){
  1183. $dateLogin = date('Ymd', strtotime("-$j days"));
  1184. $loginUserList[$dateLogin] = oo::commonOprModel('statistics')->getAllPlayer($dateLogin, 2, $sidList);
  1185. if($j % 21 == 0){
  1186. usleep(100);
  1187. }
  1188. }
  1189. //统计第二天到第3天的登录人数
  1190. $loginPlayer3 = $this->getLoginNum($loginUserList, $date3, 1, 3, $newPayUserList3);
  1191. //统计第4天到第七天的登录人数
  1192. $loginPlayer7 = $this->getLoginNum($loginUserList, $date7, 3, 7, $newPayUserList7);
  1193. //统计第8天到第15天的登录人数
  1194. $loginPlayer15 = $this->getLoginNum($loginUserList, $date15, 7, 15, $newPayUserList15);
  1195. //统计第16天到第30天的登录人数
  1196. $loginPlayer30 = $this->getLoginNum($loginUserList, $date30, 15, 30, $newPayUserList30);
  1197. //统计第31天到第60天的登录人数
  1198. $loginPlayer60 = $this->getLoginNum($loginUserList, $date60, 30, 60, $newPayUserList60);
  1199. //统计第61天到第90天的登录人数
  1200. $loginPlayer90 = $this->getLoginNum($loginUserList, $date90, 60, 90, $newPayUserList90);
  1201. //统计第91天到第120天的登录人数
  1202. $loginPlayer120 = $this->getLoginNum($loginUserList, $date120, 90, 120, $newPayUserList120);
  1203. //统计第121天到第180天的登录人数
  1204. $loginPlayer180 = $this->getLoginNum($loginUserList, $date180, 120, 180, $newPayUserList180);
  1205. //写入3日除去前1日
  1206. $payUserRet3 = $this->getPayRmainData($newPayUserList3, $date3, 1, 3, $payBlackUidList);
  1207. $payAmount3Day = floatval($payUserRet3['payAmount']);
  1208. $newPayNum3 = intval($payUserRet3['newPayNum']);
  1209. $updateSql3 = "UPDATE {$table} SET dauNum_3 = {$loginPlayer3}, payNum_3 = {$newPayNum3},payAmount_3 = {$payAmount3Day} WHERE date = {$date3} AND flag = {$flag} LIMIT 1";
  1210. $ret3 = oo::commonOprDb('statistics')->query($updateSql3);
  1211. if($ret3 < 1){
  1212. oo::logs()->debug3('updateSql3:'.$updateSql3, 'ltvstatisticsFail.php');
  1213. }
  1214. //写入7日除去前3日
  1215. $payUserRet7 = $this->getPayRmainData($newPayUserList7, $date7, 3, 7, $payBlackUidList);
  1216. $payAmount7Day = floatval($payUserRet7['payAmount']);
  1217. $newPayNum7 = intval($payUserRet7['newPayNum']);
  1218. $updateSql7 = "UPDATE {$table} SET dauNum_7 = {$loginPlayer7}, payNum_7 = {$newPayNum7},payAmount_7 = {$payAmount7Day} WHERE date = {$date7} AND flag = {$flag} LIMIT 1";
  1219. $ret7 = oo::commonOprDb('statistics')->query($updateSql7);
  1220. if($ret7 < 1){
  1221. oo::logs()->debug3('updateSql7:'.$updateSql7, 'ltvstatisticsFail.php');
  1222. }
  1223. //写入15日除去前7日
  1224. $payUserRet15 = $this->getPayRmainData($newPayUserList15, $date15, 7, 15, $payBlackUidList);
  1225. $payAmount15Day = floatval($payUserRet15['payAmount']);
  1226. $newPayNum15 = intval($payUserRet15['newPayNum']);
  1227. $updateSql15 = "UPDATE {$table} SET dauNum_15 = {$loginPlayer15}, payNum_15 = {$newPayNum15},payAmount_15 = {$payAmount15Day} WHERE date = {$date15} AND flag = {$flag} LIMIT 1";
  1228. $ret15 = oo::commonOprDb('statistics')->query($updateSql15);
  1229. if($ret15 < 1){
  1230. oo::logs()->debug3('updateSql15:'.$updateSql15, 'ltvstatisticsFail.php');
  1231. }
  1232. //写入30日除去前15日
  1233. $payUserRet30 = $this->getPayRmainData($newPayUserList30, $date30, 15, 30, $payBlackUidList);
  1234. $payAmount30Day = floatval($payUserRet30['payAmount']);
  1235. $newPayNum30= intval($payUserRet30['newPayNum']);
  1236. $updateSql30 = "UPDATE {$table} SET dauNum_30 = {$loginPlayer30}, payNum_30 = {$newPayNum30},payAmount_30 = {$payAmount30Day} WHERE date = {$date30} AND flag = {$flag} LIMIT 1";
  1237. $ret30 = oo::commonOprDb('statistics')->query($updateSql30);
  1238. if($ret30 < 1){
  1239. oo::logs()->debug3('updateSql30:'.$updateSql30, 'ltvstatisticsFail.php');
  1240. }
  1241. //写入60日除去前30日
  1242. $payUserRet60 = $this->getPayRmainData($newPayUserList60, $date60, 30, 60, $payBlackUidList);
  1243. $payAmount60Day = floatval($payUserRet60['payAmount']);
  1244. $newPayNum60= intval($payUserRet60['newPayNum']);
  1245. $updateSql60 = "UPDATE {$table} SET dauNum_60 = {$loginPlayer60}, payNum_60 = {$newPayNum60},payAmount_60 = {$payAmount60Day} WHERE date = {$date60} AND flag = {$flag} LIMIT 1";
  1246. $ret60 = oo::commonOprDb('statistics')->query($updateSql60);
  1247. if($ret60 < 1){
  1248. oo::logs()->debug3('updateSql60:'.$updateSql60, 'ltvstatisticsFail.php');
  1249. }
  1250. //写入90日除去前60日
  1251. $payUserRet90 = $this->getPayRmainData($newPayUserList90, $date90, 60, 90, $payBlackUidList);
  1252. $payAmount90Day = floatval($payUserRet90['payAmount']);
  1253. $newPayNum90= intval($payUserRet90['newPayNum']);
  1254. $updateSql90 = "UPDATE {$table} SET dauNum_90 = {$loginPlayer90}, payNum_90 = {$newPayNum90},payAmount_90 = {$payAmount90Day} WHERE date = {$date90} AND flag = {$flag} LIMIT 1";
  1255. $ret90 = oo::commonOprDb('statistics')->query($updateSql90);
  1256. if($ret90 < 1){
  1257. oo::logs()->debug3('updateSql90:'.$updateSql90, 'ltvstatisticsFail.php');
  1258. }
  1259. //写入120日除去前90日
  1260. $payUserRet120 = $this->getPayRmainData($newPayUserList120, $date120, 90, 120, $payBlackUidList);
  1261. $payAmount120Day = floatval($payUserRet120['payAmount']);
  1262. $newPayNum120 = intval($payUserRet120['newPayNum']);
  1263. $updateSql120 = "UPDATE {$table} SET dauNum_120 = {$loginPlayer120}, payNum_120 = {$newPayNum120},payAmount_120 = {$payAmount120Day} WHERE date = {$date120} AND flag = {$flag} LIMIT 1";
  1264. $ret120 = oo::commonOprDb('statistics')->query($updateSql120);
  1265. if($ret120 < 1){
  1266. oo::logs()->debug3('updateSql120:'.$updateSql120, 'ltvstatisticsFail.php');
  1267. }
  1268. //写入180日除去前120日
  1269. $payUserRet180 = $this->getPayRmainData($newPayUserList180, $date180, 120, 180, $payBlackUidList);
  1270. $payAmount180Day = floatval($payUserRet180['payAmount']);
  1271. $newPayNum180 = intval($payUserRet180['newPayNum']);
  1272. $updateSql180 = "UPDATE {$table} SET dauNum_180 = {$loginPlayer180}, payNum_180 = {$newPayNum180},payAmount_180 = {$payAmount180Day} WHERE date = {$date180} AND flag = {$flag} LIMIT 1";
  1273. $ret180 = oo::commonOprDb('statistics')->query($updateSql180);
  1274. if($ret180 < 1){
  1275. oo::logs()->debug3('updateSql180:'.$updateSql180, 'ltvstatisticsFail.php');
  1276. }
  1277. return true;
  1278. }
  1279. /**
  1280. * 获取超过30天的新注册用户
  1281. * @param $createtime
  1282. * @return array
  1283. */
  1284. public function getNewPlayerList($date, $platStr = '')
  1285. {
  1286. if(empty($date)){
  1287. $stime = strtotime(" 0:0:0");
  1288. $etime = strtotime(" 23:59:59");
  1289. }else{
  1290. $stime = strtotime("$date 0:0:0");
  1291. $etime = strtotime("$date 23:59:59");
  1292. }
  1293. $userList = [];
  1294. $key = okeys::robotUidList();
  1295. //如果是机器人
  1296. $robotUidList = oo::commonOprRedis('robot')->sMembers($key);
  1297. //获取注册用户时间
  1298. //for($j = 0; $j < 100; $j++){
  1299. //$userinfo = otable::userinfo($j);
  1300. $userinfo = otable::userinfo(1);
  1301. $sqlUser = "SELECT createtime, uid FROM {$userinfo} WHERE createtime >= {$stime} AND createtime <= {$etime} {$platStr} " ;
  1302. $retUser = oo::commonOprDb('userinfo')->getAll($sqlUser, 1);
  1303. foreach ($retUser as $val){
  1304. $uid = $val['uid'];
  1305. //如果是机器人,则不包括
  1306. if(in_array($uid, $robotUidList)){
  1307. continue;
  1308. }
  1309. $userList[] = $uid;
  1310. }
  1311. //}
  1312. return $userList;
  1313. }
  1314. public function getLTVData($newPlayer, $days, $tmpDate = '', $payBlackList = [])
  1315. {
  1316. $tmpDays = $days - 1;
  1317. empty($tmpDate) && $tmpDate = date('Ymd', strtotime("-1 days"));
  1318. $date = date('Ymd', strtotime("$tmpDate -$tmpDays days"));
  1319. $stime = strtotime("$date 0:0:0");
  1320. $etime = strtotime("$tmpDate 23:59:59");
  1321. $payBlackUidStr = implode(',', $payBlackList);
  1322. $whereStr = empty($payBlackList) ? '' : " AND sl_uid NOT IN ({$payBlackUidStr}) ";
  1323. $summaryList = otable::summarylist();
  1324. $sql = " SELECT sl_uid, sum(sl_pusd) as sl_pusd FROM {$summaryList} WHERE sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $whereStr GROUP BY sl_uid ";
  1325. $ret = oo::commonOprDb('payment')->getAll($sql, 1);
  1326. $newPayNum = 0;
  1327. $payAmount = 0;
  1328. foreach ($ret as $val){
  1329. if(in_array($val['sl_uid'], $newPlayer)){//是新用户
  1330. $pusd = $val['sl_pusd'];
  1331. $payAmount += $pusd;
  1332. $newPayNum++;
  1333. }
  1334. }
  1335. $data['payAmount'] = $payAmount;
  1336. $data['newPayNum'] = $newPayNum;
  1337. return $data;
  1338. }
  1339. /**
  1340. * 获取付费用户留存
  1341. * @param $newPlayer
  1342. * @param $sdate
  1343. * @param $edate
  1344. * @param array $payBlackList
  1345. * @return mixed
  1346. */
  1347. public function getPayRmainData($newPlayer, $date, $daysBegin, $daysEnd, $payBlackList = [])
  1348. {
  1349. $stime = strtotime("$date 0:0:0 + $daysBegin days");
  1350. $etime = strtotime("$date 23:59:59 + $daysEnd days");
  1351. $payBlackUidStr = implode(',', $payBlackList);
  1352. $whereStr = empty($payBlackList) ? '' : " AND sl_uid NOT IN ({$payBlackUidStr}) ";
  1353. $summaryList = otable::summarylist();
  1354. $sql = " SELECT sl_uid, sum(sl_pusd) as sl_pusd FROM {$summaryList} WHERE sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_status = 2 $whereStr GROUP BY sl_uid ";
  1355. $ret = oo::commonOprDb('payment')->getAll($sql, 1);
  1356. $newPayNum = 0;
  1357. $payAmount = 0;
  1358. foreach ($ret as $val){
  1359. if(in_array($val['sl_uid'], $newPlayer)){//是新用户
  1360. $pusd = $val['sl_pusd'];
  1361. $payAmount += $pusd;
  1362. $newPayNum++;
  1363. }
  1364. }
  1365. $data['payAmount'] = $payAmount;
  1366. $data['newPayNum'] = $newPayNum;
  1367. return $data;
  1368. }
  1369. /**
  1370. * 获取某个时间段付费人数
  1371. * @param $sdate
  1372. * @param $edate
  1373. * @param $newPlayer
  1374. */
  1375. public function getNewPayUser($sdate,$newPlayer, $payBlackUidList)
  1376. {
  1377. $payBlackStr = implode(',', $payBlackUidList);
  1378. $summaryList = otable::summarylist();
  1379. $stime = strtotime("$sdate 0:0:0");
  1380. $stimeEnd = strtotime("$sdate 23:59:59");
  1381. $newPayUserList1 = $newPayUserList7 = [];
  1382. //查询首日付费用户
  1383. $sql = " SELECT DISTINCT sl_uid FROM {$summaryList} WHERE sl_status and sl_pay_time >= {$stime} AND sl_pay_time <= {$stimeEnd} AND sl_status = 2 AND sl_uid NOT IN ({$payBlackStr}) ";
  1384. $ret = oo::commonOprDb('payment')->getAll($sql, 1);
  1385. if(!empty($ret)){
  1386. foreach ($ret as $val){
  1387. if(in_array($val['sl_uid'], $newPlayer)){
  1388. $newPayUserList1[] = $val['sl_uid'];
  1389. }
  1390. }
  1391. }
  1392. return $newPayUserList1;
  1393. }
  1394. public function avgLoginTime(){
  1395. // $robot = oo::commonOprModel('robot')->getAllRobot();
  1396. // $NotUid = implode(',',$robot);
  1397. // $sum = 0;
  1398. // $total = 0;
  1399. // for($i=0;$i<100;$i++){
  1400. // $tb = otable::statistics($i);
  1401. // $dbsum = oo::commonOprDb('statistics')->getOne("SELECT SUM(loginTime) as sum FROM {$tb} WHERE uid NOT IN ($NotUid)", MYSQLI_ASSOC);
  1402. // $dbtotal = oo::commonOprDb('statistics')->getOne(" SELECT count(1) as total FROM {$tb} WHERE uid NOT IN ($NotUid)", MYSQLI_ASSOC);
  1403. // $sum += $dbsum['sum'];
  1404. // $total += $dbtotal['total'];
  1405. // }
  1406. $data = $this->getAllLoginTime();
  1407. $sum = array_sum(array_values($data));
  1408. $total = count(array_keys($data));
  1409. if(empty($data)){
  1410. return 0;
  1411. }
  1412. return $sum/$total;
  1413. }
  1414. /**
  1415. * 获取登录时长所有数据(分散在多个环形hash key内)
  1416. * @return array
  1417. */
  1418. public function getAllLoginTime() {
  1419. $keys = okeys::LoginTimes();
  1420. $data = [];
  1421. foreach($keys as $k){
  1422. $data = $data + oo::commonOprRedis('common')->hGetAll($k);
  1423. }
  1424. return $data;
  1425. }
  1426. /**
  1427. * 删除所有登录时长环形key
  1428. */
  1429. public function delAllLoginTime() {
  1430. $keys = okeys::LoginTimes();
  1431. foreach($keys as $k){
  1432. oo::commonOprRedis('common')->delete($k);
  1433. }
  1434. }
  1435. public function savePropertyStatistics(){
  1436. $actArr = ["+"=>"add","-"=>"low"];
  1437. $addTotal = 0;
  1438. $lowTotal = 0;
  1439. $data = [];
  1440. foreach ($actArr as $key=>$row){
  1441. if($key == "+"){
  1442. $moneyAddType = oo::commonOprModel('member')->moneyAddType();
  1443. foreach ($moneyAddType as $x=>$y){
  1444. $num = oo::commonOprRedis('statistics')->getSet("Statistics:money{$key}{$x}",0);
  1445. $data['money']['add'][$x] += intval($num);
  1446. $addTotal += intval($num);
  1447. }
  1448. $spinAddType = oo::commonOprModel('member')->sipnAddType();
  1449. foreach ($spinAddType as $x=>$y){
  1450. $num = oo::commonOprRedis('statistics')->getSet("Statistics:spins{$key}{$x}",0);
  1451. $data['spins']['add'][$x] += intval($num);
  1452. }
  1453. }else if($key == "-"){
  1454. $moneyLowType = oo::commonOprModel('member')->moneyLowType();
  1455. foreach ($moneyLowType as $x=>$y){
  1456. $num = oo::commonOprRedis('statistics')->getSet("Statistics:money{$key}{$x}",0);
  1457. $data['money']['low'][$x] += intval($num);
  1458. $lowTotal += intval($num);
  1459. }
  1460. $sipnLowType = oo::commonOprModel('member')->sipnLowType();
  1461. foreach ($sipnLowType as $x=>$y){
  1462. $num = oo::commonOprRedis('statistics')->getSet("Statistics:spins{$key}{$x}",0);
  1463. $data['spins']['low'][$x] += intval($num);
  1464. }
  1465. }
  1466. }
  1467. $date = date('Y-m-d');
  1468. $tbKey[] = 'date';
  1469. $tbVal[] = date('Ymd');
  1470. $tbKey[] = 'data';
  1471. $tbVal[] = json_encode($data);
  1472. $tb = otable::AssetsSta();
  1473. $tbKey = implode(',',$tbKey);
  1474. $tbVal = implode("','",$tbVal);
  1475. $tbVal = "'".$tbVal."'";
  1476. $sql = "INSERT INTO {$tb} ($tbKey) VALUES ({$tbVal})";
  1477. oo::commonOprDb('statistics')->query($sql);
  1478. $keyArr = ["money", "spins", "shield", "star", "levelId","slotCount"];
  1479. $temp = [];
  1480. foreach ($actArr as $key=>$row){
  1481. foreach ($keyArr as $x){
  1482. $okey = ($key== "+")?okeys::PropertyAdd($x):okeys::PropertyLow($x);
  1483. $ret = oo::commonOprRedis('statistics')->get($okey);
  1484. $temp[$row][$x] = $ret?$ret:0;
  1485. oo::commonOprRedis('statistics')->delete($okey);
  1486. }
  1487. }
  1488. $tableAdd = otable::PropertyAdd();
  1489. $sql = " INSERT INTO {$tableAdd}(date,money,spins,shield,star,levelId,slotCount) VALUES('{$date}',{$addTotal},{$temp['add']['spins']},{$temp['add']['shield']},{$temp['add']['star']},{$temp['add']['levelId']},{$temp['add']['slotCount']})";
  1490. oo::commonOprDb('statistics')->query($sql);
  1491. $tableAdd = otable::Propertylow();
  1492. $sql = " INSERT INTO {$tableAdd}(date,money,spins,shield,star) VALUES('{$date}',{$lowTotal},{$temp['low']['spins']},{$temp['low']['shield']},{$temp['low']['star']})";
  1493. oo::commonOprDb('statistics')->query($sql);
  1494. var_dump('run savePropertyStatistics');
  1495. }
  1496. /**
  1497. * 新手流失率
  1498. * Created by: Owen
  1499. * Created on: 2019/7/26 16:58
  1500. * Description:
  1501. */
  1502. public function newLost($timestamp){
  1503. $seven = $timestamp - 24*60*60*8;
  1504. $fifteen = $timestamp - 24*60*60*15;
  1505. $thirty = $timestamp - 24*60*60*30;
  1506. $data = [
  1507. 'time'=>date('Y-m-d', $timestamp),
  1508. 'seven'=>'',
  1509. 'fifteen'=>0,
  1510. 'thirty'=>0,
  1511. 'seven_percent'=>0,
  1512. 'fifteen_percent'=>0,
  1513. 'thirty_percent'=>0,
  1514. 'total'=>0,
  1515. ];
  1516. $robot = oo::commonOprModel('robot')->getAllRobot();
  1517. $robot = implode(',',$robot);
  1518. $total = 0;
  1519. $sevenc = 0;
  1520. $fifteenc = 0;
  1521. $thirtyc = 0;
  1522. //for ($i=0;$i<100;$i++){
  1523. $ghTb = otable::gh_gameserver(1);
  1524. $userTb = otable::userinfo(1);
  1525. $sql = "SELECT count(*) as count FROM {$ghTb} WHERE mid NOT IN ({$robot})";
  1526. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1527. $total += $ret['count'];
  1528. $sql = "SELECT count(*) as count FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$seven} AND gh.beginGuide<18 AND gh.mid NOT IN ({$robot}) LIMIT 1";
  1529. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1530. $sevenc += $ret['count'];
  1531. $sql = "SELECT count(*) as count FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$fifteen} AND gh.beginGuide<18 AND gh.mid NOT IN ({$robot}) LIMIT 1";
  1532. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1533. $fifteenc += $ret['count'];
  1534. $sql = "SELECT count(*) as count FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$thirty} AND gh.beginGuide<18 AND gh.mid NOT IN ({$robot}) LIMIT 1";
  1535. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1536. $thirtyc += $ret['count'];
  1537. //}
  1538. $data['total'] = ($total != 0)?$total:0;
  1539. $data['seven'] = $sevenc;
  1540. $data['seven_percent'] = round($sevenc/$data['total'],2);
  1541. $data['fifteen'] = $fifteenc;
  1542. $data['fifteen_percent'] = round($fifteenc/$data['total'],2);
  1543. $data['thirty'] = $thirtyc;
  1544. $data['thirty_percent'] = round($thirtyc/$data['total'],2);
  1545. $tb = otable::NewLost();
  1546. $value = array_values($data);
  1547. $value = implode("','",$value);
  1548. $value = "'{$value}'";
  1549. $sql = "INSERT INTO {$tb} VALUES({$value})";
  1550. oo::commonOprDb('statistics')->query($sql,true);
  1551. }
  1552. public function newGuideLost(){
  1553. $keys = [10002,10003,10004,10005,10006,10007];
  1554. foreach ($keys as $eventId){
  1555. if($eventId == 10002 || $eventId == 10003){
  1556. continue;
  1557. }
  1558. $data = [
  1559. 'time'=>date('Y-m-d'),
  1560. 'event_id'=>$eventId,
  1561. 'data'=>[],
  1562. 'total'=>0,
  1563. 'success_total'=>0,
  1564. 'other'=>[],
  1565. 'version'=>0,
  1566. ];
  1567. //FB
  1568. $dataFb = [
  1569. 'time'=>date('Y-m-d'),
  1570. 'event_id'=>$eventId,
  1571. 'data'=>[],
  1572. 'total'=>0,
  1573. 'success_total'=>0,
  1574. 'version'=>0,
  1575. ];
  1576. //游客
  1577. $dataVisitor = [
  1578. 'time'=>date('Y-m-d'),
  1579. 'event_id'=>$eventId,
  1580. 'data'=>[],
  1581. 'total'=>0,
  1582. 'success_total'=>0,
  1583. ];
  1584. $eventData = oo::commonOprRedis('Statistics')->hGetAll(okeys::Report($eventId));
  1585. $data['total'] = count($eventData);
  1586. $Users = [];//总用户
  1587. $fbUsers = [];//fb用户
  1588. $visitorUsers = [];//游客
  1589. foreach ($eventData as $key=>$row){
  1590. if($row<24){
  1591. $data['data'][$row] = $data['data'][$row] + 1;
  1592. }
  1593. //10005事件 区分FB、游客
  1594. if($eventId == 10005 || $eventId == 10006 || $eventId == 10007){
  1595. $Users[] = $key;
  1596. if(oo::commonOprModel('member')->isVistor($key) == 1){
  1597. //游客
  1598. $visitorUsers[] = $key;
  1599. $dataVisitor['data'][$row] = $dataVisitor['data'][$row] + 1;
  1600. }else{
  1601. //FB
  1602. $fbUsers[] = $key;
  1603. $dataFb['data'][$row] = $dataFb['data'][$row] + 1;
  1604. }
  1605. }
  1606. }
  1607. $dataFb['total'] = count($fbUsers);//FB总流失数 包括通过的
  1608. $dataVisitor['total'] = count($visitorUsers);//游客总流失数 包括通过的
  1609. //最后一个事件人数减去通过新手的人数
  1610. if($eventId == 10005 || $eventId == 10006 || $eventId == 10007){
  1611. //所有当天注册玩家
  1612. $successUsersCount = 0;
  1613. if(!empty($Users)){
  1614. $UidStr = empty($Users) ? '' : " AND mid IN (".implode(',', $Users).") ";
  1615. //所有通过新手任务的玩家
  1616. //for($i = 0; $i < 100; $i ++){
  1617. $slTable = otable::gh_gameserver(1);
  1618. $sql = " SELECT count(*) AS count FROM {$slTable} WHERE beginGuide = 19 {$UidStr}";
  1619. $result = oo::commonOprDB('payment')->getOne($sql, 1);
  1620. $successUsersCount +=$result['count'];
  1621. //}
  1622. }
  1623. $data['success_total'] = $successUsersCount;
  1624. //FB的通过数
  1625. $successUsersCountFb = 0;
  1626. if(!empty($fbUsers)){
  1627. $UidStrFb = empty($fbUsers) ? '' : " AND mid IN (".implode(',', $fbUsers).") ";
  1628. //所有通过新手任务的玩家
  1629. //for($i = 0; $i < 100; $i ++){
  1630. $slTable = otable::gh_gameserver(1);
  1631. $sql = " SELECT count(*) AS count FROM {$slTable} WHERE beginGuide = 19 {$UidStrFb}";
  1632. $result = oo::commonOprDB('payment')->getOne($sql, 1);
  1633. $successUsersCountFb +=$result['count'];
  1634. //}
  1635. }
  1636. $dataFb['success_total'] = $successUsersCountFb;
  1637. //游客的通过数
  1638. $successUsersCountVisitor = 0;
  1639. if(!empty($visitorUsers)){
  1640. $UidStrVisitor = empty($visitorUsers) ? '' : " AND mid IN (".implode(',', $visitorUsers).") ";
  1641. //所有通过新手任务的玩家
  1642. //for($i = 0; $i < 100; $i ++){
  1643. $slTable = otable::gh_gameserver(1);
  1644. $sql = " SELECT count(*) AS count FROM {$slTable} WHERE beginGuide = 19 {$UidStrVisitor}";
  1645. $result = oo::commonOprDB('payment')->getOne($sql, 1);
  1646. $successUsersCountVisitor +=$result['count'];
  1647. //}
  1648. }
  1649. $dataVisitor['success_total'] = $successUsersCountVisitor;
  1650. }
  1651. $data['data'] = json_encode($data['data'],JSON_NUMERIC_CHECK);
  1652. //插入游客 统计结果
  1653. //$dataVisitor['data'] = json_encode($dataVisitor['data'],JSON_NUMERIC_CHECK);
  1654. $data['other']['fb'] = $dataFb;
  1655. $data['other']['visitor'] = $dataVisitor;
  1656. $data['other'] = json_encode($data['other'],JSON_NUMERIC_CHECK);
  1657. $tb = otable::newGuideLost();
  1658. $value = array_values($data);
  1659. $value = implode("','",$value);
  1660. $value = "'{$value}'";
  1661. $sql = "INSERT INTO {$tb} VALUES({$value})";
  1662. oo::commonOprDb('statistics')->query($sql,false);
  1663. //插入FB 统计结果
  1664. $dataFb['data'] = json_encode($dataFb['data'],JSON_NUMERIC_CHECK);
  1665. $tb = otable::newGuideLostFb();
  1666. $value = array_values($dataFb);
  1667. $value = implode("','",$value);
  1668. $value = "'{$value}'";
  1669. $sql = "INSERT INTO {$tb} VALUES({$value})";
  1670. oo::commonOprDb('statistics')->query($sql,false);
  1671. oo::commonOprRedis('Statistics')->delete(okeys::Report($eventId));
  1672. }
  1673. }
  1674. /**
  1675. * 关卡流失率
  1676. * Created by: Owen
  1677. * Created on: 2019/7/26 16:56
  1678. * Description:
  1679. */
  1680. public function levelLost($timestamp){
  1681. $seven = $timestamp - 24*60*60*8;
  1682. $fifteen = $timestamp - 24*60*60*15;
  1683. $thirty = $timestamp - 24*60*60*30;
  1684. $data = [
  1685. 'time'=>date('Y-m-d', $timestamp),
  1686. 'total'=>0,
  1687. 'seven'=>[],
  1688. 'fifteen'=>[],
  1689. 'thirty'=>[],
  1690. ];
  1691. $robot = oo::commonOprModel('robot')->getAllRobot();
  1692. $robot = implode(',',$robot);
  1693. //for ($i=0;$i<100;$i++){
  1694. $ghTb = otable::gh_gameserver(1);
  1695. $userTb = otable::userinfo(1);
  1696. $sql = "SELECT count(*) as count FROM {$ghTb} WHERE mid NOT IN ({$robot})";
  1697. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1698. $data['total'] = $ret['count'];
  1699. $sql = "SELECT gh.levelId as level FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$seven} AND gh.mid NOT IN ({$robot}) ORDER BY gh.levelId";
  1700. $ret = oo::commonOprDb('common')->getAll($sql,1);
  1701. foreach ($ret as $row){
  1702. $data['seven'][$row['level']] = $data['seven'][$row['level']] + 1;
  1703. }
  1704. $sql = "SELECT gh.levelId as level FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$fifteen} AND gh.mid NOT IN ({$robot}) ORDER BY gh.levelId";
  1705. $ret = oo::commonOprDb('common')->getAll($sql,1);
  1706. foreach ($ret as $row){
  1707. $data['fifteen'][$row['level']] = $data['fifteen'][$row['level']] + 1;
  1708. }
  1709. $sql = "SELECT gh.levelId as level FROM {$ghTb} AS gh LEFT JOIN {$userTb} as u ON gh.mid=u.uid WHERE u.lasttime<{$thirty} AND gh.mid NOT IN ({$robot}) ORDER BY gh.levelId";
  1710. $ret = oo::commonOprDb('common')->getAll($sql,1);
  1711. foreach ($ret as $row){
  1712. $data['thirty'][$row['level']] = $data['thirty'][$row['level']] + 1;
  1713. }
  1714. //}
  1715. $data['seven'] = json_encode($data['seven'],JSON_NUMERIC_CHECK);
  1716. $data['fifteen'] = json_encode($data['fifteen'],JSON_NUMERIC_CHECK);
  1717. $data['thirty'] = json_encode($data['thirty'],JSON_NUMERIC_CHECK);
  1718. $tb = otable::LevelLost();
  1719. $value = array_values($data);
  1720. $value = implode("','",$value);
  1721. $value = "'{$value}'";
  1722. $sql = "INSERT INTO {$tb} VALUES({$value})";
  1723. oo::commonOprDb('statistics')->query($sql,false);
  1724. }
  1725. /**
  1726. * 关卡通过率
  1727. * Created by: Owen
  1728. * Created on: 2019/7/26 17:01
  1729. * Description:
  1730. */
  1731. public function levelThrough($timestamp){
  1732. $stime = strtotime(date('Y-m-d 00:00:00', $timestamp));
  1733. $etime = strtotime(date('Y-m-d 23:59:59', $timestamp));
  1734. $data = [
  1735. 'time'=>date('Y-m-d', $timestamp),
  1736. 'data'=>[],
  1737. 'total'=>0,
  1738. ];
  1739. $robot = oo::commonOprModel('robot')->getAllRobot();
  1740. $robot = implode(',',$robot);
  1741. $ghTb = otable::gh_gameserver(1);
  1742. $sql = "SELECT count(*) as count FROM {$ghTb} WHERE mid NOT IN ({$robot})";
  1743. $ret = oo::commonOprDb('ghgames')->getOne($sql,1);
  1744. $data['total'] = $ret['count'];
  1745. for ($i=0;$i<100;$i++){
  1746. $lTb = otable::userlevel($i);
  1747. $sql = "SELECT levelId FROM {$lTb} WHERE levelId>1 AND createTime>{$stime} AND createTime<{$etime} ORDER BY levelId";
  1748. $ret = oo::commonOprDb('userlevel')->getAll($sql,1);
  1749. foreach ($ret as $row){
  1750. $data['data'][$row['levelId']-1] = $data['data'][$row['levelId']-1] + 1;
  1751. }
  1752. }
  1753. $data['data'] = json_encode($data['data'],JSON_NUMERIC_CHECK);
  1754. $tb = otable::LevelThrough();
  1755. $value = array_values($data);
  1756. $value = implode("','",$value);
  1757. $value = "'{$value}'";
  1758. $sql = "INSERT INTO {$tb} VALUES({$value})";
  1759. oo::commonOprDb('statistics')->query($sql,false);
  1760. }
  1761. public function slotStatistics(){
  1762. $tb = otable::slotStatistics();
  1763. $date = date('Y-m-d');
  1764. $money = $this->slotTb(1);
  1765. $spins = $this->slotTb(2);
  1766. $steal = $this->slotTb(3);
  1767. $attack = $this->slotTb(4);
  1768. $shield = $this->slotTb(5);
  1769. $activity = $this->slotTb(6);
  1770. $nothing = $this->slotTb(0);
  1771. $count = $money + $spins + $steal + $attack + $shield + $activity + $nothing;
  1772. $sql = " INSERT INTO {$tb}(date,slot,money,spins,shield,steal,attack,activity,nothing) VALUES('{$date}',{$count},{$money},{$spins},{$shield},{$steal},{$attack},{$activity},{$nothing})";
  1773. oo::commonOprDb('statistics')->query($sql);
  1774. oo::commonOprRedis('Statistics')->delete(okeys::slotSta());
  1775. }
  1776. private function slotTb($type){
  1777. $sTime = strtotime(date('00:00:00'));
  1778. $eTime = strtotime(date('23:59:59'));
  1779. $num = 0;
  1780. /*
  1781. //旧逻辑 读老虎机流水表
  1782. for($i=0;$i<100;$i++){
  1783. $tb = otable::slotlog($i);
  1784. $sql = "SELECT count(slottype) as count FROM {$tb} WHERE slottype={$type} AND time>{$sTime} AND time<{$eTime} AND type=1";
  1785. $count = oo::commonOprDb('slotlog')->getOne($sql,1);
  1786. $num += intval($count['count']);
  1787. }
  1788. */
  1789. //新逻辑 读redis
  1790. $num = intval(oo::commonOprRedis('Statistics')->hGet(okeys::slotSta(),$type));
  1791. return $num;
  1792. }
  1793. public function InviteSta($timestamp){
  1794. $date = date('Y-m-d', $timestamp);
  1795. $num = oo::commonOprRedis('statistics')->get(okeys::dailyInviteNum());
  1796. $num = $num?$num:0;
  1797. $tb = otable::userinvitesuc();
  1798. $sTime = strtotime('00:00:00', $timestamp);
  1799. $eTime = strtotime('23:59:59', $timestamp);
  1800. $sql = "SELECT count(*) as count FROM {$tb} WHERE is_time>{$sTime} AND is_time<{$eTime}";
  1801. $ret = oo::commonOprDb('common')->getOne($sql,1);
  1802. $success = $ret['count'];
  1803. $tb = otable::inviteStatistics();
  1804. $sql = " INSERT INTO {$tb}(date,invite,success) VALUES('{$date}',{$num},{$success})";
  1805. oo::commonOprDb('statistics')->query($sql);
  1806. }
  1807. function secToTime($sec)
  1808. {
  1809. $sec = round($sec/60);
  1810. if ($sec >= 60){
  1811. $hour = floor($sec/60);
  1812. $min = $sec % 60;
  1813. $res = $hour.' 小时 ';
  1814. $min != 0 && $res .= $min.' 分钟';
  1815. }
  1816. else{
  1817. $res = $sec.' 分钟';
  1818. }
  1819. return $res;
  1820. }
  1821. /**
  1822. * 后台首页上方基本数据统计--运营导出
  1823. * Created by: Owen
  1824. * Created on: 2019/9/20 15:01
  1825. */
  1826. public function BaseDataSta($timestamp){
  1827. $todayKeyDate = date('Ymd', $timestamp);
  1828. $dataToday = oo::commonOprModel('invitecode')->getInviteNum($todayKeyDate);
  1829. $inviteNum = $dataToday['fbAndNum'] + $dataToday['invAndNum'] + $dataToday['fbIosNum'] + $dataToday['invIosNum'];
  1830. $inviteNum = intval($inviteNum);
  1831. $stime = strtotime('00:00:01', $timestamp);
  1832. $etime = strtotime('23:59:59', $timestamp);
  1833. $sidList = [1,2];
  1834. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  1835. $slTable = otable::summarylist();;
  1836. $goodsTable = otable::goodsCrazy();;
  1837. $blackUidArr = oo::commonOprModel("config")->payWhiteList();
  1838. $blackUidSql = '';
  1839. if(!empty($blackUidArr)) {
  1840. $blackUidStr = implode(',', $blackUidArr);
  1841. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  1842. }
  1843. $where = $sidSqlStr.$blackUidSql;
  1844. //查询时间范围内的成功订单
  1845. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel
  1846. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  1847. WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $where ";
  1848. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  1849. //总订单数
  1850. $sql2 = " SELECT id, sl_order_time , gchannel
  1851. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  1852. WHERE sl_order_time >= {$stime} AND sl_order_time <= {$etime} $where ";
  1853. $list2 = oo::commonOprDb('common')->getAll($sql2, MYSQLI_ASSOC);
  1854. $dayList = $this->getDays($stime, $etime, 2);
  1855. $totalMoney = $totalRecord = $totalUid = $allRecord = $totalChannel = $succChannel = [];
  1856. $uid = [];
  1857. //成功的订单
  1858. foreach ($list as $_v) {
  1859. $date = date('Ymd', $_v['sl_pay_time']);
  1860. $totalMoney[$date] += round($_v['sl_pusd'], 2) ;
  1861. $totalRecord[$date] += 1 ;
  1862. //处理当天重复下单的用户统计
  1863. $uid[$date] ?? $uid[$date] = [];
  1864. if(!in_array($_v['sl_uid'], $uid[$date])) {
  1865. $totalUid[$date] += 1;
  1866. array_push($uid[$date], $_v['sl_uid']);
  1867. }
  1868. //统计当天的渠道的订单数
  1869. if(isset($succChannel[$date][$_v['gchannel']])) {
  1870. $succChannel[$date][$_v['gchannel']] += 1;
  1871. }else {
  1872. $succChannel[$date][$_v['gchannel']] = 1;
  1873. }
  1874. }
  1875. //所有订单
  1876. foreach ($list2 as $_v2) {
  1877. $date = date('Ymd', $_v2['sl_order_time']);
  1878. $allRecord[$date] += 1 ;
  1879. //统计当天的渠道的订单数
  1880. if(isset($totalChannel[$date][$_v2['gchannel']])) {
  1881. $totalChannel[$date][$_v2['gchannel']] += 1;
  1882. }else {
  1883. $totalChannel[$date][$_v2['gchannel']] = 1;
  1884. }
  1885. }
  1886. //计算总的付费用户和新增付费用户
  1887. $firstPayPlayerNum = 0;
  1888. //累计的付费用户数量
  1889. $sqlTotal = " SELECT count(DISTINCT sl_uid) as allPayNum FROM {$slTable} as sl WHERE sl_status = 2 $where ";
  1890. $retTotal = oo::commonOprDb('common')->getOne($sqlTotal, 1);
  1891. $allPayNum = $retTotal['allPayNum'] ?? 0;
  1892. $dateToday = date('Ymd', $timestamp);
  1893. //获取新增的用户UID数组
  1894. $newPlayerArr = oo::commonOprModel('statistics')->getAllPlayer($dateToday, 1, $sidList);
  1895. $newPlayerNum = count($newPlayerArr);//今日新增的人数
  1896. //获取登录的用户UID数组
  1897. $loginPlayerArr = oo::commonOprModel('statistics')->getAllPlayer($dateToday, 2, $sidList);
  1898. $loginPlayerNum = count($loginPlayerArr);
  1899. //今天付费的用户UID
  1900. $payTodayPlayer = $uid[$dateToday] ?? [];
  1901. $newPayUidArr = array_intersect($payTodayPlayer, $newPlayerArr);//获取当天所以新增用户和当天付费的用户的交集
  1902. $newPayNum = count($newPayUidArr);
  1903. $loginAvg = oo::commonOprModel('statistics')->avgLoginTime();
  1904. $loginAvg = floor($loginAvg);
  1905. //首次付费的用户
  1906. if(!empty($payTodayPlayer)) {
  1907. $time = strtotime('0:0:0', $timestamp);
  1908. foreach ($payTodayPlayer as $vuid) {
  1909. $checkBought = $this->checkPayFirst($vuid, $time);
  1910. $checkBought && $firstPayPlayerNum++ ;
  1911. }
  1912. }
  1913. $retDataPayment = [
  1914. 'totalMoney' => $totalMoney,
  1915. 'totalRecord' => $totalRecord,
  1916. 'totalUid' => $totalUid,
  1917. 'allRecord' => $allRecord,
  1918. 'dayList' => $dayList,
  1919. 'totalChannel' => $totalChannel,
  1920. 'succChannel' => $succChannel,
  1921. 'allPayNum' => $allPayNum,
  1922. 'newPayNum' => $newPayNum,
  1923. 'loginPlayerNum' => $loginPlayerNum,
  1924. 'newPlayerNum' => $newPlayerNum,
  1925. 'firstPayPlayerNum' => $firstPayPlayerNum,
  1926. 'loginAvg' => $loginAvg,
  1927. ];
  1928. $todayDate = date('Ymd', $timestamp);
  1929. $todaySuccessPayNum = $retDataPayment['totalUid'][$todayDate] ?? 0;
  1930. $todayPayMoney = $retDataPayment['totalMoney'][$todayDate] ?? 0;
  1931. $data['allPayNum'] = $retDataPayment['allPayNum'] ?? 0;
  1932. $data['newPayNum'] = $retDataPayment['newPayNum'] ?? 0;
  1933. $todayLogin = $retDataPayment['loginPlayerNum'] ?? 0;
  1934. $data['todayNew'] = $retDataPayment['newPlayerNum'] ?? 0;
  1935. $data['firstPayPlayerNum'] = $retDataPayment['firstPayPlayerNum'] ?? 0;
  1936. $data['loginAvg'] = $this->secToTime($retDataPayment['loginAvg'] ?? 0);
  1937. $todayLoginTemp = $todayLogin ?? 0;
  1938. $todaySuccessPayNumTemp = $todaySuccessPayNum ?? 0;
  1939. $todayPayMoneyTemp = round($todayPayMoney ?? 0, 2);
  1940. $data['todayLogin'] = $todayLoginTemp;
  1941. $data['todaySuccessPayNum'] = $todaySuccessPayNumTemp;
  1942. $data['todayPayMoney'] = $todayPayMoney ?? 0;
  1943. //计算付费率 付费人数/DAU
  1944. $data['payRate'] = empty($todayLoginTemp) ? '0%' : round($todaySuccessPayNumTemp * 100 / $todayLoginTemp, 2).'%';
  1945. //ARPU 付费金额/DAU
  1946. $data['payARPU'] = empty($todayLoginTemp) ? 0 : round($todayPayMoneyTemp / $todayLoginTemp, 2);
  1947. //ARPPU 付费金额/付费人数
  1948. $data['payARPPU'] = empty($todaySuccessPayNumTemp) ? 0 : round($todayPayMoneyTemp/ $todaySuccessPayNumTemp, 2);
  1949. //自传播占比 (FB邀请+邀请码邀请)/新增
  1950. $data['AARRR'] = empty($data['todayNew']) ? '0%' : round($inviteNum * 100 / $data['todayNew'], 2).'%';
  1951. $LoginCount = oo::commonOprRedis('common')->getSet(okeys::getLoginCount(),0);
  1952. $VersionCount = oo::commonOprRedis('common')->getSet(okeys::getVersionCount(),0);
  1953. if($LoginCount == 0 || $VersionCount == 0){
  1954. $data['loginPro'] = 0;
  1955. }else{
  1956. $data['loginPro'] = ceil(($LoginCount/$VersionCount)*100);
  1957. }
  1958. //新手引导完成率安卓
  1959. $guideCount = oo::commonOprRedis('common')->sInter([okeys::getGuideCount(1),okeys::getRegCount(1)]);
  1960. $regCount = oo::commonOprRedis('common')->sUnion(okeys::getRegCount(1));
  1961. if(empty($regCount)){
  1962. $data['guidePro'] = 0;
  1963. }else{
  1964. $data['guidePro'] = ceil((count($guideCount)/count($regCount))*100);
  1965. }
  1966. //新手引导完成率IOS
  1967. $guideCount = oo::commonOprRedis('common')->sInter([okeys::getGuideCount(2),okeys::getRegCount(2)]);
  1968. $regCount = oo::commonOprRedis('common')->sUnion(okeys::getRegCount(2));
  1969. if(empty($regCount)){
  1970. $data['guidePro2'] = 0;
  1971. }else{
  1972. $data['guidePro2'] = ceil((count($guideCount)/count($regCount))*100);
  1973. }
  1974. oo::commonOprRedis('common')->delete([okeys::getGuideCount(1),okeys::getRegCount(1),okeys::getGuideCount(2),okeys::getRegCount(2)]);
  1975. $stime = strtotime('-6 days 00:00:00', $timestamp);
  1976. $etime = strtotime('-7 days 00:00:00', $timestamp);
  1977. $uidTotal = 0;
  1978. $noBuildTotal = 0;
  1979. //for($i=0;$i<100;$i++){
  1980. //$tb = otable::userinfo($i);
  1981. $tb = otable::userinfo(1);
  1982. $sql = "SELECT uid FROM {$tb} WHERE lasttime<{$stime} AND lasttime>{$etime}";
  1983. $ret = oo::commonOprDb('userinfo')->getAll($sql,MYSQLI_ASSOC);
  1984. foreach ($ret as $row){
  1985. $uidTotal++;
  1986. if(oo::commonOprModel('member')->getUserCurLevelTotal($row['uid']) == 0){
  1987. $noBuildTotal++;
  1988. }
  1989. }
  1990. //}
  1991. $data['noBuildPro'] = empty($uidTotal) ? 0 : ceil(($noBuildTotal/$uidTotal)*100);
  1992. $incr = [
  1993. 'upBuild'=>0,
  1994. 'reBuild'=>0,
  1995. 'woodenChest'=>0,
  1996. 'goldenChest'=>0,
  1997. 'magicalChest'=>0
  1998. ];
  1999. foreach ($incr as $key=>$value){
  2000. $num = intval(oo::commonOprRedis('common')->get(okeys::incr($key)));
  2001. $incr[$key] = $num;
  2002. oo::commonOprRedis('common')->decrBy(okeys::incr($key),$num);
  2003. }
  2004. $data['incrData'] = json_encode($incr);
  2005. $data['slotSpinsTurnAttack'] = 0;
  2006. // $data['slotSpinsTurnAttack'] = oo::commonOprRedis('common')->getSet(okeys::SlotSpinsTurnAttack(),0);
  2007. $data['date'] = date('Ymd', $timestamp);
  2008. $table = otable::BaseDataSta();
  2009. $keys = "";
  2010. $value = "";
  2011. foreach ($data as $key=>$row){
  2012. $keys .= "{$key},";
  2013. $value .= "'{$row}',";
  2014. }
  2015. $keys = trim($keys,',');
  2016. $value = trim($value,',');
  2017. $sql = "INSERT INTO {$table} ({$keys}) VALUES({$value})";
  2018. oo::commonOprDb('statistics')->query($sql);
  2019. }
  2020. /**
  2021. * 统计警告
  2022. * @param $uid
  2023. * @param int $robotId
  2024. * @param string $content
  2025. * @param int $type
  2026. * Created by: Owen
  2027. * Created on: 2019/9/26 16:16
  2028. */
  2029. public function addWarning($uid,$content = '',$type = 0,$num = 0){
  2030. $tb = otable::addWarning();
  2031. $time = time();
  2032. $sql = "INSERT INTO {$tb}(uid,num,content,type,time) VALUES({$uid},{$num},'{$content}',{$type},{$time})";
  2033. oo::commonOprDb('common')->query($sql);
  2034. }
  2035. public function versionSta($time){
  2036. //统计累计的
  2037. $login_plat = [1=>'Android',2=>'IOS'];
  2038. $temp = [];
  2039. foreach ($login_plat as $key=>$row){
  2040. $where = "u.version = t.version";
  2041. $where .= " AND u.login_plat=".$key;
  2042. //for($i=100;$i<200;$i++){
  2043. //$tb = otable::userinfo($i);
  2044. $tb = otable::userinfo(1);
  2045. $sql = "SELECT u.version ,count(u.version) as count FROM {$tb} as u JOIN (SELECT DISTINCT version FROM {$tb}) as t WHERE {$where} GROUP BY t.version";
  2046. $ret = oo::commonOprDb('userinfo')->getAll($sql,MYSQLI_ASSOC);
  2047. foreach ($ret as $va){
  2048. $version = $va['version'];
  2049. if(empty($version)){
  2050. $version = 'none';
  2051. }
  2052. if(!isset($temp[$row][$version])){
  2053. $temp[$row][$version] = $va['count'];
  2054. }else{
  2055. $temp[$row][$version] +=$va['count'];
  2056. }
  2057. }
  2058. //}
  2059. }
  2060. $out = [];
  2061. foreach ($login_plat as $key=>$row){
  2062. $out[$row] = [];
  2063. foreach ($temp[$row] as $k=>$v){
  2064. if($k == 'none'){
  2065. $tempData['version'] = '';
  2066. }else{
  2067. $tempData['version'] = $k;
  2068. }
  2069. $tempData['count'] = $v;
  2070. $out[$row][] = $tempData;
  2071. }
  2072. }
  2073. //统计当天的
  2074. $login_plat = [1=>'Android',2=>'IOS'];
  2075. $temp = [];
  2076. foreach ($login_plat as $key=>$row){
  2077. $where = "u.version = t.version";
  2078. $where .= " AND u.login_plat=".$key;
  2079. //统计当天的
  2080. $time = strtotime('00:00:00', $time);
  2081. $where .= " AND u.lasttime>=".$time;
  2082. //for($i=100;$i<200;$i++){
  2083. //$tb = otable::userinfo($i);
  2084. $tb = otable::userinfo(1);
  2085. $sql = "SELECT u.version ,count(u.version) as count FROM {$tb} as u JOIN (SELECT DISTINCT version FROM {$tb}) as t WHERE {$where} GROUP BY t.version";
  2086. $ret = oo::commonOprDb('userinfo')->getAll($sql,MYSQLI_ASSOC);
  2087. foreach ($ret as $va){
  2088. $version = $va['version'];
  2089. if(empty($version)){
  2090. $version = 'none';
  2091. }
  2092. if(!isset($temp[$row][$version])){
  2093. $temp[$row][$version] = $va['count'];
  2094. }else{
  2095. $temp[$row][$version] +=$va['count'];
  2096. }
  2097. }
  2098. //}
  2099. }
  2100. $today_out = [];
  2101. foreach ($login_plat as $key=>$row){
  2102. $today_out[$row] = [];
  2103. if(!isset($temp[$row]) || !is_array($temp[$row])){
  2104. continue;
  2105. }
  2106. foreach ($temp[$row] as $k=>$v){
  2107. if($k == 'none'){
  2108. $tempData['version'] = '';
  2109. }else{
  2110. $tempData['version'] = $k;
  2111. }
  2112. $tempData['count'] = $v;
  2113. $today_out[$row][] = $tempData;
  2114. }
  2115. }
  2116. $tb = otable::versionSta();
  2117. $date = date('Y-m-d', $time);
  2118. $out = json_encode($out);
  2119. $today_out = json_encode($today_out);
  2120. $sql = "INSERT INTO {$tb}(date,version,today_version) VALUES('{$date}','{$out}','{$today_out}')";
  2121. oo::commonOprDb('statistics')->query($sql);
  2122. }
  2123. /**
  2124. * 登录时长
  2125. * Created by: Owen
  2126. * Created on: 2019/10/17 17:30
  2127. */
  2128. public function loginTime($deBug = false){
  2129. $date = date('Y-m-d',strtotime("-1 days 0:0:0"));
  2130. $userLoginTime = $this->getAllLoginTime();
  2131. oo::logs()->debug5($userLoginTime,'loginTime.log','loginTime/'.date('Ymd').'/');
  2132. $onLineTime = array_sum(array_values($userLoginTime));
  2133. //分地区统计
  2134. $uids = [];
  2135. $vivo_logintime = 0;//VIVO在线时长
  2136. /*
  2137. foreach($userLoginTime as $uid => $time){
  2138. $uids[] = $uid;
  2139. $temp = oo::commonOprModel('member')->getUserInfo($uid);
  2140. if($temp['channel'] == 1){
  2141. $vivo_logintime += $time;
  2142. }
  2143. }
  2144. */
  2145. $uids = array_keys($userLoginTime);
  2146. if(!empty($uids)){
  2147. $uidsStr = implode(",",$uids);
  2148. $userinfoTb = otable::userinfo(1);
  2149. $sql = "SELECT uid FROM {$userinfoTb} WHERE channel = 1 AND uid in({$uidsStr})";
  2150. $vivoPlayerRet = oo::commonOprDb('common')->getAll($sql, 1);
  2151. foreach($vivoPlayerRet as $vivoPlayerRetTemp){
  2152. $vivo_logintime += $userLoginTime[$vivoPlayerRetTemp['uid']];
  2153. }
  2154. $tb = otable::PropertyLogin();
  2155. $sql = "INSERT INTO {$tb} (uid, date, time, vivo_logintime) VALUES (0,'{$date}', {$onLineTime}, {$vivo_logintime})";
  2156. oo::commonOprDb('statistics')->query($sql);
  2157. $useraddress = otable::useraddress();
  2158. $sql = "SELECT addr.uid,addr.country_code,u.login_plat FROM {$useraddress} addr LEFT JOIN {$userinfoTb} u ON addr.uid = u.uid WHERE addr.uid in({$uidsStr})";
  2159. $ret = oo::commonOprDb('common')->getAll($sql,1);
  2160. $addr = $numArr = [];
  2161. foreach($ret as $row){
  2162. /*
  2163. $userinfo = oo::commonOprModel('member')->getUserInfo($row['uid']);//玩家基本信息
  2164. $sid = ( in_array($userinfo['login_plat'], array(11, 1)) ) ? 1 : 2;
  2165. */
  2166. $sid = ( in_array($row['login_plat'], array(11, 1)) ) ? 1 : 2;
  2167. $addr[$sid][$row['country_code']] += $userLoginTime[$row['uid']];
  2168. $numArr[$sid][$row['country_code']] += 1;
  2169. }
  2170. $tbAddress = otable::loginTimeAddress();
  2171. foreach([1,2] as $sid){
  2172. if(!empty($addr[$sid]) && is_array($addr[$sid])){
  2173. foreach($addr[$sid] as $code => $row){
  2174. $number = empty($numArr[$sid][$code])?0:$numArr[$sid][$code];
  2175. $sql = "INSERT INTO {$tbAddress} (`day`, `address`, `sid`,`time`, `number`) VALUES ('{$date}','{$code}', {$sid},{$row}, {$number})";
  2176. oo::commonOprDb('statistics')->query($sql);
  2177. }
  2178. }
  2179. }
  2180. }
  2181. !$deBug && $this->delAllLoginTime();
  2182. }
  2183. /**
  2184. * 广告统计
  2185. * @return string
  2186. * Created by: Owen
  2187. * Created on: 2019/10/21 17:22
  2188. */
  2189. public function advertisement(){
  2190. $date = date('Ymd');
  2191. $sid = [1=>'android',2=>'ios'];
  2192. $successSid = [];
  2193. foreach ($sid as $x=>$y){
  2194. $userCountList = oo::commonOprRedis('common')->hGetAll(okeys::advertisementRemainCount($x));
  2195. $success = [];
  2196. foreach ($userCountList as $key=>$row){
  2197. $temp = explode('-',$key);
  2198. $success[$temp[1]] += $row;
  2199. }
  2200. $successSid[$y] = $success;
  2201. }
  2202. $success = json_encode($successSid);
  2203. $clickSid = [];
  2204. foreach ($sid as $x=>$y){
  2205. $userCountList = oo::commonOprRedis('Statistics')->hGetAll(okeys::Report(10002,$x));
  2206. $click = [];
  2207. foreach ($userCountList as $key=>$row){
  2208. $temp = explode('-',$key);
  2209. $click[$temp[1]] += $row;
  2210. }
  2211. $clickSid[$y] = $click;
  2212. }
  2213. $clickSid = json_encode($clickSid);
  2214. $playSid = [];
  2215. foreach ($sid as $x=>$y){
  2216. $userCountList = oo::commonOprRedis('Statistics')->hGetAll(okeys::Report(10003,$x));
  2217. $play = [];
  2218. foreach ($userCountList as $key=>$row){
  2219. $temp = explode('-',$key);
  2220. $play[$temp[1]] += $row;
  2221. }
  2222. $playSid[$y] = $play;
  2223. }
  2224. $playSid = json_encode($playSid);
  2225. $tb = otable::advertisementSta();
  2226. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$success}', '{$clickSid}','{$playSid}')";
  2227. oo::commonOprDb('statistics')->query($sql);
  2228. oo::commonOprRedis('common')->delete(okeys::advertisementRemainCount());
  2229. oo::commonOprRedis('common')->delete(okeys::advertisementRemainCount(1));
  2230. oo::commonOprRedis('common')->delete(okeys::advertisementRemainCount(2));
  2231. oo::commonOprRedis('Statistics')->delete(okeys::Report(10002,1));
  2232. oo::commonOprRedis('Statistics')->delete(okeys::Report(10002,2));
  2233. oo::commonOprRedis('Statistics')->delete(okeys::Report(10003,1));
  2234. oo::commonOprRedis('Statistics')->delete(okeys::Report(10003,2));
  2235. }
  2236. public function dayRank(){
  2237. $key = ['level','money','spins','addMoney','addSpins'];
  2238. foreach ($key as $row){
  2239. oo::commonOprRedis('common')->delete(okeys::todayDataRank($row));
  2240. }
  2241. return
  2242. $inset = [
  2243. 'date'=>date('Ymd')
  2244. ];
  2245. foreach ($key as $row){
  2246. $data = oo::commonOprRedis('common')->hGetAll(okeys::todayDataRank($row));
  2247. arsort($data);
  2248. $data = array_slice($data,0,50,true);
  2249. $inset[$row] = json_encode($data);
  2250. oo::commonOprRedis('common')->delete(okeys::todayDataRank($row));
  2251. }
  2252. $tb = otable::dayRank();
  2253. $key = implode(',',array_keys($inset));
  2254. $str = "";
  2255. foreach ($inset as $row){
  2256. $str .= "'{$row}',";
  2257. }
  2258. $str = trim($str,',');
  2259. $sql = "INSERT INTO {$tb} ({$key}) VALUES ({$str})";
  2260. oo::commonOprDb('statistics')->query($sql);
  2261. }
  2262. /**
  2263. * 每日分享统计 保存到数据库
  2264. * @return string
  2265. * Created by: hss
  2266. * Created on: 2019/12/12 11:28
  2267. */
  2268. public function todayShareStatistics($timestamp){
  2269. $date = date('Ymd', $timestamp);
  2270. $tb = otable::ShareConfig();
  2271. $sql = " SELECT * FROM {$tb}";
  2272. $ret = oo::commonOprDb('config')->getAll($sql,1);
  2273. $datas = array();
  2274. foreach($ret as $k => $v){
  2275. //分享
  2276. $data = array();
  2277. $data['total'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'selfType'),'total'));
  2278. $data['successNumber'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'selfType'),'successNumber'));
  2279. $data['money'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'selfType'),'money'));
  2280. $data['spins'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'selfType'),'spins'));
  2281. $datas[$v['type']]['selfType'] = $data;
  2282. //点击
  2283. $data = array();
  2284. $data['total'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'otherType'),'total'));
  2285. $data['successNumber'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'otherType'),'successNumber'));
  2286. $data['money'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'otherType'),'money'));
  2287. $data['spins'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::todayShareStatistics($v['type'],'otherType'),'spins'));
  2288. $datas[$v['type']]['otherType'] = $data;
  2289. //统计后重置
  2290. oo::commonOprRedis('Statistics')->delete(okeys::todayShareStatistics($v['type'],'selfType'));
  2291. oo::commonOprRedis('Statistics')->delete(okeys::todayShareStatistics($v['type'],'otherType'));
  2292. }
  2293. $datas = json_encode($datas);
  2294. $tb = otable::shareSta();
  2295. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$datas}')";
  2296. oo::commonOprDb('statistics')->query($sql);
  2297. }
  2298. /**
  2299. * 每日体力金币发放消耗关卡统计 保存到数据库
  2300. * @return string
  2301. * Created by: hss
  2302. * Created on: 2019/12/13 12:05
  2303. */
  2304. public function todaySpinsMoneyLevelSta(){
  2305. return ;
  2306. $date = date('Ymd');
  2307. $data = array();
  2308. $data['moneyAdd'] = oo::commonOprRedis('Statistics')->hgetall(okeys::spinsMoneyLevelStatistics('money','Add'));
  2309. $data['moneySub'] = oo::commonOprRedis('Statistics')->hgetall(okeys::spinsMoneyLevelStatistics('money','Sub'));
  2310. $data['spinsAdd'] = oo::commonOprRedis('Statistics')->hgetall(okeys::spinsMoneyLevelStatistics('spins','Add'));
  2311. $data['spinsSub'] = oo::commonOprRedis('Statistics')->hgetall(okeys::spinsMoneyLevelStatistics('spins','Sub'));
  2312. $type = 2;
  2313. $ret = oo::commonOprModel('statistics')->getAllPlayer($date, $type, []);
  2314. $uids = [];
  2315. foreach($ret as $k => $v){
  2316. $uids[] = $v;
  2317. }
  2318. $uids = array_filter($uids);
  2319. $uidStr = implode(",",$uids);
  2320. $levelRangeList = [];
  2321. $todayLoginTime = [];
  2322. $tb = otable::gh_gameserver(1);
  2323. //记录每个关卡人数
  2324. $levelRange = $this->getLevelRange();
  2325. foreach ($levelRange as $key=>$row){
  2326. if(!empty($uidStr)){
  2327. $sql = "SELECT count(*) as count FROM {$tb} WHERE levelId={$row} AND mid in(".$uidStr.")";
  2328. $ret = oo::commonOprDb('common')->getOne($sql,1);
  2329. $levelRangeList[] = intval($ret['count']);
  2330. }else{
  2331. $levelRangeList[] = 0;
  2332. }
  2333. $todayLoginTime[] = 0;
  2334. }
  2335. $LoginTime = $this->getAllLoginTime();
  2336. foreach($LoginTime as $k => $v){
  2337. $uid = $k;
  2338. $userLevel = oo::commonOprModel('member')->getUserLevel($uid);
  2339. $levelId = $userLevel['levelId'];
  2340. $todayLoginTime[$levelId-1] += $v / 60;//登陆时长
  2341. }
  2342. $data['people'] = $levelRangeList;
  2343. $data['logintime'] = $todayLoginTime;
  2344. //统计后重置
  2345. oo::commonOprRedis('Statistics')->delete(okeys::spinsMoneyLevelStatistics('money','Add'));
  2346. oo::commonOprRedis('Statistics')->delete(okeys::spinsMoneyLevelStatistics('money','Sub'));
  2347. oo::commonOprRedis('Statistics')->delete(okeys::spinsMoneyLevelStatistics('spins','Add'));
  2348. oo::commonOprRedis('Statistics')->delete(okeys::spinsMoneyLevelStatistics('spins','Sub'));
  2349. $data = json_encode($data);
  2350. $tb = otable::spinsMoneyLevelSta();
  2351. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2352. oo::commonOprDb('statistics')->query($sql);
  2353. }
  2354. /**
  2355. * 每日偷打记录统计 保存到数据库
  2356. * @return string
  2357. * Created by: hss
  2358. * Created on: 2019/12/16 12:05
  2359. */
  2360. public function todayAttackStealSta($timestamp){
  2361. $date = date('Ymd', $timestamp);
  2362. $data = array();
  2363. $data['attack'] = oo::commonOprRedis('Statistics')->hgetall(okeys::attackStealSta('attack'));
  2364. $data['steal'] = oo::commonOprRedis('Statistics')->hgetall(okeys::attackStealSta('steal'));
  2365. //统计后重置
  2366. oo::commonOprRedis('Statistics')->delete(okeys::attackStealSta('attack'));
  2367. oo::commonOprRedis('Statistics')->delete(okeys::attackStealSta('steal'));
  2368. $data = json_encode($data);
  2369. $tb = otable::attackStealSta();
  2370. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2371. oo::commonOprDb('statistics')->query($sql);
  2372. }
  2373. /**
  2374. * 每日建筑记录统计
  2375. * @param $type build升级 repair修复
  2376. * @return string
  2377. * Created by: hss
  2378. * Created on: 2019/12/16 18:07
  2379. */
  2380. public function todayBuildSta($uid,$type = 'build',$money){
  2381. return;
  2382. oo::commonOprRedis('Statistics')->hIncrBy(okeys::todayBuildSta($type),'total',1);//总建筑次数
  2383. oo::commonOprRedis('Statistics')->hIncrBy(okeys::todayBuildSta($type),'money',$money);//建筑价格
  2384. oo::commonOprRedis('Statistics')->hIncrBy(okeys::todayBuildSta($type."Users"),$uid,1);//用户建筑次数
  2385. }
  2386. /**
  2387. * 每日建筑记录统计 保存到数据库
  2388. * @return string
  2389. * Created by: hss
  2390. * Created on: 2019/12/16 18:07
  2391. */
  2392. public function saveTodayBuildSta(){
  2393. $keys = array('build','repair');
  2394. foreach($keys as $k => $v){
  2395. oo::commonOprRedis('Statistics')->delete(okeys::todayBuildSta($v));
  2396. oo::commonOprRedis('Statistics')->delete(okeys::todayBuildSta($v.'Users'));
  2397. }
  2398. return ;
  2399. $date = date('Ymd');
  2400. $data = array();
  2401. foreach($keys as $k => $v){
  2402. $todayBuildSta = oo::commonOprRedis('Statistics')->hgetall(okeys::todayBuildSta($v));
  2403. $data[$v]['total'] = $todayBuildSta['total'];
  2404. $data[$v]['money'] = $todayBuildSta['money'];
  2405. $users = oo::commonOprRedis('Statistics')->hgetall(okeys::todayBuildSta($v.'Users'));
  2406. //其他统计
  2407. $data[$v]['userNumber'] = count($users);
  2408. //统计后重置
  2409. oo::commonOprRedis('Statistics')->delete(okeys::todayBuildSta($v));
  2410. oo::commonOprRedis('Statistics')->delete(okeys::todayBuildSta($v.'Users'));
  2411. }
  2412. $data = json_encode($data);
  2413. $tb = otable::buildSta();
  2414. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2415. oo::commonOprDb('statistics')->query($sql);
  2416. }
  2417. /**
  2418. * 新增用户付费情况 保存到数据库
  2419. * @return string
  2420. * Created by: hss
  2421. * Created on: 2019/12/18 17:13
  2422. */
  2423. public function saveNewPayGoodsSta($timestamp){
  2424. $date = date('Ymd', $timestamp);
  2425. $newUser = $this->getAllPlayer($date,1);
  2426. if(!empty($newUser)){
  2427. //查出付费订单
  2428. $slTable = otable::summarylist();
  2429. $UidStr = empty($newUser) ? '' : " AND sl_uid IN (".implode(',', $newUser).") ";
  2430. $starTime = strtotime($date);
  2431. $sql = " SELECT sl_uid,sl_pusd,sl_status FROM {$slTable} AS sl WHERE sl.sl_pay_time > {$starTime} {$UidStr}";
  2432. $list = oo::commonOprDB('payment')->getAll($sql, 1);
  2433. $userArr = array();
  2434. $money = 0;
  2435. $orderNumber = 0;
  2436. $orderNumberPay = 0;
  2437. foreach($list as $k => $v){
  2438. $orderNumber++;
  2439. if($v['sl_status'] == '2'){
  2440. $userArr[] = $v['sl_uid'];
  2441. $money += $v['sl_pusd'];
  2442. $orderNumberPay++;
  2443. }
  2444. }
  2445. $userArr = array_unique($userArr);
  2446. $data = array(
  2447. 'orderNumber'=>$orderNumber,
  2448. 'orderNumberPay'=>$orderNumberPay,
  2449. 'userNumber'=>count($newUser),
  2450. 'money'=>$money,
  2451. 'userNumberPay'=>count($userArr),
  2452. );
  2453. $data = json_encode($data);
  2454. $tb = otable::newPayGoodsSta();
  2455. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2456. oo::commonOprDb('statistics')->query($sql);
  2457. }
  2458. }
  2459. /**
  2460. * 付费用户排行榜 保存到数据库
  2461. * @return string
  2462. * Created by: hss
  2463. * Created on: 2019/12/20 11:50
  2464. */
  2465. public function savePayUserRankSta($timestamp){
  2466. $date = date('Ymd', $timestamp);
  2467. $tb = otable::summarylist();
  2468. //查询当天的,直接统计
  2469. $sql = "SELECT sl_uid AS uid,sumMoney FROM (SELECT sum(sl_pusd) AS sumMoney,sl_uid FROM {$tb} WHERE sl_status = 2 AND sl_pusd > 0 GROUP BY sl_uid) AS a ORDER BY sumMoney DESC LIMIT 100";
  2470. $list = oo::commonOprDB('payment')->getAll($sql, 1);
  2471. $list = json_encode($list);
  2472. $tb = otable::payUserRankSta();
  2473. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$list}')";
  2474. oo::commonOprDb('statistics')->query($sql);
  2475. }
  2476. /**
  2477. * 体力发放排行榜 付费 & 非付费 保存到数据库
  2478. * @return string
  2479. * Created by: hss
  2480. * Created on: 2019/12/14 10:43
  2481. */
  2482. public function saveSpinsAddRank(){
  2483. return ;
  2484. $date = date('Ymd');
  2485. //先计算再传输,因为排行榜只取前100人,如果用户量过大,传输到后台再计算的话,传输的数据量太大了
  2486. $all_addSpins = oo::commonOprRedis('common')->hGetAll(okeys::todayDataRank('addSpins'));
  2487. arsort($all_addSpins);
  2488. //$all_addSpins = array_slice($all_addSpins,0,100);
  2489. //付费的用户
  2490. $payBlackList = oo::commonOprModel("config")->payWhiteList();
  2491. $slTable = otable::summarylist();
  2492. $blackUidStr = empty($payBlackList) ? '' : " AND sl_uid NOT IN (".implode(',', $payBlackList).") ";
  2493. $sql = " SELECT DISTINCT sl_uid FROM {$slTable} AS sl WHERE sl.sl_status = 2 AND sl.sl_pusd > 0 {$blackUidStr}";
  2494. $list = oo::commonOprDB('payment')->getAll($sql, 1);
  2495. $pay_list = [];
  2496. foreach($list as $k => $v){
  2497. $pay_list[] = $v['sl_uid'];
  2498. }
  2499. $data['pay_rank'] = [];//付费排行
  2500. $data['unpay_rank'] = [];//非付费排行
  2501. foreach($all_addSpins as $k => $v){
  2502. if(in_array($k,$pay_list)){
  2503. $data['pay_rank'][] = [$k,$v];
  2504. }else{
  2505. $data['unpay_rank'][] = [$k,$v];
  2506. }
  2507. }
  2508. $data['pay_rank'] = array_slice($data['pay_rank'],0,100);
  2509. $data['unpay_rank'] = array_slice($data['unpay_rank'],0,100);
  2510. $data = json_encode($data);
  2511. $tb = otable::spinsAddRankSta();
  2512. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2513. oo::commonOprDb('statistics')->query($sql);
  2514. }
  2515. /**
  2516. * 新手步骤统计 保存到数据库
  2517. * @return string
  2518. * Created by: hss
  2519. * Created on: 2019/12/24 10:41
  2520. */
  2521. public function saveNoviceStepsSta(){
  2522. $date = date('Ymd');
  2523. $data = array();
  2524. $data['statistics'] = oo::commonOprRedis('Statistics')->hgetall(okeys::noviceStepsSta());
  2525. $data['statisticsFb'] = oo::commonOprRedis('Statistics')->hgetall(okeys::noviceStepsSta(1));
  2526. //统计后重置
  2527. oo::commonOprRedis('Statistics')->delete(okeys::noviceStepsSta());
  2528. oo::commonOprRedis('Statistics')->delete(okeys::noviceStepsSta(1));
  2529. $data = json_encode($data);
  2530. $tb = otable::noviceStepsSta();
  2531. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2532. oo::commonOprDb('statistics')->query($sql);
  2533. }
  2534. /**
  2535. * 游客转FB数量统计
  2536. * @return string
  2537. * Created by: hss
  2538. * Created on: 2020/1/11 18:55
  2539. */
  2540. public function visitorToFbSta($status,$uid){
  2541. oo::commonOprRedis('Statistics')->hIncrBy(okeys::visitorToFbSta(),$status,1);
  2542. }
  2543. /**
  2544. * 游客转FB数量统计 保存到数据库
  2545. * @return string
  2546. * Created by: hss
  2547. * Created on: 2020/1/13 10:43
  2548. */
  2549. public function saveVisitorToFbSta($timestamp){
  2550. $date = date('Ymd', $timestamp);
  2551. $data = array();
  2552. $data['statistics'] = oo::commonOprRedis('Statistics')->hgetall(okeys::visitorToFbSta());
  2553. //统计后重置
  2554. oo::commonOprRedis('Statistics')->delete(okeys::visitorToFbSta());
  2555. $data = json_encode($data);
  2556. $tb = otable::saveVisitorToFbSta();
  2557. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2558. oo::commonOprDb('statistics')->query($sql);
  2559. }
  2560. /**
  2561. * 赠送情况统计
  2562. * @param $type money金币 spins体力 $t Receive收取 Send发送
  2563. * Created by: hss
  2564. * Created on: 2020/1/14 11:43
  2565. */
  2566. static public function giveSta($type = 'money',$t = 'Send',$uid,$number){
  2567. return ;
  2568. oo::commonOprRedis('Statistics')->hIncrBy(okeys::giveSta($type,$t),$uid,$number);
  2569. }
  2570. /**
  2571. * 一键赠送 一键领取 人数
  2572. * @param $type money金币 spins体力 $t Receive收取 Send发送
  2573. * Created by: hss
  2574. * Created on: 2020/1/14 11:43
  2575. */
  2576. static public function givesSta($type = 'money',$t = 'Send',$uid){
  2577. oo::commonOprRedis('Statistics')->hIncrBy(okeys::givesSta($type,$t),$uid,1);
  2578. }
  2579. /**
  2580. * 赠送情况统计 保存到数据库
  2581. * @return string
  2582. * Created by: hss
  2583. * Created on: 2020/1/14 15:48
  2584. */
  2585. public function saveGivesSta(){
  2586. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('money','Send'));
  2587. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('spins','Send'));
  2588. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('money','Send'));
  2589. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('spins','Send'));
  2590. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('money','Receive'));
  2591. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('spins','Receive'));
  2592. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('money','Receive'));
  2593. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('spins','Receive'));
  2594. return;
  2595. $date = date('Ymd');
  2596. $data = array();
  2597. $arr = ['Send','Receive'];
  2598. foreach($arr as $a_k => $a_v){
  2599. }
  2600. $moneySend = oo::commonOprRedis('Statistics')->hgetall(okeys::giveSta('money','Send'));//赠送统计 金币
  2601. $spinsSend = oo::commonOprRedis('Statistics')->hgetall(okeys::giveSta('spins','Send'));//赠送统计 体力
  2602. $moneySends = oo::commonOprRedis('Statistics')->hgetall(okeys::givesSta('money','Send'));//一键赠送统计 金币
  2603. $spinsSends = oo::commonOprRedis('Statistics')->hgetall(okeys::givesSta('spins','Send'));//一键赠送统计 体力
  2604. $moneyReceive = oo::commonOprRedis('Statistics')->hgetall(okeys::giveSta('money','Receive'));//领取统计 金币
  2605. $spinsReceive = oo::commonOprRedis('Statistics')->hgetall(okeys::giveSta('spins','Receive'));//领取统计 体力
  2606. $moneyReceives = oo::commonOprRedis('Statistics')->hgetall(okeys::givesSta('money','Receive'));//一键领取统计 金币
  2607. $spinsReceives = oo::commonOprRedis('Statistics')->hgetall(okeys::givesSta('spins','Receive'));//一键领取统计 体力
  2608. //赠送
  2609. $data['send']['moneyUserNumber'] = 0;
  2610. $data['send']['moneyNumber'] = 0;
  2611. foreach($moneySend as $k => $v){
  2612. $data['send']['moneyUserNumber']++;
  2613. $data['send']['moneyNumber'] += $v;
  2614. }
  2615. $data['send']['spinsUserNumber'] = 0;
  2616. $data['send']['spinsNumber'] = 0;
  2617. foreach($spinsSend as $k => $v){
  2618. $data['send']['spinsUserNumber']++;
  2619. $data['send']['spinsNumber'] += $v;
  2620. }
  2621. $data['send']['moneyCount'] = 0;
  2622. foreach($moneySends as $k => $v){
  2623. $data['send']['moneyCount']++;
  2624. }
  2625. $data['send']['spinsCount'] = 0;
  2626. foreach($spinsSends as $k => $v){
  2627. $data['send']['spinsCount']++;
  2628. }
  2629. //领取
  2630. $data['receive']['moneyUserNumber'] = 0;
  2631. $data['receive']['moneyNumber'] = 0;
  2632. foreach($moneyReceive as $k => $v){
  2633. $data['receive']['moneyUserNumber']++;
  2634. $data['receive']['moneyNumber'] += $v;
  2635. }
  2636. $data['receive']['spinsUserNumber'] = 0;
  2637. $data['receive']['spinsNumber'] = 0;
  2638. foreach($spinsReceive as $k => $v){
  2639. $data['receive']['spinsUserNumber']++;
  2640. $data['receive']['spinsNumber'] += $v;
  2641. }
  2642. $data['receive']['moneyCount'] = 0;
  2643. foreach($moneyReceives as $k => $v){
  2644. $data['receive']['moneyCount']++;
  2645. }
  2646. $data['receive']['spinsCount'] = 0;
  2647. foreach($spinsReceives as $k => $v){
  2648. $data['receive']['spinsCount']++;
  2649. }
  2650. //统计后重置
  2651. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('money','Send'));
  2652. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('spins','Send'));
  2653. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('money','Send'));
  2654. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('spins','Send'));
  2655. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('money','Receive'));
  2656. oo::commonOprRedis('Statistics')->delete(okeys::giveSta('spins','Receive'));
  2657. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('money','Receive'));
  2658. oo::commonOprRedis('Statistics')->delete(okeys::givesSta('spins','Receive'));
  2659. $data = json_encode($data);
  2660. $tb = otable::saveGivesSta();
  2661. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2662. oo::commonOprDb('statistics')->query($sql);
  2663. }
  2664. /**
  2665. * 赠送卡片排行榜
  2666. * @param $ciid卡片ID
  2667. * Created by: hss
  2668. * Created on: 2020/1/15 10:46
  2669. */
  2670. static public function giveCardSta($ciid){
  2671. //全部赠送卡片排行榜 可以分两种 1用每天的累加 2或者直接在redis统计 每次只清空当天的
  2672. //当天赠送数量
  2673. oo::commonOprRedis('Statistics')->hIncrBy(okeys::giveCardSta('today'),$ciid,1);
  2674. //全部赠送数量
  2675. oo::commonOprRedis('Statistics')->hIncrBy(okeys::giveCardSta('all'),$ciid,1);
  2676. }
  2677. /**
  2678. * 赠送卡片排行榜 保存到数据库
  2679. * @return string
  2680. * Created by: hss
  2681. * Created on: 2020/1/15 11:52
  2682. */
  2683. public function saveGiveCardSta(){
  2684. $date = date('Ymd');
  2685. $data = array();
  2686. $data['statistics'] = oo::commonOprRedis('Statistics')->hgetall(okeys::giveCardSta('today'));
  2687. //统计后重置
  2688. oo::commonOprRedis('Statistics')->delete(okeys::giveCardSta('today'));
  2689. $data = json_encode($data);
  2690. $tb = otable::saveGiveCardSta();
  2691. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2692. oo::commonOprDb('statistics')->query($sql);
  2693. }
  2694. /**
  2695. * 当天人均通关数(当天通关数 / 当天登陆用户数) 保存到数据库
  2696. * @return string
  2697. * Created by: hss
  2698. * Created on: 2020/1/15 18:33
  2699. */
  2700. public function saveTodayUpLvelSta(){
  2701. $date = date('Ymd');
  2702. //通过人数 以及 关卡数
  2703. $ret = oo::commonOprRedis('common')->hGetAll(okeys::todayDataRank('level'));
  2704. $data = array();
  2705. $total = 0;
  2706. $count = 0;
  2707. foreach($ret as $k => $v){
  2708. $total += $v;
  2709. $count++;
  2710. }
  2711. $data['total'] = $total;
  2712. $data['count'] = $count;
  2713. $data = json_encode($data);
  2714. $tb = otable::saveTodayUpLvelSta();
  2715. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2716. oo::commonOprDb('statistics')->query($sql);
  2717. }
  2718. /**
  2719. * 金矿领取率
  2720. * @return string
  2721. * Created by: hss
  2722. * Created on: 2020/1/17 10:51
  2723. */
  2724. public function miningReceiveSta($uid,$number){
  2725. oo::commonOprRedis('Statistics')->hIncrBy(okeys::miningReceiveSta(),$uid,$number);
  2726. }
  2727. /**
  2728. * 金矿领取率 保存到数据库
  2729. * @return string
  2730. * Created by: hss
  2731. * Created on: 2020/1/17 10:51
  2732. */
  2733. public function saveMiningReceiveSta(){
  2734. $date = date('Ymd');
  2735. //通过人数 以及 关卡数
  2736. $ret = oo::commonOprRedis('Statistics')->hLen(okeys::miningReceiveSta());
  2737. $data = array();
  2738. $data['count'] = intval($ret);
  2739. //统计后重置
  2740. oo::commonOprRedis('Statistics')->delete(okeys::miningReceiveSta());
  2741. $data = json_encode($data);
  2742. $tb = otable::saveMiningReceiveSta();
  2743. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2744. oo::commonOprDb('statistics')->query($sql);
  2745. }
  2746. /**
  2747. * 矿工进度 保存进数据库
  2748. * @return string
  2749. * Created by: hss
  2750. * Created on: 2020/2/7 12:15
  2751. */
  2752. public function saveMinerSpeedSta(){
  2753. $date = date('Ymd');
  2754. $day = date('Ymd', strtotime("-1 day"));
  2755. $days3age = date('Ymd', strtotime($day.'-3 days'));
  2756. $days8age = date('Ymd', strtotime($day.'-7 days'));
  2757. $last8daysPlayer = oo::commonOprModel('statistics')->getAllPlayer($days3age, 1, []);//新增玩家 3天
  2758. //方案一 读数据全部人的统计平均值 效率低
  2759. $miningInfo = otable::miningInfo();
  2760. $uidStr = implode(",",$last8daysPlayer);
  2761. if(!empty($uidStr)){
  2762. $sql = "SELECT * FROM {$miningInfo} WHERE uid in (".$uidStr.")";
  2763. $ret = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  2764. $molecule = 0;
  2765. $denominator = 0;
  2766. foreach ($ret as $k => $v){
  2767. $uid = $v['uid'];
  2768. $speed = json_decode($v['islandLevel'],true);
  2769. foreach($speed as $speed_k => $speed_v){
  2770. $denominator += 5;
  2771. $molecule += $speed_v;
  2772. }
  2773. }
  2774. //return json_encode([$molecule/$denominator]);
  2775. //保存进数据库
  2776. $data['speed'] = $molecule/$denominator;
  2777. $data = json_encode($data);
  2778. $tb = otable::saveMinerSpeedSta();
  2779. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2780. oo::commonOprDb('statistics')->query($sql);
  2781. }
  2782. //方案二 添加字段 统计 效率高些
  2783. }
  2784. /**
  2785. * 获取RichestKing统计
  2786. * @return string
  2787. * Created by: hss
  2788. * Created on: 2020/2/14 18:52
  2789. */
  2790. public function getRichestKingSta($uid){
  2791. oo::commonOprRedis('Statistics')->hIncrBy(okeys::getRichestKingSta(),$uid,1);
  2792. }
  2793. /**
  2794. * 获取RichestKing统计 保存到数据库
  2795. * @return string
  2796. * Created by: hss
  2797. * Created on: 2020/2/17 13:06
  2798. */
  2799. public function saveGetRichestKingSta(){
  2800. $date = date('Ymd');
  2801. //通过人数 以及 关卡数
  2802. $ret = oo::commonOprRedis('Statistics')->hgetall(okeys::getRichestKingSta());
  2803. $data = array();
  2804. $total = 0;
  2805. foreach($ret as $k => $v){
  2806. $total += $v;
  2807. }
  2808. arsort($ret);
  2809. $ret = array_slice($ret,0,50,true);
  2810. $data['total'] = $total;
  2811. $data['data'] = $ret;
  2812. //统计后重置
  2813. oo::commonOprRedis('Statistics')->delete(okeys::getRichestKingSta());
  2814. $data = json_encode($data);
  2815. $tb = otable::saveGetRichestKingSta();
  2816. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2817. oo::commonOprDb('statistics')->query($sql);
  2818. }
  2819. /**
  2820. * 签到领取率统计
  2821. * @return string
  2822. * Created by: hss
  2823. * Created on: 2020/2/25 10:29
  2824. */
  2825. public function signInSta($uid,$type){
  2826. //all 全部
  2827. //1001 体力月卡1
  2828. //1002 体力月卡2
  2829. // oo::commonOprRedis('Statistics')->hIncrBy(okeys::signInSta(),$type,1);
  2830. }
  2831. /**
  2832. * 签到领取率统计 保存到数据库
  2833. * @return string
  2834. * Created by: hss
  2835. * Created on: 2020/2/25 10:30
  2836. */
  2837. public function saveSignInSta(){
  2838. //统计后重置
  2839. oo::commonOprRedis('Statistics')->delete(okeys::signInSta());
  2840. return;
  2841. $date = date('Ymd');
  2842. //通过人数 以及 关卡数
  2843. $ret = oo::commonOprRedis('Statistics')->hGetAll(okeys::signInSta());
  2844. $data = array();
  2845. $data['all'] = intval($ret['all']);
  2846. $data['1001'] = intval($ret['1001']);
  2847. $data['1002'] = intval($ret['1002']);
  2848. $type = 2;
  2849. $ret = oo::commonOprModel('statistics')->getAllPlayer($date, $type, []);
  2850. if(!empty($ret)){
  2851. $ret = array_filter($ret);//去掉空元素
  2852. $data['all_login'] = is_array($ret) ? count($ret) : 0;
  2853. $data['login_1001'] = 0;
  2854. $data['login_1002'] = 0;
  2855. foreach($ret as $k => $uid){
  2856. if(!empty(oo::commonOprModel('payment')->getSpinMonthly($uid,1001))){
  2857. $data['login_1001']++;
  2858. }
  2859. if(!empty(oo::commonOprModel('payment')->getSpinMonthly($uid,1002))){
  2860. $data['login_1002']++;
  2861. }
  2862. }
  2863. //统计后重置
  2864. oo::commonOprRedis('Statistics')->delete(okeys::signInSta());
  2865. $data = json_encode($data);
  2866. $tb = otable::saveSignInSta();
  2867. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2868. oo::commonOprDb('statistics')->query($sql);
  2869. }
  2870. }
  2871. /**
  2872. * 系统补偿领取率
  2873. * @return string
  2874. * Created by: hss
  2875. * Created on: 2020/2/27 22:24
  2876. */
  2877. public function sysCompensateSta($uid){
  2878. oo::commonOprRedis('Statistics')->hIncrBy(okeys::sysCompensateSta(),$uid,1);
  2879. }
  2880. /**
  2881. * 更新公告领取率
  2882. * @return string
  2883. * Created by: hss
  2884. * Created on: 2020/3/3 10:18
  2885. */
  2886. public function updateVersionSta($uid){
  2887. oo::commonOprRedis('Statistics')->hIncrBy(okeys::updateVersionSta(),$uid,1);
  2888. }
  2889. /**
  2890. * 奖励中心统计 保存进数据库
  2891. * @return string
  2892. * Created by: hss
  2893. * Created on: 2020/3/3 10:48
  2894. */
  2895. public function saveRewardCenterSta($time = null){
  2896. $time = $time ?? time();
  2897. $slTable = otable::gh_gameserver(1);
  2898. $sql = " SELECT count(mid) as total FROM {$slTable}";
  2899. $list = oo::commonOprDB('payment')->getOne($sql, 1);
  2900. $totalCount = $list['total'];//总玩家数
  2901. //更新公告领取率
  2902. //取出所有更新版本
  2903. $tb = otable::gameupdate();
  2904. $sql = " SELECT * FROM {$tb} ORDER BY id ASC";
  2905. $versionRet = oo::commonOprDB('common')->getAll($sql, 1);
  2906. $updateVersionStatb = otable::updateVersionSta();
  2907. foreach($versionRet as $k => $v){
  2908. $version = $v['gu_version'];
  2909. $sql = "SELECT * FROM {$updateVersionStatb} WHERE `version` = '{$version}'";
  2910. $ret = oo::commonOprDB('statistics')->getOne($sql, 1);
  2911. if(empty($ret)){
  2912. $sql = "INSERT INTO {$updateVersionStatb} (version,number,total,add_time) VALUES('{$version}', 0,'{$totalCount}','{$time}')";
  2913. oo::commonOprDb('statistics')->query($sql);
  2914. }
  2915. }
  2916. $newVersion = end($versionRet);
  2917. $newVersion = $newVersion['gu_version'];
  2918. //更新最新版本领取率
  2919. $ret = oo::commonOprRedis('Statistics')->hLen(okeys::updateVersionSta());
  2920. $count = intval($ret);//领取人数
  2921. $sql = "UPDATE {$updateVersionStatb} SET number = '{$count}' WHERE version = '{$newVersion}'";
  2922. oo::commonOprDb('statistics')->query($sql);
  2923. //系统补偿领取率
  2924. //取出所有系统补偿
  2925. $tb = otable::SysCompenConfig();
  2926. $sql = "SELECT * FROM {$tb} WHERE 1";
  2927. $sysCompensateSta = otable::sysCompensateSta();
  2928. $SysCompenConfig = oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  2929. foreach($SysCompenConfig as $k => $v){
  2930. $compen_id = $v['id'];
  2931. $sql = "SELECT * FROM {$sysCompensateSta} WHERE `compen_id` = '{$compen_id}'";
  2932. $ret = oo::commonOprDB('statistics')->getOne($sql, 1);
  2933. if(empty($ret)){
  2934. $sql = "INSERT INTO {$sysCompensateSta} (compen_id,number,total,add_time) VALUES('{$compen_id}', 0,'{$totalCount}','{$time}')";
  2935. oo::commonOprDb('statistics')->query($sql);
  2936. }
  2937. }
  2938. $newCompen = end($SysCompenConfig);
  2939. $newCompenId = $newCompen['id'];
  2940. //更新最新版本领取率
  2941. $ret = oo::commonOprRedis('Statistics')->hLen(okeys::sysCompensateSta());
  2942. $count = intval($ret);//领取人数
  2943. $sql = "UPDATE {$sysCompensateSta} SET number = '{$count}' WHERE compen_id = '{$newCompenId}'";
  2944. oo::commonOprDb('statistics')->query($sql);
  2945. }
  2946. /**
  2947. * 聊天的人均金币体力领取次数统计
  2948. * @return string
  2949. * Created by: hss
  2950. * Created on: 2020/3/3 10:18
  2951. */
  2952. public function chatGiftSta($type = 'money'){
  2953. //$type spins money
  2954. oo::commonOprRedis('Statistics')->hIncrBy(okeys::chatGiftSta(),$type,1);
  2955. }
  2956. /**
  2957. * 聊天的人均金币体力领取次数统计 保存进数据库
  2958. * @return string
  2959. * Created by: hss
  2960. * Created on: 2020/3/3 10:18
  2961. */
  2962. public function saveChatGiftSta(){
  2963. $date = date('Ymd');
  2964. //当天登陆用户数
  2965. $type = 2;
  2966. $ret = oo::commonOprModel('statistics')->getAllPlayer($date, $type, []);
  2967. $data = array();
  2968. $data['all_login'] = count($ret);
  2969. $data['money'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::chatGiftSta(),'money'));
  2970. $data['spins'] = intval(oo::commonOprRedis('Statistics')->hget(okeys::chatGiftSta(),'spins'));
  2971. //统计后重置
  2972. oo::commonOprRedis('Statistics')->delete(okeys::chatGiftSta());
  2973. $data = json_encode($data);
  2974. $tb = otable::chatGiftSta();
  2975. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  2976. oo::commonOprDb('statistics')->query($sql);
  2977. }
  2978. /**
  2979. * 转盘参与率
  2980. * @return string
  2981. * Created by: hss
  2982. * Created on: 2020/3/5 10:49
  2983. */
  2984. public function turnTableInSta($uid){
  2985. return ;
  2986. oo::commonOprRedis('Statistics')->hIncrBy(okeys::turnTableInSta(),$uid,1);
  2987. }
  2988. /**
  2989. * 转盘参与率 & 转盘得奖分布 保存进数据库
  2990. * @return string
  2991. * Created by: hss
  2992. * Created on: 2020/3/3 10:18
  2993. */
  2994. public function saveTurnTableInSta(){
  2995. oo::commonOprRedis('Statistics')->delete(okeys::turnTableInSta());
  2996. $level = range(1,60);
  2997. $type = [2,3];
  2998. foreach($type as $t_k => $t_v){
  2999. foreach($level as $l_k => $l_v){
  3000. oo::commonOprRedis('Statistics')->delete(okeys::turnTablePrizeSta($t_v,$l_v));
  3001. }
  3002. }
  3003. return ;
  3004. $date = date('Ymd');
  3005. //当天登陆用户数
  3006. $type = 2;
  3007. $ret = oo::commonOprModel('statistics')->getAllPlayer($date, $type, []);
  3008. $data = array();
  3009. $data['all_login'] = count($ret);
  3010. $data['join'] = intval(oo::commonOprRedis('Statistics')->hLen(okeys::turnTableInSta()));
  3011. //统计后重置
  3012. oo::commonOprRedis('Statistics')->delete(okeys::turnTableInSta());
  3013. //转盘得奖分布
  3014. $level = range(1,60);
  3015. $type = [2,3];
  3016. $Prize = [];
  3017. foreach($type as $t_k => $t_v){
  3018. $levelRet = [];
  3019. foreach($level as $l_k => $l_v){
  3020. $ret = oo::commonOprRedis('Statistics')->hGetAll(okeys::turnTablePrizeSta($t_v,$l_v));
  3021. for($i = 0; $i < 8; $i++){
  3022. $levelRet[$l_v][$i] = intval($ret[$i]);
  3023. }
  3024. //统计后重置
  3025. oo::commonOprRedis('Statistics')->delete(okeys::turnTablePrizeSta($t_v,$l_v));
  3026. }
  3027. $Prize[$t_v] = $levelRet;
  3028. }
  3029. $data['turnTablePrizeSta'] = $Prize;
  3030. $data = json_encode($data);
  3031. $tb = otable::turnTableSta();
  3032. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$data}')";
  3033. oo::commonOprDb('statistics')->query($sql);
  3034. }
  3035. /**
  3036. * 转盘得奖分布
  3037. * @return string
  3038. * @param int $type 类型 2金币转盘 3金币&体力转盘
  3039. * @param int $levelId 等级
  3040. * @param int $rid 中奖ID
  3041. * Created by: hss
  3042. * Created on: 2020/3/6 10:42
  3043. */
  3044. public function turnTablePrizeSta($type,$levelId,$rid){
  3045. return ;
  3046. oo::commonOprRedis('Statistics')->hIncrBy(okeys::turnTablePrizeSta($type,$levelId),$rid,1);
  3047. }
  3048. /**
  3049. * 打偷统计
  3050. * @param $type #attack 打 steal 偷 $baseNumber #基础获得 $multNumber #加倍获得
  3051. * @return array
  3052. * Created by: Hss
  3053. * Created on: 2019/12/16 12:00
  3054. * Description:
  3055. */
  3056. public function attackStealSta($type,$baseNumber,$multNumber,$uid = 0){
  3057. return ;
  3058. $systemNumber = $multNumber - $baseNumber;//纯系统发放
  3059. oo::commonOprRedis('Statistics')->hIncrBy(okeys::attackStealSta($type),'total',1);//打偷次数
  3060. oo::commonOprRedis('Statistics')->hIncrBy(okeys::attackStealSta($type),'baseNumber',$baseNumber);//打偷基础获得
  3061. oo::commonOprRedis('Statistics')->hIncrBy(okeys::attackStealSta($type),'multNumber',$multNumber);//打偷加倍获得
  3062. if($systemNumber > 0){
  3063. oo::commonOprRedis('Statistics')->hIncrBy(okeys::attackStealSta($type),'systemNumber',$systemNumber);//系统纯发放
  3064. }
  3065. oo::commonOprRedis('Statistics')->hIncrBy(okeys::attackStealRankSta($type),$uid,1);//打偷排行榜
  3066. }
  3067. /**
  3068. * 个人老虎机摇奖次数记录 & 老虎机类型次数统计 (wsc-6.10-废弃)
  3069. * @return string
  3070. * @param int $uid 摇奖用户 int $type 类型
  3071. * Created by: hss
  3072. * Created on: 2020/3/24 15:11
  3073. */
  3074. public function shakeSta($uid,$type = ""){
  3075. return ;
  3076. oo::commonOprRedis('Statistics')->hIncrBy(okeys::shakeSta(),$uid,1);
  3077. oo::commonOprRedis('Statistics')->hIncrBy(okeys::slotSta(),$type,1);
  3078. }
  3079. /**
  3080. * 打偷排行榜统计 & 摇奖次数排行榜
  3081. * @return string
  3082. * Created by: hss
  3083. * Created on: 2020/3/3 10:18
  3084. */
  3085. public function attackStealRankSta(){
  3086. oo::commonOprRedis('Statistics')->delete(okeys::shakeSta());
  3087. oo::commonOprRedis('Statistics')->delete(okeys::attackStealRankSta('steal'));
  3088. oo::commonOprRedis('Statistics')->delete(okeys::attackStealRankSta('attack'));
  3089. return;
  3090. $date = date('Ymd');
  3091. $data = array();
  3092. $ret = oo::commonOprRedis('Statistics')->hGetAll(okeys::shakeSta());
  3093. //摇奖次数排行榜
  3094. $data['rank'] = array_slice($ret,0,100,true);
  3095. $data = json_encode($data);
  3096. $tb = otable::staData();
  3097. $type = 'shakeRankSta';
  3098. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3099. oo::commonOprDb('statistics')->query($sql);
  3100. //打偷排行榜
  3101. $stealRet = oo::commonOprRedis('Statistics')->hGetAll(okeys::attackStealRankSta('steal'));
  3102. $attackRet = oo::commonOprRedis('Statistics')->hGetAll(okeys::attackStealRankSta('attack'));
  3103. $stealRank = $attackRank = $data = array();
  3104. foreach($ret as $uid => $number){
  3105. if(empty($number)){
  3106. $stealRank[$uid] = 0;
  3107. }else{
  3108. $stealRank[$uid] = $stealRet[$uid] / $number * 100;//百分比
  3109. }
  3110. if(empty($number)){
  3111. $attackRank[$uid] = 0;
  3112. }else{
  3113. $attackRank[$uid] = $attackRet[$uid] / $number * 100;//百分比
  3114. }
  3115. }
  3116. arsort($stealRank);
  3117. arsort($attackRank);
  3118. arsort($stealRet);
  3119. arsort($attackRet);
  3120. $data['stealRank'] = array_slice($stealRank,0,100,true);//偷概率排行榜
  3121. $data['attackRank'] = array_slice($attackRank,0,100,true);//打概率排行榜
  3122. $data['stealRank2'] = array_slice($stealRet,0,100,true);//偷次数排行榜
  3123. $data['attackRank2'] = array_slice($attackRet,0,100,true);//打次数排行榜
  3124. //次数排行的概率 偷
  3125. $chance = [];
  3126. foreach($data['stealRank2'] as $uid => $v){
  3127. if(empty($ret[$uid])){
  3128. $chance[$uid] = 0;
  3129. }else{
  3130. $chance[$uid] = $v / $ret[$uid] * 100;
  3131. }
  3132. }
  3133. $data['stealRankChance'] = $chance;
  3134. //次数排行的概率 打
  3135. $chance = [];
  3136. foreach($data['attackRank2'] as $uid => $v){
  3137. if(empty($ret[$uid])){
  3138. $chance[$uid] = 0;
  3139. }else{
  3140. $chance[$uid] = $v / $ret[$uid] * 100;
  3141. }
  3142. }
  3143. $data['attackRankChance'] = $chance;
  3144. $data = json_encode($data);
  3145. $tb = otable::staData();
  3146. $type = 'attackStealRankSta';
  3147. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3148. oo::commonOprDb('statistics')->query($sql);
  3149. //统计后重置
  3150. oo::commonOprRedis('Statistics')->delete(okeys::shakeSta());
  3151. oo::commonOprRedis('Statistics')->delete(okeys::attackStealRankSta('steal'));
  3152. oo::commonOprRedis('Statistics')->delete(okeys::attackStealRankSta('attack'));
  3153. }
  3154. /**
  3155. * 每日卡片发放产出统计 保存到数据库
  3156. * @return string
  3157. * Created by: hss
  3158. * Created on: 2020/3/30 15:33
  3159. */
  3160. public function cardGrantSta(){
  3161. $date = date('Ymd');
  3162. $tb = otable::cardinfo_config();
  3163. $sql = "SELECT * FROM {$tb} WHERE 1";
  3164. $temp = oo::commonOprDb('common')->getAll($sql,1);
  3165. foreach ($temp as $key=>$row){
  3166. $t['ci_name'] = $row['ci_name'];
  3167. $t['owner'] = 0;
  3168. $t['num'] = 0;
  3169. $card[$row['ciid']] = $t;
  3170. }
  3171. $tb = otable::usercard_config(1);
  3172. $sql = "SELECT ciid FROM {$tb} WHERE ciid <> '{}'";
  3173. $temp = oo::commonOprDb('common')->getAll($sql,1);
  3174. foreach ($temp as $row){
  3175. $ciid = json_decode($row['ciid'],true);
  3176. foreach ($ciid as $c=>$r){
  3177. $card[$c]['owner'] += 1;
  3178. $card[$c]['num'] += $r;
  3179. }
  3180. }
  3181. $data['card'] = $card;
  3182. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3183. $tb = otable::staData();
  3184. $type = 'cardGrantSta';
  3185. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3186. oo::commonOprDb('statistics')->query($sql);
  3187. }
  3188. /**
  3189. * 卡片来源统计
  3190. * @return string
  3191. * @param $type 1木质宝箱 2黄金宝箱 3 魔法宝箱 4至尊宝箱 5 挖矿【挖到金币为0才有机会触发】,6任务奖励
  3192. * Created by: hss
  3193. * Created on: 2020/4/9 10:40
  3194. */
  3195. public function cardSourceSta($type,$num = 1){
  3196. oo::commonOprRedis('Statistics')->hIncrBy(okeys::cardSourceSta(),$type,$num);
  3197. }
  3198. /**
  3199. * 卡片来源统计 保存到数据库
  3200. * @return string
  3201. * Created by: hss
  3202. * Created on: 2020/3/30 15:33
  3203. */
  3204. public function saveCardSourceSta($timestamp){
  3205. $date = date('Ymd', $timestamp);
  3206. $card = oo::commonOprRedis('Statistics')->hGetAll(okeys::cardSourceSta());
  3207. $data['card'] = $card;
  3208. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3209. $tb = otable::staData();
  3210. $type = 'cardSourceSta';
  3211. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3212. oo::commonOprDb('statistics')->query($sql);
  3213. //统计后重置
  3214. oo::commonOprRedis('Statistics')->delete(okeys::cardSourceSta());
  3215. }
  3216. /**
  3217. * 每日VIP开通人数统计
  3218. * @return string
  3219. * Created by: hss
  3220. * Created on: 2020/4/22 10:50
  3221. */
  3222. public function saveTodayVipOpenSta($timestamp){
  3223. $tb = otable::VipLvConfig();
  3224. $sql = "SELECT * FROM {$tb} WHERE 1";
  3225. $levelConfig = oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  3226. $userinfoTb = otable::userinfo(1);
  3227. $outOpen = $outNoOpen = [];
  3228. //开通人数
  3229. $sql = "SELECT vipLv,count(*) AS count FROM {$userinfoTb} WHERE vipLv > 0 AND vip = 1 GROUP BY vipLv";
  3230. $ret = oo::commonOprDb('userinfo')->getAll($sql, MYSQLI_ASSOC);
  3231. $open = [];
  3232. foreach($ret as $k => $v){
  3233. $open[$v['vipLv']] = $v['count'];
  3234. }
  3235. //未开通人数
  3236. $sql = "SELECT vipLv,count(*) AS count FROM {$userinfoTb} WHERE vipLv > 0 AND vip = 0 GROUP BY vipLv";
  3237. $ret2 = oo::commonOprDb('userinfo')->getAll($sql, MYSQLI_ASSOC);
  3238. $noOpen = [];
  3239. foreach($ret2 as $k => $v){
  3240. $noOpen[$v['vipLv']] = $v['count'];
  3241. }
  3242. foreach ($levelConfig as $key=>$row){
  3243. $vipLv = $row['lv'];
  3244. $outOpen[$vipLv] = isset($open[$vipLv])?$open[$vipLv]:0;
  3245. $outNoOpen[$vipLv] = isset($noOpen[$vipLv])?$noOpen[$vipLv]:0;
  3246. }
  3247. $date = date('Ymd', $timestamp);
  3248. $data['open'] = $outOpen;
  3249. $data['no_open'] = $outNoOpen;
  3250. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3251. $tb = otable::staData();
  3252. $type = 'todayVipOpenSta';
  3253. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3254. oo::commonOprDb('statistics')->query($sql);
  3255. }
  3256. /**
  3257. * 在线玩家数量 保存到数据库
  3258. * @return string
  3259. * Created by: hss
  3260. * Created on: 2020/4/26 16:32
  3261. */
  3262. public function saveOnlinePlaying($timestamp){
  3263. $date = date('Ymd', $timestamp);
  3264. $ret = oo::commonOprRedis('statistics')->hGetAll(okeys::onlineplaying(1));
  3265. $data['1'] = $ret;
  3266. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3267. $tb = otable::staData();
  3268. $type = 'onlinePlaying';
  3269. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3270. oo::commonOprDb('statistics')->query($sql);
  3271. oo::commonOprRedis('statistics')->delete(okeys::onlineplaying(1));//统计在线在玩
  3272. }
  3273. /**
  3274. * 登录监控 保存到数据库
  3275. * @return string
  3276. * Created by: hss
  3277. * Created on: 2020/4/29 10:39
  3278. */
  3279. public function saveLoginMonitorSta($timestamp){
  3280. $date = date('Ymd', $timestamp);
  3281. $sidList = [1,2];
  3282. foreach($sidList as $sid){
  3283. $ret = oo::commonOprRedis('common')->hGetAll(okeys::LoginMonitor($sid));
  3284. $data['sid'.$sid] = $ret;
  3285. }
  3286. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3287. $tb = otable::staData();
  3288. $type = 'loginMonitorSta';
  3289. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3290. oo::commonOprDb('statistics')->query($sql);
  3291. }
  3292. /**
  3293. * 升级速率排行榜(日)
  3294. * @return string
  3295. * Created by: hss
  3296. * Created on: 2020/4/30 12:18
  3297. */
  3298. public function saveLevelRateRankDay(){
  3299. return;
  3300. $type = 2;
  3301. $date = date('Ymd', $timestamp);
  3302. $day = date('Ymd', strtotime("-1 day", $timestamp));
  3303. $ret = oo::commonOprModel('statistics')->getAllPlayer($date, $type, []);//前天新增用户
  3304. if(!empty($ret)){
  3305. $ret = array_filter($ret);//去掉空元素
  3306. $uidStr = implode(",",$ret);
  3307. }
  3308. if(!empty($uidStr)){
  3309. //换城数据库保存的
  3310. $ghtable = otable::statistics(1);
  3311. //$sql = "SELECT loginTime FROM {$ghtable} WHERE uid in (".$uidStr.") AND loginTime > 0";//过滤登陆时间为0的用户
  3312. $sql = "SELECT uid,loginTime FROM {$ghtable} WHERE uid in (".$uidStr.")";
  3313. $ghgamesRet = oo::commonOprDb('ghgames')->getAll($sql,1);
  3314. $data = [];
  3315. foreach($ghgamesRet as $ret_k => $ret_v){
  3316. $uid = $ret_v['uid'];
  3317. $loginTime = intval($ret_v['loginTime']);
  3318. $userLevel = oo::commonOprModel('member')->getUserLevel($uid);
  3319. $levelId = $userLevel['levelId'];
  3320. if($levelId <= 10){
  3321. continue;
  3322. }
  3323. if($loginTime <= 0){
  3324. continue;
  3325. }
  3326. $data[$uid] = $levelId / ($loginTime / 3600);
  3327. }
  3328. arsort($data);
  3329. $out['levelRateRank'] = array_slice($data,0,50,true);
  3330. $out = json_encode($out,JSON_NUMERIC_CHECK);
  3331. $tb = otable::staData();
  3332. $type = 'levelRateRankDay';
  3333. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$out}')";
  3334. oo::commonOprDb('statistics')->query($sql);
  3335. }
  3336. }
  3337. /**
  3338. * 付费关卡分析(首充率、首次付费率、付费率、累积付费钱数、付费人数曲线、当天钱数人数曲线)
  3339. * 方法一:接口统计,数据精确,但是需要在支付接口加入统计代码,统计影响支付流程性能
  3340. * 方法二:从每天的订单中统计,数据不精确,因为当天用户可能升级,那么付费关卡就不准确
  3341. * @return string
  3342. * Created by: hss
  3343. * Created on: 2020/5/11 11:21
  3344. */
  3345. public function saveLevelPaySta($param){
  3346. /*
  3347. //获取用户关卡
  3348. $uid = oo::functions()->uint($param['uid']);
  3349. $userLevel = oo::commonOprModel('member')->getUserLevel($uid);
  3350. $levelId = $userLevel['levelId'];
  3351. //关卡付费人数+1
  3352. oo::commonOprRedis('Statistics')->hIncrBy(okeys::levelPaySta('payNum'),$levelId,1);
  3353. */
  3354. //获取当天支付成功的订单
  3355. $stime = strtotime(date('Y-m-d 00:00:01', time()));
  3356. $etime = strtotime(date('Y-m-d 23:59:59', time()));
  3357. $sidList = [999];
  3358. $isAllSid = in_array(999, $sidList);
  3359. $sidSqlStr = '';
  3360. if(!$isAllSid) {
  3361. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  3362. }
  3363. $blackUidArr = $this->_payBlackList['uid'];
  3364. $blackUidSql = '';
  3365. if(!empty($blackUidArr)) {
  3366. $blackUidStr = implode(',', $blackUidArr);
  3367. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  3368. }
  3369. $where = $sidSqlStr.$blackUidSql;
  3370. $slTable = otable::summarylist();
  3371. $goodsTable = otable::goodsCrazy();
  3372. //查询时间范围内的成功订单
  3373. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel, sl_gid
  3374. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  3375. WHERE sl_sid != -1 AND sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $where ";
  3376. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  3377. $totalMoney = [];//每个关卡总付费
  3378. $totalRecord = [];//每个关卡付费订单数
  3379. $firstNum = [];//每个关卡首充次数
  3380. $firstPayNum = [];//每个关卡首次付费
  3381. $uids = [];
  3382. $levels = [];
  3383. $payLevel = [];//每个关卡付费人数
  3384. //成功的订单
  3385. foreach ($list as $_v) {
  3386. $uid = $_v['sl_uid'];
  3387. //获取用户关卡
  3388. $userLevel = oo::commonOprModel('member')->getUserLevel($uid);
  3389. $levelId = $userLevel['levelId'];
  3390. $totalMoney[$levelId] += round($_v['sl_pusd'], 2);
  3391. $totalRecord[$levelId] += 1 ;
  3392. $levels[$uid] = $levelId;
  3393. if($_v['sl_gid'] == 601){
  3394. $firstNum[$levelId] ?? $firstNum[$levelId] = 0;
  3395. $firstNum[$levelId]++;
  3396. }
  3397. //处理当天重复下单的用户统计
  3398. if(!in_array($_v['sl_uid'], $uids)) {
  3399. array_push($uids, $_v['sl_uid']);
  3400. }
  3401. }
  3402. foreach($uids as $uid){
  3403. $firstPayNum[$levelId] ?? $firstPayNum[$levelId] = 0;
  3404. //首次付费
  3405. $time = strtotime(date('Y-m-d 0:0:0', $stime));
  3406. $checkBought = $this->checkPayFirst($uid, $time);
  3407. if(!isset($firstPayNum[$levels[$uid]])){
  3408. $firstPayNum[$levels[$uid]] = 0;
  3409. }
  3410. $checkBought && $firstPayNum[$levels[$uid]]++;
  3411. $payLevel[$levels[$uid]] ?? $payLevel[$levels[$uid]] = 0;
  3412. $payLevel[$levels[$uid]]++;
  3413. }
  3414. $data = [];
  3415. $data['totalMoney'] = $totalMoney;
  3416. $data['totalRecord'] = $totalRecord;
  3417. $data['firstNum'] = $firstNum;
  3418. $data['firstPayNum'] = $firstPayNum;
  3419. $data['payLevel'] = $payLevel;
  3420. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3421. $date = date("Ymd");
  3422. $tb = otable::staData();
  3423. $type = 'levelPaySta';
  3424. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3425. oo::commonOprDb('statistics')->query($sql);
  3426. }
  3427. /**
  3428. * 支付上报 保存到数据库
  3429. * @return string
  3430. * Created by: hss
  3431. * Created on: 2020/6/11 11:17
  3432. */
  3433. public function savePayReportSta(){
  3434. $date = date('Ymd', strtotime("-1 day"));
  3435. $sidList = [1,2];
  3436. //总次数
  3437. foreach($sidList as $sid){
  3438. $ret = oo::commonOprRedis('Statistics')->hGetAll(okeys::payReport($sid));
  3439. $data['sid'][$sid] = $ret;
  3440. $data["total"][$sid] = array_sum($ret);
  3441. //统计后重置
  3442. oo::commonOprRedis('Statistics')->delete(okeys::payReport($sid));
  3443. }
  3444. $event = [10009,10010,10011];
  3445. //支付成功、支付取消、支付失败
  3446. foreach($event as $event_id){
  3447. foreach($sidList as $sid){
  3448. $ret = oo::commonOprRedis('Statistics')->hGetAll(okeys::payReport($sid,$event_id));
  3449. $data[$event_id]['sid'][$sid] = $ret;
  3450. $data[$event_id]["total"][$sid] = array_sum($ret);
  3451. //统计后重置
  3452. oo::commonOprRedis('Statistics')->delete(okeys::payReport($sid,$event_id));
  3453. }
  3454. }
  3455. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3456. $tb = otable::staData();
  3457. $type = 'payReport';
  3458. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3459. oo::commonOprDb('statistics')->query($sql);
  3460. oo::commonOprRedis('Statistics')->delete(okeys::Report(10009));
  3461. oo::commonOprRedis('Statistics')->delete(okeys::Report(10010));
  3462. oo::commonOprRedis('Statistics')->delete(okeys::Report(10011));
  3463. }
  3464. /**
  3465. * 新手当天卡片发放数量统计 保存到数据库
  3466. * @return string
  3467. * Created by: hss
  3468. * Created on: 2020/6/12 15:50
  3469. */
  3470. public function saveNewUserCardSta(){
  3471. $date = date('Ymd', strtotime("-1 day"));
  3472. $newUser = oo::commonOprModel('statistics')->getAllPlayer($date,1);
  3473. $data = [];
  3474. if(!empty($newUser)){
  3475. $newUserStr = implode(",",$newUser);
  3476. $tb = otable::cardinfo_config();
  3477. $sql = "SELECT * FROM {$tb} WHERE 1";
  3478. $temp = oo::commonOprDb('common')->getAll($sql,1);
  3479. foreach ($temp as $key=>$row){
  3480. $t['ci_name'] = $row['ci_name'];
  3481. $t['owner'] = 0;
  3482. $t['num'] = 0;
  3483. $card[$row['ciid']] = $t;
  3484. }
  3485. $tb = otable::usercard_config(1);
  3486. $sql = "SELECT ciid FROM {$tb} WHERE uid in({$newUserStr})";
  3487. $temp = oo::commonOprDb('common')->getAll($sql,1);
  3488. foreach ($temp as $row){
  3489. $ciid = json_decode($row['ciid'],true);
  3490. foreach ($ciid as $c=>$r){
  3491. $card[$c]['owner'] += 1;
  3492. $card[$c]['num'] += $r;
  3493. }
  3494. }
  3495. $data['card'] = $card;
  3496. }
  3497. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3498. $tb = otable::staData();
  3499. $type = 'newUserCardSta';
  3500. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3501. oo::commonOprDb('statistics')->query($sql);
  3502. }
  3503. /**
  3504. * adJust 統計
  3505. * Created by: Owen
  3506. * Created on: 2020/6/17 16:10
  3507. */
  3508. public function adJustSta(){
  3509. foreach ([1=>'android',2=>'ios'] as $key=>$row){
  3510. $sqlArr = [];
  3511. $list = oo::commonOprRedis('Statistics')->hGetAll(okeys::Report(10012,$key));
  3512. if(empty($list)){
  3513. continue;
  3514. }
  3515. //$sql = "INSERT IGNORE INTO {$tb} (uid,{$row}) VALUES ";
  3516. $sql = "INSERT IGNORE INTO %s (uid,{$row}) VALUES ";
  3517. foreach ($list as $uid=>$data){
  3518. $tb = otable::AdJustSta($uid);
  3519. if(!isset($sqlArr[$tb])){
  3520. $sqlArr[$tb] = sprintf($sql, $tb);
  3521. }
  3522. $sqlArr[$tb] .= "('{$uid}','{$data}'),";
  3523. }
  3524. //批量插入多表
  3525. foreach($sqlArr as $v){
  3526. $v = trim($v,",");
  3527. oo::commonOprDb('common')->query($v);
  3528. }
  3529. oo::commonOprRedis('Statistics')->delete(okeys::Report(10012,$key));
  3530. }
  3531. }
  3532. /**
  3533. * 活动进度支付统计
  3534. * Created by: Hss
  3535. * Created on: 2020/8/25 17:43
  3536. */
  3537. public function activityProgresPaySta(){
  3538. $date = date('Ymd', strtotime("-1 day"));
  3539. $aids = oo::commonOprRedis('activity')->hGetAll(okeys::activityProgresPayAidSta());
  3540. foreach($aids as $aid => $aid2){
  3541. foreach([0,1,2,3,4,5] as $rid){
  3542. if(empty($rid)){
  3543. $rid = '';
  3544. }
  3545. if(empty($aid)){
  3546. $aidTemp = '';
  3547. }else{
  3548. $aidTemp = '_'.$aid;
  3549. }
  3550. $data['data'.$rid.$aidTemp] = oo::commonOprRedis('activity')->hGetAll(okeys::activityProgresPaySta($rid,$aid));
  3551. oo::commonOprRedis('activity')->delete(okeys::activityProgresPaySta($rid,$aid));
  3552. }
  3553. }
  3554. $data['aids'] = $aids;
  3555. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3556. $tb = otable::staData();
  3557. $type = 'activityProgresPaySta';
  3558. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3559. oo::commonOprDb('statistics')->query($sql);
  3560. oo::commonOprRedis('activity')->delete(okeys::activityProgresPayAidSta());
  3561. }
  3562. /**
  3563. * 宝藏探索产出消耗统计
  3564. * @param $type 道具ID
  3565. * Created by: hss
  3566. * Created on: 2020/9/2 16:01
  3567. */
  3568. public function treasureRewardSta($id,$taskId,$num = 1){
  3569. oo::commonOprRedis('Statistics')->hIncrBy(okeys::treasureRewardSta($taskId),$id,$num);
  3570. }
  3571. /**
  3572. * 宝藏探索产出消耗统计 保存到数据库
  3573. * Created by: Hss
  3574. * Created on: 2020/9/2 16:01
  3575. */
  3576. public function saveTreasureRewardSta(){
  3577. $date = date('Ymd', strtotime("-1 day"));
  3578. for($i = 1; $i <= 10; $i++){
  3579. $data['list'][$i] = oo::commonOprRedis('Statistics')->hGetAll(okeys::treasureRewardSta($i));
  3580. oo::commonOprRedis('Statistics')->delete(okeys::treasureRewardSta($i));
  3581. }
  3582. $data = json_encode($data,JSON_NUMERIC_CHECK);
  3583. $tb = otable::staData();
  3584. $type = 'treasureRewardSta';
  3585. $sql = "INSERT INTO {$tb} VALUES('{$date}', '{$type}' ,'{$data}')";
  3586. oo::commonOprDb('statistics')->query($sql);
  3587. }
  3588. /**
  3589. * 小丑卡统计
  3590. * @param $id 来源ID
  3591. * Created by: Hss
  3592. * Created on: 2020/10/15 15:58
  3593. */
  3594. public function jokerCardSta($id,$number = 1,$uid = 0,$reason = "",$rid=3004){
  3595. oo::commonOprRedis('Statistics')->hIncrBy(okeys::JokerCardSta(),$id,$number);
  3596. //获得小丑卡流水
  3597. oo::commonOprModel('currency')->log($uid,"card","+",1,1,$rid,"来源:".$reason);
  3598. }
  3599. /**
  3600. * 商城促销统计
  3601. * @param $uid $price价格
  3602. * Created by: Hss
  3603. * Created on: 2020/11/2 10:53
  3604. */
  3605. public function shopDiscountSta($uid,$price = 0){
  3606. oo::commonOprRedis('Statistics')->hIncrBy(okeys::shopDiscountSta(),$uid,1);
  3607. oo::commonOprRedis('Statistics')->hIncrBy(okeys::shopDiscountSta('price'),$uid,$price);
  3608. }
  3609. /**
  3610. * 通行證統計
  3611. * @return bool
  3612. * Created by: Owen
  3613. * Created on: 2020/11/7 10:49
  3614. */
  3615. public function trafficPermitSta($timestamp){
  3616. $aidArr = oo::commonOprModel('activitynew')->getAllOnlineActivityByType('traffic_permit');
  3617. if(empty($aidArr)){
  3618. return false;
  3619. }
  3620. $aid = 0;
  3621. foreach ($aidArr as $row){
  3622. $aid = $row;
  3623. break;
  3624. }
  3625. $date = date("Ymd", $timestamp);
  3626. $buyTrafficPermitNum = oo::commonOprRedis('Statistics')->hLen(okeys::TrafficPermitSta("BUY"));
  3627. $playerNum = max(oo::commonOprRedis('Statistics')->hLen(okeys::TrafficPermitSta("PLAY")),1);
  3628. $buySta = [
  3629. 'playerNum' => $playerNum,
  3630. 'buyNum' => $buyTrafficPermitNum,
  3631. 'buyPro' => $buyTrafficPermitNum/$playerNum,
  3632. ];
  3633. $taskList = [
  3634. 1=>"邀请好友",
  3635. 2=>"完成世界",
  3636. 3=>"偷",
  3637. 4=>"打",
  3638. 5=>"和大盗莫里一起偷袭",
  3639. 6=>"和拳手莫里一起进攻",
  3640. 7=>"转一次黄金转盘",
  3641. 8=>"夺宝一次",
  3642. 9=>"玩一次黄金矿工",
  3643. 10=>"分享游戏",
  3644. ];
  3645. $taskSta = [];
  3646. foreach ($taskList as $taskId=>$taskName){
  3647. $standard = oo::commonOprRedis('Statistics')->hGet(okeys::TrafficPermitSta("STANDARD"),$taskId);
  3648. $complete_1 = oo::commonOprRedis('Statistics')->hGet(okeys::TrafficPermitSta("COMPLETE-1"),$taskId);
  3649. $complete_2 = oo::commonOprRedis('Statistics')->hGet(okeys::TrafficPermitSta("COMPLETE-2"),$taskId);
  3650. $taskSta[$taskId] = [
  3651. 'standard' => $standard,
  3652. 'complete_1' => $complete_1,
  3653. 'complete_2' => $complete_2,
  3654. 'completePro' =>( $complete_1 + $complete_2 )/$playerNum,
  3655. ];
  3656. }
  3657. $levelSta = [];
  3658. $levelArr = oo::commonOprRedis('Statistics')->hGetAll(okeys::TrafficPermitSta("BUYLEVEL"));
  3659. $userBuy = oo::commonOprRedis('Statistics')->hGetAll(okeys::TrafficPermitSta("BUY"));
  3660. $onLevelBuy = [];
  3661. foreach ($userBuy as $row){
  3662. $onLevelBuy[$row] = intval($onLevelBuy[$row]) + 1;
  3663. }
  3664. $curNumArr = oo::commonOprRedis('activity')->hGetAll(okeys::TrafficPermitCurNum($aid));
  3665. $rewardConf = oo::commonOprModel('activitynew')->getActReward($aid);
  3666. $levelConf = [];
  3667. $reward = $rewardConf['reward']??[];
  3668. $maxLevel = max(array_column($reward,'levelId'));
  3669. foreach ($reward as $k=>$v) {
  3670. $levelConf[$v['levelId']] = $v['max'];
  3671. }
  3672. $levelData = [];
  3673. foreach ($curNumArr as $num){
  3674. $levelId = 0;
  3675. foreach ($levelConf as $level=>$max){
  3676. if($num < $max){
  3677. break;
  3678. }
  3679. $levelId = $level;
  3680. }
  3681. $levelData[$levelId] = intval($levelData[$levelId]) + 1;
  3682. }
  3683. for($i=0;$i<=$maxLevel;$i++){
  3684. $levelSta[$i] = [
  3685. 'buyTrafficPermitNum' => intval($onLevelBuy[$i]),
  3686. 'buyLevelNum' => intval($levelArr[$i]),
  3687. 'playerNum' => intval($levelData[$i]),
  3688. ];
  3689. }
  3690. $propsSta = [];
  3691. $propsList = oo::commonOprModel('props')->getPropsConfig();
  3692. foreach ($propsList as $propsId=>$row){
  3693. $propsSta['normal'][$propsId] = oo::commonOprRedis('Statistics')->hGet(okeys::TrafficPermitSta("PROPS-normal"),$propsId);
  3694. $propsSta['special'][$propsId] = oo::commonOprRedis('Statistics')->hGet(okeys::TrafficPermitSta("PROPS-special"),$propsId);
  3695. }
  3696. $data = addslashes(json_encode([
  3697. 'buySta' => $buySta,
  3698. 'taskSta' => $taskSta,
  3699. 'levelSta' => $levelSta,
  3700. 'propsSta' => $propsSta,
  3701. ]));
  3702. $tb = otable::TrafficPermitSta();
  3703. oo::commonOprDb('statistics')->query("INSERT INTO {$tb} VALUES('{$date}', '{$data}')");
  3704. oo::commonOprRedis('Statistics')->delete([
  3705. okeys::TrafficPermitSta("BUY"),
  3706. okeys::TrafficPermitSta("PLAY"),
  3707. okeys::TrafficPermitSta("STANDARD"),
  3708. okeys::TrafficPermitSta("COMPLETE-1"),
  3709. okeys::TrafficPermitSta("COMPLETE-2"),
  3710. okeys::TrafficPermitSta("BUYLEVEL"),
  3711. okeys::TrafficPermitSta("PROPS-normal"),
  3712. okeys::TrafficPermitSta("PROPS-special"),
  3713. ]);
  3714. }
  3715. /**
  3716. * 矿工小游戏統計(停用-2021.10.23-wsc)
  3717. * Created by: Owen
  3718. * Created on: 2020/11/7 10:49
  3719. */
  3720. public function miningGameSta(){
  3721. oo::commonOprRedis('common')->delete([okeys::MiningGameSta("PLAY",0),okeys::MiningGameSta("PASS",0)]);
  3722. return true;
  3723. $data = [];
  3724. for($i=1;$i<=20;$i++){
  3725. $data[$i] = [
  3726. 'play'=>intval(oo::commonOprRedis('common')->hGet(okeys::MiningGameSta("PLAY",0),$i)),
  3727. 'pass'=>intval(oo::commonOprRedis('common')->hGet(okeys::MiningGameSta("PASS",0),$i)),
  3728. ];
  3729. }
  3730. $tb = otable::MiningGameDateSta();
  3731. $date = date("Ymd");
  3732. $data = addslashes(json_encode($data));
  3733. oo::commonOprDb('statistics')->query("INSERT INTO {$tb} VALUES('{$date}','{$data}')");
  3734. oo::commonOprRedis('common')->delete([okeys::MiningGameSta("PLAY",0),okeys::MiningGameSta("PASS",0)]);
  3735. }
  3736. /**
  3737. * 保险柜统计
  3738. * Created by: Owen
  3739. * Created on: 2020/12/8 19:45
  3740. */
  3741. public function steelSafeSta(){
  3742. $data = [];
  3743. foreach ([1,2,3] as $progressId){
  3744. $data['times'][] = intval(oo::commonOprRedis('Activity')->hGet(okeys::SteelSafeSta(),"reward:".$progressId));// 每天统计每个进度领取次数
  3745. $data['coins'][] = intval(oo::commonOprRedis('Activity')->hGet(okeys::SteelSafeSta(),"coins:".$progressId));// 每天统计每个进度金币金额
  3746. $data['limit'][] = intval(oo::commonOprRedis('Activity')->hGet(okeys::SteelSafeSta(),"limit:".$progressId));// 每天统计每个进度领取到限时奖励次数
  3747. $list = oo::commonOprModel('props')->getPropsConfig();
  3748. foreach ($list as $propsId=>$row){
  3749. $data['props'][$progressId][] = intval(oo::commonOprRedis('Activity')->hGet(okeys::SteelSafeSta(),"props:".$progressId."-".$propsId)); // 每天统计每个进度的领取到限时奖励物品和数量
  3750. }
  3751. }
  3752. $data = addslashes(json_encode($data));
  3753. $tb = otable::SteelSafeSta();
  3754. $date = date("Ymd");
  3755. oo::commonOprDb('statistics')->query("INSERT INTO {$tb} VALUES('{$date}', '{$data}')");
  3756. oo::commonOprRedis('Activity')->delete(okeys::SteelSafeSta());
  3757. $aidArr = oo::commonOprModel('activitynew')->getAllOnlineActivityByType('steel_safe');
  3758. foreach ($aidArr as $aid){
  3759. oo::commonOprRedis('Activity')->delete([okeys::SteelSafeCurNum($aid),okeys::SteelSafeCurProgress($aid)]);
  3760. }
  3761. }
  3762. /**
  3763. * Notes:统计每日活跃推送开关
  3764. * User: wsc
  3765. * Time: 2021/1/5 19:44
  3766. */
  3767. public function userPushStatusSta(){
  3768. $yd = date('Ymd',strtotime('-1 days'));
  3769. for($i=0;$i<3;$i++){
  3770. $k="OPENPUSHUSERLOG:{$yd}:{$i}";
  3771. $arr[$i]=oo::commonOprRedis('statistics')->hLen($k);
  3772. oo::commonOprRedis('statistics')->delete($k);
  3773. }
  3774. $data['data'] = json_encode($arr);
  3775. $data['date'] = $yd;
  3776. $data['type'] ='userPushStatus';
  3777. $tb= otable::staData();
  3778. $sql = funs::db_insertSQL($tb,$data);
  3779. oo::commonOprDb('statistics')->query($sql);
  3780. }
  3781. /**
  3782. * Notes:后台增加老虎机体力统计/老虎机体力关卡概率统计 & 锦标赛 活动期间消耗体力 & 收集活动 每个进度消耗体力
  3783. * User: Hss
  3784. * Time: 2021/2/1 16:35
  3785. */
  3786. public function slotSpinsSta($uid = 0,$levelId = 1,$spins = 0,$bet = 1,$type = 1,$rankAid = 0,$lowSpins = 0){
  3787. $date = date("Ymd",time());
  3788. oo::commonOprRedis('Statistics')->hIncrBy(okeys::slotSpinsSta($date,$type),$levelId,$spins);
  3789. if($rankAid){
  3790. $info = oo::commonOprModel('activitynew')->getUserActStageInfo($uid, $rankAid);
  3791. $stage = isset($info['stage'])?$info['stage']:0;
  3792. $rid = oo::commonOprRedis('activity')->get(okeys::userBindActRid($uid,$rankAid));//绑定活动奖励方案id
  3793. self::rankConsumeSta($rankAid,$uid,$rid,$stage,$lowSpins);//锦标赛 活动期间消耗体力
  3794. }
  3795. $aid = oo::commonOprModel('activitynew')->activityLock($uid,'super_collect');
  3796. if($aid){
  3797. $info = oo::commonOprModel('activitynew')->getUserActStageInfo($uid, $aid);
  3798. $stage = isset($info['stage'])?$info['stage']:0;
  3799. $rid = oo::commonOprRedis('activity')->get(okeys::userBindActRid($uid,$aid));//绑定活动奖励方案id
  3800. // oo::commonOprRedis('Statistics')->hIncrBy(okeys::rankConsumeSta($aid,'super_collect-up',$rid,$stage),$uid,$lowSpins);//每升一次进度清空一次
  3801. oo::commonOprRedis('activity')->hIncrBy(okeys::getCollectActSpins($aid),$uid,$lowSpins);
  3802. }
  3803. }
  3804. /**
  3805. * 锦标赛 + 超级收集活动 统计 & 活动进度支付统计
  3806. * @param $param
  3807. * @return false|string
  3808. * Created by: Hss
  3809. * Created on: 2021/3/2 18:19
  3810. */
  3811. public function rankCollectSta($uid = 0,$gprice = 0,$spins = 0){
  3812. $gprice = $gprice * 100;
  3813. foreach(['super_collect','rank'] as $type){
  3814. $aid = oo::commonOprModel('activitynew')->activityLock($uid,$type);
  3815. if($aid){
  3816. $info = oo::commonOprModel('activitynew')->getUserActStageInfo($uid, $aid);
  3817. $stage = isset($info['stage'])?$info['stage']:0;
  3818. $rid = oo::commonOprRedis('activity')->get(okeys::userBindActRid($uid,$aid));//绑定活动奖励方案id
  3819. //记录当前层付费总金额
  3820. oo::commonOprRedis('Statistics')->hIncrBy(okeys::rankCollectPaySta($aid,$type, $rid, $stage), $uid, $gprice);
  3821. //记录付费前当前体力
  3822. oo::commonOprRedis('Statistics')->hSetNx(okeys::rankCollectSpinsSta($aid,$type, $rid, $stage), $uid, $spins);
  3823. //记录每层首次付费进度数值
  3824. $num = intval($info['rate']);
  3825. oo::commonOprRedis('Statistics')->hSetNx(okeys::rankCollectNumSta($aid,$type, $rid, $stage), $uid, $num);
  3826. if($type == "super_collect"){
  3827. //活动进度支付统计
  3828. oo::commonOprRedis('activity')->hIncrBy(okeys::activityProgresPaySta($rid,$aid), $stage, 1);
  3829. oo::commonOprRedis('activity')->hSetNx(okeys::activityProgresPayAidSta(),$aid,$aid);
  3830. }
  3831. }
  3832. }
  3833. }
  3834. /**
  3835. * 锦标赛 活动期间消耗体力 & 升进度消耗体力
  3836. * @param $param
  3837. * @return false|string
  3838. * Created by: Hss
  3839. * Created on: 2021/3/3 16:49
  3840. */
  3841. public function rankConsumeSta($aid,$uid = 0,$rid = 0,$stage = 0,$spins = 0){
  3842. //根据进度消耗累加获得累计数值,无需重复计算
  3843. // oo::commonOprRedis('Statistics')->hIncrBy(okeys::rankConsumeSta($aid,'',$rid),$uid,$spins);//累计
  3844. // oo::commonOprRedis('Statistics')->hIncrBy(okeys::rankConsumeSta($aid,'rank-up',$rid,$stage),$uid,$spins);//进度消耗
  3845. }
  3846. /**
  3847. * 获取用户统计数据
  3848. * @param $uid
  3849. * @return array
  3850. * Created by: Owen
  3851. * Created on: 2021/5/10 18:16
  3852. */
  3853. public function getUserStatistics($uid){
  3854. $cacheKey = okeys::UserStatistics($uid);
  3855. $cache = oo::commonOprRedis('Statistics')->hGetAll($cacheKey);
  3856. if(!empty($cache)){
  3857. return $cache;
  3858. }
  3859. $tb = otable::UserStatistics($uid);
  3860. $ret= oo::commonOprDb('userinfo')->getOne("SELECT * FROM {$tb} WHERE uid={$uid} LIMIT 1",MYSQLI_ASSOC);
  3861. if(empty($ret)){
  3862. oo::commonOprDb('userinfo')->query("INSERT INTO {$tb} (uid) VALUES ({$uid})");
  3863. $ret= oo::commonOprDb('userinfo')->getOne("SELECT * FROM {$tb} WHERE uid={$uid} LIMIT 1",MYSQLI_ASSOC);
  3864. }
  3865. oo::commonOprRedis('Statistics')->hMset($cacheKey,$ret);
  3866. oo::commonOprRedis('Statistics')->expire($cacheKey,5*24*60*60);
  3867. return $ret;
  3868. }
  3869. /**
  3870. * 追加统计
  3871. * @param $uid
  3872. * @param $info
  3873. * Created by: Owen
  3874. * Created on: 2021/5/10 19:00
  3875. */
  3876. public function addUserStatistics($uid,$info){
  3877. $cacheKey = okeys::UserStatistics($uid);
  3878. if(!oo::commonOprRedis('Statistics')->exists($cacheKey)){
  3879. $this->getUserStatistics($uid);
  3880. }
  3881. foreach ($info as $key=>$row){
  3882. oo::commonOprRedis('Statistics')->hIncrBy($cacheKey,$key,$row);
  3883. }
  3884. oo::commonOprRedis('Statistics')->expire($cacheKey,5*24*60*60);
  3885. /** 数据落地标识 */
  3886. oo::commonOprRedis('common')->zAdd(okeys::Landing("USERSTATISTICS", $uid),time(),$uid);
  3887. }
  3888. /**
  3889. * 追加统计
  3890. * @param $uid
  3891. * @param $info
  3892. * Created by: Owen
  3893. * Created on: 2021/5/10 19:00
  3894. */
  3895. public function setUserStatistics($uid,$info){
  3896. $cacheKey = okeys::UserStatistics($uid);
  3897. if(!oo::commonOprRedis('Statistics')->exists($cacheKey)){
  3898. $this->getUserStatistics($uid);
  3899. }
  3900. foreach ($info as $key=>$row){
  3901. oo::commonOprRedis('Statistics')->hSet($cacheKey,$key,$row);
  3902. }
  3903. oo::commonOprRedis('Statistics')->expire($cacheKey,5*24*60*60);
  3904. /** 数据落地标识 */
  3905. oo::commonOprRedis('common')->zAdd(okeys::Landing("USERSTATISTICS", $uid),time(),$uid);
  3906. }
  3907. }