LiveDataController.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\helper\NumConfig;
  5. use App\Notification\TelegramBot;
  6. use DOMDocument;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Facades\DB;
  9. use Illuminate\Support\Facades\Cache;
  10. use App\Models\AccountsInfo;
  11. use App\Models\Order;
  12. use App;
  13. use App\Util;
  14. use Illuminate\Support\Facades\Redis;
  15. class LiveDataController extends Controller
  16. {
  17. private $gameInfoKey="livedata_gameinfo";
  18. //游戏概括
  19. public function gameInfo(Request $request)
  20. {
  21. $adminChannels = session('admin_channels');
  22. $Channels = session('all_channels');
  23. $admin = session('admin');
  24. // 申请人数,笔数,金额
  25. $applyUserCount = DB::connection('write')->table('QPAccountsDB.dbo.OrderWithDraw as ow')
  26. ->join('QPAccountsDB.dbo.AccountsInfo as ai', 'ow.UserID', 'ai.UserID')
  27. ->where('ow.State', '=', 1);
  28. if(count($adminChannels)<5)$applyUserCount=$applyUserCount->whereIn('ai.Channel', $adminChannels);
  29. $applyUserCount=$applyUserCount->selectRaw('count(distinct(ow.UserID)) userCount,(sum(ow.WithDraw)+sum(ow.ServiceFee)) WithDraw,count(ow.RecordID) count')
  30. ->lock('with(nolock)')->first();
  31. if (isset($applyUserCount->WithDraw)) {
  32. $applyUserCount->WithDraw = number_float($applyUserCount->WithDraw / NumConfig::NUM_VALUE);
  33. }
  34. // 𝚌𝚊𝚛𝚕𝚊 𝚖𝚒𝚌𝚔
  35. //carla mick
  36. $message = DB::connection('write')->table('QPAccountsDB.dbo.Message as m')
  37. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as ai','m.GameID','=','ai.GameID')
  38. ->leftJoin('QPAccountsDB.dbo.Message as n','n.PID','=','m.ID')
  39. ->selectRaw('count(case when m.admin_id = 0 then m.admin_id else NULL end ) as count,
  40. count(nullif(m.admin_id, 0)) as replycount,
  41. count(case when m.admin_read > 0 then 1 else NULL end) as readcount');
  42. if(count($adminChannels)<5)$message=$message->whereIn('ai.Channel', $adminChannels);
  43. $message=$message->where('m.type',0)
  44. ->whereRaw('m.CreateAt>CONVERT(varchar(20),DATEADD(DAY,-1,GETDATE()),120)')->first();
  45. if(!in_array($admin->roles[0]->id,[1,12,2010,2011])){
  46. return view('admin.livedata.customerservice', ['applyUserCount' => $applyUserCount, 'message'=>$message,'Channels' => $Channels, 'adminChannels' => $adminChannels]);
  47. }
  48. $redis_k=$this->gameInfoKey;
  49. if (!Redis::exists($redis_k)) {
  50. $this->gameInfoReadFromDB("beigai");
  51. }
  52. $data =json_decode(Redis::get($redis_k),true);
  53. $ccs=DB::table('QPPlatformDB.dbo.ChannelPackageName')->select('Channel')->where('UnionSign',0)->pluck('Channel')->toArray();
  54. $ccs1=array_unique($ccs);
  55. $ccs=DB::table('QPPlatformDB.dbo.ChannelPackageName')->select('Channel')->where('UnionSign',1)->pluck('Channel')->toArray();
  56. $ccs2=array_unique($ccs);
  57. $ccsall=array_merge($ccs1,$ccs2);
  58. $dataGropSums=[991=>$ccsall];
  59. $Channels[991]="总计";
  60. // $Channels[992]="自营";
  61. // $Channels[993]="24680ARIES";
  62. if(isset($request->debug)){
  63. print_r($data);
  64. die;
  65. }
  66. $item=null;
  67. foreach ($data as $dd) {
  68. $item = $dd;
  69. }
  70. $ndata=[];
  71. foreach ($dataGropSums as $sum=>$sub){
  72. $sumdatas=[];
  73. foreach ($data as $ch=>$d){
  74. if(in_array($ch,$sub)){
  75. $sumdatas[]=$d;
  76. }
  77. }
  78. $ndata=[];
  79. foreach ($item as $k=>$v){
  80. $arr=array_column($sumdatas, $k);
  81. $arr=array_map(function ($item){
  82. if(!is_array($item)){
  83. return str_replace(",","",$item);
  84. }else{
  85. return $item;
  86. }
  87. },$arr);
  88. $ndata[$k]=array_sum($arr);
  89. if(in_array($k,["d0_day_pay", "yes_day_pay"])){
  90. $ndata[$k]=[];
  91. if(count($arr))foreach ($arr[0] as $kk=>$vv){
  92. $arrarr=array_column($arr, $kk);
  93. $ndata[$k][$kk]=array_sum($arrarr);
  94. }
  95. }
  96. }
  97. $ndata['new_rhb']=$this->compute($ndata['today_register'] ?? 0, $ndata['yesterday_register_now'] ?? 0);
  98. $ndata['d0_day_pay_rhb']=$this->compute($ndata['d0_day_pay_count'] ?? 0, $ndata['d0_yday_pay_count_now'] ?? 0);
  99. $ndata['pay_sum_rhb']=$this->compute($ndata['today_pay_sum'] ?? 0, $ndata['yesterday_pay_sum_now'] ?? 0);
  100. $ndata['today_pay_sum_u'] = number_format($ndata['today_pay_sum']/env('USD_RATE',1));//充值金额
  101. $ndata['today_pay_sum']=number_format($ndata['today_pay_sum']);
  102. $data[$sum]=$ndata;
  103. }
  104. // $chanel_orders = [ 121,101,110,125,105, 100,122,126,130,146,124,156,158,129,133,146,152, 106,123, 103, 104, 113,127, 131,141,144,148,149,150,151 ,128,132];
  105. // $chanel_orders=array_merge($dataGropSums[992],$dataGropSums[993]);
  106. $nadmins = [];
  107. // foreach ($chanel_orders as $channel) {
  108. // if (in_array($channel, $adminChannels)) {
  109. // array_push($nadmins, $channel);
  110. // }
  111. // }
  112. foreach ($adminChannels as $channel) {
  113. if (!in_array($channel, $nadmins)) {
  114. array_push($nadmins, $channel);
  115. }
  116. }
  117. $adminChannels = $nadmins;
  118. if(isset($request->debug)){
  119. print_r($data);
  120. print_r($nadmins);
  121. die;
  122. }
  123. // dd($data);
  124. return view('admin.livedata.game_info', ['alldata' => $data,'dataGropSums'=>$dataGropSums, 'applyUserCount' => $applyUserCount, 'message'=>$message,'Channels' => $Channels, 'adminChannels' => $adminChannels]);
  125. }
  126. public function d0_day_pay()
  127. {
  128. $pay = DB::connection('read')->table('agent.dbo.order as a')
  129. ->selectRaw('
  130. cast(sum(a.amount)/100 as int) as d0_pay_num ,
  131. count(DISTINCT a.user_id) as day_pay_count,
  132. a.Channel')
  133. ->join("QPAccountsDB.dbo.AccountsInfo as ai","ai.UserID","=","a.user_id")
  134. ->whereRaw('RegisterDate>=CONVERT(varchar(10),GETDATE(),120) and a.pay_at>CONVERT(varchar(10),GETDATE(),120)')
  135. ->lock('with(nolock)')
  136. ->groupBy('a.Channel')->get()->toArray();
  137. $withdraw = DB::connection('read')->table('QPAccountsDB.dbo.OrderWithDraw as ow')
  138. ->selectRaw('
  139. sum(cast(ow.WithDraw as int))/100 payout,
  140. sum(cast(ow.ServiceFee as int))/100 fee,
  141. count(ow.RecordID) payout_count,
  142. count(distinct (ow.UserID)) payout_user_count,
  143. ai.Channel')
  144. ->join("QPAccountsDB.dbo.AccountsInfo as ai","ai.UserID","=","ow.UserID")
  145. ->whereRaw('RegisterDate>=CONVERT(varchar(10),GETDATE(),120) and ow.State=2')
  146. ->lock('with(nolock)')
  147. ->groupBy('ai.Channel')->get()->toArray();
  148. $result=[];
  149. foreach ($pay as $value){
  150. $value=(array)$value;
  151. $result[$value['Channel']]=$value;
  152. }
  153. foreach ($withdraw as $value){
  154. $value=(array)$value;
  155. if(isset($result[$value['Channel']])){
  156. $result[$value['Channel']]=array_merge($result[$value['Channel']],$value);
  157. }else{
  158. $result[$value['Channel']]=$value;
  159. }
  160. }
  161. foreach ($result as &$item){
  162. $item['payout']=$item['payout']??0;
  163. $item['fee']=$item['fee']??0;
  164. $item['payout_count']=$item['payout_count']??0;
  165. $item['payout_user_count']=$item['payout_user_count']??0;
  166. $item['d0_pay_num']=$item['d0_pay_num']??0;
  167. $item['day_pay_count']=$item['day_pay_count']??0;
  168. $item['ltv_now']=$item['d0_pay_num']-$item['payout'];
  169. }
  170. Redis::set("d0_day_pay_".date("Ymd"),json_encode($result));
  171. return $result;
  172. }
  173. public function yes_day_pay()
  174. {
  175. $yesday=Redis::get("d0_day_pay_".date("Ymd",time()-86400));
  176. if(isset($yesday)&&!empty($yesday)){
  177. return json_decode($yesday,true);
  178. }
  179. $pay = DB::connection('read')->table('agent.dbo.order as a')
  180. ->selectRaw('
  181. cast(sum(a.amount)/100 as int) as d0_pay_num ,
  182. count(DISTINCT a.user_id) as day_pay_count,
  183. a.Channel')
  184. ->leftJoin("QPAccountsDB.dbo.AccountsInfo as ai","ai.UserID","=","a.user_id")
  185. ->whereRaw('RegisterDate>CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)')
  186. ->whereRaw('RegisterDate<CONVERT(varchar(10),GETDATE(),120)')
  187. ->whereRaw('a.pay_at>CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)')
  188. ->whereRaw('a.pay_at<CONVERT(varchar(10),GETDATE(),120)')
  189. ->lock('with(nolock)')
  190. ->groupBy('a.Channel')->get()->toArray();
  191. $withdraw = DB::connection('read')->table('QPAccountsDB.dbo.OrderWithDraw as ow')
  192. ->selectRaw('
  193. sum(cast(ow.WithDraw as int))/100 payout,
  194. sum(cast(ow.ServiceFee as int))/100 fee,
  195. count(ow.RecordID) payout_count,
  196. count(distinct (ow.UserID)) payout_user_count,
  197. ai.Channel')
  198. ->leftJoin("QPAccountsDB.dbo.AccountsInfo as ai","ai.UserID","=","ow.UserID")
  199. ->whereRaw('RegisterDate>CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)')
  200. ->whereRaw('RegisterDate<CONVERT(varchar(10),GETDATE(),120)')
  201. ->whereRaw('ow.CreateDate>CONVERT(varchar(10),DATEADD(DAY,-1,GETDATE()),120)')
  202. ->whereRaw('ow.CreateDate<CONVERT(varchar(10),GETDATE(),120)')
  203. ->lock('with(nolock)')
  204. ->groupBy('ai.Channel')->get()->toArray();
  205. $result=[];
  206. foreach ($pay as $value){
  207. $value=(array)$value;
  208. $result[$value['Channel']]=$value;
  209. }
  210. foreach ($withdraw as $value){
  211. $value=(array)$value;
  212. if(isset($result[$value['Channel']])){
  213. $result[$value['Channel']]=array_merge($result[$value['Channel']],$value);
  214. }else{
  215. $result[$value['Channel']]=$value;
  216. }
  217. }
  218. foreach ($result as &$item){
  219. $item['payout']=$item['payout']??0;
  220. $item['fee']=$item['fee']??0;
  221. $item['payout_count']=$item['payout_count']??0;
  222. $item['payout_user_count']=$item['payout_user_count']??0;
  223. $item['d0_pay_num']=$item['d0_pay_num']??0;
  224. $item['day_pay_count']=$item['day_pay_count']??0;
  225. $item['ltv_now']=$item['d0_pay_num']-$item['payout'];
  226. }
  227. Redis::set("d0_day_pay_".date("Ymd",time()-86400),json_encode($result));
  228. return $result;
  229. }
  230. public function gameInfoReadFromDB()
  231. {
  232. sleep(10);
  233. $Channels = DB::table('QPPlatformDB.dbo.ChannelPackageName')
  234. ->pluck('Remarks', 'Channel')->toArray();
  235. Redis::set("AllChannels",json_encode($Channels));
  236. Redis::expire("AllChannels", 3600);
  237. //今日新增
  238. $today_register = AccountsInfo::today_register();
  239. //昨日新增
  240. $yesterday_register = AccountsInfo::yesterday_register();
  241. $yesterday_register_now = AccountsInfo::yesterday_register_now();
  242. $today_gameplay=AccountsInfo::today_gameplay();
  243. $yesterday_gameplay=AccountsInfo::yesterday_gameplay();
  244. //日活
  245. $today_live = AccountsInfo::today_live();
  246. //昨日日活
  247. $yesterday_live = AccountsInfo::yesterday_live();
  248. // $yesterday_live_now = AccountsInfo::yesterday_live_now();
  249. // $new_rhb = $this->compute($today_register,$yesterday_register);
  250. //周活
  251. $week_login = AccountsInfo::week_login();
  252. //上周周活
  253. $yweek_login = AccountsInfo::yweek_login();
  254. //月活
  255. $month_login = AccountsInfo::month_login();
  256. //上月月活
  257. $ymonth_login = AccountsInfo::ymonth_login();
  258. //总注册用户
  259. $user_count = AccountsInfo::user_count_byChannel();
  260. //休眠用户
  261. $dormancy_user = AccountsInfo::dormancy_user_byChannel();
  262. //今日充值总额和人数
  263. $today_pay = Order::today_pay_byChannel();
  264. //昨日充值总额和人数
  265. $yesterday_pay = Order::yesterday_pay();
  266. $yesterday_pay_now = Order::yesterday_pay_now();
  267. // print_r($yesterday_pay);
  268. //今日新增付费人数
  269. $day_pay_count = Order::day_pay_count();
  270. //昨日新增付费人数
  271. $yday_pay_count = Order::yday_pay_count();
  272. $yday_pay_count_now = Order::yday_pay_count_now();
  273. //今日新增付费人数
  274. $d0_day_pay = $this->d0_day_pay();
  275. $yes_day_pay = $this->yes_day_pay();
  276. $d0_day_pay_count = [];
  277. foreach ($d0_day_pay as $Channel=>$item){
  278. $d0_day_pay_count[$Channel]=$item['day_pay_count'];
  279. }
  280. //昨日新增付费人数
  281. $d0_yday_pay_count = Order::d0_yday_pay_count();
  282. $d0_yday_pay_count_now = Order::d0_yday_pay_count_now();
  283. //总充值金额
  284. $pay_sum = Order::pay_sum()->pay_sum ?? 0;
  285. //总充值人数
  286. $pay_user_count = Order::pay_user_count();
  287. $monlist=DB::table('QPPlatformDB.dbo.ChannelPackageName')->selectRaw("PackageName as package,Channel as id,Remarks as name")->where('OnlineMon', 1)->get()->toArray();
  288. $googlePlayList = [
  289. //
  290. ];
  291. foreach ($monlist as $value){
  292. $value=(array)$value;
  293. $value['url']='https://play.google.com/store/apps/details?id='.$value['package'];
  294. $value['status']=200;
  295. $googlePlayList[]=$value;
  296. }
  297. $old_list=[];
  298. if(Redis::exists("googleplay_list")){
  299. $old_list=json_decode(Redis::get("googleplay_list"),true);
  300. }
  301. foreach ($googlePlayList as &$item) {
  302. $url = $item['url'];
  303. $ch = curl_init($url);
  304. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  305. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  306. // curl_setopt($ch, CURLOPT_NOBODY, 1);
  307. $res = curl_exec($ch);
  308. $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  309. curl_close($ch);
  310. if ($code == 404) {
  311. $item['status'] = $code;
  312. }else{
  313. // 使用DOM解析器加载HTML
  314. $doc = new DOMDocument();
  315. @$doc->loadHTML($res); // 使用@符号抑制加载HTML时的警告
  316. // 获取<title>标签的内容
  317. $titles = $doc->getElementsByTagName("title");
  318. // 确保文档中有<title>标签
  319. if ($titles->length > 0) {
  320. // 输出<title>标签的内容
  321. $item['title']=$titles->item(0)->textContent;
  322. }
  323. }
  324. foreach($old_list as $olditem){
  325. if($item['url']==$olditem['url']){
  326. if(isset($olditem['uptime']))$item['uptime']=$olditem['uptime'];
  327. if(isset($olditem['downtime']))$item['downtime']=$olditem['downtime'];
  328. if($item['status']!=$olditem['status']){
  329. $telegram = new TelegramBot();
  330. $env = env('APP_ENV');
  331. $telegram->sendMsg($env."在线包 ".$item['name']." 异常,立即通知广告".$item['status'].':'.$item['url']);
  332. if(!isset($item['downtime']))$item['downtime']=time();
  333. }else if($item['status']==200){
  334. if(isset($item['title'])&&isset($olditem['title'])&&$item['title']!=$olditem['title']){
  335. $telegram = new TelegramBot();
  336. $env = env('APP_ENV');
  337. $telegram->sendMsg($env."上包通过 ".$item['name']." 名称更改--".$item['title'].",立即通知广告".$item['status'].':'.$item['url']);
  338. if(!isset($item['uptime']))$item['uptime']=time();
  339. }
  340. }
  341. break;
  342. }
  343. }
  344. }
  345. Redis::set("googleplay_list",json_encode($googlePlayList));
  346. $alldatas = [
  347. 'today_register' => $today_register,//今日用户新增
  348. 'yesterday_register' => $yesterday_register,//今日用户新增
  349. 'yesterday_register_now' => $yesterday_register_now,//今日用户新增
  350. 'today_gameplay' => $today_gameplay,//今日用户新增
  351. 'yesterday_gameplay' => $yesterday_gameplay,//今日用户新增
  352. 'today_live' => $today_live,//日活
  353. 'week_login' => $week_login,//周活
  354. 'month_login' => $month_login,//月活
  355. 'user_count' => $user_count,//总注册用户
  356. 'dormancy_user' => $dormancy_user,//休眠用户
  357. 'day_pay_count' => $day_pay_count,//新增付费人数
  358. 'yday_pay_count' => $yday_pay_count,//新增付费人数
  359. 'd0_day_pay_count' => $d0_day_pay_count,//新增付费人数
  360. 'd0_yday_pay_count_now' => $d0_yday_pay_count_now,//新增付费人数
  361. 'd0_yday_pay_count' => $d0_yday_pay_count,//新增付费人数
  362. ];
  363. $data = [
  364. 'plays' => $googlePlayList,
  365. 'pay_sum' => number_format($pay_sum / 100),//总充值金额
  366. 'pay_user_count' => $pay_user_count,//总充值人数
  367. 'time' => date('Y-m-d'),
  368. ];
  369. // print_r($alldatas);die;
  370. foreach ($Channels as $channel => $name) {
  371. // if($channel==102)continue;
  372. if (!isset($data[$channel])) $data[$channel] = [];
  373. foreach ($alldatas as $key => &$arr) {
  374. $arr[$channel]=$arr[$channel]??0;
  375. $data[$channel][$key] = $arr[$channel];
  376. }
  377. $today_pay[$channel] = $today_pay[$channel] ?? (object)['today_pay_sum' => 0, 'today_pay_count' => 0];
  378. $yesterday_pay[$channel] = $yesterday_pay[$channel] ?? (object)['yesterday_pay_sum' => 0, 'yesterday_pay_count' => 0];
  379. $yesterday_pay_now[$channel] = $yesterday_pay_now[$channel] ?? (object)['yesterday_pay_sum' => 0, 'yesterday_pay_count' => 0];
  380. $today_gameplay[$channel]=$today_gameplay[$channel]??0;
  381. $yesterday_gameplay[$channel]=$yesterday_gameplay[$channel]??0;
  382. $today_register[$channel]=$today_register[$channel]??1;
  383. $yesterday_register[$channel]=$yesterday_register[$channel]??1;
  384. $today_play_rate = number_float((int)$today_gameplay[$channel] / $today_register[$channel]*100);
  385. $yesterday_play_rate = number_float((int)$yesterday_gameplay[$channel] / $yesterday_register[$channel]*100);
  386. $today_pay_sum = number_float((int)$today_pay[$channel]->today_pay_sum / 100);
  387. $yesterday_pay_sum = number_float((int)$yesterday_pay[$channel]->yesterday_pay_sum / 100);
  388. $yesterday_pay_sum_now = number_float((int)$yesterday_pay_now[$channel]->yesterday_pay_sum / 100);
  389. $today_pay_count = (int)$today_pay[$channel]->today_pay_count;
  390. $yesterday_pay_count = (int)$yesterday_pay[$channel]->yesterday_pay_count;
  391. $yesterday_pay_count_now = (int)$yesterday_pay_now[$channel]->yesterday_pay_count;
  392. $pay_sum_rhb = $this->compute($today_pay_sum, $yesterday_pay_sum_now);
  393. $pay_count_rhb = $this->compute($today_pay_count, $yesterday_pay_count_now);
  394. $data[$channel]['today_pay_sum'] = number_format($today_pay_sum);//充值金额
  395. $data[$channel]['today_pay_sum_u'] = number_format($today_pay_sum/env('USD_RATE',1));//充值金额
  396. $data[$channel]['yesterday_pay_sum'] = number_format($yesterday_pay_sum);//充值金额
  397. $data[$channel]['yesterday_pay_sum_now'] = number_format($yesterday_pay_sum_now);//充值金额
  398. $data[$channel]['pay_sum_rhb'] = $pay_sum_rhb;//充值金额环比
  399. $data[$channel]['today_pay_count'] = $today_pay_count;//付费人数
  400. $data[$channel]['yesterday_pay_count'] = $yesterday_pay_count;//付费人数
  401. $data[$channel]['pay_count_rhb'] = $pay_count_rhb;//付费人数日环比
  402. $data[$channel]['d0_day_pay'] = $d0_day_pay[$channel]??['pay'=>0,'payout'=>0,'payout_user_count'=>0,'d0_pay_num'=>0,'ltv_now'=>0,'fee'=>0];//d0ltv数据
  403. $data[$channel]['yes_day_pay'] = $yes_day_pay[$channel]??['pay'=>0,'payout'=>0,'payout_user_count'=>0,'d0_pay_num'=>0,'ltv_now'=>0,'fee'=>0];//d0ltv数据
  404. $new_rhb = $this->compute($today_register[$channel] ?? 0, $yesterday_register_now[$channel] ?? 0);
  405. $live_rhb = $this->compute($today_live[$channel] ?? 0, $yesterday_live[$channel] ?? 0);
  406. $play_rhb = $this->compute($today_play_rate, $yesterday_play_rate);
  407. //环比
  408. $week_rhb = $this->compute($week_login[$channel] ?? 0, $yweek_login[$channel] ?? 0);
  409. //环比
  410. $month_rhb = $this->compute($month_login[$channel] ?? 0, $ymonth_login[$channel] ?? 0);
  411. //环比
  412. $d0_day_pay_rhb = $this->compute($d0_day_pay_count[$channel] ?? 0, $d0_yday_pay_count_now[$channel] ?? 0);
  413. //环比
  414. $day_pay_rhb = $this->compute($day_pay_count[$channel] ?? 0, $yday_pay_count_now[$channel] ?? 0);
  415. $data[$channel]['new_rhb'] = $new_rhb;//日环比
  416. $data[$channel]['today_play_rate'] = $today_play_rate;//日环比
  417. $data[$channel]['yesterday_play_rate'] = $yesterday_play_rate;//日环比
  418. $data[$channel]['play_rhb'] = $play_rhb;//日环比
  419. $data[$channel]['day_pay_rhb'] = $day_pay_rhb;//新增付费人数日环比
  420. $data[$channel]['d0_day_pay_rhb'] = $d0_day_pay_rhb;//新增付费人数日环比
  421. $data[$channel]['live_rhb'] = $live_rhb;//日活环比
  422. $data[$channel]['week_rhb'] = $week_rhb;//周环比
  423. $data[$channel]['month_rhb'] = $month_rhb;//月环比
  424. }
  425. // Cache::put('livedata_gameinfo', $data, 5);
  426. $redis_k=$this->gameInfoKey;
  427. Redis::set($redis_k,json_encode($data));
  428. Redis::expire($redis_k,600);
  429. // DB::connection('mysql')->table('log_gameinfos')->insert(['data'=>json_encode($data)]);
  430. }
  431. //金币总览
  432. public function goldInfo(Request $request)
  433. {
  434. if (Cache::has('livedata_goldinfo')) {
  435. $data = Cache::get('livedata_goldinfo');
  436. return view('admin.livedata.gold_info', ['data' => $data]);
  437. }
  438. //平台金币总额
  439. $data['platform_gold'] = DB::table('QPTreasureDB.dbo.GameScoreInfo as gsi')
  440. ->Join('QPAccountsDB.dbo.AccountsInfo as ai', 'gsi.UserID', '=', 'ai.UserID')
  441. ->selectRaw('Isnull(SUM(gsi.Score+gsi.BankScore),0) as platform_gold')
  442. ->where('ai.IsAndroid', 0)
  443. ->first()->platform_gold;
  444. //经销商库存
  445. $data['distributor_gold'] = DB::table('agent.dbo.agent')
  446. ->selectRaw('Isnull(SUM(score),0) as distributor_gold')
  447. ->where('distributor', 1)
  448. ->first()->distributor_gold;
  449. //计提总金额
  450. $data['revenue_gold'] = DB::table('QPAccountsDB.dbo.YN_Agent')
  451. ->selectRaw('Isnull(SUM(Revenue),0) as revenue_gold')
  452. ->where('Status', 0)
  453. ->first()->revenue_gold;
  454. $recode_game_date = DB::table('QPPlatformDB.dbo.YN_RecordGameDataDay')
  455. ->selectRaw('Isnull(SUM(Revenue),0) as today_revenue,Isnull(SUM(Waste),0) as robot_gold')
  456. ->whereRaw('RecordDate>CONVERT(varchar(10),GETDATE(),120)')
  457. ->first();
  458. //今日税收
  459. $data['today_revenue'] = $recode_game_date->today_revenue;
  460. //机器人输赢总额
  461. $data['robot_gold'] = $recode_game_date->robot_gold;
  462. //今日活跃资金量
  463. $data['today_active_gold'] = DB::table('QPTreasureDB.dbo.GameScoreInfo as gsi')
  464. ->Join('QPAccountsDB.dbo.AccountsInfo as ai', 'gsi.UserID', '=', 'ai.UserID')
  465. ->selectRaw('Isnull(SUM(gsi.Score+gsi.BankScore),0) as today_active_gold')
  466. ->whereRaw('gsi.LastLogonDate>CONVERT(varchar(10),GETDATE(),120) AND ai.IsAndroid=0')
  467. ->first()->today_active_gold;
  468. //今日回收总额
  469. $data['today_recovery_gold'] = $data['today_revenue'] + $data['robot_gold'];
  470. //今日流通量总额
  471. $data['today_circulate_gold'] = DB::table('QPTreasureDB.dbo.RecordDrawScore')
  472. ->selectRaw('Isnull(SUM(Score),0) as today_circulate_gold')
  473. // ->whereRaw('DATEDIFF(DAY,InsertTime,GETDATE())=0 AND Score>0')
  474. ->whereRaw('InsertTime>CONVERT(varchar(10),GETDATE(),120) AND Score>0')
  475. ->first()->today_circulate_gold;
  476. //新用户注册
  477. //$data['new_user_count'] = (AccountsInfo::today_register())*8000;
  478. $data['new_user_count'] = DB::table('QPRecordDB.dbo.PD_RecordScoreInfo')
  479. ->where('Reason', 33)
  480. ->whereDate('AtDate', date('Ymd'))
  481. ->selectRaw('Isnull(sum(Score),0) as ChangeScore')
  482. ->first()->ChangeScore;
  483. //每日签到
  484. $data['bonus_gold'] = DB::table('QPAccountsDB.dbo.YN_PlayerTaskLog')
  485. ->selectRaw('Isnull(SUM(BonusNumber),0) as bonus_gold')
  486. ->whereRaw('created_at>CONVERT(varchar(10),GETDATE(),120) AND BonusID=30000')
  487. ->first()->bonus_gold;
  488. //商城兑换
  489. $data['exchange_gold'] = DB::table('QPAccountsDB.dbo.ActivityShopRecord')
  490. ->selectRaw('COUNT(*)*60000 as exchange_gold')
  491. ->whereRaw('CreateDate>CONVERT(varchar(10),GETDATE(),120) AND GoodsID=4')
  492. ->first()->exchange_gold;
  493. //全民推广兑换
  494. $data['spread_gold'] = DB::table('QPAccountsDB.dbo.YN_Withdrawal')
  495. ->selectRaw('Isnull(SUM(Gold),0) as spread_gold')
  496. ->whereRaw('ApplyDate>CONVERT(varchar(10),GETDATE(),120)')
  497. ->first()->spread_gold;
  498. //充值发放
  499. $data['recharge_gold'] = DB::table('agent.dbo.order_goods as og')
  500. ->leftJoin('agent.dbo.order as o', 'og.order_id', '=', 'o.id')
  501. ->lock('with(nolock)')
  502. ->selectRaw('Isnull(SUM(og.score_quantity),0) as recharge_gold')
  503. ->whereRaw('o.pay_at>CONVERT(varchar(10),GETDATE(),120)')
  504. ->first()->recharge_gold;
  505. //低保破产赠送
  506. $data['succour_gold'] = DB::table('QPRecordDB.dbo.YN_LogProtect')
  507. ->selectRaw('Isnull(SUM(AddNums),0) as succour_gold')
  508. ->whereRaw('UpdateDate>CONVERT(varchar(10),GETDATE(),120)')
  509. ->first()->succour_gold;
  510. //任务获得
  511. $data['mission_gold'] = DB::table('QPRecordDB.dbo.LogProp')
  512. ->selectRaw('Isnull(SUM(PropNum),0) as mission_gold')
  513. ->whereRaw('RecordData>CONVERT(varchar(10),GETDATE(),120) AND Source=4 AND PropID=30000')
  514. ->first()->mission_gold;
  515. //周卡月卡每日发放
  516. $data['week_gold'] = DB::table('QPRecordDB.dbo.LogProp')
  517. ->selectRaw('ISNULL(SUM(PropNum),0) as week_gold')
  518. ->whereRaw("RecordData>CONVERT(varchar(10),GETDATE(),120) AND Source = 10")
  519. ->first()->week_gold;
  520. //每日分享
  521. $data['share_gold'] = DB::table('QPGameMatchDB.dbo.MatchShareRecord')
  522. ->selectRaw('Isnull(SUM(Gold),0) as share_gold')
  523. ->whereRaw('ShareDate>CONVERT(varchar(10),GETDATE(),120)')
  524. ->first()->share_gold;
  525. //今日总发放
  526. $data['gold_sum'] = $data['new_user_count'] + $data['bonus_gold'] + $data['exchange_gold'] + $data['spread_gold']
  527. + $data['recharge_gold'] + $data['succour_gold'] + $data['mission_gold'] + $data['week_gold'] + $data['share_gold'];
  528. foreach ($data as $key => &$value) {
  529. $value = number_format($value);
  530. }
  531. Cache::put('livedata_goldinfo', $data, 5);
  532. return view('admin.livedata.gold_info', ['data' => $data]);
  533. }
  534. //环比计算
  535. private function compute($numerator, $denominator = 0)
  536. {
  537. $denominator != 0 ? $result = round((($numerator - $denominator) / $denominator * 100), 2) . '%' : $result = round($numerator * 100, 2) . '%';
  538. return $result;
  539. }
  540. //当前玩家在线明细
  541. public function OnlinePlayer(Request $request)
  542. {
  543. $list = DB::connection('read')->table('QPTreasureDB.dbo.GameScoreLocker as gsl')
  544. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as ai', 'gsl.UserID', '=', 'ai.UserID')
  545. ->leftJoin('QPTreasureDB.dbo.GameScoreInfo as gsi', 'gsl.UserID', '=', 'gsi.UserID')
  546. ->leftJoin('QPPlatformDB.dbo.GameRoomInfo as gri', 'gsl.ServerID', '=', 'gri.ServerID')
  547. ->select('gsl.UserID', 'gsl.CollectDate', 'ai.GameID', 'ai.NickName', 'ai.LastLogonDate', 'gsi.Score', 'gsi.BankScore', 'gri.ServerName')
  548. ->paginate(10);
  549. foreach ($list as $key => &$value) {
  550. $value->Score = number_format($value->Score);
  551. $value->BankScore = number_format($value->BankScore);
  552. }
  553. return view('admin.livedata.online_player', ['list' => $list]);
  554. }
  555. }