AdminDistrictController.php 4.2 KB

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