| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <?php
- namespace Longyi\Member\Http\Controllers\Admin;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\View\View;
- use Longyi\Member\DataGrids\Member\MemberDataGrid;
- use Longyi\Member\Imports\MemberPlusSpreadsheet;
- use Longyi\Member\Services\MemberPlusImportException;
- use Longyi\Member\Services\MemberPlusImportService;
- use Longyi\Member\Services\MemberPlusStatisticsService;
- use Maatwebsite\Excel\Facades\Excel;
- use Webkul\Admin\Http\Controllers\Controller;
- class MemberController extends Controller
- {
- /**
- * Create a new controller instance.
- */
- public function __construct(
- protected MemberPlusImportService $importService,
- protected MemberPlusStatisticsService $statisticsService
- ) {}
- /**
- * Display a listing of the resource.
- */
- public function index(): View|JsonResponse
- {
- if (request()->ajax()) {
- return datagrid(MemberDataGrid::class)->process();
- }
- return view('member::admin.index');
- }
- /**
- * Plus 会员统计:新增 / 过期。
- */
- public function statistics(Request $request): JsonResponse
- {
- $request->validate([
- 'start' => ['nullable', 'date'],
- 'end' => ['nullable', 'date'],
- ]);
- $end = $request->date('end') ?? now();
- $start = $request->date('start') ?? $end->copy()->subDays(29);
- return new JsonResponse($this->statisticsService->get($start, $end));
- }
- /**
- * 批量导入 Plus 会员(邮箱 + 过期天数)。
- */
- public function import(Request $request): RedirectResponse
- {
- $request->validate([
- 'import_file' => [
- 'required',
- 'file',
- 'extensions:xlsx,xls,csv',
- 'mimetypes:text/csv,text/plain,application/csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'max:10240',
- ],
- ]);
- try {
- $sheets = Excel::toArray(new MemberPlusSpreadsheet, $request->file('import_file'));
- $result = $this->importService->import($sheets[0] ?? []);
- } catch (MemberPlusImportException $e) {
- return $this->redirectToIndex('error', $e->getMessage());
- } catch (\Throwable $e) {
- return $this->redirectToIndex('error', trans('member::app.member.import.errors.generic', [
- 'message' => $this->sanitizeMessage($e->getMessage()),
- ]));
- }
- return redirect()
- ->route('admin.member.index')
- ->with('member_import_result', $result)
- ->with(
- $result['failed'] > 0 ? 'warning' : 'success',
- trans('member::app.member.import.summary', [
- 'updated' => $result['updated'],
- 'failed' => $result['failed'],
- 'skipped' => $result['skipped'],
- ])
- );
- }
- /**
- * 返回列表页并带上提示信息。
- */
- protected function redirectToIndex(string $type, string $message): RedirectResponse
- {
- return redirect()
- ->route('admin.member.index')
- ->with($type, $this->sanitizeMessage($message));
- }
- /**
- * 去掉会破坏前端提示脚本的引号与换行。
- */
- protected function sanitizeMessage(string $message): string
- {
- return trim(str_replace(['"', "\r", "\n"], ["'", ' ', ' '], $message));
- }
- }
|