Vip.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. /**
  3. * Vip统计相关
  4. */
  5. defined( 'IN_WEB') or die( 'Include Error!');
  6. include_once dirname(__FILE__) . "/Base.php";
  7. class Vip extends Base{
  8. //积分等级分布 & VIP开通人数
  9. public function lvDistribution($param){
  10. $start_time = microtime();
  11. $where = '';
  12. if($param['open'] == 1){
  13. $where .= " AND vip = 1";
  14. }else{
  15. $where .= " AND vip = 0";
  16. }
  17. $tb = otable::VipLvConfig();
  18. $sql = "SELECT * FROM {$tb} WHERE 1";
  19. $levelConfig = oo::commonOprDb('config')->getAll($sql,MYSQLI_ASSOC);
  20. $userinfoTb = otable::userinfo(1);
  21. $out = [];
  22. //方法一 for循环查询
  23. // foreach ($levelConfig as $key=>$row){
  24. // $vipLv = $row['lv'];
  25. // $sql = "SELECT count(*) as count FROM {$userinfoTb} WHERE vipLv = '{$vipLv}' {$where}";
  26. // $ret = oo::commonOprDb('userinfo')->getOne($sql, MYSQLI_ASSOC);
  27. // $out[$vipLv] = $ret['count'];
  28. // }
  29. //方法二 SELECT vipLv,count(*) FROM t_userinfo GROUP BY vipLv 一条语句查完
  30. //开通人数
  31. $sql = "SELECT vipLv,count(*) AS count FROM {$userinfoTb} WHERE vipLv > 0 {$where} GROUP BY vipLv";
  32. $ret = oo::commonOprDb('userinfo')->getAll($sql, MYSQLI_ASSOC);
  33. $arr = [];
  34. foreach($ret as $k => $v){
  35. $arr[$v['vipLv']] = $v['count'];
  36. }
  37. foreach ($levelConfig as $key=>$row){
  38. $vipLv = $row['lv'];
  39. $out[$vipLv] = isset($arr[$vipLv])?$arr[$vipLv]:0;
  40. }
  41. return json_encode(['data'=>$out,'resultTime'=>microtime() - $start_time]);
  42. }
  43. //VIP玩家详情
  44. public function paySta($param){
  45. $limit = oo::functions()->uint($param['limit']);
  46. $page = oo::functions()->uint($param['page']);
  47. if(empty($limit)){
  48. $limit = 10;
  49. }
  50. if(empty($page)){
  51. $page = 1;
  52. }
  53. $start = ($page - 1) * $limit;
  54. $sort = oo::functions()->escape($param['sort']);
  55. $uid = oo::functions()->uint($param['uid']);
  56. if($sort == "time"){
  57. $orderSql = "ORDER BY sl_pay_time DESC";
  58. }elseif($sort == "count"){
  59. $orderSql = "ORDER BY count DESC";
  60. }else{
  61. $orderSql = "ORDER BY sl_pay_time DESC";
  62. }
  63. //积分排序
  64. if($sort == 'point'){
  65. //查询用户表
  66. $where = '';
  67. if($uid){
  68. $where = " AND uid = $uid";
  69. }
  70. $table = otable::userinfo(1);
  71. $sql = "SELECT uid,vip,vipPoint,vipLv FROM {$table} WHERE vipLv > 0 {$where} ORDER BY vipPoint DESC LIMIT {$start}, {$limit}";
  72. $ret = oo::commonOprDb('userinfo')->getAll($sql,MYSQLI_ASSOC);
  73. $sql2 = "SELECT count(*) as count FROM {$table} WHERE vipLv > 0";
  74. $ret2 = oo::commonOprDb('userinfo')->getOne($sql2,MYSQLI_ASSOC);
  75. $out = [];
  76. foreach ($ret as $k => $v){
  77. $uidArr[] = $v['uid'];
  78. }
  79. if(empty($uidArr)){
  80. $uidArr[] = 100050;
  81. }
  82. $uidStr = implode(",",$uidArr);
  83. $table = otable::summarylist();
  84. $sql = "SELECT sl_uid,sl_gid,sl_pay_time,count(*) as count FROM {$table} WHERE sl_uid in($uidStr) AND sl_gid in(801,803) AND sl_status = 2 GROUP BY sl_uid ORDER BY sl_pay_time DESC";
  85. $summarylist = oo::commonOprDb('payment')->getAll($sql,MYSQLI_ASSOC);
  86. $list = [];
  87. foreach($summarylist as $k => $v){
  88. $list[$v['sl_uid']] = $v;
  89. }
  90. foreach ($ret as $k => $v){
  91. $uid = $v['uid'];
  92. if(isset($list[$uid])){
  93. $ret[$k]['sl_gid'] = $list[$uid]['sl_gid'];
  94. $ret[$k]['sl_pay_time'] = $list[$uid]['sl_pay_time'];
  95. $ret[$k]['count'] = $list[$uid]['count'];
  96. }else{
  97. $ret[$k]['sl_gid'] = 801;
  98. $ret[$k]['sl_pay_time'] = 0;
  99. $ret[$k]['count'] = 0;
  100. }
  101. }
  102. $out = $ret;
  103. }else{
  104. $where = '';
  105. if($uid){
  106. $where = " AND sl_uid = $uid";
  107. }
  108. $table = otable::summarylist();
  109. $sql = "SELECT sl_uid,sl_gid,sl_pay_time,count(*) as count FROM {$table} WHERE sl_gid in(801,803) AND sl_status = 2 {$where} GROUP BY sl_uid {$orderSql} LIMIT {$start}, {$limit}";
  110. $ret = oo::commonOprDb('payment')->getAll($sql,MYSQLI_ASSOC);
  111. $sql2 = "SELECT count(*) as count FROM (SELECT DISTINCT sl_uid FROM {$table} WHERE sl_gid in(801,803) AND sl_status = 2 {$where}) as a";
  112. $ret2 = oo::commonOprDb('payment')->getOne($sql2,MYSQLI_ASSOC);
  113. $out = [];
  114. foreach ($ret as $k => $v){
  115. $uid = $v['sl_uid'];
  116. $userinfo = oo::commonOprModel('member')->getUserInfo($uid);//玩家基本信息
  117. $data = [];
  118. $data['uid'] = $uid;
  119. $data['vipPoint'] = $userinfo['vipPoint'];
  120. $data['vip'] = $userinfo['vip'];
  121. $data['sl_pay_time'] = $v['sl_pay_time'];
  122. $data['sl_gid'] = $v['sl_gid'];
  123. $data['count'] = $v['count'];
  124. $out[] = $data;
  125. }
  126. }
  127. return json_encode(['data'=>$out,'total'=>$ret2['count']]);
  128. }
  129. //积分获得排行
  130. public function getRank($param){
  131. //$stime = strtotime("2020-03-05 20:00:00");//VIP积分获得规则代码上传时间
  132. $stime = oo::functions()->escape($param['stime']);
  133. $etime = oo::functions()->escape($param['etime']);
  134. $rate = oo::functions()->uint($param['rate']);
  135. if(empty($rate)){
  136. $rate = 100;
  137. }
  138. $dayList = $this->getDays($stime, $etime);
  139. $data = [];
  140. $table = otable::summarylist();
  141. $out = [];
  142. foreach($dayList as $date) {
  143. //查询每个日期总积分
  144. $sDay = strtotime($date." 00:00:00");
  145. $eDay = strtotime($date." 23:59:59");
  146. $sql = "SELECT SUM(sl_pusd) as total FROM {$table} WHERE sl_status = 2 AND sl_pay_time > {$sDay} AND sl_pay_time < {$eDay}";
  147. $ret = oo::commonOprDb('payment')->getOne($sql,MYSQLI_ASSOC);
  148. $out[$date] = intval($ret['total']) * $rate;
  149. }
  150. $data['day'] = $out;
  151. //查询日期范围不同商品积分获取数量
  152. $sql = "SELECT sl_gid,sum(sl_pusd) AS total,count(*) AS count FROM {$table} WHERE sl_status = 2 AND sl_pay_time > {$stime} AND sl_pay_time < {$etime} GROUP BY sl_gid";
  153. $ret = oo::commonOprDb('payment')->getAll($sql,MYSQLI_ASSOC);
  154. $data['sumDay'] = $ret;
  155. //商品数据
  156. $gTable = otable::goodsCrazy();
  157. $sql = " SELECT gid,gpid,gname,gprice FROM {$gTable}";
  158. $goodsCrazy = oo::commonOprDb('common')->getAll($sql, 1);
  159. $data['goods'] = $goodsCrazy;
  160. return json_encode(['data'=>$data]);
  161. }
  162. //每日VIP开通人数统计
  163. public function todayVipOpenSta($param){
  164. //每日新增开通人数
  165. /*
  166. $date = $param['date'];
  167. $table = otable::staData();
  168. $type = 'todayVipOpenSta';
  169. //当天数据
  170. $dateNew = date("Ymd",strtotime($date));
  171. $sql = "SELECT * FROM {$table} WHERE date IN ({$dateNew}) AND type = '{$type}'";
  172. $retNew = oo::commonOprDb('statistics')->getOne($sql,MYSQLI_ASSOC);
  173. $retNew['data'] = json_decode($retNew['data'],true);
  174. //前一天数据
  175. $dateLast = date("Ymd",strtotime($date)-86400);
  176. $sql = "SELECT * FROM {$table} WHERE date IN ({$dateLast}) AND type = '{$type}'";
  177. $retLast = oo::commonOprDb('statistics')->getOne($sql,MYSQLI_ASSOC);
  178. if(!empty($retLast)){
  179. $retLast['data'] = json_decode($retLast['data'],true);
  180. }
  181. $data = array();
  182. foreach($retNew['data']['open'] as $k => $v){
  183. $data['open'][$k] = $v - (isset($retLast['data']['open'][$k])?$retLast['data']['open'][$k]:0);
  184. $data['no_open'][$k] = $retNew['data']['no_open'][$k] - (isset($retLast['data']['no_open'][$k])?$retLast['data']['no_open'][$k]:0);
  185. }
  186. return json_encode(['data'=>$data]);
  187. */
  188. //每日付费开通VIP人数
  189. $date = $param['date'];
  190. $sidList = json_decode($param['sidList'], 1);
  191. if(empty($date)){
  192. $date = date("Y-m-d",time());
  193. }
  194. if(empty($sidList)){
  195. $sidList = [999];
  196. }
  197. $where = '';
  198. if(!in_array(999,$sidList)){
  199. $where .= " AND sl_sid in ( ". implode(',', $sidList)." )";
  200. }
  201. $stime = strtotime($date." 00:00:00");
  202. $etime = strtotime($date." 23:59:59");
  203. $table = otable::summarylist();
  204. $sql = "SELECT sl_uid,sl_gid,sl_pay_time,count(*) as count FROM {$table} WHERE sl_pay_time > {$stime} AND sl_pay_time < {$etime} AND sl_gid in(801,803) AND sl_status = 2 {$where} GROUP BY sl_uid ORDER BY sl_pay_time DESC";
  205. $summarylist = oo::commonOprDb('payment')->getAll($sql,MYSQLI_ASSOC);
  206. $data = [];
  207. foreach($summarylist as $k => $v){
  208. $uid = $v['sl_uid'];
  209. $userinfo = oo::commonOprModel('member')->getUserInfo($uid);//玩家基本信息
  210. if(!isset($data[$userinfo['vipLv']])){
  211. $data[$userinfo['vipLv']] = 0;
  212. }
  213. $data[$userinfo['vipLv']]++;
  214. }
  215. return json_encode(['data'=>$data]);
  216. }
  217. public function openVip($param){
  218. if(empty($param['uid']) || empty($param['day']))
  219. return json_encode(['code'=>-1,'msg'=>'非法操作']);
  220. $uid = oo::functions()->uint($param['uid']);
  221. $day = oo::functions()->uint($param['day']);
  222. if(empty($uid) || empty($day))
  223. return json_encode(['code'=>-1,'msg'=>'非法操作']);
  224. $res = oo::commonOprModel('member')->updateUserInfo($uid, ['vip_expire' =>time() + $day * 86400,"vip"=>1]);
  225. return json_encode(['code'=>$res,'msg'=>'操作成功']);
  226. }
  227. }