SupplierController.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\AsyncResponse;
  4. use App\Filters\SupplierFilters;
  5. use App\Http\Requests\Supplier\SupplierRequest;
  6. use App\Material;
  7. use App\MaterialSupplier;
  8. use App\Supplier;
  9. use Illuminate\Http\Request;
  10. class SupplierController extends Controller
  11. {
  12. use AsyncResponse;
  13. public function index(Request $request, SupplierFilters $filters)
  14. {
  15. $this->gate('供应商');
  16. $suppliers = Supplier::query()->with('material')->orderByDesc('id')->filter($filters)->paginate($request['paginate'] ?? 50);
  17. $materials = Material::query()->select('id', 'name')->get();
  18. return view('/maintenance/supplier/index', compact('suppliers', 'materials'));
  19. }
  20. public function storeApi(SupplierRequest $request)
  21. {
  22. $this->gate('供应商-编辑');
  23. $supplier = Supplier::query()->create($request->all());
  24. $material_supplier = [];
  25. foreach ($request['material_id'] as $item) {
  26. $material_supplier[] = [
  27. 'material_id' => $item,
  28. 'supplier_id' => $supplier['id'],
  29. ];
  30. }
  31. MaterialSupplier::query()->insert($material_supplier);
  32. $supplier->loadMissing('material');
  33. $this->success($supplier);
  34. }
  35. public function updateApi(SupplierRequest $request)
  36. {
  37. $this->gate('供应商-编辑');
  38. $material_suppliers = MaterialSupplier::query()->where('supplier_id', $request['id'])->get();
  39. $this->updateMaterial($material_suppliers, $request['material_id'], $request['id']);
  40. /** @var Supplier $supplier */
  41. $supplier = Supplier::query()->find($request['id']);
  42. $bool = $supplier->update($request->all());
  43. if ($bool) $this->success($supplier->loadMissing('material'));
  44. $this->error('更新异常');
  45. }
  46. public function destroyApi($id)
  47. {
  48. $this->gate('供应商-删除');
  49. /** @var Supplier $supplier */
  50. $supplier = Supplier::query()->find($id);
  51. $supplier->delete();
  52. $this->success();
  53. }
  54. private function updateMaterial($material_suppliers, $material_ids, $supplier_id)
  55. {
  56. $exist = [];
  57. $adds = [];
  58. $addMaterial = [];
  59. foreach ($material_suppliers as $material_supplier) {
  60. $exist[] = $material_supplier['material_id'];
  61. }
  62. $deletes = array_diff($exist, $material_ids);
  63. foreach ($material_ids as $id) {
  64. if (empty($material_suppliers->where('material_id', $id)->first())) $adds[] = $id;
  65. }
  66. foreach ($adds as $add) {
  67. $addMaterial[] = [
  68. 'material_id' => $add,
  69. 'supplier_id' => $supplier_id,
  70. ];
  71. }
  72. if (count($addMaterial) > 0) MaterialSupplier::query()->insert($addMaterial);
  73. foreach ($deletes as $delete) {
  74. MaterialSupplier::query()->where('material_id', $delete)->where('supplier_id', $supplier_id)->delete();
  75. }
  76. }
  77. }