AdminAreaController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Dictionary\Area;
  5. use App\Models\Dictionary\District;
  6. use App\Services\Export\ExportAreasService;
  7. use App\Services\Import\ImportAreasService;
  8. use Illuminate\Http\RedirectResponse;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Storage;
  11. use Illuminate\View\View;
  12. class AdminAreaController extends Controller
  13. {
  14. protected string $id = 'id';
  15. protected array $header = [
  16. 'id' => 'ID',
  17. 'name' => 'Название',
  18. 'district_name' => 'Округ',
  19. ];
  20. protected array $searchFields = ['name'];
  21. public function index(Request $request): View
  22. {
  23. $query = Area::with('district')->orderBy('name');
  24. // Фильтр по округу
  25. if ($request->has('district_id') && $request->district_id) {
  26. $query->where('district_id', $request->district_id);
  27. }
  28. $areas = $query->get()->map(function ($area) {
  29. return [
  30. 'id' => $area->id,
  31. 'name' => $area->name,
  32. 'district_name' => $area->district?->shortname ?? '-',
  33. ];
  34. });
  35. $districts = District::orderBy('shortname')->pluck('shortname', 'id')->toArray();
  36. return view('admin.areas.index', [
  37. 'active' => 'admin_areas',
  38. 'id' => $this->id,
  39. 'header' => $this->header,
  40. 'areas' => $areas,
  41. 'districts' => $districts,
  42. 'selectedDistrict' => $request->district_id,
  43. ]);
  44. }
  45. public function show(int $areaId): View
  46. {
  47. $area = Area::withTrashed()->findOrFail($areaId);
  48. $districts = District::orderBy('shortname')->pluck('name', 'id')->toArray();
  49. return view('admin.areas.edit', [
  50. 'active' => 'admin_areas',
  51. 'area' => $area,
  52. 'districts' => $districts,
  53. ]);
  54. }
  55. public function store(Request $request): RedirectResponse
  56. {
  57. $validated = $request->validate([
  58. 'id' => ['nullable', 'integer'],
  59. 'name' => ['required', 'string', 'max:255'],
  60. 'district_id' => ['required', 'integer', 'exists:districts,id'],
  61. ]);
  62. if (!empty($validated['id'])) {
  63. $area = Area::withTrashed()->findOrFail($validated['id']);
  64. $area->update([
  65. 'name' => $validated['name'],
  66. 'district_id' => $validated['district_id'],
  67. ]);
  68. } else {
  69. Area::create([
  70. 'name' => $validated['name'],
  71. 'district_id' => $validated['district_id'],
  72. ]);
  73. }
  74. return redirect()->route('admin.area.index')->with('success', 'Район сохранён');
  75. }
  76. public function destroy(Area $area): RedirectResponse
  77. {
  78. $area->delete();
  79. return redirect()->route('admin.area.index')->with('success', 'Район удалён');
  80. }
  81. public function undelete(int $areaId): RedirectResponse
  82. {
  83. $area = Area::withTrashed()->findOrFail($areaId);
  84. $area->restore();
  85. return redirect()->route('admin.area.index')->with('success', 'Район восстановлен');
  86. }
  87. public function export(Request $request): RedirectResponse
  88. {
  89. $service = new ExportAreasService();
  90. $link = $service->handle($request->user()->id);
  91. return redirect()->away($link);
  92. }
  93. public function import(Request $request): RedirectResponse
  94. {
  95. $request->validate([
  96. 'import_file' => ['required', 'file', 'mimes:xlsx,xls'],
  97. ]);
  98. $file = $request->file('import_file');
  99. $path = $file->store('import/areas', 'upload');
  100. $fullPath = Storage::disk('upload')->path($path);
  101. $service = new ImportAreasService($fullPath, $request->user()->id);
  102. $result = $service->handle();
  103. if ($result['success']) {
  104. return redirect()->route('admin.area.index')
  105. ->with('success', 'Импорт завершён успешно');
  106. }
  107. return redirect()->route('admin.area.index')
  108. ->with('error', 'Ошибка импорта: ' . ($result['error'] ?? 'неизвестная ошибка'));
  109. }
  110. }