manghe/app/api/controller/Sign.php
2025-04-10 02:46:53 +08:00

243 lines
7.9 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace app\api\controller;
use app\api\controller\Base;
use app\common\model\UserSign;
use app\common\model\SignConfig;
use app\common\model\SignConfigReward;
use app\common\model\Reward;
use app\common\service\RewardService;
use think\Request;
use app\common\model\Order;
use app\common\server\RedisHelper;
use app\common\service\CommonService;
class Sign extends Base
{
/**
* 签到
*/
public function signAdd()
{
$user = $this->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] : '未知';
}
}