getUser(); $user_id = $user['id']; // 添加Redis锁防止重复请求 $redis = new RedisHelper(); $lock_key = 'user_sign_lock:' . $user_id; // 检查是否存在锁 if ($redis->exists($lock_key)) { return $this->renderError('操作频繁,请稍后再试'); } // 设置锁,5秒过期 $redis->set($lock_key, 1, 3); try { $app_setting = getConfig('app_setting'); if ($app_setting && $app_setting['sign_in_spend_limit'] && $app_setting['sign_in_spend_limit'] > 0) { //消费门槛 $is_sign = false; //获取当天开始和结束时间 $today_start = strtotime(date('Y-m-d 00:00:00')); $today_end = strtotime(date('Y-m-d 23:59:59')); $user_consumption = CommonService::getUserConsumptionByTimeRange($user_id, $today_start, $today_end); if ($user_consumption) { if ($user_consumption['total_consumed'] >= $app_setting['sign_in_spend_limit']) { $is_sign = true; } } if (!$is_sign) { // 删除锁后返回错误 $redis->delete($lock_key); return $this->renderError('您今日尚未达到签到消费门槛,请消费后再来签到'); } } // 执行签到 $result = UserSign::add($user_id); if ($result['status']) { return $this->renderSuccess($result['msg'], $result['data']); } else { return $this->renderError($result['msg']); } } catch (\Exception $e) { return $this->renderError('签到失败:' . $e->getMessage()); } finally { // 删除锁 $redis->delete($lock_key); } } /** * 获取签到信息 */ public function info() { $user = $this->getUser(); $user_id = $user['id']; // 获取用户今日签到信息 list($days, $is_sign) = UserSign::getListByUserId($user_id, 0); $current_month = date('m', time()); $current_year = date('Y', time()); // 查询本月累计签到领取记录 $leiji_list = UserSign::where('user_id', '=', $user_id) ->where('month', '=', $current_month) ->where('year', '=', $current_year) ->where('sign_type', '=', 1) ->field('days') ->order(['create_time' => 'desc']) ->select() ->toArray(); // 获取用户本月已签到日期 $signDays = UserSign::getMonthSignDays($user_id); // 获取累计签到配置 $continuousConfigs = SignConfig::where(['type' => 2, 'status' => 1]) ->field('id,reward_id,day,description,sort,icon,title') ->order('sort asc') ->select() ->toArray(); // 当前月份总天数 $totalDays = date('t'); // 获取每日签到配置 $dailyConfigs = SignConfig::where(['type' => 1, 'status' => 1]) ->where('day', '<=', $totalDays) ->field('id,reward_id,day,description,sort,icon,title') ->order('sort asc') ->select() ->toArray(); $signDays_1 = $signDays; if (!$is_sign) { $signDays_1 = $signDays + 1; } // 处理配置关联的奖励信息 $nowDay = date('j'); // 每日签到配置 foreach ($dailyConfigs as &$config) { $day = $config['day']; // 获取关联的奖励ID $rewardIds = $config['reward_id']; // 获取奖励详情 $rewards = Reward::where('reward_id', '=', $rewardIds) ->field('reward_type,reward_extend,reward_value') ->select() ->toArray(); // 处理奖励类型名称 foreach ($rewards as &$reward) { $reward['reward_type_text'] = $this->getRewardTypeText($reward['reward_type']); } $config['title'] = "第" . $config['day'] . "天"; $config['rewards'] = $rewards; if ($signDays >= $day) { $config['is_sign'] = 2; } else { $config['is_sign'] = 0; } if ( $signDays_1 == $day) { $config['is_sign_day'] = 1; } else { $config['is_sign_day'] = 0; } } // 累计签到配置 foreach ($continuousConfigs as &$config) { $day = $config['day']; // 获取关联的奖励ID $rewardIds = $config['reward_id']; // 获取奖励详情 $rewards = Reward::where('reward_id', '=', $rewardIds) ->field('reward_type,reward_extend,reward_value') ->select() ->toArray(); // 处理奖励类型名称 foreach ($rewards as &$reward) { $reward['reward_type_text'] = $this->getRewardTypeText($reward['reward_type']); } $config['title'] = "累计签到" . $config['day'] . "天"; $config['rewards'] = $rewards; // $leiji_list->find($config['day']); //判断$leiji_lis 是否包含 day $is_contain = array_column($leiji_list, 'days'); if (in_array($config['day'], $is_contain)) { $config['is_sign'] = 2; } else { if ($signDays >= $day) { $config['is_sign'] = 1; } else { $config['is_sign'] = 0; } } } // 计算下次月重置剩余天数 $restDays = $totalDays - $nowDay; $data = [ 'days' => $days, // 签到天数 'is_sign' => $is_sign, // 今日是否已签到 'sign_days' => $signDays, // 已签到日期数组 'total_days' => intval($totalDays), // 当月总天数 'rest_days' => intval($restDays), // 距离月底还有几天 'continuous_configs' => $continuousConfigs, // 累计签到配置 'daily_configs' => $dailyConfigs // 每日签到配置 ]; return $this->renderSuccess('请求成功', $data); } /** * 处理配置关联的奖励信息 */ private function processConfigRewards(&$configs) { foreach ($configs as &$config) { // 获取关联的奖励ID $rewardIds = $config['reward_id']; // 获取奖励详情 $rewards = Reward::where('reward_id', '=', $rewardIds) ->field('reward_type,reward_extend,reward_value') ->select() ->toArray(); // 处理奖励类型名称 foreach ($rewards as &$reward) { $reward['reward_type_text'] = $this->getRewardTypeText($reward['reward_type']); } $config['rewards'] = $rewards; } } /** * 获取奖励类型文本 */ private function getRewardTypeText($type) { $types = [ 1 => '钻石', 2 => 'UU币', 3 => '达达卷', 4 => '优惠券', ]; return isset($types[$type]) ? $types[$type] : '未知'; } }