$Channel), $retInfo, array("YMD" => 1), array("YMD" => -1))) { return; } $StartYMDTime = 0; // 需要导出的起始日期时间戳 if (isset($retInfo)) { $lastYMD = $retInfo["YMD"]; // 最后一次导出的报表日期 $StartYMDTime = strtotime("+1 day", strtotime($lastYMD)); // 从+1天开始导出 \Logging\LogInfo("ExportDailyReport Channel:" . $Channel . " lastYMD:" . $lastYMD . " StartYMDTime:" . date("Y-m-d", $StartYMDTime)); } else { // 取出最早的首登日期 if (!\DBOper\FindOneSort("AccountFirstLogin", array("Channel" => $Channel), $retInfo, array("CreateYMD" => 1), array("CreateYMD" => 1))) { return; } if (!isset($retInfo)) { \Logging\LogInfo("ExportDailyReport AccountFirstLogin 还没有数据,不用导出! Channel:" . $Channel); return; } $StartYMDTime = strtotime($retInfo["CreateYMD"]); \Logging\LogInfo("ExportDailyReport Channel:" . $Channel . " AccountFirstLogin StartYMDTime:" . date("Y-m-d", $StartYMDTime)); } if (!$StartYMDTime) { return; } $EndYMDTime = strtotime("-1 day", strtotime(date("Y-m-d"))); // 只导出到昨天 $diffSeconds = $EndYMDTime - $StartYMDTime; $diffDays = floor($diffSeconds / (3600 * 24)) + 1; if ($diffDays <= 0) { \Logging\LogInfo("【 " . $Channel . " 】不需要导出每日报表! StartYMDTime:" . date("Y-m-d", $StartYMDTime)); return; } \Logging\LogInfo("===== 开始导出每日报表 【" . $Channel . "】 ====="); \Logging\LogInfo("StartYMDTime:" . $StartYMDTime . " " . date("Y-m-d", $StartYMDTime)); $batchInsDayActive = array(); while ($StartYMDTime <= $EndYMDTime && $diffDays >= 0) { $diffDays -= 1; $exportActiveYMD = date("Y-m-d", $StartYMDTime); $repArray = StatDailyReport($Channel, $exportActiveYMD); array_push($batchInsDayActive, $repArray); $StartYMDTime = strtotime("+1 day", $StartYMDTime); } if (count($batchInsDayActive) > 0) { \DBOper\BatchInsert("DailyReport", $batchInsDayActive); } \Logging\LogInfo("=============================================="); } /** * 统计日报表 * @param string $Channel * @param string $YMD 要统计的yyyy-MM-dd */ function StatDailyReport($Channel, $YMD) { \Logging\LogInfo("=== 统计: " . $YMD); $DAU = \DBOper\Count("AccountDayActive", array("Channel" => $Channel, "ActiveYMD" => $YMD)); \Logging\LogInfo(" 日活跃用户数 DAU:" . $DAU); $DNU = \DBOper\Count("AccountFirstLogin", array("Channel" => $Channel, "CreateYMD" => $YMD)); \Logging\LogInfo(" 日新增用户数 DNU:" . $DNU); \DBOper\Find("AccountFirstPay", array("Channel" => $Channel, "PayYMD" => $YMD), $ret, array("AccountID" => 1)); $firstPayAccountIDInfo = array(); if (isset($ret)) { foreach ($ret as $firstPayInfo) { $AccountID = $firstPayInfo["AccountID"]; $firstPayAccountIDInfo[$AccountID] = 1; } } $ret = \DBOper\Aggregate("PayOrder", array( array( '$match' => array( "Channel" => $Channel, "State" => 1, "PayTime" => array('$gte' => $YMD . " 00:00:00", '$lte' => $YMD . " 23:59:59") ), ), array( '$group' => array( '_id' => array('AccountID' => '$AccountID'), 'total' => array('$sum' => '$OrderAmount'), ), ) ), $retInfo); $DPU = 0; $DRPU = 0; $DRNPU = 0; if ($ret && isset($retInfo)) { foreach ($retInfo as $info) { $DPU += 1; $AccountID = $info["_id"]["AccountID"]; $DRPU += $info["total"]; if ($firstPayAccountIDInfo[$AccountID]) { $DRNPU += $info["total"]; } } } $DRPU = round($DRPU, 2); $DRNPU = round($DRNPU, 2); $DNPU = count($firstPayAccountIDInfo); \Logging\LogInfo(" 日新增充值用户数 DNPU:" . $DNPU); \Logging\LogInfo(" 日新增充值用户充值总额 DRNPU:" . $DRNPU); \Logging\LogInfo(" 日充值用户数 DPU:" . $DPU); \Logging\LogInfo(" 日充值用户数充值总额 DRPU:" . $DRPU); return array( "Channel" => $Channel, "YMD" => $YMD, "DAU" => $DAU, "DNU" => $DNU, "DNPU" => $DNPU, "DRNPU" => $DRNPU, "DPU" => $DPU, "DRPU" => $DRPU, ); } /**检查并导出首登/首充每日报表 */ function CheckAndExportFirstKeepReport($Channel) { $eventKey = "FirstKeepReportYMD_" . $Channel; if (!\DBOper\FindOne("ServerEvent", array("Key" => $eventKey), $ret, null, false)) { return; } $reportYMD = $ret["Value"] ? $ret["Value"] : ""; // 最后一次成功导出报表日期 $StartYMDTime = 0; // 需要导出的起始日期时间戳 if ($reportYMD) { $StartYMDTime = strtotime("+1 day", strtotime($reportYMD)); // 从+1天开始导出 \Logging\LogInfo("ExportFirstKeepReport Channel:" . $Channel . " reportYMD:" . $reportYMD . " StartYMDTime:" . date("Y-m-d", $StartYMDTime)); } else { // 取出最早的首登日期 if (!\DBOper\FindOneSort("AccountFirstLogin", array("Channel" => $Channel), $retInfo, array("CreateYMD" => 1), array("CreateYMD" => 1))) { return; } if (!isset($retInfo)) { \Logging\LogInfo("ExportFirstKeepReport AccountFirstLogin 还没有数据,不用导出! Channel:" . $Channel); return; } $StartYMDTime = strtotime($retInfo["CreateYMD"]); \Logging\LogInfo("ExportFirstKeepReport Channel:" . $Channel . " AccountFirstLogin StartYMDTime:" . date("Y-m-d", $StartYMDTime)); } if (!$StartYMDTime) { return; } $StartYMD = date("Y-m-d", $StartYMDTime); $EndYMDTime = strtotime("-1 day", strtotime(date("Y-m-d"))); // 只导出到昨天 $diffSeconds = $EndYMDTime - $StartYMDTime; $diffDays = floor($diffSeconds / (3600 * 24)) + 1; if ($diffDays <= 0) { \Logging\LogInfo("【 " . $Channel . " 】不需要导出首登每日报表! StartYMD:" . $StartYMD); return; } $EndYMD = date("Y-m-d", $EndYMDTime); \Logging\LogInfo("===== 开始导出首登每日报表 【" . $Channel . "】 ====="); \Logging\LogInfo("StartYMD:" . $StartYMD . " EndYMD:" . $EndYMD); $fistLoginReportArray = array(); $fistPayReportArray = array(); while ($StartYMDTime <= $EndYMDTime && $diffDays >= 0) { $diffDays -= 1; $exportActiveYMD = date("Y-m-d", $StartYMDTime); if (!StatFirstKeepReport($Channel, $exportActiveYMD, $fistLoginReportArray, $fistPayReportArray, $accountFirstLoginDateInfo, $accountFirstPayDateInfo)) { return; } $StartYMDTime = strtotime("+1 day", $StartYMDTime); } \Logging\LogInfo("fistLoginReportArray:" . print_r($fistLoginReportArray, true)); \Logging\LogInfo("fistPayReportArray:" . print_r($fistPayReportArray, true)); // 生成插入数据 $batchInsDatas = array(); foreach ($fistLoginReportArray as $CreateYMD => $ymdArray) { foreach ($ymdArray as $ReportYMD => $statInfo) { $keepCount = $statInfo["keepCount"] ? $statInfo["keepCount"] : 0; $payTotal = $statInfo["payTotal"] ? $statInfo["payTotal"] : 0; $payCnt = $statInfo["payCnt"] ? $statInfo["payCnt"] : 0; $firstPayCnt = $statInfo["firstPayCnt"] ? $statInfo["firstPayCnt"] : 0; array_push($batchInsDatas, array( "Channel" => $Channel, "CreateYMD" => $CreateYMD, "ReportYMD" => $ReportYMD, "KeepCount" => $keepCount, "PayTotal" => $payTotal, "PayCnt" => $payCnt, "FirstPayCnt" => $firstPayCnt, )); } } if (count($batchInsDatas) > 0) { // 每次清除后重新插入 \DBOper\Remove("AccountFirstLoginReport", array("Channel" => $Channel, "ReportYMD" => array('$gte' => $StartYMD))); if (!\DBOper\BatchInsert("AccountFirstLoginReport", $batchInsDatas)) { return; } \Logging\LogInfo("AccountFirstLoginReport 插入OK:" . count($batchInsDatas)); } // 生成插入数据 $batchInsDatas = array(); foreach ($fistPayReportArray as $FirstPayYMD => $ymdArray) { foreach ($ymdArray as $ReportYMD => $statInfo) { $keepCount = $statInfo["keepCount"] ? $statInfo["keepCount"] : 0; array_push($batchInsDatas, array( "Channel" => $Channel, "FirstPayYMD" => $FirstPayYMD, "ReportYMD" => $ReportYMD, "KeepCount" => $keepCount, )); } } if (count($batchInsDatas) > 0) { // 每次清除后重新插入 \DBOper\Remove("AccountFirstPayReport", array("Channel" => $Channel, "ReportYMD" => array('$gte' => $StartYMD))); if (!\DBOper\BatchInsert("AccountFirstPayReport", $batchInsDatas)) { return; } \Logging\LogInfo("AccountFirstPayReport 插入OK:" . count($batchInsDatas)); } // 全部处理完毕才更新 \DBOper\Update("ServerEvent", array("Key" => $eventKey), array("Value" => $EndYMD), false, true); \Logging\LogInfo("=============================================="); } /** * 统计首登相关留存日期报表,包含充值(用于ltv计算) * @param string $Channel * @param string $YMD 要统计的报表日期yyyy-MM-dd * @param array $fistLoginReportArray 统计首登报表结果 {首登日期:{统计日期:{keepCount:x, payTotal:x, payCnt:x, firstPayCnt:x}} ...}} * @param array $fistPayReportArray 统计首充报表结果 {首充日期:{统计日期:{keepCount:x}} ...}} * @param array $accountFirstLoginDateInfo 账号首登日期信息 {accountID:firstLoginYMD, ...} * @param array $accountFirstPayDateInfo 账号首充日期信息 {accountID:firstPayYMD, ...} */ function StatFirstKeepReport($Channel, $YMD, &$fistLoginReportArray, &$fistPayReportArray, &$accountFirstLoginDateInfo = null, &$accountFirstPayDateInfo = null) { \Logging\LogInfo("=== 统计: " . $YMD); if (!isset($fistLoginReportArray)) { $fistLoginReportArray = array(); } if (!isset($fistPayReportArray)) { $fistPayReportArray = array(); } if (!isset($accountFirstLoginDateInfo)) { $accountFirstLoginDateInfo = array(); } if (!isset($accountFirstPayDateInfo)) { $accountFirstPayDateInfo = array(); } if ( !\DBOper\Find( "AccountDayActive", array("Channel" => $Channel, "ActiveYMD" => $YMD), $activeRetArray, array("AccountID" => 1) ) || !isset($activeRetArray) ) { return; } $dayActiveAccIDList = array(); // 统计日期活跃账号ID列表 [accountID, ..] $queryFirstLoginAccIDList = array(); // 需要查询首登日期的账号列表 [accountID, ..] $queryFirstPayAccIDList = array(); // 需要查询首充日期的账号列表 [accountID, ..] foreach ($activeRetArray as $activeInfo) { $AccountID = $activeInfo["AccountID"]; array_push($dayActiveAccIDList, $AccountID); if (!isset($accountFirstLoginDateInfo[$AccountID])) { array_push($queryFirstLoginAccIDList, $AccountID); } if (!isset($accountFirstPayDateInfo[$AccountID])) { array_push($queryFirstPayAccIDList, $AccountID); } } if (count($queryFirstLoginAccIDList) > 0) { if ( !\DBOper\Find( "AccountFirstLogin", array("Channel" => $Channel, "AccountID" => array('$in' => $queryFirstLoginAccIDList)), $accountRetArray, array("AccountID" => 1, "CreateYMD" => 1) ) || !isset($accountRetArray) ) { return; } foreach ($accountRetArray as $accountInfo) { $accountFirstLoginDateInfo[$accountInfo["AccountID"]] = $accountInfo["CreateYMD"]; } } if (count($queryFirstPayAccIDList) > 0) { if ( !\DBOper\Find( "AccountFirstPay", array("Channel" => $Channel, "AccountID" => array('$in' => $queryFirstPayAccIDList)), $accountPayRetArray, array("AccountID" => 1, "PayYMD" => 1) ) || !isset($accountPayRetArray) ) { return; } foreach ($accountPayRetArray as $accountInfo) { $accountFirstPayDateInfo[$accountInfo["AccountID"]] = $accountInfo["PayYMD"]; } } // 今日首付账号 if ( !\DBOper\Find("AccountFirstPay", array("Channel" => $Channel, "PayYMD" => $YMD), $firstPayRetArray, array("AccountID" => 1)) || !isset($firstPayRetArray) ) { return; } $accountFirstPayDict = array(); // 统计日期首付账号 foreach ($firstPayRetArray as $firstPayInfo) { $accountFirstPayDict[$firstPayInfo["AccountID"]] = 1; } if ( !\DBOper\Find( "PayOrder", array( "Channel" => $Channel, "State" => 1, "PayTime" => array('$gte' => $YMD . " 00:00:00", '$lte' => $YMD . " 23:59:59"), "AccountID" => array('$in' => $dayActiveAccIDList) ), $payRetArray, array("AccountID" => 1, "PayTime" => 1, "OrderAmount" => 1) ) || !isset($payRetArray) ) { return; } $accountPayDict = array(); // 统计日期活跃账号充值额 {accountID:充值总额, ...} foreach ($payRetArray as $payInfo) { $AccountID = $payInfo["AccountID"]; $OrderAmount = $payInfo["OrderAmount"]; $accountPayDict[$AccountID] = $accountPayDict[$AccountID] + $OrderAmount; } // 汇总信息 for ($i = 0; $i < count($dayActiveAccIDList); $i++) { $AccountID = $dayActiveAccIDList[$i]; // 首登 $FirstLoginYMD = $accountFirstLoginDateInfo[$AccountID]; if ($FirstLoginYMD) { if (!isset($fistLoginReportArray[$FirstLoginYMD])) { $fistLoginReportArray[$FirstLoginYMD] = array(); } $statYMDInfo = $fistLoginReportArray[$FirstLoginYMD]; if (!isset($statYMDInfo[$YMD])) { $statYMDInfo[$YMD] = array("keepCount" => 0, "payTotal" => 0, "payCnt" => 0, "firstPayCnt" => 0); } $statInfo = $statYMDInfo[$YMD]; $statInfo["keepCount"] = ($statInfo["keepCount"] ? $statInfo["keepCount"] : 0) + 1; $payTotal = $accountPayDict[$AccountID] ? $accountPayDict[$AccountID] : 0; $statInfo["payTotal"] = ($statInfo["payTotal"] ? $statInfo["payTotal"] : 0) + $payTotal; if ($payTotal > 0) { $statInfo["payCnt"] = ($statInfo["payCnt"] ? $statInfo["payCnt"] : 0) + 1; } if ($accountFirstPayDict[$AccountID]) { $statInfo["firstPayCnt"] = ($statInfo["firstPayCnt"] ? $statInfo["firstPayCnt"] : 0) + 1; } $statYMDInfo[$YMD] = $statInfo; $fistLoginReportArray[$FirstLoginYMD] = $statYMDInfo; } // 首充 $FirstPayYMD = $accountFirstPayDateInfo[$AccountID]; if ($FirstPayYMD) { if (!isset($fistPayReportArray[$FirstPayYMD])) { $fistPayReportArray[$FirstPayYMD] = array(); } $statYMDInfo = $fistPayReportArray[$FirstPayYMD]; if (!isset($statYMDInfo[$YMD])) { $statYMDInfo[$YMD] = array(); } $statInfo = $statYMDInfo[$YMD]; $statInfo["keepCount"] = ($statInfo["keepCount"] ? $statInfo["keepCount"] : 0) + 1; $statYMDInfo[$YMD] = $statInfo; $fistPayReportArray[$FirstPayYMD] = $statYMDInfo; } } \Logging\LogInfo("统计每日首登OK " . $YMD); return true; } /** * 获取每日报表 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @param boolean $returnDateKey 是否以日期为字典key格式返回 * @return array [{k:v, ...}, ...] 或 {dateYMD:{k:v, ...}, ...} */ function GetDailyReport($Channel, $fromYMD, $toYMD, $returnDateKey = False) { CheckAndExportDailyReport($Channel); // 每次获取检查导出 $find = array("Channel" => $Channel, "YMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); \DBOper\Find("DailyReport", $find, $retArray); if (!isset($retArray)) { $retArray = array(); } $curYMD = date("Y-m-d"); if ($toYMD >= $curYMD) { // 包含当日,实时统计 array_push($retArray, StatDailyReport($Channel, $curYMD)); } if ($returnDateKey) { $retDict = array(); foreach ($retArray as $repData) { $retDict[$repData["YMD"]] = $repData; } return $retDict; } return $retArray; } /** * 查询日期范围内新用户数总数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return int 总数 */ function QueryNewUserCount($Channel, $fromYMD = "", $toYMD = "") { $find = array("Channel" => $Channel); $ymdCond = array(); if ($fromYMD) { $ymdCond['$gte'] = $fromYMD; } if ($toYMD) { $ymdCond['$lte'] = $toYMD; } if (count($ymdCond)) { $find["CreateYMD"] = $ymdCond; } $count = \DBOper\Count("AccountFirstLogin", $find); return $count; } /** * 查询日期范围内每日新用户数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @param array $dateCountInfo {date:count, ...} * @return int 总数 */ function QueryNewUserCountByDate($Channel, $fromYMD, $toYMD, &$dateCountInfo) { $count = 0; $find = array("Channel" => $Channel, "CreateYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); $ret = \DBOper\Aggregate("AccountFirstLogin", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$CreateYMD', 'count' => array('$sum' => 1), ), ) ), $retInfo); if ($ret && isset($retInfo)) { foreach ($retInfo as $info) { $count += $info["count"]; $dateCountInfo[$info["_id"]] = $info["count"]; } ksort($dateCountInfo); } return $count; } /** * 查询日期范围内新付费用户数总数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return int 总数 */ function QueryNewPayUserCount($Channel, $fromYMD = "", $toYMD = "") { $find = array("Channel" => $Channel); $ymdCond = array(); if ($fromYMD) { $ymdCond['$gte'] = $fromYMD; } if ($toYMD) { $ymdCond['$lte'] = $toYMD; } if (count($ymdCond)) { $find["PayYMD"] = $ymdCond; } $count = \DBOper\Count("AccountFirstPay", $find); return $count; } /** * 查询日期范围内每日新付费用户数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @param array $dateCountInfo {date:count, ...} * @return int 总数 */ function QueryNewPayUserCountByDate($Channel, $fromYMD, $toYMD, &$dateCountInfo) { $count = 0; $find = array("Channel" => $Channel, "PayYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); $ret = \DBOper\Aggregate("AccountFirstPay", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$PayYMD', 'count' => array('$sum' => 1), ), ) ), $retInfo); if ($ret && isset($retInfo)) { foreach ($retInfo as $info) { $count += $info["count"]; $dateCountInfo[$info["_id"]] = $info["count"]; } ksort($dateCountInfo); } return $count; } /** * 查询日期范围内活跃用户数总数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return int 总数 */ function QueryActiveUserCount($Channel, $fromYMD, $toYMD) { $count = 0; $find = array("Channel" => $Channel, "ActiveYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); $ret = \DBOper\Aggregate("AccountDayActive", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$AccountID', // 按账号去重分组 'count' => array('$sum' => 1), ), ) ), $retInfo); if ($ret && isset($retInfo)) { $count = count($retInfo); } return $count; } /** * 查询日期范围内每日活跃用户数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @param array $dateCountInfo {date:count, ...} * @return int 总数(未去重账号) */ function QueryActiveUserCountByDate($Channel, $fromYMD, $toYMD, &$dateCountInfo) { $count = 0; $find = array("Channel" => $Channel, "ActiveYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); $ret = \DBOper\Aggregate("AccountDayActive", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$ActiveYMD', 'count' => array('$sum' => 1), ), ) ), $retInfo); if ($ret && isset($retInfo)) { foreach ($retInfo as $info) { $count += $info["count"]; $dateCountInfo[$info["_id"]] = $info["count"]; } ksort($dateCountInfo); } return $count; } /** * 查询日期范围内充值用户及付费总额 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return array (总人数, 总额度) */ function QueryPayUserCountAndTotal($Channel, $fromYMD, $toYMD) { $count = 0; $total = 0; $find = array("Channel" => $Channel, "State" => 1); $ymdCond = array(); if ($fromYMD) { $ymdCond['$gte'] = $fromYMD . " 00:00:00"; } if ($toYMD) { $ymdCond['$lte'] = $toYMD . " 23:59:59"; } if (count($ymdCond)) { $find["PayTime"] = $ymdCond; } $ret = \DBOper\Aggregate("PayOrder", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$AccountID', // 按账号去重分组 'total' => array('$sum' => '$OrderAmount'), ), ) ), $retInfo); if ($ret && isset($retInfo)) { foreach ($retInfo as $info) { $count += 1; $total += $info["total"]; } } return array($count, $total); } /** * 查询日期范围内充值用户总数 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return int 总数 */ function QueryPayUserCount($Channel, $fromYMD, $toYMD) { $count = 0; $find = array("Channel" => $Channel, "State" => 1); $ymdCond = array(); if ($fromYMD) { $ymdCond['$gte'] = $fromYMD . " 00:00:00"; } if ($toYMD) { $ymdCond['$lte'] = $toYMD . " 23:59:59"; } if (count($ymdCond)) { $find["PayTime"] = $ymdCond; } $ret = \DBOper\Aggregate("PayOrder", array( array( '$match' => $find, ), array( '$group' => array( '_id' => '$AccountID', // 按账号去重分组 'count' => array('$sum' => 1), ), ) ), $retInfo); if ($ret && isset($retInfo)) { $count = count($retInfo); } return $count; } /** * 查询日期范围内累计付费 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @return int 总付费 */ function QueryPayTotal($Channel, $fromYMD = "", $toYMD = "") { $total = 0; $find = array("Channel" => $Channel, "State" => 1); $ymdCond = array(); if ($fromYMD) { $ymdCond['$gte'] = $fromYMD . " 00:00:00"; } if ($toYMD) { $ymdCond['$lte'] = $toYMD . " 23:59:59"; } if (count($ymdCond)) { $find["PayTime"] = $ymdCond; } $ret = \DBOper\Aggregate("PayOrder", array( array( '$match' => $find, ), array( '$group' => array( '_id' => null, 'total' => array('$sum' => '$OrderAmount'), ), ) ), $retInfo); if ($ret && isset($retInfo) && count($retInfo) > 0) { $total = $retInfo[0]["total"]; // foreach ($retInfo as $info) { // $total += $info["total"]; // } } return round($total, 2); } /** * 获取首登及首充用户相关报表 * @param string $Channel * @param string $fromYMD 起始日期yyyy-MM-dd * @param string $toYMD 到日期yyyy-MM-dd * @param array &$fistLoginReportArray {首登日期:{统计日期:{keepCount:x, payTotal:x, payCnt:x, firstPayCnt:x}} ...}} * @param array &$fistPayReportArray {首充日期:{统计日期:{keepCount:x}} ...}} */ function GetAccountFirstLoginPayReport($Channel, $fromYMD, $toYMD, &$fistLoginReportArray, &$fistPayReportArray) { CheckAndExportFirstKeepReport($Channel); // 每次获取检查导出 $find = array("Channel" => $Channel, "CreateYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); \DBOper\Find("AccountFirstLoginReport", $find, $newUserRetArray); if (!isset($newUserRetArray)) { $newUserRetArray = array(); } $find = array("Channel" => $Channel, "FirstPayYMD" => array('$gte' => $fromYMD, '$lte' => $toYMD)); \DBOper\Find("AccountFirstPayReport", $find, $newPayUserRetArray, array("FirstPayYMD" => 1, "ReportYMD" => 1, "KeepCount" => 1)); if (!isset($newPayUserRetArray)) { $newPayUserRetArray = array(); } $curYMD = date("Y-m-d"); if ($toYMD >= $curYMD) { // 包含当日,实时统计 StatFirstKeepReport($Channel, $curYMD, $fistLoginReportArray, $fistPayReportArray); } foreach ($newUserRetArray as $info) { $FirstLoginYMD = $info["CreateYMD"]; $ReportYMD = $info["ReportYMD"]; if (!isset($fistLoginReportArray[$FirstLoginYMD])) { $fistLoginReportArray[$FirstLoginYMD] = array(); } $statYMDInfo = $fistLoginReportArray[$FirstLoginYMD]; $statYMDInfo[$ReportYMD] = array( "keepCount" => $info["KeepCount"], "payTotal" => $info["PayTotal"], "payCnt" => $info["PayCnt"], "firstPayCnt" => $info["FirstPayCnt"] ); $fistLoginReportArray[$FirstLoginYMD] = $statYMDInfo; } ksort($fistLoginReportArray); foreach ($newPayUserRetArray as $info) { $FirstPayYMD = $info["FirstPayYMD"]; $ReportYMD = $info["ReportYMD"]; if (!isset($fistPayReportArray[$FirstPayYMD])) { $fistPayReportArray[$FirstPayYMD] = array(); } $statYMDInfo = $fistPayReportArray[$FirstPayYMD]; $statYMDInfo[$ReportYMD] = array("keepCount" => $info["KeepCount"]); $fistPayReportArray[$FirstPayYMD] = $statYMDInfo; } ksort($fistPayReportArray); return; } // function test() // { // echo "run test" . "
"; // \Logging\CreateLogging("test.report.php"); // $AllChannel = \CommFunc\GetAllChannel(); // for ($i = 0; $i < count($AllChannel); $i++) { // $Channel = $AllChannel[$i]; // echo "run Channel" . $Channel . "
"; // CheckAndExportDailyReport($Channel); // CheckAndExportFirstKeepReport($Channel); // } // echo "run test end" . "
"; // } // test();