LiveDataController.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  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(DB::raw("QPAccountsDB.dbo.AccountsInfo as ai with(nolock)"),"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(DB::raw("QPAccountsDB.dbo.AccountsInfo as ai with(nolock)"),"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(DB::raw("QPAccountsDB.dbo.AccountsInfo as ai with(nolock)"),"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(DB::raw("QPAccountsDB.dbo.AccountsInfo as ai with(nolock)"),"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. // 获取iOS App Store监控列表
  298. $ioslist = DB::connection('mysql')->table('webgame.WebChannelConfig')
  299. ->selectRaw("LightApk as iosurl, Channel as id, Remarks as name")
  300. ->whereNotNull('LightApk')
  301. ->where('LightApk', '!=', '')
  302. ->get()->toArray();
  303. foreach ($ioslist as $value){
  304. $value=(array)$value;
  305. // 只处理包含apple的URL
  306. if(!empty($value['iosurl']) && strpos($value['iosurl'], 'apple') !== false){
  307. $value['url'] = $value['iosurl'];
  308. $value['status'] = 200;
  309. $value['type'] = 'ios';
  310. $googlePlayList[]=$value;
  311. }
  312. }
  313. $old_list=[];
  314. if(Redis::exists("googleplay_list")){
  315. $old_list=json_decode(Redis::get("googleplay_list"),true);
  316. }
  317. foreach ($googlePlayList as &$item) {
  318. $url = $item['url'];
  319. $ch = curl_init($url);
  320. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  321. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  322. // curl_setopt($ch, CURLOPT_NOBODY, 1);
  323. $res = curl_exec($ch);
  324. $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  325. curl_close($ch);
  326. if ($code == 404) {
  327. $item['status'] = $code;
  328. }else{
  329. // 使用DOM解析器加载HTML
  330. $doc = new DOMDocument();
  331. @$doc->loadHTML($res); // 使用@符号抑制加载HTML时的警告
  332. // 获取<title>标签的内容
  333. $titles = $doc->getElementsByTagName("title");
  334. // 确保文档中有<title>标签
  335. if ($titles->length > 0) {
  336. // 输出<title>标签的内容
  337. $item['title']=$titles->item(0)->textContent;
  338. }
  339. }
  340. foreach($old_list as $olditem){
  341. if($item['url']==$olditem['url']){
  342. if(isset($olditem['uptime']))$item['uptime']=$olditem['uptime'];
  343. if(isset($olditem['downtime']))$item['downtime']=$olditem['downtime'];
  344. if($item['status']!=$olditem['status']){
  345. $telegram = new TelegramBot();
  346. $env = env('APP_ENV');
  347. $platform = isset($item['type']) && $item['type'] == 'ios' ? 'iOS App' : 'Google Play';
  348. $telegram->sendMsg($env."在线包(".$platform.") ".$item['name']." 异常,立即通知广告".$item['status'].':'.$item['url']);
  349. if(!isset($item['downtime']))$item['downtime']=time();
  350. }else if($item['status']==200){
  351. if(isset($item['title'])&&isset($olditem['title'])&&$item['title']!=$olditem['title']){
  352. $telegram = new TelegramBot();
  353. $env = env('APP_ENV');
  354. $platform = isset($item['type']) && $item['type'] == 'ios' ? 'iOS App' : 'Google Play';
  355. $telegram->sendMsg($env."上包通过(".$platform.") ".$item['name']." 名称更改--".$item['title'].",立即通知广告".$item['status'].':'.$item['url']);
  356. if(!isset($item['uptime']))$item['uptime']=time();
  357. }
  358. }
  359. break;
  360. }
  361. }
  362. }
  363. Redis::set("googleplay_list",json_encode($googlePlayList));
  364. $alldatas = [
  365. 'today_register' => $today_register,//今日用户新增
  366. 'yesterday_register' => $yesterday_register,//今日用户新增
  367. 'yesterday_register_now' => $yesterday_register_now,//今日用户新增
  368. 'today_gameplay' => $today_gameplay,//今日用户新增
  369. 'yesterday_gameplay' => $yesterday_gameplay,//今日用户新增
  370. 'today_live' => $today_live,//日活
  371. 'week_login' => $week_login,//周活
  372. 'month_login' => $month_login,//月活
  373. 'user_count' => $user_count,//总注册用户
  374. 'dormancy_user' => $dormancy_user,//休眠用户
  375. 'day_pay_count' => $day_pay_count,//新增付费人数
  376. 'yday_pay_count' => $yday_pay_count,//新增付费人数
  377. 'd0_day_pay_count' => $d0_day_pay_count,//新增付费人数
  378. 'd0_yday_pay_count_now' => $d0_yday_pay_count_now,//新增付费人数
  379. 'd0_yday_pay_count' => $d0_yday_pay_count,//新增付费人数
  380. ];
  381. $data = [
  382. 'plays' => $googlePlayList,
  383. 'pay_sum' => number_format($pay_sum / 100),//总充值金额
  384. 'pay_user_count' => $pay_user_count,//总充值人数
  385. 'time' => date('Y-m-d'),
  386. ];
  387. // print_r($alldatas);die;
  388. foreach ($Channels as $channel => $name) {
  389. // if($channel==102)continue;
  390. if (!isset($data[$channel])) $data[$channel] = [];
  391. foreach ($alldatas as $key => &$arr) {
  392. $arr[$channel]=$arr[$channel]??0;
  393. $data[$channel][$key] = $arr[$channel];
  394. }
  395. $today_pay[$channel] = $today_pay[$channel] ?? (object)['today_pay_sum' => 0, 'today_pay_count' => 0];
  396. $yesterday_pay[$channel] = $yesterday_pay[$channel] ?? (object)['yesterday_pay_sum' => 0, 'yesterday_pay_count' => 0];
  397. $yesterday_pay_now[$channel] = $yesterday_pay_now[$channel] ?? (object)['yesterday_pay_sum' => 0, 'yesterday_pay_count' => 0];
  398. $today_gameplay[$channel]=$today_gameplay[$channel]??0;
  399. $yesterday_gameplay[$channel]=$yesterday_gameplay[$channel]??0;
  400. $today_register[$channel]=$today_register[$channel]??1;
  401. $yesterday_register[$channel]=$yesterday_register[$channel]??1;
  402. $today_play_rate = number_float((int)$today_gameplay[$channel] / $today_register[$channel]*100);
  403. $yesterday_play_rate = number_float((int)$yesterday_gameplay[$channel] / $yesterday_register[$channel]*100);
  404. $today_pay_sum = number_float((int)$today_pay[$channel]->today_pay_sum / 100);
  405. $yesterday_pay_sum = number_float((int)$yesterday_pay[$channel]->yesterday_pay_sum / 100);
  406. $yesterday_pay_sum_now = number_float((int)$yesterday_pay_now[$channel]->yesterday_pay_sum / 100);
  407. $today_pay_count = (int)$today_pay[$channel]->today_pay_count;
  408. $yesterday_pay_count = (int)$yesterday_pay[$channel]->yesterday_pay_count;
  409. $yesterday_pay_count_now = (int)$yesterday_pay_now[$channel]->yesterday_pay_count;
  410. $pay_sum_rhb = $this->compute($today_pay_sum, $yesterday_pay_sum_now);
  411. $pay_count_rhb = $this->compute($today_pay_count, $yesterday_pay_count_now);
  412. $data[$channel]['today_pay_sum'] = number_format($today_pay_sum);//充值金额
  413. $data[$channel]['today_pay_sum_u'] = number_format($today_pay_sum/env('USD_RATE',1));//充值金额
  414. $data[$channel]['yesterday_pay_sum'] = number_format($yesterday_pay_sum);//充值金额
  415. $data[$channel]['yesterday_pay_sum_now'] = number_format($yesterday_pay_sum_now);//充值金额
  416. $data[$channel]['pay_sum_rhb'] = $pay_sum_rhb;//充值金额环比
  417. $data[$channel]['today_pay_count'] = $today_pay_count;//付费人数
  418. $data[$channel]['yesterday_pay_count'] = $yesterday_pay_count;//付费人数
  419. $data[$channel]['pay_count_rhb'] = $pay_count_rhb;//付费人数日环比
  420. $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数据
  421. $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数据
  422. $new_rhb = $this->compute($today_register[$channel] ?? 0, $yesterday_register_now[$channel] ?? 0);
  423. $live_rhb = $this->compute($today_live[$channel] ?? 0, $yesterday_live[$channel] ?? 0);
  424. $play_rhb = $this->compute($today_play_rate, $yesterday_play_rate);
  425. //环比
  426. $week_rhb = $this->compute($week_login[$channel] ?? 0, $yweek_login[$channel] ?? 0);
  427. //环比
  428. $month_rhb = $this->compute($month_login[$channel] ?? 0, $ymonth_login[$channel] ?? 0);
  429. //环比
  430. $d0_day_pay_rhb = $this->compute($d0_day_pay_count[$channel] ?? 0, $d0_yday_pay_count_now[$channel] ?? 0);
  431. //环比
  432. $day_pay_rhb = $this->compute($day_pay_count[$channel] ?? 0, $yday_pay_count_now[$channel] ?? 0);
  433. $data[$channel]['new_rhb'] = $new_rhb;//日环比
  434. $data[$channel]['today_play_rate'] = $today_play_rate;//日环比
  435. $data[$channel]['yesterday_play_rate'] = $yesterday_play_rate;//日环比
  436. $data[$channel]['play_rhb'] = $play_rhb;//日环比
  437. $data[$channel]['day_pay_rhb'] = $day_pay_rhb;//新增付费人数日环比
  438. $data[$channel]['d0_day_pay_rhb'] = $d0_day_pay_rhb;//新增付费人数日环比
  439. $data[$channel]['live_rhb'] = $live_rhb;//日活环比
  440. $data[$channel]['week_rhb'] = $week_rhb;//周环比
  441. $data[$channel]['month_rhb'] = $month_rhb;//月环比
  442. }
  443. // Cache::put('livedata_gameinfo', $data, 5);
  444. $redis_k=$this->gameInfoKey;
  445. Redis::set($redis_k,json_encode($data));
  446. Redis::expire($redis_k,600);
  447. // DB::connection('mysql')->table('log_gameinfos')->insert(['data'=>json_encode($data)]);
  448. }
  449. //金币总览
  450. public function goldInfo(Request $request)
  451. {
  452. if (Cache::has('livedata_goldinfo')) {
  453. $data = Cache::get('livedata_goldinfo');
  454. return view('admin.livedata.gold_info', ['data' => $data]);
  455. }
  456. //平台金币总额
  457. $data['platform_gold'] = DB::table('QPTreasureDB.dbo.GameScoreInfo as gsi')
  458. ->Join('QPAccountsDB.dbo.AccountsInfo as ai', 'gsi.UserID', '=', 'ai.UserID')
  459. ->selectRaw('Isnull(SUM(gsi.Score+gsi.BankScore),0) as platform_gold')
  460. ->where('ai.IsAndroid', 0)
  461. ->first()->platform_gold;
  462. //经销商库存
  463. $data['distributor_gold'] = DB::table('agent.dbo.agent')
  464. ->selectRaw('Isnull(SUM(score),0) as distributor_gold')
  465. ->where('distributor', 1)
  466. ->first()->distributor_gold;
  467. //计提总金额
  468. $data['revenue_gold'] = DB::table('QPAccountsDB.dbo.YN_Agent')
  469. ->selectRaw('Isnull(SUM(Revenue),0) as revenue_gold')
  470. ->where('Status', 0)
  471. ->first()->revenue_gold;
  472. $recode_game_date = DB::table('QPPlatformDB.dbo.YN_RecordGameDataDay')
  473. ->selectRaw('Isnull(SUM(Revenue),0) as today_revenue,Isnull(SUM(Waste),0) as robot_gold')
  474. ->whereRaw('RecordDate>CONVERT(varchar(10),GETDATE(),120)')
  475. ->first();
  476. //今日税收
  477. $data['today_revenue'] = $recode_game_date->today_revenue;
  478. //机器人输赢总额
  479. $data['robot_gold'] = $recode_game_date->robot_gold;
  480. //今日活跃资金量
  481. $data['today_active_gold'] = DB::table('QPTreasureDB.dbo.GameScoreInfo as gsi')
  482. ->Join('QPAccountsDB.dbo.AccountsInfo as ai', 'gsi.UserID', '=', 'ai.UserID')
  483. ->selectRaw('Isnull(SUM(gsi.Score+gsi.BankScore),0) as today_active_gold')
  484. ->whereRaw('gsi.LastLogonDate>CONVERT(varchar(10),GETDATE(),120) AND ai.IsAndroid=0')
  485. ->first()->today_active_gold;
  486. //今日回收总额
  487. $data['today_recovery_gold'] = $data['today_revenue'] + $data['robot_gold'];
  488. //今日流通量总额
  489. $data['today_circulate_gold'] = DB::table('QPTreasureDB.dbo.RecordDrawScore')
  490. ->selectRaw('Isnull(SUM(Score),0) as today_circulate_gold')
  491. // ->whereRaw('DATEDIFF(DAY,InsertTime,GETDATE())=0 AND Score>0')
  492. ->whereRaw('InsertTime>CONVERT(varchar(10),GETDATE(),120) AND Score>0')
  493. ->first()->today_circulate_gold;
  494. //新用户注册
  495. //$data['new_user_count'] = (AccountsInfo::today_register())*8000;
  496. $data['new_user_count'] = DB::table('QPRecordDB.dbo.PD_RecordScoreInfo')
  497. ->where('Reason', 33)
  498. ->whereDate('AtDate', date('Ymd'))
  499. ->selectRaw('Isnull(sum(Score),0) as ChangeScore')
  500. ->first()->ChangeScore;
  501. //每日签到
  502. $data['bonus_gold'] = DB::table('QPAccountsDB.dbo.YN_PlayerTaskLog')
  503. ->selectRaw('Isnull(SUM(BonusNumber),0) as bonus_gold')
  504. ->whereRaw('created_at>CONVERT(varchar(10),GETDATE(),120) AND BonusID=30000')
  505. ->first()->bonus_gold;
  506. //商城兑换
  507. $data['exchange_gold'] = DB::table('QPAccountsDB.dbo.ActivityShopRecord')
  508. ->selectRaw('COUNT(*)*60000 as exchange_gold')
  509. ->whereRaw('CreateDate>CONVERT(varchar(10),GETDATE(),120) AND GoodsID=4')
  510. ->first()->exchange_gold;
  511. //全民推广兑换
  512. $data['spread_gold'] = DB::table('QPAccountsDB.dbo.YN_Withdrawal')
  513. ->selectRaw('Isnull(SUM(Gold),0) as spread_gold')
  514. ->whereRaw('ApplyDate>CONVERT(varchar(10),GETDATE(),120)')
  515. ->first()->spread_gold;
  516. //充值发放
  517. $data['recharge_gold'] = DB::table('agent.dbo.order_goods as og')
  518. ->leftJoin('agent.dbo.order as o', 'og.order_id', '=', 'o.id')
  519. ->lock('with(nolock)')
  520. ->selectRaw('Isnull(SUM(og.score_quantity),0) as recharge_gold')
  521. ->whereRaw('o.pay_at>CONVERT(varchar(10),GETDATE(),120)')
  522. ->first()->recharge_gold;
  523. //低保破产赠送
  524. $data['succour_gold'] = DB::table('QPRecordDB.dbo.YN_LogProtect')
  525. ->selectRaw('Isnull(SUM(AddNums),0) as succour_gold')
  526. ->whereRaw('UpdateDate>CONVERT(varchar(10),GETDATE(),120)')
  527. ->first()->succour_gold;
  528. //任务获得
  529. $data['mission_gold'] = DB::table('QPRecordDB.dbo.LogProp')
  530. ->selectRaw('Isnull(SUM(PropNum),0) as mission_gold')
  531. ->whereRaw('RecordData>CONVERT(varchar(10),GETDATE(),120) AND Source=4 AND PropID=30000')
  532. ->first()->mission_gold;
  533. //周卡月卡每日发放
  534. $data['week_gold'] = DB::table('QPRecordDB.dbo.LogProp')
  535. ->selectRaw('ISNULL(SUM(PropNum),0) as week_gold')
  536. ->whereRaw("RecordData>CONVERT(varchar(10),GETDATE(),120) AND Source = 10")
  537. ->first()->week_gold;
  538. //每日分享
  539. $data['share_gold'] = DB::table('QPGameMatchDB.dbo.MatchShareRecord')
  540. ->selectRaw('Isnull(SUM(Gold),0) as share_gold')
  541. ->whereRaw('ShareDate>CONVERT(varchar(10),GETDATE(),120)')
  542. ->first()->share_gold;
  543. //今日总发放
  544. $data['gold_sum'] = $data['new_user_count'] + $data['bonus_gold'] + $data['exchange_gold'] + $data['spread_gold']
  545. + $data['recharge_gold'] + $data['succour_gold'] + $data['mission_gold'] + $data['week_gold'] + $data['share_gold'];
  546. foreach ($data as $key => &$value) {
  547. $value = number_format($value);
  548. }
  549. Cache::put('livedata_goldinfo', $data, 5);
  550. return view('admin.livedata.gold_info', ['data' => $data]);
  551. }
  552. //环比计算
  553. private function compute($numerator, $denominator = 0)
  554. {
  555. $denominator != 0 ? $result = round((($numerator - $denominator) / $denominator * 100), 2) . '%' : $result = round($numerator * 100, 2) . '%';
  556. return $result;
  557. }
  558. //当前玩家在线明细
  559. public function OnlinePlayer(Request $request)
  560. {
  561. $list = DB::connection('read')->table('QPTreasureDB.dbo.GameScoreLocker as gsl')
  562. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as ai', 'gsl.UserID', '=', 'ai.UserID')
  563. ->leftJoin('QPTreasureDB.dbo.GameScoreInfo as gsi', 'gsl.UserID', '=', 'gsi.UserID')
  564. ->leftJoin('QPPlatformDB.dbo.GameRoomInfo as gri', 'gsl.ServerID', '=', 'gri.ServerID')
  565. ->select('gsl.UserID', 'gsl.CollectDate', 'ai.GameID', 'ai.NickName', 'ai.LastLogonDate', 'gsi.Score', 'gsi.BankScore', 'gri.ServerName')
  566. ->paginate(10);
  567. foreach ($list as $key => &$value) {
  568. $value->Score = number_format($value->Score);
  569. $value->BankScore = number_format($value->BankScore);
  570. }
  571. return view('admin.livedata.online_player', ['list' => $list]);
  572. }
  573. }