136 lines
4.9 KiB
PHP
136 lines
4.9 KiB
PHP
<?php
|
||
|
||
namespace app\dao;
|
||
|
||
use App\model\Signlog;
|
||
|
||
|
||
|
||
class SignDao
|
||
{
|
||
/**
|
||
* 签到函数
|
||
*
|
||
*/
|
||
public static function Sign($user_id)
|
||
{
|
||
if (self::search_Sign_today($user_id) == 1) {
|
||
return 0;
|
||
}
|
||
$Signlog = new Signlog();
|
||
$Signlog->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;
|
||
}
|
||
}
|