$Channel)); $AccountFirstPayOK = \DBOper\Remove("AccountFirstPay", array("Channel" => $Channel)); $AccountDayActiveOK = \DBOper\Remove("AccountDayActive", array("Channel" => $Channel)); $DailyReportOK = \DBOper\Remove("DailyReport", array("Channel" => $Channel)); $AccountFirstLoginReportOK = \DBOper\Remove("AccountFirstLoginReport", array("Channel" => $Channel)); $AccountFirstPayReportOK = \DBOper\Remove("AccountFirstPayReport", array("Channel" => $Channel)); $eventYMDOK = \DBOper\Remove("ServerEvent", array("Key" => "FirstKeepReportYMD_" . $Channel)); logweb("AccountFirstLoginOK:" . $AccountFirstLoginOK); logweb("AccountFirstPayOK:" . $AccountFirstPayOK); logweb("AccountDayActiveOK:" . $AccountDayActiveOK); logweb("DailyReportOK:" . $DailyReportOK); logweb("AccountFirstLoginReportOK:" . $AccountFirstLoginReportOK); logweb("AccountFirstPayReportOK:" . $AccountFirstPayReportOK); logweb("eventYMDOK:" . $eventYMDOK); } if (!$opt || $opt == "first") { logweb("firstfirstfirst:" . $Channel); impAccountFirstLogin(); impAccountFirstPay(); } if (!$opt || $opt == "day") { logweb("daydaydaydayday:" . $Channel); impAccountDayActive(); // impAccountDayActiveTestData(); } if (!$opt || $opt == "rep") { logweb("repreprepreprep:" . $Channel); \Report\CheckAndExportDailyReport($Channel); \Report\CheckAndExportFirstKeepReport($Channel); } logweb("处理完毕!"); exit(); function impAccountFirstLogin() { global $Channel; logweb("开始导入首登账号"); \DBOper\Find("AccountFirstLogin", array("Channel" => $Channel), $findFirstLoginDataList, array("AccountID" => 1)); $firstLoginAccountIDList = array(); foreach ($findFirstLoginDataList as $findData) { $firstLoginAccountIDList[$findData["AccountID"]] = 1; } logweb("已存在首登账号数:" . count($firstLoginAccountIDList)); $limit = 10000; $skip = 0; $succCountTotal = 0; $gameRolesCount = \DBOper\Count("GameRoles", array("Channel" => $Channel)); logweb("GameRoles 总条数:" . $gameRolesCount); while ($gameRolesCount > 0) { $ret = \DBOper\Find("GameRoles", array("Channel" => $Channel), $rolesDataList, null, null, $limit, $skip); logweb("查询GameRoles: limit:" . $limit . " skip:" . $skip . " ret:" . $ret . " findCount:" . count($rolesDataList)); $batchInsFirstLogin = array(); foreach ($rolesDataList as $findData) { $AccountID = $findData["AccountID"]; if (isset($firstLoginAccountIDList[$AccountID])) { continue; } $firstLoginAccountIDList[$AccountID] = 1; $firstLoginInfo = null; $firstLoginTime = ""; foreach ($findData as $field => $value) { $ServerID = \CommFunc\GetServerIDBySid($field); if ($ServerID <= 0) { continue; } $roleInfo = $value; $roleInfo["ServerID"] = $ServerID; $CreateRoleTime = $roleInfo["CreateRoleTime"]; // $PlayerID = $roleInfo["PlayerID"]; // $PlayerName = $roleInfo["PlayerName"]; // $Job = $roleInfo["Job"]; // $IP = $roleInfo["IP"]; // $LoginTime = $roleInfo["LoginTime"]; // $LogoffTime = $roleInfo["LogoffTime"]; // 首次创角 if ($CreateRoleTime < $firstLoginTime || $firstLoginTime == "") { $firstLoginTime = $CreateRoleTime; $firstLoginInfo = $roleInfo; } } if (isset($firstLoginInfo)) { $CreateRoleTime = $firstLoginInfo["CreateRoleTime"]; $CreateYMD = substr($CreateRoleTime, 0, 10); if (!array_key_exists($CreateYMD, $batchInsFirstLogin)) { $batchInsFirstLogin[$CreateYMD] = array(); } $insArray = $batchInsFirstLogin[$CreateYMD]; array_push($insArray, array( "Channel" => $Channel, "AccountID" => $AccountID, "CreateYMD" => $CreateYMD, "CreateTime" => $CreateRoleTime, "ServerID" => $firstLoginInfo["ServerID"], "PlayerID" => $firstLoginInfo["PlayerID"], "PlayerName" => $firstLoginInfo["PlayerName"], "Job" => $firstLoginInfo["Job"], "IP" => $firstLoginInfo["IP"], )); $batchInsFirstLogin[$CreateYMD] = $insArray; } } logweb(" firstLoginAccountIDList:" . count($firstLoginAccountIDList)); $gameRolesCount -= $limit; $skip += $limit; if (count($batchInsFirstLogin)) { ksort($batchInsFirstLogin); $succCount = 0; foreach ($batchInsFirstLogin as $CreateYMD => $insArray) { if (DBOper\BatchInsert("AccountFirstLogin", $insArray)) { // logweb("批量导入首登账号数: CreateYMD:" . $CreateYMD . " count:" . count($insArray)); $succCount += count($insArray); } else { logweb("###批量导入首登账号数异常: CreateYMD:" . $CreateYMD . " count:" . count($insArray)); } } $succCountTotal += $succCount; logweb("新增导入首登账号数: " . $succCount); } } logweb("本次新增导入首登账号总数: " . $succCountTotal); \Logging\LogInfo("---------------------------------------------------------------"); echo "
"; } function impAccountFirstPay() { global $Channel; logweb("开始导入首充账号"); \DBOper\Find("AccountFirstPay", array("Channel" => $Channel), $findFirstPayDataList, array("AccountID" => 1)); $firstPayAccountIDList = array(); foreach ($findFirstPayDataList as $findData) { $firstPayAccountIDList[$findData["AccountID"]] = 1; } logweb("已存在首充账号数:" . count($firstPayAccountIDList)); $payOrderCount = \DBOper\Count("PayOrder", array("Channel" => $Channel)); logweb("PayOrder 总条数:" . $payOrderCount); $limit = 10000; $skip = 0; $succCountTotal = 0; while ($payOrderCount > 0) { $ret = \DBOper\Find("PayOrder", array("Channel" => $Channel), $payDataList, null, array("PayTime" => 1), $limit, $skip); logweb("查询PayOrder: limit:" . $limit . " skip:" . $skip . " ret:" . $ret . " findCount:" . count($payDataList)); $batchInsFirstPay = array(); foreach ($payDataList as $payOrderInfo) { $AccountID = $payOrderInfo["AccountID"]; if (isset($firstPayAccountIDList[$AccountID])) { continue; } $firstPayAccountIDList[$AccountID] = 1; $PayYMD = substr($payOrderInfo["PayTime"], 0, 10); if (!array_key_exists($PayYMD, $batchInsFirstPay)) { $batchInsFirstPay[$PayYMD] = array(); } $insArray = $batchInsFirstPay[$PayYMD]; array_push($insArray, array( "Channel" => $Channel, "AccountID" => $AccountID, "OrderID" => $payOrderInfo["OrderID"], "OrderIDSDK" => $payOrderInfo["OrderIDSDK"], "ServerID" => $payOrderInfo["ServerID"], "OrderInfo" => $payOrderInfo["OrderInfo"], "OrderAmount" => $payOrderInfo["OrderAmount"], // 中心的这个字段是实际支付金额 "OriginalAmount" => $payOrderInfo["OriginalAmount"], "PayTime" => $payOrderInfo["PayTime"], "PayYMD" => $PayYMD, "Extras" => $payOrderInfo["Extras"], )); $batchInsFirstPay[$PayYMD] = $insArray; } logweb(" firstPayAccountIDList:" . count($firstPayAccountIDList)); $payOrderCount -= $limit; $skip += $limit; if (count($batchInsFirstPay)) { ksort($batchInsFirstPay); $succCount = 0; foreach ($batchInsFirstPay as $PayTime => $insArray) { if (DBOper\BatchInsert("AccountFirstPay", $insArray)) { // logweb("批量导入首充账号数: PayTime:" . $PayTime . " count:" . count($insArray)); $succCount += count($insArray); } else { logweb("###批量导入首充账号数异常: PayTime:" . $PayTime . " count:" . count($insArray)); } } $succCountTotal += $succCount; logweb("新增导入首充账号数: " . $succCount); } } logweb("本次新增导入首充账号总数: " . $succCountTotal); \Logging\LogInfo("---------------------------------------------------------------"); echo "
"; } function impAccountDayActive() { global $Channel; $startDate = $_GET["startDate"]; if (!$startDate) { $startDate = "2024-05-01"; } logweb("开始从中心导入备档日活数据! startDate:" . $startDate); $allDateAccIDInfo = array(); // 所有记录 // 查询备份流向 $pack_data = array(); $pack_data["spID"] = $Channel; $pack_data["eventType"] = "QueryAccountLoginOut"; $pack_data["queryCenterbak"] = 1; # 设置查询中心的 $pack_data["allServer"] = 1; # 设置检索所有服务器流向 $pack_data["startDate"] = $startDate; $pack_data["endDate"] = ""; $centerToolUrl = 'http://' . $_SERVER['HTTP_HOST'] . "/Server/eventdata/toolcenter.php"; logweb("centerToolUrl:" . $centerToolUrl); $retStr = \CommFunc\DoPost($centerToolUrl, $pack_data, false, 300); $ret = json_decode($retStr, true); if (isset($ret)) { $allDateAccIDInfo = $ret[0]; ksort($allDateAccIDInfo); foreach ($allDateAccIDInfo as $dateStr => $accIDInfo) { logweb("中心流向备档日活数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); // foreach ($accIDInfo as $accID => $loginoutInfo) { // logweb(" accID:" . $accID. json_encode($loginoutInfo)); // } } } else { logweb("query center backup error: " . $retStr); return; } logweb("开始从子服导入日活数据! startDate:" . $startDate); $pack_data = array(); $pack_data["spID"] = $Channel; $pack_data["eventType"] = "QueryAccountLoginOut"; // $pack_data["queryAllData"] = "on"; // 设置可查询备份数据,子服不查备份流向,防止同时多服访问多次 $pack_data["startDate"] = $startDate; $pack_data["endDate"] = ""; $sendServers = array(); $serverPageInfos = \CommFunc\GetGameServerPageInfo($Channel); // 多服查询的 foreach ($serverPageInfos as $mainServerID => $serverInfo) { $sendServers[] = array($mainServerID, \CommFunc\GetQueryEventToolUrl($serverInfo['Page']), $pack_data); } \Logging\LogInfo("待发送的服务器信息: " . count($sendServers) . " " . print_r($sendServers, true)); $retList = array(); $retMulti = \CommFunc\DoPostMulti($sendServers); if ($retMulti && count($retMulti) == count($sendServers)) { for ($i = 0; $i < count($sendServers); $i++) { $ret = json_decode($retMulti[$i], true); if (!isset($ret)) { $retList[$sendServers[$i][0]] = $retMulti[$i]; } else { $retList[$sendServers[$i][0]] = $ret; } } } $retCount = count($retList); \Logging\LogInfo("返回查询结果条数: " . $retCount); // \Logging\LogInfo("retList: " . print_r($retList, true)); // 先合并中心备份 及 各服务器数据 foreach ($retList as $serverName => $ret) { logweb("-----"); if (is_array($ret) && $ret["OK"] == 1) { ksort($ret["loginoutDateAccIDInfo"]); foreach ($ret["loginoutDateAccIDInfo"] as $dateStr => $accIDInfo) { logweb("服务器返回日活数量 serverName:" . $serverName . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); if (!isset($allDateAccIDInfo[$dateStr])) { $allDateAccIDInfo[$dateStr] = array(); } $allAccIDInfo = $allDateAccIDInfo[$dateStr]; foreach ($accIDInfo as $accID => $loginoutInfo) { $allAccIDInfo[$accID] = $loginoutInfo; // 各子服一定是最新的,直接替换备份流向数据 } $allDateAccIDInfo[$dateStr] = $allAccIDInfo; } } else { logweb("###服务器返回日活数据异常! serverName:" . $serverName . " ret:" . $ret); } } ksort($allDateAccIDInfo); foreach ($allDateAccIDInfo as $dateStr => $accIDInfo) { logweb("最终日活数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); $dateInsInfo = array(); foreach ($accIDInfo as $accID => $loginoutInfo) { // logweb(" accID:" . $accID. json_encode($loginoutInfo)); $accIDParts = explode("@", $accID); $AccountID = implode("@", array_slice($accIDParts, 0, count($accIDParts) - 2)); $ServerID = \CommFunc\GetServerIDBySid($accIDParts[count($accIDParts) - 1]); $LoginTime = $loginoutInfo[0]; $LogoffTime = $loginoutInfo[1]; $IP = $loginoutInfo[2]; $ActiveYMD = ""; if ($LoginTime != "") { $ActiveYMD = substr($LoginTime, 0, 10); } else { $ActiveYMD = substr($LogoffTime, 0, 10); } array_push($dateInsInfo, array( "Channel" => $Channel, "AccountID" => $AccountID, "ActiveYMD" => $ActiveYMD, "LoginTime" => $LoginTime, "LogoffTime" => $LogoffTime, "ServerID" => $ServerID, "IP" => $IP, )); } $actCount = DBOper\Count("AccountDayActive", array("Channel" => $Channel, "ActiveYMD" => $dateStr)); if ($actCount == count($dateInsInfo)) { logweb("日活数据数相同,不重新插入: " . $dateStr . " count:" . $actCount); continue; } // 数据量不同,则删除后重新插入 if ($actCount > 0) { if (!DBOper\Remove("AccountDayActive", array("Channel" => $Channel, "ActiveYMD" => $dateStr), false)) { logweb("###日活数据数不同,移除时失败!: " . $dateStr . " delCount:" . $actCount . " insCount:" . count($dateInsInfo)); continue; } } if (DBOper\BatchInsert("AccountDayActive", $dateInsInfo)) { logweb("批量导入日活数:" . $dateStr . " count:" . count($dateInsInfo)); } else { logweb("###批量导入日活数失败:" . $dateStr . " count:" . count($dateInsInfo)); } } \Logging\LogInfo("---------------------------------------------------------------"); echo "
"; } // 插入山寨日活数据 function impAccountDayActiveTestData() { global $Channel; DBOper\Remove("AccountDayActive", array(), false); \DBOper\Find("AccountFirstLogin", array("Channel" => $Channel), $findFirstLoginDataList, array("CreateYMD" => 1, "AccountID" => 1)); $firstAccountIDInfo = array(); foreach ($findFirstLoginDataList as $findData) { $CreateYMD = $findData["CreateYMD"]; $AccountID = $findData["AccountID"]; if (!isset($firstAccountIDInfo[$CreateYMD])) { $firstAccountIDInfo[$CreateYMD] = array(); } $accountIDList = $firstAccountIDInfo[$CreateYMD]; array_push($accountIDList, $AccountID); $firstAccountIDInfo[$CreateYMD] = $accountIDList; } $keepPer = 100; $keepPerSet = array(100, 50, 35, 30, 25, 15, 10); ksort($firstAccountIDInfo); foreach ($firstAccountIDInfo as $CreateYMD => $accountIDList) { logweb("CreateYMD:" . $CreateYMD . " count:" . count($accountIDList)); if ($CreateYMD < "2024-05-23") { continue; } $dateInsInfo = array(); $accountCount = count($accountIDList); $onePerCount = $accountCount * 0.1; for ($i = 0; $i < 30; $i++) { // $randNum = mt_rand(1, 100); if (count($keepPerSet) > $i) { $keepPer = $keepPerSet[$i]; } else { $keepPer = mt_rand(-1, 5); } if ($keepPer <= 0) { continue; } $keepCount = $accountCount; if ($keepPer < 100) { $keepCount = intval($accountCount * $keepPer / 100.0); $keepCount = mt_rand($keepCount - $onePerCount, $keepCount + $onePerCount); } if ($keepCount <= 0) { continue; } $ActiveYMD = date("Y-m-d", strtotime("+" . $i . " day", strtotime($CreateYMD))); logweb("CreateYMD:" . $CreateYMD . " i:" . $i . " ActiveYMD:" . $ActiveYMD . " keepPer:" . $keepPer . " keepCount:" . $keepCount); for ($k = 0; $k < $keepCount; $k++) { $AccountID = $accountIDList[$k]; array_push($dateInsInfo, array( "Channel" => $Channel, "AccountID" => $AccountID, "ActiveYMD" => $ActiveYMD, "LoginTime" => $ActiveYMD . " 00:00:00", "LogoffTime" => $ActiveYMD . " 23:59:59", "ServerID" => 999, "IP" => "127.0.0.1", )); } } if (DBOper\BatchInsert("AccountDayActive", $dateInsInfo)) { logweb("批量山寨日活数, CreateYMD:" . $CreateYMD . " count:" . count($dateInsInfo)); } else { logweb("###批量山寨日活数失败, CreateYMD:" . $CreateYMD . " count:" . count($dateInsInfo)); } } } function logweb($msg, $showWeb = True) { \Logging\LogInfo($msg); if ($showWeb) { echo date('Y-m-d H:i:s'), $msg, "
"; } }