mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-24 03:57:27 +08:00
fix: optimize batch email performance and fix gift card issues
- Add chunking and batching for admin email sending - Fix gift card pagination and add per_page limits - Update frontend prompts and complete language packs
This commit is contained in:
@@ -65,15 +65,7 @@ class GiftCardController extends Controller
|
||||
];
|
||||
})->values();
|
||||
|
||||
return response()->json([
|
||||
'data' => $data,
|
||||
'pagination' => [
|
||||
'current_page' => $templates->currentPage(),
|
||||
'last_page' => $templates->lastPage(),
|
||||
'per_page' => $templates->perPage(),
|
||||
'total' => $templates->total(),
|
||||
],
|
||||
]);
|
||||
return $this->paginate( $templates);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -352,7 +344,7 @@ class GiftCardController extends Controller
|
||||
'batch_id' => 'string',
|
||||
'status' => 'integer|in:0,1,2,3',
|
||||
'page' => 'integer|min:1',
|
||||
'per_page' => 'integer|min:1|max:100',
|
||||
'per_page' => 'integer|min:1|max:500',
|
||||
]);
|
||||
|
||||
$query = GiftCardCode::with(['template', 'user']);
|
||||
@@ -391,15 +383,7 @@ class GiftCardController extends Controller
|
||||
];
|
||||
})->values();
|
||||
|
||||
return response()->json([
|
||||
'data' => $data,
|
||||
'pagination' => [
|
||||
'current_page' => $codes->currentPage(),
|
||||
'last_page' => $codes->lastPage(),
|
||||
'per_page' => $codes->perPage(),
|
||||
'total' => $codes->total(),
|
||||
],
|
||||
]);
|
||||
return $this->paginate($codes);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -464,7 +448,7 @@ class GiftCardController extends Controller
|
||||
'template_id' => 'integer|exists:v2_gift_card_template,id',
|
||||
'user_id' => 'integer|exists:v2_user,id',
|
||||
'page' => 'integer|min:1',
|
||||
'per_page' => 'integer|min:1|max:100',
|
||||
'per_page' => 'integer|min:1|max:500',
|
||||
]);
|
||||
|
||||
$query = GiftCardUsage::with(['template', 'code', 'user', 'inviteUser']);
|
||||
@@ -480,7 +464,7 @@ class GiftCardController extends Controller
|
||||
$perPage = $request->input('per_page', 15);
|
||||
$usages = $query->orderBy('created_at', 'desc')->paginate($perPage);
|
||||
|
||||
$data = $usages->getCollection()->map(function ($usage) {
|
||||
$usages->transform(function ($usage) {
|
||||
return [
|
||||
'id' => $usage->id,
|
||||
'code' => $usage->code->code ?? '',
|
||||
@@ -493,15 +477,7 @@ class GiftCardController extends Controller
|
||||
'created_at' => $usage->created_at,
|
||||
];
|
||||
})->values();
|
||||
return response()->json([
|
||||
'data' => $data,
|
||||
'pagination' => [
|
||||
'current_page' => $usages->currentPage(),
|
||||
'last_page' => $usages->lastPage(),
|
||||
'per_page' => $usages->perPage(),
|
||||
'total' => $usages->total(),
|
||||
],
|
||||
]);
|
||||
return $this->paginate($usages);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,6 +16,7 @@ use App\Utils\Helper;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\Bus;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
@@ -442,22 +443,38 @@ class UserController extends Controller
|
||||
$sort = $request->input('sort') ? $request->input('sort') : 'created_at';
|
||||
$builder = User::orderBy($sort, $sortType);
|
||||
$this->applyFiltersAndSorts($request, $builder);
|
||||
$users = $builder->get();
|
||||
foreach ($users as $user) {
|
||||
SendEmailJob::dispatch(
|
||||
[
|
||||
|
||||
$subject = $request->input('subject');
|
||||
$content = $request->input('content');
|
||||
$templateValue = [
|
||||
'name' => admin_setting('app_name', 'XBoard'),
|
||||
'url' => admin_setting('app_url'),
|
||||
'content' => $content
|
||||
];
|
||||
|
||||
$chunkSize = 1000;
|
||||
$totalProcessed = 0;
|
||||
|
||||
$builder->chunk($chunkSize, function ($users) use ($subject, $templateValue, &$totalProcessed) {
|
||||
$jobs = [];
|
||||
|
||||
foreach ($users as $user) {
|
||||
$jobs[] = new SendEmailJob([
|
||||
'email' => $user->email,
|
||||
'subject' => $request->input('subject'),
|
||||
'subject' => $subject,
|
||||
'template_name' => 'notify',
|
||||
'template_value' => [
|
||||
'name' => admin_setting('app_name', 'XBoard'),
|
||||
'url' => admin_setting('app_url'),
|
||||
'content' => $request->input('content')
|
||||
]
|
||||
],
|
||||
'send_email_mass'
|
||||
);
|
||||
}
|
||||
'template_value' => $templateValue
|
||||
], 'send_email_mass');
|
||||
}
|
||||
|
||||
if (!empty($jobs)) {
|
||||
Bus::batch($jobs)
|
||||
->allowFailures()
|
||||
->dispatch();
|
||||
}
|
||||
|
||||
$totalProcessed += $users->count();
|
||||
});
|
||||
|
||||
return $this->success(true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user