with(['order', 'orderProduct']); $query->where('user_id', $request->user()->id); if ($request->filled('doing')) { $doing = (bool) $request->query('doing'); if ($doing) {//获取正在处理中的订单 $query->where('state', '<', AfterSale::STATE_FINISH)->latest('updated_at'); } else {//获取已完成+已取消的售后订单 $query->where('state', '>=', AfterSale::STATE_FINISH)->latest(); } } else {//获取全部申请记录 $query->latest(); } $afterSales = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50)); return AfterSaleSimpleResource::collection($afterSales); } /** * 提交审核 * * @param Request $request * @return void */ public function store(Request $request, AfterSaleService $afterSaleService) { $input = $request->validate([ 'order_product_id' => ['bail', 'required', 'integer'], 'num' => ['bail', 'required', 'integer', 'min:1'], 'type' => ['bail', 'required', 'integer', 'min:1', 'max:4'], 'description' => ['bail', 'required', 'string', 'max:255'], 'images' => ['bail', 'required', 'array', 'max:6'], ]); $orderProduct = OrderProduct::where('user_id', $request->user()->id)->findOrFail($input['order_product_id']); try { DB::beginTransaction(); $afterSale = $afterSaleService->create($request->user(), $orderProduct, $input['type'], $input['num'], $input); DB::commit(); } catch (BizException $th) { DB::rollBack(); throw new BizException($th->getMessage()); } catch (Throwable $th) { DB::rollBack(); report($th); throw new BizException('申请失败,请稍后再试'); } return AfterSaleResource::make($afterSale); } /** * 售后订单详情 * * @param [type] $id * @param Request $request * @return void */ public function show($id, Request $request) { $afterSale = $request->user()->afterSales()->findOrFail($id); return AfterSaleResource::make($afterSale); } /** * 获取售后单的售后日志 * * @param [type] $id * @param Request $request * @return void */ public function logs($id, Request $request) { $afterSale = $request->user()->afterSales()->findOrFail($id); return AfterSaleLogResource::collection($afterSale->logs->sortByDesc('created_at')); } /** * 补充资料 * * @param Request $request * @return void */ public function update($id, Request $request, AfterSaleService $afterSaleService) { $afterSale = $request->user()->afterSales()->where('state', '=', AfterSale::STATE_APPLY)->findOrFail($id); $input = $request->validate([ 'type' => ['bail', 'required', 'integer', 'min:1', 'max:4'], 'description' => ['bail', 'required', 'string', 'max:255'], 'images' => ['bail', 'required', 'array', 'max:6'], ]); try { DB::beginTransaction(); $afterSale = $afterSaleService->apply($afterSale, $input); DB::commit(); } catch (Throwable $th) { DB::rollBack(); report($th); throw new BizException('提交失败,请稍后再试'); } return AfterSaleResource::make($afterSale); } /** * 客户同意 * * @param Request $request * @return void */ public function agree($id, Request $request) { $afterSale = $request->user()->afterSales()->where('state', '=', AfterSale::STATE_AGREE)->findOrFail($id); $input = $request->validate([ 'tracking_number' => ['bail', 'string', 'max:255'], ]); //如果是 if (in_array($afterSale->type, [AfterSale::TYPE_REFUND_AND_RETURN, AfterSale::TYPE_CHANGE]) && (!isset($input['tracking_number']) || empty($input['tracking_number']))) { throw new BizException('请填写物流单号'); } try { DB::beginTransaction(); $afterSaleService = new AfterSaleService(); $afterSale = $afterSaleService->agree($afterSale, $input); DB::commit(); } catch (Throwable $th) { DB::rollBack(); report($th); throw new BizException('提交失败,请稍后再试'); } return AfterSaleResource::make($afterSale); } /** * 取消申请 * * @param Request $request * @return void */ public function cancel($id, Request $request) { $afterSale = $request->user()->afterSales()->where('state', '<', 4)->findOrFail($id); $afterSale->update( ['state'=> AfterSale::STATE_CANCEL, 'remarks'=>'用户取消售后申请'] ); return AfterSaleResource::make($afterSale); } }