regNumNew($day,0,0,0, 0, 'reg_total'); $list = $retaineService->regNumV2($day,0,0, 'reg_total'); $retaineService->insertorupdate($list, 1, $day, 'reg_total'); return 'ok'; } /** * 留存表-游戏-新增玩家 * @return string */ public function reg_num() { $day = input('day', ''); if (!$day) { $day = date('Y-m-d', strtotime('-1 day')); } $retaineService = new RetaineService(); //当天注册账号 // $mebmers = $retaineService->getMembers($day); // $list = $retaineService->regNumNew($day, $mebmers); $list = $retaineService->regNumV2($day); $retaineService->insertorupdate($list, 1, $day, 'reg_num'); return 'ok'; } /** * 留存表-游戏-新增角色 * @return string */ public function role_num() { $day = input('day', ''); if (!$day) { $day = date('Y-m-d', strtotime('-1 day')); } $retaineService = new RetaineService(); // 当天新增角色 $list = $retaineService->getFirstRoleMember($day); $retaineService->insertOrUpdate($list, 1, $day, 'role_num'); return 'ok'; } /** * 留存表-游戏-活跃玩家 * @return string */ public function act_num() { $day = input('day', ''); if (!$day) { $day = date('Y-m-d', strtotime('-1 day')); } $retaineService = new RetaineService(); //当天活跃玩家 // $list = $retaineService->activeMember($day, 'act_num'); $list = $retaineService->activeMemberV2($day, 'act_num'); $retaineService->insertOrUpdate($list, 1, $day, 'act_num'); return 'ok'; } /** * 留存表-游戏-充值金额-付费人数 * @return string */ public function recharge_num() { $day = input('day', ''); if (!$day) { $day = date('Y-m-d', strtotime('-1 day')); } $retaineService = new RetaineService(); //充值金额 $list = $retaineService->rechargeMoney($day); $retaineService->insertOrUpdate($list, 1, $day, 'recharge_num'); $retaineService->insertOrUpdate($list, 1, $day, 'pay_num'); return 'ok'; } public function retentionHandle() { // ## 次留 = 获取某天创建玩家数据,根据数据去查询今天的活跃 $day = "2025-12-17"; $handleTime = $this->getTime($day, 1); // dump($day, $handleTime); $retaineService = new RetaineService(); echo "
";
        // ### 创建用户数
        $members = Db::table('nw_member_game_server')
            ->where('game_id', 507)
            ->whereBetween('create_time', [strtotime($handleTime), strtotime($handleTime . ' 23:59:59')])->column(' DISTINCT member_id');
        // ### 活跃玩家
        $stay_1 = $retaineService->activeMember($day, 'one_stay', 0, 0, $members);
        echo "1. day=".$day.",h_day=".$handleTime.", count = ".count($members).', act='.count($stay_1).PHP_EOL;

        $handleTime = $this->getTime($day, 2);
        $members = Db::table('nw_member_game_server')
            ->where('game_id', 507)
            ->whereBetween('create_time', [strtotime($handleTime), strtotime($handleTime . ' 23:59:59')])->column(' DISTINCT member_id');
        $stay_2 = $retaineService->activeMember($day, 'three_stay', 0, 0, $members);
        echo "2. day=".$day.",h_day=".$handleTime.", count = ".count($members).', act='.count($stay_2).PHP_EOL;

        $handleTime = $this->getTime($day, 3);
        $members = Db::table('nw_member_game_server')
            ->where('game_id', 507)
            ->whereBetween('create_time', [strtotime($handleTime), strtotime($handleTime . ' 23:59:59')])->column(' DISTINCT member_id');
        $stay_3 = $retaineService->activeMember($day, 'three_stay', 0, 0, $members);
        echo "3. day=".$day.",h_day=".$handleTime.", count = ".count($members).', act='.count($stay_3).PHP_EOL;

        $handleTime = $this->getTime($day, 4);
        $members = Db::table('nw_member_game_server')
            ->where('game_id', 507)
            ->whereBetween('create_time', [strtotime($handleTime), strtotime($handleTime . ' 23:59:59')])->column(' DISTINCT member_id');
        $stay_4 = $retaineService->activeMember($day, 'three_stay', 0, 0, $members);
        echo "4. day=".$day.",h_day=".$handleTime.", count = ".count($members).', act='.count($stay_4).PHP_EOL;



        // dump(count($members), count($stay_1), count($stay_2));
    }

    /**
     * 留存表-游戏-次留
     * @return string
     */
    public function one_stay()
    {
        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 1);

        $retaineService = new RetaineService();
        // 获取那天注册用户
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        // $members = ["266264","266260","266257","266250","266248","266242","266238","266236","266231","266228","266222","266220","266219","266215","266213","266212","266209","266204","266203","266202","266201","266200","266199","266197","266195","266190","266189","266174","266168","266167","266166","266162","266158","266156","266139","266138","266137","266128","266126","266121","266119","266110","266107","266083","266073","266064","266063","266052","266045","266043","266027","266025","266024","266023","265999","265989","265984","265963","265961","265959","265955","265953","265952","265945","265929","265923","265917","265915","265914","265908","265907","265898","265897","265893","265886","265885","265884","265881","265880","265876"];
        if($members) {
            // 今天仍然活跃的玩家
            $list = $retaineService->activeMemberV2($day, 'one_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'one_stay');
        }

        return 'ok';
    }

    /**
     * 留存表-游戏-三留
     * @return string
     */
    public function three_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 2);

        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'three_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'three_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-四留
     * @return string
     */
    public function four_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 3);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'four_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'four_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-五留
     * @return string
     */
    public function five_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 4);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'five_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'five_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-六留
     * @return string
     */
    public function six_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 5);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'six_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'six_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-七留
     * @return string
     */
    public function seven_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 6);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'seven_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'seven_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-十五留
     * @return string
     */
    public function fifteen_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 14);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'fifteen_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'fifteen_stay');
        }
        return 'ok';
    }

    /**
     * 留存表-游戏-三十留
     * @return string
     */
    public function thirty_stay()
    {

        $day = input('day', '');
        if (!$day) {
            $day = date('Y-m-d', strtotime('-1 day'));
        }

        $handleTime = $this->getTime($day, 29);
        $retaineService = new RetaineService();
        // 那天创角用户数
        // $members = $retaineService->getFirstRoleMemberList($handleTime);
        $members = $retaineService->getSubIds($handleTime);

        if($members) {
            //当天活跃玩家
            $list = $retaineService->activeMemberV2($day, 'thirty_stay', 0, $members);
            $retaineService->insertOrUpdate($list, 1, $handleTime, 'thirty_stay');
        }
        return 'ok';
    }

    private function getTime($day, $num)
    {
        return date('Y-m-d', strtotime($day) - 86400 * $num);
    }
}