ShopController.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\Admin\ShopStoreRequest;
  5. use App\Http\Requests\Admin\ShopUpdateRequest;
  6. use App\Models\Goods;
  7. use App\Models\GoodsCategory;
  8. use App\Models\Level;
  9. use App\Models\Order;
  10. use Arr;
  11. use Exception;
  12. use Illuminate\Contracts\View\View;
  13. use Illuminate\Http\JsonResponse;
  14. use Illuminate\Http\RedirectResponse;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Http\UploadedFile;
  17. use Log;
  18. use Str;
  19. class ShopController extends Controller
  20. {
  21. public function index(Request $request): View
  22. {
  23. $query = Goods::query();
  24. foreach (['type', 'status'] as $field) {
  25. $request->whenFilled($field, function ($value) use ($query, $field) {
  26. $query->where($field, $value);
  27. });
  28. }
  29. $goodsList = $query->orderByDesc('status')->paginate(10)->appends($request->except('page'));
  30. // 优化订单统计查询,使用更高效的方式
  31. $goodsIds = $goodsList->pluck('id')->toArray();
  32. // 批量获取订单统计数据
  33. $orderStats = Order::whereIn('goods_id', $goodsIds)
  34. ->whereIn('status', [2, 3])
  35. ->selectRaw('goods_id, is_expire, count(*) as count')
  36. ->groupBy('goods_id', 'is_expire')
  37. ->get()
  38. ->groupBy('goods_id');
  39. // 为每个商品设置使用统计
  40. foreach ($goodsList as $goods) {
  41. $stats = $orderStats->get($goods->id, collect());
  42. $usedCount = $stats->where('is_expire', 0)->sum('count');
  43. $totalCount = $stats->sum('count');
  44. $goods->use_count = $usedCount;
  45. $goods->total_count = $totalCount;
  46. }
  47. return view('admin.shop.index', compact('goodsList'));
  48. }
  49. public function store(ShopStoreRequest $request): RedirectResponse
  50. {
  51. $data = $request->validated();
  52. if (array_key_exists('traffic_unit', $data)) {
  53. $data['traffic'] *= $data['traffic_unit'];
  54. Arr::forget($data, 'traffic_unit');
  55. }
  56. $data['is_hot'] = array_key_exists('is_hot', $data) ? 1 : 0;
  57. $data['status'] = array_key_exists('status', $data) ? 1 : 0;
  58. // 商品LOGO
  59. if ($request->hasFile('logo')) {
  60. $path = $this->fileUpload($request->file('logo'));
  61. if (is_string($path)) {
  62. $data['logo'] = $path;
  63. } else {
  64. return $path;
  65. }
  66. }
  67. try {
  68. if ($good = Goods::create($data)) {
  69. return redirect()->route('admin.goods.edit', $good)->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')]));
  70. }
  71. } catch (Exception $e) {
  72. Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage());
  73. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage());
  74. }
  75. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')]));
  76. }
  77. public function fileUpload(UploadedFile $file): RedirectResponse|string
  78. { // 图片上传
  79. $fileName = Str::random(8).time().'.'.$file->getClientOriginalExtension();
  80. if (! $file->storeAs('public', $fileName)) {
  81. return redirect()->back()->withInput()->withErrors(trans('common.failed_action_item', ['action' => trans('common.store'), 'attribute' => trans('model.goods.logo')]));
  82. }
  83. return 'upload/'.$fileName;
  84. }
  85. public function create(): View
  86. {
  87. return view('admin.shop.info', ['levels' => Level::orderBy('level')->pluck('name', 'id'), 'categories' => GoodsCategory::pluck('name', 'id')]);
  88. }
  89. public function edit(Goods $good): View
  90. {
  91. return view('admin.shop.info', [
  92. 'good' => $good,
  93. 'levels' => Level::orderBy('level')->pluck('name', 'id'),
  94. 'categories' => GoodsCategory::pluck('name', 'id'),
  95. ]);
  96. }
  97. public function update(ShopUpdateRequest $request, Goods $good): RedirectResponse
  98. {
  99. $data = $request->validated();
  100. // 商品LOGO
  101. if ($request->hasFile('logo')) {
  102. $path = $this->fileUpload($request->file('logo'));
  103. if (is_string($path)) {
  104. $data['logo'] = $path;
  105. } else {
  106. return $path;
  107. }
  108. }
  109. try {
  110. $data['is_hot'] = array_key_exists('is_hot', $data) ? 1 : 0;
  111. $data['status'] = array_key_exists('status', $data) ? 1 : 0;
  112. if ($good->update($data)) {
  113. return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')]));
  114. }
  115. } catch (Exception $e) {
  116. Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage());
  117. return redirect()->back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')]).', '.$e->getMessage());
  118. }
  119. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')]));
  120. }
  121. public function destroy(Goods $good): JsonResponse
  122. {
  123. try {
  124. if ($good->delete()) {
  125. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]);
  126. }
  127. } catch (Exception $e) {
  128. Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage());
  129. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]);
  130. }
  131. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]);
  132. }
  133. }