Payment.php 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534
  1. <?php
  2. /**
  3. * 订单相关
  4. */
  5. defined('IN_WEB') or die('Include Error!');
  6. include_once dirname(__FILE__) . "/Base.php";
  7. class Payment extends Base
  8. {
  9. protected $summarylistTable;//汇总表
  10. protected $goods;//商品表
  11. private $_payBlackList; //支付需要过滤的黑名单
  12. private $_firstPayGoodsList = [12, 19, 44, 185, 320];//首冲商品列表
  13. public function __construct()
  14. {
  15. $this->summarylistTable = otable::summarylist();
  16. $this->goods = otable::goodsCrazy();
  17. $this->_payBlackList['uid'] = oo::commonOprModel("config")->payWhiteList();
  18. }
  19. /**
  20. * 获取订单列表
  21. */
  22. public function getList($param)
  23. {
  24. $data = array('list' => array(), 'total' => 0);
  25. $stime = oo::functions()->uint($param['stime']);
  26. $etime = oo::functions()->uint($param['etime']);
  27. $paymentType = oo::functions()->uint($param['payment_type']);
  28. $uid = oo::functions()->uint($param['userid']); // 用户ID
  29. $orderId = oo::functions()->escape($param['order_id']);//订单号
  30. $sl_platform_serial_num = $param['sl_platform_serial_num'];
  31. $channel = oo::functions()->uint($param['channel']);//渠道
  32. $sidList = json_decode($param['sidList'], 1);
  33. $page = oo::functions()->uint($param['page']);//起始页数
  34. $limit = oo::functions()->uint($param['limit']);//每页数量
  35. $uidSql = '';
  36. if(empty($sidList)) {
  37. return json_encode(['list'=>[], 'total'=>0]);
  38. }
  39. if($this->isAllSid($sidList)) {
  40. $where = " 1=1 ";
  41. }else {
  42. $where = " sl_sid IN ( ". implode(',', $sidList)." )";
  43. }
  44. if( empty($stime) ){$stime = strtotime('0:0:1');}//默认为当天
  45. if( empty($etime) ){$etime = time();}
  46. if( empty($paymentType) ){ $paymentType = 2; }
  47. if( !empty($uid)) { $uidSql = ' AND sl_uid = '.$uid; }
  48. if($paymentType > 1){ //已发货,已退款,退款已处理等状态
  49. $where .= " AND sl_status = {$paymentType} AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} ";
  50. } else {
  51. if($paymentType == 1){
  52. $where .= " AND sl_status = {$paymentType} AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} ";
  53. }else{
  54. $where .= " AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} ";
  55. }
  56. }
  57. if(!empty($orderId)) {
  58. $where .= " AND sl_orderid = '{$orderId}' ";
  59. }
  60. if(!empty($sl_platform_serial_num)) {
  61. $where .= " AND sl_platform_serial_num = '{$sl_platform_serial_num}' ";
  62. }
  63. if(!empty($channel)) {
  64. $where .= " AND g.gchannel = $channel ";
  65. }
  66. $slTable = $this->summarylistTable;
  67. $goodsTable = $this->goods;
  68. $blackUidArr = $this->_payBlackList['uid'];
  69. $blackUidSql = '';
  70. if(!empty($blackUidArr) && empty($uid)) {
  71. $blackUidStr = implode(',', $blackUidArr);
  72. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  73. }
  74. $sql = " SELECT sl.*, g.* FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS g ON sl.sl_gid = g.gid WHERE {$where} $blackUidSql $uidSql ORDER BY sl_order_time DESC LIMIT $page, $limit ";
  75. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  76. //获取总数
  77. $totalSql = " SELECT count(1) as t FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS g ON sl.sl_gid = g.gid WHERE {$where} $blackUidSql $uidSql ";
  78. // oo::logs()->debug3(['tsql'=>$totalSql], 'Payment.php');
  79. $retTotal = oo::commonOprDb('common')->getOne($totalSql, MYSQLI_ASSOC);
  80. $total = intval($retTotal['t']);
  81. $data['list'] = $list;
  82. $data['total'] = $total;
  83. return json_encode($data);
  84. }
  85. /**
  86. * 获取订单列表
  87. */
  88. public function getTotal($param)
  89. {
  90. $stime = oo::functions()->uint($param['stime']);
  91. $etime = oo::functions()->uint($param['etime']);
  92. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为8天前
  93. if( empty($etime) ){$etime = time();}
  94. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  95. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  96. $sidList = json_decode($param['sidList'], 1);
  97. if(empty($sidList)) {
  98. return json_encode([]);
  99. }
  100. $sidSqlStr = '';
  101. if(!$this->isAllSid($sidList)) {
  102. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  103. }
  104. $slTable = $this->summarylistTable;
  105. $goodsTable = $this->goods;
  106. $blackUidArr = $this->_payBlackList['uid'];
  107. $blackUidSql = '';
  108. if(!empty($blackUidArr)) {
  109. $blackUidStr = implode(',', $blackUidArr);
  110. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  111. }
  112. //查询时间范围内的成功订单
  113. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel, sl_sid
  114. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  115. WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $blackUidSql $sidSqlStr ";
  116. // oo::logs()->debug3(['sql'=>$sql], 'Payment.php');
  117. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  118. //总订单数
  119. $sql2 = " SELECT id, sl_order_time , gchannel, sl_sid
  120. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  121. WHERE sl_order_time >= {$stime} AND sl_order_time <= {$etime} $blackUidSql $sidSqlStr";
  122. $list2 = oo::commonOprDb('common')->getAll($sql2, MYSQLI_ASSOC);
  123. $dayList = $this->getDays($stime, $etime, 2);
  124. $totalMoney = $totalMoneyAndroid = $totalMoneyIos = $totalRecord = $totalUid = $allRecord = $totalChannel = $succChannel = $totalSid = $succSid = $vivoTotalMoney = [];
  125. $uid = [];
  126. // oo::logs()->debug3(['succ'=>json_encode($list)], 'Payment.php');
  127. // oo::logs()->debug3(['total'=>json_encode($list2)], 'Payment.php');
  128. //成功的订单
  129. foreach ($list as $_v) {
  130. $date = date('Ymd', $_v['sl_pay_time']);
  131. $totalMoney[$date] += number_format($_v['sl_pusd'], 2,".","") ;
  132. if($_v['sl_sid'] == 1){
  133. $totalMoneyAndroid[$date] += number_format($_v['sl_pusd'], 2,".","") ;
  134. }else{
  135. $totalMoneyIos[$date] += number_format($_v['sl_pusd'], 2,".","") ;
  136. }
  137. $totalRecord[$date] += 1 ;
  138. //处理当天重复下单的用户统计
  139. $uid[$date] ?? $uid[$date] = [];
  140. if(!in_array($_v['sl_uid'], $uid[$date])) {
  141. $totalUid[$date] += 1;
  142. array_push($uid[$date], $_v['sl_uid']);
  143. }
  144. //统计当天的渠道的订单数
  145. if(isset($succChannel[$date][$_v['gchannel']])) {
  146. $succChannel[$date][$_v['gchannel']] += 1;
  147. }else {
  148. $succChannel[$date][$_v['gchannel']] = 1;
  149. }
  150. //统计平台 当天成功
  151. if(isset($succSid[$date][$_v['sl_sid']])) {
  152. $succSid[$date][$_v['sl_sid']] += 1;
  153. }else {
  154. $succSid[$date][$_v['sl_sid']] = 1;
  155. }
  156. //VIVO收入
  157. $temp = oo::commonOprModel('member')->getUserInfo($_v['sl_uid']);
  158. if($temp['channel'] == 1){
  159. $vivoTotalMoney[$date] += number_format($_v['sl_pusd'],2,".","");
  160. $succSid[$date][3] += 1;
  161. }
  162. }
  163. //所有订单
  164. foreach ($list2 as $_v2) {
  165. $date = date('Ymd', $_v2['sl_order_time']);
  166. $allRecord[$date] += 1 ;
  167. //统计当天的渠道的订单数
  168. if(isset($totalChannel[$date][$_v2['gchannel']])) {
  169. $totalChannel[$date][$_v2['gchannel']] += 1;
  170. }else {
  171. $totalChannel[$date][$_v2['gchannel']] = 1;
  172. }
  173. //统计平台
  174. if(isset($totalSid[$date][$_v2['sl_sid']])) {
  175. $totalSid[$date][$_v2['sl_sid']] += 1;
  176. }else {
  177. $totalSid[$date][$_v2['sl_sid']] = 1;
  178. }
  179. }
  180. $dayList = $this->getDays($stime, $etime);
  181. $dayArr = [];
  182. foreach ($dayList as $day) {
  183. $dayArr[] = date('Ymd', strtotime($day));
  184. }
  185. //点击支付次数统计
  186. $payReportTotal = $payReportOtherTotal = [];
  187. if(!empty($dayArr)){
  188. $dateStr = implode(",",$dayArr);
  189. $table = otable::staData();
  190. $type = 'payReport';
  191. $sql = "SELECT * FROM {$table} WHERE date IN ({$dateStr}) AND type = '{$type}'";
  192. $payReportRet = oo::commonOprDb('statistics')->getAll($sql,MYSQLI_ASSOC);
  193. $sidList = [1,2];
  194. //10009支付成功 10010支付取消 10011支付失败
  195. $tempArr = [10009,10010,10011];
  196. foreach($payReportRet as $k => $v){
  197. if($v['date'] == date('Ymd')){
  198. $dataTemp = $dataTotalTemp = [];
  199. foreach($tempArr as $eventId){
  200. foreach($sidList as $sid) {
  201. $ret = oo::commonOprRedis("Statistics")->hGetAll(okeys::payReport($sid, $eventId));
  202. $dataTemp[$eventId]["total"][$sid] = array_sum($ret);
  203. }
  204. }
  205. foreach($sidList as $sid){
  206. $ret = oo::commonOprRedis("Statistics")->hGetAll(okeys::payReport($sid));
  207. $dataTotalTemp['sid'][$sid] = $ret;
  208. $dataTotalTemp['total'][$sid] = array_sum($ret);
  209. }
  210. foreach($dataTotalTemp['total'] as $sid => $val){
  211. $payReportTotal[$v['date']][$sid] += $val;
  212. }
  213. foreach($tempArr as $eventId){
  214. if(isset($dataTemp[$eventId]['total'])){
  215. foreach($dataTemp[$eventId]['total'] as $sid => $val){
  216. $payReportOtherTotal[$eventId][$v['date']][$sid] += $val;
  217. }
  218. }
  219. }
  220. }else{
  221. $v['data'] = json_decode($v['data'],true);
  222. if(isset($v['data']['total'])){
  223. foreach($v['data']['total'] as $sid => $val){
  224. $payReportTotal[$v['date']][$sid] += $val;
  225. }
  226. }
  227. foreach($tempArr as $eventId){
  228. if(isset($v['data'][$eventId]['total'])){
  229. foreach($v['data'][$eventId]['total'] as $sid => $val){
  230. $payReportOtherTotal[$eventId][$v['date']][$sid] += $val;
  231. }
  232. }
  233. }
  234. }
  235. }
  236. if(!isset($payReportTotal[date('Ymd')])){
  237. $dataTemp = $dataTotalTemp =[];
  238. foreach($tempArr as $eventId){
  239. foreach($sidList as $sid) {
  240. $ret = oo::commonOprRedis("Statistics")->hGetAll(okeys::payReport($sid, $eventId));
  241. $dataTemp[$eventId]["total"][$sid] = array_sum($ret);
  242. }
  243. }
  244. foreach($sidList as $sid){
  245. $ret = oo::commonOprRedis("Statistics")->hGetAll(okeys::payReport($sid));
  246. $dataTotalTemp['sid'][$sid] = $ret;
  247. $dataTotalTemp['total'][$sid] = array_sum($ret);
  248. }
  249. foreach($dataTotalTemp['total'] as $sid => $val){
  250. $payReportTotal[date('Ymd')][$sid] += $val;
  251. }
  252. foreach($tempArr as $eventId){
  253. if(isset($dataTemp[$eventId]['total'])){
  254. foreach($dataTemp[$eventId]['total'] as $sid => $val){
  255. $payReportOtherTotal[$eventId][date('Ymd')][$sid] += $val;
  256. }
  257. }
  258. }
  259. }
  260. }
  261. $data = [
  262. 'totalMoney' => $totalMoney,
  263. 'totalMoneyAndroid' => $totalMoneyAndroid,
  264. 'totalMoneyIos' => $totalMoneyIos,
  265. 'totalRecord' => $totalRecord,
  266. 'totalUid' => $totalUid,
  267. 'allRecord' => $allRecord,
  268. 'dayList' => $dayList,
  269. 'totalChannel' => $totalChannel,
  270. 'succChannel' => $succChannel,
  271. 'totalSid' => $totalSid,
  272. 'succSid' => $succSid,
  273. 'payReportTotal' => $payReportTotal,
  274. 'payReportOtherTotal' => $payReportOtherTotal,
  275. 'vivoTotalMoney' => $vivoTotalMoney,
  276. ];
  277. return json_encode($data);
  278. }
  279. /**
  280. * 获取订单列表
  281. */
  282. public function getTotalKeyData($param)
  283. {
  284. $totalKey = okeys::keydatatotal();
  285. $stime = oo::functions()->uint($param['stime']);
  286. $etime = oo::functions()->uint($param['etime']);
  287. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为8天前
  288. if( empty($etime) ){$etime = time();}
  289. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  290. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  291. $sidList = json_decode($param['sidList'], 1);
  292. if(empty($sidList)) {
  293. return json_encode([]);
  294. }
  295. $isAllSid = $this->isAllSid($sidList);
  296. if($isAllSid) {
  297. $keydataInfo = oo::commonOprRedis('common')->get($totalKey);
  298. if(!empty($keydataInfo)) {
  299. return $keydataInfo;
  300. }
  301. }
  302. $where = '';
  303. $sidSqlStr = '';
  304. if(!$isAllSid) {
  305. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  306. }
  307. $slTable = $this->summarylistTable;
  308. $goodsTable = $this->goods;
  309. $blackUidArr = $this->_payBlackList['uid'];
  310. $blackUidSql = '';
  311. if(!empty($blackUidArr)) {
  312. $blackUidStr = implode(',', $blackUidArr);
  313. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  314. }
  315. $where = $sidSqlStr.$blackUidSql;
  316. //查询时间范围内的成功订单
  317. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel
  318. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  319. WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $where ";
  320. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  321. //总订单数
  322. $sql2 = " SELECT id, sl_order_time , gchannel
  323. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  324. WHERE sl_order_time >= {$stime} AND sl_order_time <= {$etime} $where ";
  325. $list2 = oo::commonOprDb('common')->getAll($sql2, MYSQLI_ASSOC);
  326. $dayList = $this->getDays($stime, $etime, 2);
  327. $totalMoney = $totalRecord = $totalUid = $allRecord = $totalChannel = $succChannel = [];
  328. $uid = [];
  329. // oo::logs()->debug3(['succ'=>json_encode($list)], 'Payment.php');
  330. // oo::logs()->debug3(['total'=>json_encode($list2)], 'Payment.php');
  331. //成功的订单
  332. foreach ($list as $_v) {
  333. $date = date('Ymd', $_v['sl_pay_time']);
  334. $totalMoney[$date] += round($_v['sl_pusd'], 2) ;
  335. $totalRecord[$date] += 1 ;
  336. //处理当天重复下单的用户统计
  337. $uid[$date] ?? $uid[$date] = [];
  338. if(!in_array($_v['sl_uid'], $uid[$date])) {
  339. $totalUid[$date] += 1;
  340. array_push($uid[$date], $_v['sl_uid']);
  341. }
  342. //统计当天的渠道的订单数
  343. if(isset($succChannel[$date][$_v['gchannel']])) {
  344. $succChannel[$date][$_v['gchannel']] += 1;
  345. }else {
  346. $succChannel[$date][$_v['gchannel']] = 1;
  347. }
  348. }
  349. //所有订单
  350. foreach ($list2 as $_v2) {
  351. $date = date('Ymd', $_v2['sl_order_time']);
  352. $allRecord[$date] += 1 ;
  353. //统计当天的渠道的订单数
  354. if(isset($totalChannel[$date][$_v2['gchannel']])) {
  355. $totalChannel[$date][$_v2['gchannel']] += 1;
  356. }else {
  357. $totalChannel[$date][$_v2['gchannel']] = 1;
  358. }
  359. }
  360. //计算总的付费用户和新增付费用户
  361. $loginPlayerNum = 0;
  362. $firstPayPlayerNum = 0;
  363. $firstPayPlayerNumLastDay = 0;//昨天新增付费用户
  364. //累计的付费用户数量
  365. $sqlTotal = " SELECT count(DISTINCT sl_uid) as allPayNum FROM {$slTable} as sl WHERE sl_status = 2 $where ";
  366. $retTotal = oo::commonOprDb('common')->getOne($sqlTotal, 1);
  367. $allPayNum = $retTotal['allPayNum'] ?? 0;
  368. $dateToday = date('Ymd', time());
  369. $dateLastDay = date('Ymd', strtotime('-1 days 0:0:1'));
  370. //获取新增的用户UID数组
  371. $newPlayerArr = oo::commonOprModel('statistics')->getAllPlayer($dateToday, 1, $sidList);
  372. $newPlayerNum = count($newPlayerArr);//今日新增的人数
  373. //获取登录的用户UID数组
  374. $loginPlayerArr = oo::commonOprModel('statistics')->getAllPlayer($dateToday, 2, $sidList);
  375. $loginPlayerNum = count($loginPlayerArr);
  376. //今天付费的用户UID
  377. $payTodayPlayer = $uid[$dateToday] ?? [];
  378. $newPayUidArr = array_intersect($payTodayPlayer, $newPlayerArr);//获取当天所以新增用户和当天付费的用户的交集
  379. $newPayNum = count($newPayUidArr);
  380. $loginAvg = oo::commonOprModel('statistics')->avgLoginTime();
  381. $loginAvg = floor($loginAvg);
  382. //首次付费的用户
  383. if(!empty($payTodayPlayer)) {
  384. $time = strtotime('0:0:0');
  385. foreach ($payTodayPlayer as $vuid) {
  386. $checkBought = $this->checkPayFirst($vuid, $time);
  387. $checkBought && $firstPayPlayerNum++ ;
  388. }
  389. }
  390. //昨天的数据
  391. $newPlayerArrLastDay = oo::commonOprModel('statistics')->getAllPlayer($dateLastDay, 1, $sidList);
  392. $newPlayerNumLastDay = count($newPlayerArrLastDay);//昨天新增的人数
  393. $payTodayPlayerLastDay = $uid[$dateLastDay] ?? [];
  394. $newPayUidArrLastDay = array_intersect($payTodayPlayerLastDay, $newPlayerArrLastDay);//获取当天所以新增用户和当天付费的用户的交集
  395. $newPayNumLastDay = count($newPayUidArrLastDay);
  396. //首次付费的用户 昨天
  397. if(!empty($payTodayPlayerLastDay)) {
  398. $time = strtotime('-1 days 0:0:0');
  399. foreach ($payTodayPlayerLastDay as $vuid) {
  400. $checkBought = $this->checkPayFirst($vuid, $time);
  401. $checkBought && $firstPayPlayerNumLastDay++ ;
  402. }
  403. }
  404. $data = [
  405. 'totalMoney' => $totalMoney,
  406. 'totalRecord' => $totalRecord,
  407. 'totalUid' => $totalUid,
  408. 'allRecord' => $allRecord,
  409. 'dayList' => $dayList,
  410. 'totalChannel' => $totalChannel,
  411. 'succChannel' => $succChannel,
  412. 'allPayNum' => $allPayNum,
  413. 'newPayNum' => $newPayNum,
  414. 'loginPlayerNum' => $loginPlayerNum,
  415. 'newPlayerNum' => $newPlayerNum,
  416. 'firstPayPlayerNum' => $firstPayPlayerNum,
  417. 'loginAvg' => $loginAvg,
  418. 'firstPayPlayerNumLastDay' => $firstPayPlayerNumLastDay,
  419. 'newPlayerNumLastDay' => $newPlayerNumLastDay,
  420. 'newPayNumLastDay' => $newPayNumLastDay,
  421. ];
  422. $jsonData = json_encode($data);
  423. if($isAllSid) {
  424. oo::commonOprRedis('common')->set($totalKey, $jsonData);
  425. oo::commonOprRedis('common')->expire($totalKey, 10*60);//过期时间10分钟
  426. }
  427. return $jsonData;
  428. }
  429. /**
  430. * 获取关键数据明细
  431. */
  432. public function getKeyDataDetail($param)
  433. {
  434. $totalKey = okeys::keydatadetail();
  435. $stime = oo::functions()->uint($param['stime']);
  436. $etime = oo::functions()->uint($param['etime']);
  437. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为7天前
  438. if( empty($etime) ){$etime = strtotime('-1 days');}
  439. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  440. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  441. $sidList = json_decode($param['sidList'], 1);
  442. if(empty($sidList)) {
  443. return json_encode([]);
  444. }
  445. $isAllSid = $this->isAllSid($sidList);
  446. // if($isAllSid) {
  447. // $keydataInfo = oo::commonOprRedis('common')->get($totalKey);
  448. // if(!empty($keydataInfo)) {
  449. // die($keydataInfo);
  450. // }
  451. // }
  452. $sidSqlStr = '';
  453. if(!$isAllSid) {
  454. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  455. }
  456. $slTable = $this->summarylistTable;
  457. $goodsTable = $this->goods;
  458. $blackUidArr = $this->_payBlackList['uid'];
  459. $blackUidSql = '';
  460. if(!empty($blackUidArr)) {
  461. $blackUidStr = implode(',', $blackUidArr);
  462. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  463. }
  464. $where = $sidSqlStr.$blackUidSql;
  465. //查询时间范围内的成功订单
  466. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel, sl_sid
  467. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  468. WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $where ";
  469. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  470. //总订单数
  471. $sql2 = " SELECT id, sl_order_time , gchannel
  472. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  473. WHERE sl_order_time >= {$stime} AND sl_order_time <= {$etime} $where ";
  474. $list2 = oo::commonOprDb('common')->getAll($sql2, MYSQLI_ASSOC);
  475. $dayList = $this->getDays($stime, $etime, 2);
  476. $totalMoney = $totalRecord = $totalUid = $allRecord = $totalChannel = $succChannel = [];
  477. $uid = [];
  478. // oo::logs()->debug3(['succ'=>json_encode($list)], 'Payment.php');
  479. // oo::logs()->debug3(['total'=>json_encode($list2)], 'Payment.php');
  480. //android ios 付费率 arpu arppu
  481. $androidMoney = $iosMoney = $androidPayUser = $iosPayUser = [];
  482. //成功的订单
  483. foreach ($list as $_v) {
  484. $date = date('Ymd', $_v['sl_pay_time']);
  485. $totalMoney[$date] += round($_v['sl_pusd'], 2) ;
  486. $totalRecord[$date] += 1 ;
  487. //处理当天重复下单的用户统计
  488. $uid[$date] ?? $uid[$date] = [];
  489. if(!in_array($_v['sl_uid'], $uid[$date])) {
  490. $totalUid[$date] += 1;
  491. array_push($uid[$date], $_v['sl_uid']);
  492. }
  493. $androidPayUser[$date] ?? $androidPayUser[$date] = [];
  494. $iosPayUser[$date] ?? $iosPayUser[$date] = [];
  495. if($_v['sl_sid'] == 1){
  496. $androidMoney[$date] += $_v['sl_pusd'];
  497. if(!in_array($_v['sl_uid'],$androidPayUser[$date])){
  498. array_push($androidPayUser[$date], $_v['sl_uid']);
  499. }
  500. }else if($_v['sl_sid'] == 2){
  501. $iosMoney[$date] += $_v['sl_pusd'];
  502. if(!in_array($_v['sl_uid'],$iosPayUser[$date])){
  503. array_push($iosPayUser[$date], $_v['sl_uid']);
  504. }
  505. }
  506. }
  507. //所有订单
  508. foreach ($list2 as $_v2) {
  509. $date = date('Ymd', $_v2['sl_order_time']);
  510. $allRecord[$date] += 1 ;
  511. }
  512. //累计的付费用户数量
  513. $sqlTotal = " SELECT count(DISTINCT sl_uid) as allPayNum FROM {$slTable} as sl WHERE sl_status = 2 AND sl_pay_time <= {$etime} $where ";
  514. $retTotal = oo::commonOprDb('common')->getOne($sqlTotal, 1);
  515. $allPayNum = $retTotal['allPayNum'] ?? 0;
  516. $newPlayerNumList = $loginPlayerNumList = $newPayNumList = $firstPayPlayerNumList = $aarrrList = $payRateList = $payARPUList = $payARPPUList = $inviteNumList = $firstPayRateList = $newFirstPayRateList = [];
  517. $vivoPayRateList = $vivoPayARPUList = $vivoPayARPPUList = [];//vivo付费率 vivo ARPU vivo ARPPU
  518. $androidPayRateList = $androidPayARPUList = $androidPayARPPUList = [];//android付费率 android ARPU android ARPPU
  519. $iosPayRateList = $iosPayARPUList = $iosPayARPPUList = [];//ios付费率 ios ARPU ios ARPPU
  520. $userinfoTb = otable::userinfo(1);
  521. foreach ($dayList as $day) {
  522. $firstPayPlayerNum = 0;
  523. $dateTmp = date('Ymd', strtotime($day));
  524. //获取新增的用户
  525. $newPlayerArr = oo::commonOprModel('statistics')->getAllPlayer($dateTmp, 1, $sidList);
  526. $newPlayerNum = count($newPlayerArr);//今日新增的人数
  527. //获取登录的用户
  528. $loginPlayer = oo::commonOprModel('statistics')->getAllPlayer($dateTmp, 2, $sidList);
  529. $loginPlayerNum = count($loginPlayer);
  530. //今天付费的用户UID
  531. $payTodayPlayer = $uid[$dateTmp] ?? [];
  532. $newPayUidArr = array_intersect($payTodayPlayer, $newPlayerArr);//获取当天所以新增用户和当天付费的用户的交集
  533. $newPayNum = count($newPayUidArr);
  534. //首次付费的用户
  535. if(!empty($payTodayPlayer)) {
  536. $time = strtotime(date('Y-m-d 0:0:0', strtotime($day)));
  537. foreach ($payTodayPlayer as $vuid) {
  538. $checkBought = $this->checkPayFirst($vuid, $time);
  539. $checkBought && $firstPayPlayerNum++ ;
  540. }
  541. }
  542. $newPlayerNumList[$dateTmp] = $newPlayerNum;
  543. $loginPlayerNumList[$dateTmp] = $loginPlayerNum;
  544. $newPayNumList[$dateTmp] = $newPayNum;
  545. $firstPayPlayerNumList[$dateTmp] = $firstPayPlayerNum;
  546. //邀请人数
  547. $dataToday = oo::commonOprModel('invitecode')->getInviteNum($dateTmp);
  548. $inviteNum = $dataToday['fbAndNum'] + $dataToday['invAndNum'] + $dataToday['fbIosNum'] + $dataToday['invIosNum'];
  549. $inviteNumList[$dateTmp] = $inviteNum;//自传播人数列表
  550. //自传播占比 (FB邀请+邀请码邀请)/新增
  551. $aarrrList[$dateTmp] = empty($newPlayerNum) ? 0 : round($inviteNum * 100 / $newPlayerNum, 2);
  552. //计算付费率 付费人数/DAU
  553. $payPlayerTemp = $totalUid[$dateTmp] ?? 0;//支付是人数
  554. $payRateList[$dateTmp] = empty($loginPlayerNum) ? 0 : round($payPlayerTemp * 100 / $loginPlayerNum, 2);
  555. //ARPU 付费金额/DAU
  556. $payMoneyTemp = $totalMoney[$dateTmp] ?? 0;//支付的金额
  557. $payARPUList[$dateTmp] = empty($loginPlayerNum) ? 0 : round($payMoneyTemp / $loginPlayerNum, 2);
  558. //ARPPU 付费金额/付费人数
  559. $payARPPUList[$dateTmp] = empty($payPlayerTemp) ? 0 : round($payMoneyTemp/ $payPlayerTemp, 2);
  560. $firstPayRateList[$dateTmp] = empty($payPlayerTemp) ? 0 : round($firstPayPlayerNum * 100 / $payPlayerTemp, 2);
  561. $newFirstPayRateList[$dateTmp] = empty($payPlayerTemp) ? 0 : round($newPayNum * 100 / $payPlayerTemp, 2);
  562. //新增用户付费率
  563. $newFirstPayRateList2[$dateTmp] = empty($newPlayerNum) ? 0 : round($newPayNum * 100 / $newPlayerNum, 2);
  564. //vivo统计
  565. $vivoPlayer = [];//vivo活跃人数
  566. $vivoPayNum = 0;
  567. /*
  568. //这个统计超时了
  569. foreach($loginPlayer as $uidTemp){
  570. $temp = oo::commonOprModel('member')->getUserInfo($uidTemp);
  571. if($temp['channel'] == 1){
  572. $vivoPlayer[] = $uidTemp;
  573. }
  574. }
  575. */
  576. /*
  577. //去掉VIVO
  578. if(!empty($loginPlayer)){
  579. $loginPlayerStr = implode(",",$loginPlayer);
  580. $sql = "SELECT uid FROM {$userinfoTb} WHERE channel = 1 AND uid in({$loginPlayerStr})";
  581. $vivoPlayerRet = oo::commonOprDb('common')->getAll($sql, 1);
  582. foreach($vivoPlayerRet as $vivoPlayerRetTemp){
  583. $vivoPlayer[] = $vivoPlayerRetTemp['uid'];
  584. }
  585. }
  586. $vivoPayUser = array_intersect($payTodayPlayer,$vivoPlayer);
  587. $vivoPayNum = count($vivoPayUser);
  588. //vivo付费率 付费人数/DAU
  589. $vivoPayRateList[$dateTmp] = empty($vivoPlayer) ? 0 : round($vivoPayNum * 100 / count($vivoPlayer),2);
  590. */
  591. //vivo ARPU 付费金额/DAU
  592. if(!empty($blackUidSql) && !empty($vivoPayUser)){
  593. $vivoPayUserStr = implode(",",$vivoPayUser);
  594. $stimeTemp = strtotime($day . " 0:0:0");
  595. $etimeTemp = strtotime($day . " 23:59:59");
  596. $sql = "SELECT sum(sl_pusd) AS total FROM {$slTable} WHERE sl_status = 2 AND sl_sid <> -1 AND sl_pay_time >= {$stimeTemp} AND sl_pay_time <= {$etimeTemp} AND sl_uid in($vivoPayUserStr) {$blackUidSql} ";
  597. $vivoRet = oo::commonOprDb('common')->getOne($sql, 1);
  598. $vivoPayMoney = empty($vivoRet['total']) ? 0 : $vivoRet['total'];
  599. $vivoPayARPUList[$dateTmp] = empty($vivoPlayer) ? 0 : round($vivoPayMoney / count($vivoPlayer),2);
  600. $vivoPayARPPUList[$dateTmp] = empty($vivoPayNum) ? 0 : round($vivoPayMoney / $vivoPayNum,2);
  601. }else{
  602. $vivoPayARPUList[$dateTmp] = 0;
  603. $vivoPayARPPUList[$dateTmp] = 0;
  604. }
  605. //android ios 付费率 arpu arppu
  606. $androidPlayer = [];
  607. if(!empty($loginPlayer)){
  608. $loginPlayerStr = implode(",",$loginPlayer);
  609. $sql = "SELECT uid FROM {$userinfoTb} WHERE channel = 0 AND uid in({$loginPlayerStr})";
  610. $androidPlayerRet = oo::commonOprDb('common')->getAll($sql, 1);
  611. foreach($androidPlayerRet as $androidPlayerRetTemp){
  612. $androidPlayer[] = $androidPlayerRetTemp['uid'];
  613. }
  614. }
  615. $androidPayRateList[$dateTmp] = empty($androidPlayer) ? 0 : round(count($androidPayUser[$dateTmp]) * 100 / count($androidPlayer),2);//付费率 付费人数 / DAU
  616. $androidPayARPUList[$dateTmp] = empty($androidPlayer) ? 0 : round($androidMoney[$dateTmp] / count($androidPlayer),2);//ARPU 付费金额 / DAU
  617. $androidPayARPPUList[$dateTmp] = empty($androidPayUser[$dateTmp]) ? 0 : round($androidMoney[$dateTmp] / count($androidPayUser[$dateTmp]),2);//ARPPU 付费金额 / 付费人数
  618. $iosPlayer = oo::commonOprModel('statistics')->getAllPlayer($dateTmp, 2, [2]);
  619. $iosPayRateList[$dateTmp] = empty($iosPlayer) ? 0 : round(count($iosPayUser[$dateTmp]) * 100 / count($iosPlayer),2);//付费率 付费人数 / DAU
  620. $iosPayARPUList[$dateTmp] = empty($iosPlayer) ? 0 : round($iosMoney[$dateTmp] / count($iosPlayer),2);//ARPU 付费金额 / DAU
  621. $iosPayARPPUList[$dateTmp] = empty($iosPayUser[$dateTmp]) ? 0 : round($iosMoney[$dateTmp] / count($iosPayUser[$dateTmp]),2);//ARPPU 付费金额 / 付费人数
  622. }
  623. $data = [
  624. 'totalMoney' => $totalMoney,
  625. 'totalRecord' => $totalRecord,
  626. 'totalUid' => $totalUid,
  627. 'allRecord' => $allRecord,
  628. 'dayList' => $dayList,
  629. 'totalChannel' => $totalChannel,
  630. 'succChannel' => $succChannel,
  631. 'allPayNum' => $allPayNum,
  632. 'newPayNum' => $newPayNumList,
  633. 'loginPlayerNum' => $loginPlayerNumList,
  634. 'newPlayerNum' => $newPlayerNumList,
  635. 'firstPayPlayerNum' => $firstPayPlayerNumList,
  636. 'AARRR' => $aarrrList,
  637. 'payRate' => $payRateList,
  638. 'payARPU' => $payARPUList,
  639. 'payARPPU' => $payARPPUList,
  640. 'inviteNumList' => $inviteNumList,
  641. 'firstPayRateList' => $firstPayRateList,
  642. 'newFirstPayRateList' => $newFirstPayRateList,
  643. 'newFirstPayRateList2' => $newFirstPayRateList2,
  644. 'vivoPayRateList' => $vivoPayRateList,
  645. 'vivoPayARPUList' => $vivoPayARPUList,
  646. 'vivoPayARPPUList' => $vivoPayARPPUList,
  647. 'androidPayRateList' => $androidPayRateList,
  648. 'androidPayARPUList' => $androidPayARPUList,
  649. 'androidPayARPPUList' => $androidPayARPPUList,
  650. 'iosPayRateList' => $iosPayRateList,
  651. 'iosPayARPUList' => $iosPayARPUList,
  652. 'iosPayARPPUList' => $iosPayARPPUList,
  653. ];
  654. $jsonData = json_encode($data);
  655. // if($isAllSid) {
  656. // oo::commonOprRedis('common')->set($totalKey, $jsonData);
  657. // oo::commonOprRedis('common')->expireAt($totalKey, strtotime('23:59:59'));//过期时间当天23:59:59
  658. // }
  659. return $jsonData;
  660. }
  661. /*
  662. * 获取广告的用户
  663. */
  664. public function getAdvertisement($param)
  665. {
  666. $stime = oo::functions()->uint($param['stime']);
  667. $etime = oo::functions()->uint($param['etime']);
  668. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为7天前
  669. if( empty($etime) ){$etime = strtotime('-1 days');}
  670. // $stime = strtotime(date('Y-m-d 0:0:0', $stime));
  671. // $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  672. $sdate = date('Ymd', $stime);
  673. $edate = date('Ymd', $etime);
  674. $reportTable = otable::report();
  675. $where = '1=1';
  676. !empty($sdate) && $where .= " AND date >= {$sdate} ";
  677. !empty($edate) && $where .= " AND date <= {$edate} ";
  678. $sql = " SELECT ad_android, ad_ios, install, date FROM {$reportTable} WHERE {$where} ORDER BY date ASC";
  679. $ret = oo::commonOprDb('common')->getAll($sql , 1);
  680. $data = [];
  681. foreach ($ret as $value) {
  682. $data[$value['date']] = $value['ad_android'] + $value['ad_ios'] + $value['install'];
  683. }
  684. return json_encode($data);
  685. }
  686. /**
  687. * 查询是否是首次充值
  688. * @param $uid
  689. * @param $time
  690. * @return bool
  691. */
  692. private function checkPayFirst($uid, $time)
  693. {
  694. $pay = oo::commonOprModel('statistics')->checkPayFirst($uid, $time);
  695. return $pay;
  696. }
  697. // /**
  698. // * 计算天数差
  699. // */
  700. // protected function getDays($second1, $second2)
  701. // {
  702. // if ($second1 < $second2) {
  703. // $tmp = $second2;
  704. // $second2 = $second1;
  705. // $second1 = $tmp;
  706. // }
  707. // $days = ($second1 - $second2) / 86400;
  708. // $dayList = array();
  709. // for ($i=0; $i <= $days ; $i++) {
  710. // $dayList[] = date('Ymd', $second2 + 86400*$i);
  711. // }
  712. // return $dayList;
  713. // }
  714. /**
  715. * 获取玩家订单信息
  716. */
  717. public function userList($param)
  718. {
  719. $data = array('list' => array(), 'total' => 0);
  720. $stime = oo::functions()->uint($param['stime']);
  721. $etime = oo::functions()->uint($param['etime']);
  722. $paymentType = oo::functions()->uint($param['payment_type']);
  723. $length = oo::functions()->uint($param['length']);
  724. if( empty($stime) ){$stime = strtotime('0:0:1');}//默认为当天
  725. if( empty($etime) ){$etime = time();}
  726. if( empty($paymentType) ){ $paymentType = 2; }
  727. $wherePaymentType = ' 1=1 ';
  728. if( $paymentType == 2 ){
  729. $wherePaymentType = " sl_status = 2 ";
  730. }
  731. $sidList = json_decode($param['sidList'], 1);
  732. if(empty($sidList)) {
  733. return json_encode([]);
  734. }
  735. $sidSqlStr = '';
  736. if(!$this->isAllSid($sidList)) {
  737. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  738. }
  739. $where = $wherePaymentType.$sidSqlStr;
  740. $page = oo::functions()->uint($param['page']);//起始页数
  741. $limit = oo::functions()->uint($param['limit']);//每页页数
  742. $slTable = $this->summarylistTable;
  743. $blackUidArr = $this->_payBlackList['uid'];
  744. $limitStr = !empty($length) ? " " :" limit $page, $limit";
  745. // $blackUidStr = implode(',', $blackUidArr);
  746. $sql = " SELECT sl_uid as uid, count(1) as num, sum(sl_pusd) as money FROM {$slTable} WHERE {$where} AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} AND sl_uid GROUP BY sl_uid ORDER BY money DESC {$limitStr} ";
  747. // oo::logs()->debug3(['sqlStr'=>$sql], 'Payment.php');
  748. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  749. //获取总数
  750. $totalSql = " SELECT COUNT(1) AS t FROM (SELECT COUNT(1) AS num FROM {$slTable} WHERE {$where} AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} AND sl_uid GROUP BY sl_uid ) as aa";
  751. $totalRet = oo::commonOprDb('common')->getOne($totalSql, MYSQLI_ASSOC);
  752. $data['list'] = $list;
  753. $data['total'] = $totalRet['t'];
  754. $data['blackUidList'] = $blackUidArr;
  755. return json_encode($data);
  756. }
  757. /**
  758. * vip用户列表
  759. * @param $param
  760. * @return string
  761. */
  762. public function vipuserList($param)
  763. {
  764. $stime = oo::functions()->uint($param['stime']);
  765. $etime = oo::functions()->uint($param['etime']);
  766. $data =[];
  767. if( empty($etime) ){$etime = time();}
  768. if( empty($stime) ){$stime = $etime;}//如果stime为空,默认查etime的时间 否则查stime时间内的vip用户
  769. $sidList = json_decode($param['sidList'], 1);
  770. if(empty($sidList)) {
  771. return json_encode([]);
  772. }
  773. $sidSqlStr = '';
  774. if(!$this->isAllSid($sidList)) {
  775. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  776. }
  777. $where = $sidSqlStr;
  778. // $page = oo::functions()->uint($param['page']);//起始页数
  779. // $limit = oo::functions()->uint($param['limit']);//每页页数
  780. //2.27 -wsc-注释以下内容
  781. // $table = otable::vippayment();
  782. // $sql = " SELECT uid, updatetime,flag FROM {$table} WHERE etime >= {$stime} GROUP BY uid ORDER BY updatetime DESC ";
  783. // $ret = oo::commonOprDb('common')->getAll($sql, 1);
  784. //
  785. $list = [];
  786. // if(!empty($ret)) {
  787. // $now = time();
  788. // foreach ($ret as $v) {
  789. // //获取vip用户的信息
  790. // $uid = $v['uid'];
  791. // $info = oo::commonOprModel('vip')->getVipInfo($uid);
  792. // $type = $info['type'] ?? 0;
  793. // if($type <= 0) {
  794. // continue;
  795. // }
  796. // //如果是后台加的VIP
  797. // if($v['flag'] == 2) {
  798. // $type = 999;
  799. // }
  800. // $etime = $info['etime'] ?? '';
  801. // $tmp = &$list[$type][$uid];
  802. // $tmp['uid'] = $uid;
  803. // $tmp['type'] = $type;
  804. // empty($v['updatetime']) ? $tmp['updatetime'] = '' : $tmp['updatetime'] = date('Y-m-d H:i:s', $v['updatetime']);
  805. // $tmp['etime'] = date('Y-m-d H:i:s', $etime);
  806. // $tmp['days'] = oo::commonOprModel('vip')->betweenDays($now, $etime);
  807. // $list[$type]['total'] += 1;
  808. // }
  809. // }
  810. // $data['list'] = $list;
  811. return json_encode($data);
  812. }
  813. /**
  814. * BluePay对账
  815. */
  816. public function account($param)
  817. {
  818. $data = array();
  819. $stime = oo::functions()->uint($param['stime']);
  820. $etime = oo::functions()->uint($param['etime']);
  821. $sidList = json_decode($param['sidList'], 1);
  822. if(empty($sidList)) {
  823. return json_encode([]);
  824. }
  825. $sidSqlStr = '';
  826. if(!$this->isAllSid($sidList)) {
  827. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  828. }
  829. $sTable = otable::summarylist();
  830. $gTable = otable::goodsCrazy();
  831. // $blackUidArr = $this->_payBlackList['uid'];
  832. $blackUidArr = [1,2,3];
  833. $blackUidStr = implode(',', $blackUidArr);
  834. $sql = " SELECT sl_gid, sl_pusd, sl_pay_time, gchannel, gplatform,sl_sid FROM {$sTable} AS st LEFT JOIN {$gTable} AS gt ON st.sl_gid = gt.gid WHERE sl_sid != -1 AND sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} AND sl_uid NOT IN ({$blackUidStr}) $sidSqlStr";
  835. $sucList = oo::commonOprDb('common')->getAll($sql, 1);
  836. $sucDeviceMoney = $sucChannelMoney = array();
  837. if ($sucList) {
  838. foreach ($sucList as $info) {
  839. // $gid = $info['sl_gid'];
  840. // $money = $info['sl_pusd'];
  841. $money = $info['sl_pusd'];
  842. // $moneyThb = $info['gpriceThb'];
  843. // $gchannel = $info['gchannel'];
  844. $gplatform = $info['sl_sid'];
  845. //汇总
  846. $sucDeviceMoney[$gplatform]['money'] += $money;//设备汇总
  847. // $sucDeviceMoney[$gplatform]['moneyThb'] += $moneyThb;//设备汇总
  848. // $sucChannelMoney[$gchannel][$gplatform]['money'] += ($money * 100);//渠道汇总
  849. // $sucChannelMoney[$gchannel][$gplatform]['moneyThb'] += ($moneyThb);//渠道汇总泰铢
  850. }
  851. }
  852. $data['sucDeviceMoney'] = $sucDeviceMoney;
  853. //$data['sucChannelMoney'] = $sucChannelMoney;
  854. return json_encode($data);
  855. }
  856. /**
  857. * 热门商品列表
  858. * @param $param
  859. */
  860. public function hotGoodsList($param)
  861. {
  862. $stime = oo::functions()->uint($param['stime']);
  863. $etime = oo::functions()->uint($param['etime']);
  864. $page = oo::functions()->uint($param['page']);//起始页数
  865. $limit = oo::functions()->uint($param['limit']);//每页数量
  866. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为七天前天
  867. if( empty($etime) ){$etime = time();}
  868. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  869. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  870. $slTable = $this->summarylistTable;
  871. $goodsTable = $this->goods;
  872. $blackUidArr = $this->_payBlackList['uid'];
  873. $blackUidSql = '';
  874. if(!empty($blackUidArr)) {
  875. $blackUidStr = implode(',', $blackUidArr);
  876. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  877. }
  878. $sql = " SELECT gid, gname, sl_sid as gchannel, gimg, sl_pusd AS gprice, count(sl_gid) as num
  879. FROM {$slTable} AS sl
  880. JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  881. WHERE sl.sl_sid <> -1 AND sl.sl_pusd > 0 AND sl.sl_status = 2 {$blackUidSql} AND sl_order_time >= {$stime} AND sl_order_time <= {$etime}
  882. GROUP BY sl_gid,sl_pusd,sl_sid
  883. ORDER BY count(sl_gid) DESC
  884. LIMIT $page, $limit";
  885. // oo::logs()->debug3(['sql'=>$sql], 'Payment.php');
  886. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  887. empty($list) && $list = [];
  888. return json_encode($list);
  889. }
  890. // /**
  891. // * 返回付费玩家数据
  892. // * @param $param
  893. // * @return string
  894. // */
  895. // public function getPayUserStatistics($param)
  896. // {
  897. // $data = array();
  898. // $stime = oo::functions()->uint($param['stime']);
  899. // $etime = oo::functions()->uint($param['etime']);
  900. //
  901. // $dayList = $this->getDays($stime, $etime);
  902. // $loseList = [];
  903. // foreach ($dayList as $day) {
  904. // $day = date('Ymd', strtotime($day));
  905. // $key = okeys::paystatistics($day);
  906. // $loseList[$day] = oo::commonOprRedis('common')->get($key);
  907. // }
  908. // $data['dayList'] = $dayList;
  909. // $data['list'] = $loseList;
  910. //
  911. // return json_encode($data);
  912. // }
  913. /**
  914. * 进行补发
  915. * @param $param
  916. */
  917. public function reissue($param)
  918. {
  919. $uid = oo::functions()->uint($param['uid']);
  920. $orderId = oo::functions()->escape($param['orderId']);
  921. if(empty($uid) || empty($orderId)) {
  922. $this->response(1, '参数错误');
  923. }
  924. //进行写入补发操作
  925. $result = oo::commonOprModel('payment')->pubDelivery($uid, $orderId);
  926. if($result !== true) {//如果补发失败
  927. oo::logs()->debug3(['uid'=>$uid, 'orderId' => $orderId, 'time' => time()], 'reissue_error.log');
  928. return $this->response(2, '补发失败');
  929. }
  930. return $this->response(0, '补发成功');
  931. }
  932. /**
  933. * 查询订单
  934. * @param $param
  935. */
  936. public function detail($param)
  937. {
  938. $orderId = oo::functions()->escape($param['orderId']);
  939. $uid = oo::functions()->uint($param['uid']);
  940. if(empty($uid) || empty($orderId)) {
  941. $this->response(1, '参数错误');
  942. }
  943. $table = otable::payment($uid);
  944. $sql = "SELECT platform_serial_num FROM {$table} WHERE order_id = '{$orderId}' LIMIT 1 ";
  945. $ret = oo::commonOprDb('common')->getOne($sql, 1);
  946. if(!empty($ret)) {
  947. return $this->response(0, '查询成功',$ret);
  948. }
  949. return $this->response(1, '查询失败');
  950. }
  951. /**
  952. * 新版对账
  953. */
  954. public function checking($param)
  955. {
  956. $data = array('list' => []);
  957. $channel = oo::functions()->uint($param['channletype']);//支付渠道
  958. $table = otable::earnmoney();
  959. $sql = "SELECT * FROM {$table} WHERE local_channel = {$channel} ORDER BY check_time DESC ";
  960. $list = oo::commonOprDb('common')->getAll($sql, 1);
  961. $data['list'] = $list;
  962. return json_encode($data);
  963. }
  964. /**
  965. * 新版对账,添加支付渠道金额处理入库
  966. */
  967. public function actionChecking($param)
  968. {
  969. $data = array('code' => -1);
  970. $channel = oo::functions()->uint($param['pay_channel']);//支付渠道
  971. $money = oo::functions()->uint($param['pay_money']);//总金额
  972. $ordernum = oo::functions()->uint($param['pay_ordernum']);//订单数
  973. $currency = oo::functions()->uint($param['pay_currency']);//货币单位
  974. $time = oo::functions()->escape($param['pay_time']);//记录时间
  975. $other_income = oo::functions()->escape($param['other_income']);//第三方实际财务收入
  976. $exchange_rate = oo::functions()->escape($param['exchange_rate']);//汇率
  977. if (empty($channel) || empty($money) || empty($ordernum) || empty($currency) || empty($time) || empty($exchange_rate)) {
  978. return json_encode($data);
  979. }
  980. $time = strtotime($time);
  981. $table = otable::earnmoney();
  982. //先查询是否有填写相关数据
  983. $sql = " SELECT * FROM {$table} WHERE local_channel = {$channel} AND check_time = {$time} ";
  984. $info = oo::commonOprDb('common')->getOne($sql, 1);
  985. if (!empty($info)) {//已经存在了
  986. return json_encode($data);
  987. }
  988. //查询本地数据入库
  989. $monthStart = mktime(0,0,0,date('m', $time),1,date('Y', $time));
  990. $temp = date('Y-m-d', $time);
  991. $monthEnd = mktime(23,59,59,date('m', $time),date('d', strtotime("$temp +1 month -1 day")),date('Y', $time));
  992. $sTable = otable::summarylist();
  993. $gTable = otable::goodsCrazy();
  994. // $blackUidArr = $this->_payBlackList['uid'];
  995. $blackUidArr = [1,2,3];
  996. $blackUidStr = implode(',', $blackUidArr);
  997. $sqlChannl = ' AND gchannel = '.$channel;
  998. $sql = " SELECT sl_pusd, sl_sid FROM {$sTable} AS st LEFT JOIN {$gTable} AS gt ON st.sl_gid = gt.gid WHERE sl_sid != -1 AND sl_status = 2 AND sl_pay_time >= {$monthStart} AND sl_pay_time <= {$monthEnd} AND sl_uid NOT IN ({$blackUidStr}) {$sqlChannl} ";
  999. $sucList = oo::commonOprDb('common')->getAll($sql, 1);
  1000. $local_totalmoney = $local_ordernum = $local_income = 0;
  1001. if (!empty($sucList)) {
  1002. foreach ($sucList as $info) {
  1003. $local_totalmoney += $info['sl_pusd'];
  1004. $local_ordernum++;
  1005. $tmpIncome = $this->channelSettlement($info['sl_sid'], $info['sl_pusd']);
  1006. $local_income += $tmpIncome;
  1007. }
  1008. }
  1009. //本地金额乘汇率
  1010. $local_totalmoney = $local_totalmoney * $exchange_rate;
  1011. $local_income = $local_income * $exchange_rate;
  1012. $local_income = round($local_income, 2);
  1013. //判断商家和本地的金额差距
  1014. $moneygap = 0;
  1015. if ($local_totalmoney != $money) {
  1016. $moneygap = $money - $local_totalmoney;
  1017. }
  1018. $sqlInsert = "INSERT INTO {$table} (local_channel, local_totalmoney, local_ordernum, local_currency, other_channel, other_totalmoney, other_ordernum, other_currency, moneygap, check_time, local_income, other_income,exchange_rate) VALUES($channel, $local_totalmoney, $local_ordernum, $currency, $channel, $money, $ordernum, $currency, $moneygap, $time, $local_income, $other_income,$exchange_rate)";
  1019. oo::commonOprDb('common')->query($sqlInsert);
  1020. $data['code'] = 1;
  1021. return json_encode($data);
  1022. }
  1023. //渠道结算
  1024. public function channelSettlement($channel, $money)
  1025. {
  1026. $income = 0;
  1027. switch ($channel) {
  1028. case 1://谷歌 本地*70
  1029. case 3://苹果 本地*70
  1030. $income = $money * 0.7;
  1031. break;
  1032. case 2://短信
  1033. $income = (1 - 0.05) * 0.7 * $money;
  1034. break;
  1035. case 4://Bluecoins 96%
  1036. $income = $money * 0.96;
  1037. break;
  1038. case 5://Truemoney
  1039. case 6://12call
  1040. case 7://dtac 86%
  1041. $income = $money * 0.86;
  1042. break;
  1043. case 8://line 90%
  1044. $income = $money * 0.9;
  1045. break;
  1046. default:
  1047. break;
  1048. }
  1049. return $income;
  1050. }
  1051. /**
  1052. * ajax编辑财务收入
  1053. */
  1054. public function ajaxEditIncome($param){
  1055. $id = oo::functions()->uint($param['id']);
  1056. $field = oo::functions()->escape($param['field']);
  1057. $val = oo::functions()->escape($param['val']);
  1058. $table = otable::earnmoney();
  1059. $sql = "UPDATE {$table} SET {$field} = '{$val}' WHERE id = {$id} LIMIT 1";
  1060. oo::commonOprDb('common')->query($sql);
  1061. }
  1062. // /**
  1063. // * 支付渠道屏蔽管理
  1064. // */
  1065. // public function switch($param){
  1066. // include WWWROOT.'config/config.sids.php';
  1067. // $versionkey = okeys::limitversion();
  1068. // $sidkey = okeys::limitsid();
  1069. // $versionRs = oo::commonOprRedis('common')->get($versionkey);
  1070. // $sidRs = oo::commonOprRedis('common')->get($sidkey);
  1071. // $sidlist = [];
  1072. // foreach ($config['sidlist'] as $sid => $packname){
  1073. // $k = okeys::limitsidversion($sid);
  1074. // $version = oo::commonOprRedis('common')->get($k);
  1075. // $sidlist[$sid]['version'] = $version ? $version : '1.5.3';
  1076. // $sidlist[$sid]['packname'] = $packname;
  1077. // }
  1078. // die(json_encode(array('v' => $versionRs, 's' => $sidRs, 'sidlist' => $sidlist)));
  1079. // }
  1080. /**
  1081. * 支付渠道屏蔽管理
  1082. */
  1083. public function actionSwitch($param){
  1084. $name = oo::functions()->escape($param['keyname']);
  1085. $val = oo::functions()->escape($param['keyval']);
  1086. $name = strtoupper($name);
  1087. $key = 'PAYMENT:'.$name;
  1088. oo::commonOprRedis('common')->set($key, $val);
  1089. }
  1090. /**
  1091. * 获取当日所有的收入
  1092. * @param $param
  1093. */
  1094. public function getDailyIncome($param)
  1095. {
  1096. $stime = $param['stime'];
  1097. $etime = $param['etime'];
  1098. $table = otable::summarylist();
  1099. $sql = " SELECT SUM(sl_pusd) AS money FROM {$table} WHERE sl_status = 2 AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} ";
  1100. $info = oo::commonOprDb('common')->getOne($sql, 1);
  1101. $money = empty($info) ? 0 : round($info['money'], 2);
  1102. return json_encode(array('money' => $money));
  1103. }
  1104. /**
  1105. * 获取首冲商品统计
  1106. * @param $param
  1107. * @return string
  1108. */
  1109. public function getFirstBuy($param)
  1110. {
  1111. $stime = oo::functions()->uint($param['stime']);
  1112. $etime = oo::functions()->uint($param['etime']);
  1113. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为8天前
  1114. if( empty($etime) ){$etime = time();}
  1115. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  1116. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  1117. $dayList = $this->getDays($stime, $etime);
  1118. $blackUidArr = $this->_payBlackList['uid'];
  1119. $blackUidSql = '';
  1120. if(!empty($blackUidArr)) {
  1121. $blackUidStr = implode(',', $blackUidArr);
  1122. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  1123. }
  1124. $where = $blackUidSql;
  1125. $slTable = otable::summarylist();
  1126. $sql = " SELECT sl_gid, sl_pay_time, sl_uid FROM {$slTable} WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} {$where}";
  1127. $ret = oo::commonOprDb('common')->getAll($sql, 1);
  1128. //获取登录的人数
  1129. $loginPlayer = otable::sta_lp();
  1130. $sql2 = "SELECT total, ordertime FROM {$loginPlayer} WHERE ordertime >= {$stime} AND ordertime <= {$etime} AND sid=999 ";
  1131. $ret2 = oo::commonOprDb('common')->getAll($sql2, 1);
  1132. $loginList = [];
  1133. foreach ($ret2 as $v) {
  1134. $loginDay = date('Y-m-d', $v['ordertime']);
  1135. $loginList[$loginDay] = $v['total'];
  1136. }
  1137. $list = [];
  1138. $uidList = [];
  1139. foreach ($ret as $value) {
  1140. $slDay = date('Y-m-d', $value['sl_pay_time']);
  1141. $gid = $value['sl_gid'];
  1142. $uid = $value['sl_uid'];
  1143. //如果是首冲商品
  1144. if(in_array($gid, $this->_firstPayGoodsList)) {
  1145. $list[$slDay]['firstBuy'][$gid] += 1;
  1146. }
  1147. //记录该天的充值人数、首冲的人数
  1148. if(!in_array($uid, $uidList)) {
  1149. $list[$slDay]['payNum'] += 1;
  1150. $time = strtotime("$slDay 00:00:00");
  1151. $checkFirstPay = $this->checkPayFirst($uid, $time);
  1152. $checkFirstPay && $list[$slDay]['firstPayNum'] += 1;
  1153. }
  1154. }
  1155. $data['dayList'] = $dayList;
  1156. $data['loginList'] = $loginList;
  1157. $data['slList'] = $list;
  1158. return json_encode($data);
  1159. }
  1160. /**
  1161. * 商品购买成功率曲线
  1162. * @return string
  1163. * Created by: hss
  1164. * Created on: 2020/3/16 14:58
  1165. */
  1166. public function goodsPaySuccess($param){
  1167. $stime = oo::functions()->uint($param['stime']);
  1168. $etime = oo::functions()->uint($param['etime']);
  1169. $gname = oo::functions()->escape($param['gname']);
  1170. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为8天前
  1171. if( empty($etime) ){$etime = time();}
  1172. $dayList = $this->getDays($stime, $etime);
  1173. $where = '';
  1174. //查询某个商品
  1175. if(!empty($gname)){
  1176. $gTable = otable::goodsCrazy();
  1177. $sql = " SELECT gid,gpid,gname FROM {$gTable} WHERE gname = '{$gname}'";
  1178. $goodsCrazy = oo::commonOprDb('common')->getOne($sql, 1);
  1179. if($goodsCrazy){
  1180. $gid = $goodsCrazy['gid'];
  1181. $where = " AND sl_gid = '{$gid}'";
  1182. }
  1183. }
  1184. $sidList = json_decode($param['sidList'], 1);
  1185. $isAllSid = $this->isAllSid($sidList);
  1186. $sidSqlStr = '';
  1187. if(!$isAllSid) {
  1188. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  1189. }
  1190. $where .= $sidSqlStr;
  1191. $blackUidArr = $this->_payBlackList['uid'];
  1192. $blackUidSql = '';
  1193. if(!empty($blackUidArr)) {
  1194. $blackUidStr = implode(',', $blackUidArr);
  1195. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  1196. $where .= $blackUidSql;
  1197. }
  1198. $slTable = otable::summarylist();
  1199. $retSuccess = $retAll = $retDau = [];
  1200. foreach($dayList as $k => $v){
  1201. $stime = strtotime($v. ' 0:0:1');
  1202. $etime = strtotime($v. ' 23:59:59');
  1203. //支付成功的订单
  1204. $sql = " SELECT sl_gid,count(*) as count,sl_order_time FROM {$slTable} WHERE sl_sid <> -1 AND sl_status = 2 AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} {$where} GROUP BY sl_gid";
  1205. $retSuccess[] = oo::commonOprDb('common')->getAll($sql, 1);
  1206. //所有订单
  1207. $sql = " SELECT sl_gid,count(*) as count,sl_order_time FROM {$slTable} WHERE sl_sid <> -1 AND sl_order_time >= {$stime} AND sl_order_time <= {$etime} {$where} GROUP BY sl_gid";
  1208. $retAll[] = oo::commonOprDb('common')->getAll($sql, 1);
  1209. //获取DAU
  1210. $infoLogin = oo::commonOprModel('statistics')->getOneLoginPlayer($stime, $etime);
  1211. if ($infoLogin) {
  1212. $retDau[] = $infoLogin['total'];
  1213. }else{
  1214. $retDau[] = 0;
  1215. }
  1216. }
  1217. //商品数据
  1218. $gTable = otable::goodsCrazy();
  1219. if($gid){
  1220. $sql = " SELECT gid,gpid,gname FROM {$gTable} WHERE gid = '{$gid}'";
  1221. }else{
  1222. $sql = " SELECT gid,gpid,gname FROM {$gTable}";
  1223. }
  1224. $goodsCrazy = oo::commonOprDb('common')->getAll($sql, 1);
  1225. $data['retSuccess'] = $retSuccess;
  1226. $data['retAll'] = $retAll;
  1227. $data['dayList'] = $dayList;
  1228. $data['goods'] = $goodsCrazy;
  1229. $data['retDau'] = $retDau;
  1230. return json_encode($data);
  1231. }
  1232. /**
  1233. * 支付白名单
  1234. * @return string
  1235. * Created by: hss
  1236. * Created on: 2020/3/18 11:19
  1237. */
  1238. public function payWhite($param){
  1239. $content = $this->_payBlackList['uid'];
  1240. if(!empty($content)){
  1241. $content = implode(",",$content);
  1242. }
  1243. $data['list'] = $content;
  1244. return json_encode($data);
  1245. }
  1246. /**
  1247. * 设置白名单
  1248. * @return string
  1249. * Created by: hss
  1250. * Created on: 2020/3/18 11:19
  1251. */
  1252. public function setPayWhite($param){
  1253. $content = oo::functions()->escape($param['content']);
  1254. // $content = explode(",",$content);
  1255. // $content = array_filter($content);
  1256. // $contentStr = '<?php
  1257. // return array("uid"=>'.var_export($content, true).');';
  1258. //
  1259. // $ret = file_put_contents(COM_CFG.'config.payBlackList.php', $contentStr);
  1260. $key = okeys::payWhiteList();
  1261. $tb = otable::payWhiteList();
  1262. $sql="UPDATE {$tb} SET content = '{$content}'";
  1263. $ret = oo::commonOprDb('common')->query($sql,1);
  1264. oo::commonOprRedis('config')->set($key,$content);
  1265. return $ret?1:0;
  1266. }
  1267. /**
  1268. * 首充分析
  1269. * @return string
  1270. */
  1271. public function firstPunch($param){
  1272. $start_time = microtime();
  1273. //以下是用每日充值分析代码复用 旧逻辑
  1274. $stime = oo::functions()->uint($param['stime']);
  1275. $etime = oo::functions()->uint($param['etime']);
  1276. if( empty($stime) ){$stime = strtotime('-7 days');}//默认为7天前
  1277. if( empty($etime) ){$etime = strtotime('-1 days');}
  1278. $stime = strtotime(date('Y-m-d 00:00:01', $stime));
  1279. $etime = strtotime(date('Y-m-d 23:59:59', $etime));
  1280. $sidList = json_decode($param['sidList'], 1);
  1281. $isAllSid = $this->isAllSid($sidList);
  1282. $sidSqlStr = '';
  1283. if(!$isAllSid) {
  1284. $sidSqlStr = " AND sl_sid IN ( ". implode(',', $sidList)." ) ";
  1285. }
  1286. $dayList = $this->getDays($stime, $etime, 2);
  1287. $slTable = $this->summarylistTable;
  1288. $goodsTable = $this->goods;
  1289. $blackUidArr = $this->_payBlackList['uid'];
  1290. $blackUidSql = '';
  1291. if(!empty($blackUidArr)) {
  1292. $blackUidStr = implode(',', $blackUidArr);
  1293. $blackUidSql = " AND sl_uid NOT IN ({$blackUidStr}) ";
  1294. }
  1295. $where = $sidSqlStr.$blackUidSql;
  1296. //查询时间范围内的成功订单
  1297. $sql = " SELECT sl_pusd, sl_uid, sl_pay_time, gchannel
  1298. FROM {$slTable} AS sl LEFT JOIN {$goodsTable} AS goods ON sl.sl_gid = goods.gid
  1299. WHERE sl_status = 2 AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} $where ";
  1300. $list = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  1301. $uid = [];
  1302. //成功的订单
  1303. foreach ($list as $_v) {
  1304. $date = date('Ymd', $_v['sl_pay_time']);
  1305. //处理当天重复下单的用户统计
  1306. $uid[$date] ?? $uid[$date] = [];
  1307. if(!in_array($_v['sl_uid'], $uid[$date])) {
  1308. array_push($uid[$date], $_v['sl_uid']);
  1309. }
  1310. }
  1311. $firstPayPlayerNumList = $firstPayPlayerOrderNumList = $firstPunchNumList = $firstPunchOrderNumList = [];
  1312. foreach ($dayList as $day) {
  1313. $firstPayPlayerNum = 0;//首次付费用户数
  1314. $firstPayPlayerArr = [];//首次付费的用户
  1315. $dateTmp = date('Ymd', strtotime($day));
  1316. //今天付费的用户UID
  1317. $payTodayPlayer = $uid[$dateTmp] ?? [];
  1318. //首次付费的用户
  1319. if(!empty($payTodayPlayer)) {
  1320. $time = strtotime(date('Y-m-d 0:0:0', strtotime($day)));
  1321. foreach ($payTodayPlayer as $vuid) {
  1322. $checkBought = $this->checkPayFirst($vuid, $time);
  1323. $checkBought && $firstPayPlayerNum++ ;
  1324. if($checkBought){
  1325. $firstPayPlayerArr[] = $vuid;
  1326. }
  1327. }
  1328. }
  1329. $stime = strtotime(date('Y-m-d 00:00:01', strtotime($day)));
  1330. $etime = strtotime(date('Y-m-d 23:59:59', strtotime($day)));
  1331. //当天首次付费用户的订单数
  1332. $firstPayPlayerOrderNum = 0;
  1333. if(!empty($firstPayPlayerArr)){
  1334. $uidStr = implode(',', $firstPayPlayerArr);
  1335. $sql = " SELECT count(*) AS count FROM {$slTable} WHERE sl_uid in({$uidStr}) AND sl_status = 2 {$sidSqlStr} AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} ";
  1336. $ret = oo::commonOprDb('common')->getOne($sql, MYSQLI_ASSOC);
  1337. $firstPayPlayerOrderNum = intval($ret['count']);
  1338. }else{
  1339. $firstPayPlayerOrderNum = $firstPayPlayerNum;
  1340. }
  1341. $firstPayPlayerNumList[] = $firstPayPlayerNum;
  1342. $firstPayPlayerOrderNumList[] = $firstPayPlayerOrderNum;
  1343. //每天购买首充礼包的人数/次数
  1344. $firstPunchArr = [];
  1345. $sql = " SELECT sl_uid,sl_pusd,sl_gid FROM {$slTable} WHERE sl_gid = 601 AND sl_status = 2 {$sidSqlStr} AND sl_pay_time >= {$stime} AND sl_pay_time <= {$etime} ";
  1346. $ret = oo::commonOprDb('common')->getAll($sql, MYSQLI_ASSOC);
  1347. foreach($ret as $k => $v){
  1348. if(!isset($firstPunchArr[$v['sl_uid']])){
  1349. $firstPunchArr[$v['sl_uid']] = $v;
  1350. }
  1351. }
  1352. $firstPunchNumList[] = count($firstPunchArr);
  1353. $firstPunchOrderNumList[] = count($ret);
  1354. }
  1355. $data = array(
  1356. 'firstPayPlayerNumList'=>$firstPayPlayerNumList,
  1357. 'firstPayPlayerOrderNumList'=>$firstPayPlayerOrderNumList,
  1358. 'firstPunchNumList'=>$firstPunchNumList,
  1359. 'firstPunchOrderNumList'=>$firstPunchOrderNumList,
  1360. 'resultTime'=>microtime() - $start_time,//统计耗时
  1361. );
  1362. return json_encode($data);
  1363. }
  1364. }