243 lines
7.9 KiB
PHP
Executable File
243 lines
7.9 KiB
PHP
Executable File
<?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] : '未知';
|
||
}
|
||
} |