diff --git a/app/Console/Commands/XboardInstall.php b/app/Console/Commands/XboardInstall.php index 7b0187a..58d898b 100644 --- a/app/Console/Commands/XboardInstall.php +++ b/app/Console/Commands/XboardInstall.php @@ -266,9 +266,9 @@ class XboardInstall extends Command /** * 配置 MySQL 数据库 * - * @return array|null + * @return array */ - private function configureMysql(): ?array + private function configureMysql(): array { while (true) { $envConfig = [ @@ -312,9 +312,9 @@ class XboardInstall extends Command /** * 配置 PostgreSQL 数据库 * - * @return array|null + * @return array */ - private function configurePostgresql(): ?array + private function configurePostgresql(): array { while (true) { $envConfig = [ diff --git a/app/Http/Controllers/V1/User/GiftCardController.php b/app/Http/Controllers/V1/User/GiftCardController.php index 83ba221..507c164 100644 --- a/app/Http/Controllers/V1/User/GiftCardController.php +++ b/app/Http/Controllers/V1/User/GiftCardController.php @@ -111,22 +111,30 @@ class GiftCardController extends Controller ->orderBy('created_at', 'desc') ->paginate($perPage); - $data = $usages->getCollection()->map(function ($usage) { + $data = $usages->getCollection()->map(function (GiftCardUsage $usage) { return [ 'id' => $usage->id, - 'code' => substr($usage->code->code, 0, 8) . '****', // 脱敏处理 - 'template_name' => $usage->template->name, - 'template_type' => $usage->template->type, - 'template_type_name' => $usage->template->type_name, + 'code' => ($usage->code instanceof \App\Models\GiftCardCode && $usage->code->code) + ? (substr($usage->code->code, 0, 8) . '****') + : '', + 'template_name' => $usage->template->name ?? '', + 'template_type' => $usage->template->type ?? '', + 'template_type_name' => $usage->template->type_name ?? '', 'rewards_given' => $usage->rewards_given, 'invite_rewards' => $usage->invite_rewards, 'multiplier_applied' => $usage->multiplier_applied, 'created_at' => $usage->created_at, ]; - }); - $usages->setCollection($data); - - return $this->paginate($usages); + })->values(); + return response()->json([ + 'data' => $data, + 'pagination' => [ + 'current_page' => $usages->currentPage(), + 'last_page' => $usages->lastPage(), + 'per_page' => $usages->perPage(), + 'total' => $usages->total(), + ], + ]); } /** @@ -149,20 +157,20 @@ class GiftCardController extends Controller return $this->success([ 'id' => $usage->id, - 'code' => $usage->code->code, + 'code' => $usage->code->code ?? '', 'template' => [ - 'name' => $usage->template->name, - 'description' => $usage->template->description, - 'type' => $usage->template->type, - 'type_name' => $usage->template->type_name, - 'icon' => $usage->template->icon, - 'theme_color' => $usage->template->theme_color, + 'name' => $usage->template->name ?? '', + 'description' => $usage->template->description ?? '', + 'type' => $usage->template->type ?? '', + 'type_name' => $usage->template->type_name ?? '', + 'icon' => $usage->template->icon ?? '', + 'theme_color' => $usage->template->theme_color ?? '', ], 'rewards_given' => $usage->rewards_given, 'invite_rewards' => $usage->invite_rewards, 'invite_user' => $usage->inviteUser ? [ - 'id' => $usage->inviteUser->id, - 'email' => substr($usage->inviteUser->email, 0, 3) . '***@***', + 'id' => $usage->inviteUser->id ?? '', + 'email' => isset($usage->inviteUser->email) ? (substr($usage->inviteUser->email, 0, 3) . '***@***') : '', ] : null, 'user_level_at_use' => $usage->user_level_at_use, 'plan_id_at_use' => $usage->plan_id_at_use, diff --git a/app/Http/Controllers/V2/Admin/GiftCardController.php b/app/Http/Controllers/V2/Admin/GiftCardController.php index 84439c9..97ec7d7 100644 --- a/app/Http/Controllers/V2/Admin/GiftCardController.php +++ b/app/Http/Controllers/V2/Admin/GiftCardController.php @@ -9,6 +9,7 @@ use App\Models\GiftCardUsage; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Validation\Rule; +use Illuminate\Support\Facades\DB; class GiftCardController extends Controller { @@ -62,10 +63,17 @@ class GiftCardController extends Controller 'codes_count' => $template->codes()->count(), 'used_count' => $template->usages()->count(), ]; - }); + })->values(); - $templates->setCollection($data); - return $this->paginate($templates); + return response()->json([ + 'data' => $data, + 'pagination' => [ + 'current_page' => $templates->currentPage(), + 'last_page' => $templates->lastPage(), + 'per_page' => $templates->perPage(), + 'total' => $templates->total(), + ], + ]); } /** @@ -287,15 +295,7 @@ class GiftCardController extends Controller $templateType = $template->type ?? ''; $templateRewards = $template->rewards ? json_encode($template->rewards, JSON_UNESCAPED_UNICODE) : ''; // 状态判断 - if ($code->disabled) { - $status = '已禁用'; - } elseif ($code->used_at) { - $status = '已使用'; - } elseif ($code->expires_at && $code->expires_at < time()) { - $status = '已过期'; - } else { - $status = '未使用'; - } + $status = $code->status_name; $usedBy = $code->user_id ?? ''; $usedAt = $code->used_at ? date('Y-m-d H:i:s', $code->used_at) : ''; $remark = $code->remark ?? ''; @@ -376,23 +376,30 @@ class GiftCardController extends Controller return [ 'id' => $code->id, 'template_id' => $code->template_id, - 'template_name' => $code->template->name, + 'template_name' => $code->template->name ?? '', 'code' => $code->code, 'batch_id' => $code->batch_id, 'status' => $code->status, 'status_name' => $code->status_name, 'user_id' => $code->user_id, - 'user_email' => $code->user ? substr($code->user->email, 0, 3) . '***@***' : null, + 'user_email' => $code->user ? (substr($code->user->email ?? '', 0, 3) . '***@***') : null, 'used_at' => $code->used_at, 'expires_at' => $code->expires_at, 'usage_count' => $code->usage_count, 'max_usage' => $code->max_usage, 'created_at' => $code->created_at, ]; - }); + })->values(); - $codes->setCollection($data); - return $this->paginate($codes); + return response()->json([ + 'data' => $data, + 'pagination' => [ + 'current_page' => $codes->currentPage(), + 'last_page' => $codes->lastPage(), + 'per_page' => $codes->perPage(), + 'total' => $codes->total(), + ], + ]); } /** @@ -476,18 +483,16 @@ class GiftCardController extends Controller $data = $usages->getCollection()->map(function ($usage) { return [ 'id' => $usage->id, - 'code' => $usage->code->code, - 'template_name' => $usage->template->name, - 'user_email' => $usage->user->email, - 'invite_user_email' => $usage->inviteUser ? substr($usage->inviteUser->email, 0, 3) . '***@***' : null, + 'code' => $usage->code->code ?? '', + 'template_name' => $usage->template->name ?? '', + 'user_email' => $usage->user->email ?? '', + 'invite_user_email' => $usage->inviteUser ? (substr($usage->inviteUser->email ?? '', 0, 3) . '***@***') : null, 'rewards_given' => $usage->rewards_given, 'invite_rewards' => $usage->invite_rewards, 'multiplier_applied' => $usage->multiplier_applied, - // 'ip_address' => $usage->ip_address, 'created_at' => $usage->created_at, ]; - }); - + })->values(); return response()->json([ 'data' => $data, 'pagination' => [ @@ -522,7 +527,7 @@ class GiftCardController extends Controller ]; // 每日使用统计 - $driver = GiftCardUsage::query()->getConnection()->getDriverName(); + $driver = DB::connection()->getDriverName(); $dateExpression = "date(created_at, 'unixepoch')"; // Default for SQLite if ($driver === 'mysql') { $dateExpression = 'DATE(FROM_UNIXTIME(created_at))'; @@ -543,9 +548,9 @@ class GiftCardController extends Controller ->get() ->map(function ($item) { return [ - 'template_name' => $item->template->name, - 'type_name' => $item->template->type_name, - 'count' => $item->count, + 'template_name' => $item->template->name ?? '', + 'type_name' => $item->template->type_name ?? '', + 'count' => $item->count ?? 0, ]; }); diff --git a/app/Models/GiftCardCode.php b/app/Models/GiftCardCode.php index c04aeaf..8fb161a 100644 --- a/app/Models/GiftCardCode.php +++ b/app/Models/GiftCardCode.php @@ -172,7 +172,8 @@ class GiftCardCode extends Model public static function generateCode(string $prefix = 'GC'): string { do { - $code = $prefix . strtoupper(substr(md5(uniqid(mt_rand(), true)), 0, 12)); + $safePrefix = (string) $prefix; + $code = $safePrefix . strtoupper(substr(md5(uniqid($safePrefix . mt_rand(), true)), 0, 12)); } while (self::where('code', $code)->exists()); return $code; diff --git a/app/Models/GiftCardTemplate.php b/app/Models/GiftCardTemplate.php index 4e89022..39251fe 100644 --- a/app/Models/GiftCardTemplate.php +++ b/app/Models/GiftCardTemplate.php @@ -2,6 +2,7 @@ namespace App\Models; +use Dflydev\DotAccessData\Data; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -200,7 +201,7 @@ class GiftCardTemplate extends Model if (isset($festivalConfig['start_time']) && isset($festivalConfig['end_time'])) { if ($now >= $festivalConfig['start_time'] && $now <= $festivalConfig['end_time']) { - $bonus = (float) ($festivalConfig['festival_bonus'] ?? 1.0); + $bonus = data_get($festivalConfig, 'festival_bonus', 1.0); if ($bonus > 1.0) { foreach ($actualRewards as $key => &$value) { if (is_numeric($value)) { @@ -240,7 +241,7 @@ class GiftCardTemplate extends Model ->orderBy('created_at', 'desc') ->first(); - if ($lastUsage) { + if ($lastUsage && isset($lastUsage->created_at)) { $cooldownTime = $lastUsage->created_at + ($conditions['cooldown_hours'] * 3600); if (time() < $cooldownTime) { return false; diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 695d27a..ba4fa53 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -38,7 +38,6 @@ class OrderService * @param Plan $plan * @param string $period * @param string|null $couponCode - * @param array|null $telegramMessageIds * @return Order * @throws ApiException */