userid = $user_id; $Signlog->save(); UserRewardDao::sing($user_id, 30); } /** * 查询今天是否签到 * 0没签到1签到 */ public static function search_Sign_today($user_id) { $today = date('Y-m-d'); $is_sign = Signlog::where('userid', $user_id)->where('created_at', '>=', $today . " 00:00:00")->count(); return $is_sign == 0 ? 0 : 1; } /** * 查询当月签到数据 * */ public static function search_Sign_tomon($user_id) { $startTime = date('Y-m-01', time()); //获取该月份的第一天 $endTime = date('Y-m-t', time()); //获取该月份的最后一天 $mon_data = Signlog::where('userid', $user_id)->whereBetween('created_at', [$startTime . " 00:00:00", $endTime . " 23:59:59"])->orderBy('created_at', 'ASC')->get(); $days = []; foreach ($mon_data as $sign) { // 将签到日期提取出来 $days[] = $sign->created_at->format('d'); // 格式化为 Y-m-d 格式 } // 获取当前月份的天数 $days_in_month = date('t'); for ($day = 1; $day <= $days_in_month; $day++) { // 判断该天是否有签到 if (in_array($day, $days)) { $res[$day] = 1; // 已签到 } else { $res[$day] = 0; // 未签到 } } return $res; } /** * 查询连续签到天数,并按 7 天一个周期计算 * * @param int $user_id 用户ID * @return int 连续签到的天数 */ public static function search_Sign_tolong($user_id) { // 获取该月份的第一天和最后一天 $startTime = date('Y-m-01', time()); // 获取该月份的第一天 $endTime = date('Y-m-t', time()); // 获取该月份的最后一天 // 查询该用户在当前月份的所有签到记录,筛选出有效签到(未兑换奖励的签到) $mon_data = Signlog::where('userid', $user_id) ->whereBetween('created_at', [$startTime . " 00:00:00", $endTime . " 23:59:59"]) ->orderBy('created_at', 'ASC') ->get(); // 签到的日期数组,用于判断哪些天有签到 $signed_days = []; $today = date('d'); // 获取今天的日期(用于判断是否是连续签到) // 遍历签到记录,记录没有兑换奖励的签到日期 foreach ($mon_data as $sign) { if ($sign->isexchange == 0) { // 判断是否没有兑换奖励 $signed_days[] = $sign->created_at->format('d'); // 保存签到日期的“日”部分 } } // 获取当前月份的总天数 $days_in_month = date('t'); $sign_days = 0; // 初始化连续签到天数 $full_cycles = 0; // 完整周期的数量(每7天为一个周期) // 检查从今天开始,是否连续签到 for ($day = $today; $day >= 1; $day--) { // 检查当前日期是否在签到日期数组中 if (in_array($day, $signed_days)) { $sign_days++; // 连续签到天数加 1 } else { break; // 一旦发现没有签到,跳出循环 } // 如果连续签到达到 7 天,发放奖励并重置 if ($sign_days == 7) { $today = date('Y-m-d'); // 获取今天的日期 $todaySign = Signlog::where('userid', $user_id) ->whereDate('created_at', $today) // 查找今天的签到记录 ->where('isexchange', 0) // 确认没有兑换奖励 ->first(); // 如果今天没有兑换奖励,则返回记录 // 如果今天没有兑换奖励,则进行奖励 if ($todaySign) { // 赠送奖励 UserRewardDao::sing($user_id, 500); // 给用户奖励 500 // 标记为已兑换奖励 $todaySign->isexchange = 1; // 假设 isexchange 是控制是否已兑换奖励的字段 $todaySign->save(); // 保存更新后的签到记录 } $sign_days = 0; // 重置连续签到天数,开始新的一周期 $full_cycles++; // 增加完整周期数 } } // 如果在最后的连续签到周期内还不足 7 天,不发放奖励 if ($sign_days == 0 && $full_cycles > 0) { // 返回已经完成的周期数 return $full_cycles * 7; } // 返回连续签到的天数 return $full_cycles * 7 + $sign_days; } }