user()->dealerDeliveryBills() ->filter($request->all()) ->latest('id') ->simplePaginate($perPage); return DealerDeliveryBillResource::collection($deliveryBills); } /** * 创建提货单 * * @param \Illuminate\Http\Request $request * @param \App\Services\Dealer\DealerDeliveryBillService $dealerDeliveryBillService * @return \Illuminate\Http\JsonResponse */ public function store(Request $request, DealerDeliveryBillService $dealerDeliveryBillService) { $input = $request->validate([ 'shipping_address_id' => ['bail', 'required'], 'products' => ['bail', 'required', 'array'], 'products.*.id' => ['bail', 'required', 'int'], 'products.*.qty' => ['bail', 'required', 'int', 'min:1'], 'remark' => ['bail', 'nullable', 'string', 'max:255'], ], [], [ 'shipping_address_id' => '收货地址', 'products' => '商品', 'remark' => '备注', ]); $user = $request->user(); $shippingAddress = $user->shippingAddresses()->findOrFail($input['shipping_address_id']); try { DB::beginTransaction(); $deliveryBill = $dealerDeliveryBillService->create( $user, $input['products'], [ 'name' => $shippingAddress->consignee, 'telephone' => $shippingAddress->telephone, 'zone' => $shippingAddress->zone, 'address' => $shippingAddress->address, ], $input['remark'] ?? null ); DB::commit(); } catch (Throwable $e) { DB::rollBack(); throw $e; } $deliveryBill->load(['deliveryProducts.product']); return DealerDeliveryBillResource::make($deliveryBill); } /** * 提货单详情 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function show($id, Request $request) { $deliveryBill = $request->user()->dealerDeliveryBills()->findOrFail($id); $deliveryBill->load(['deliveryProducts.product']); return DealerDeliveryBillResource::make($deliveryBill); } /** * 提货单支付 * * @param int $id * @param \Illuminate\Http\Request $request * @param \App\Services\Dealer\DealerDeliveryBillService $dealerDeliveryBillService * @return \Illuminate\Http\JsonResponse */ public function pay($id, Request $request, DealerDeliveryBillService $dealerDeliveryBillService) { $input = $request->validate([ 'pay_way' => ['bail', 'required', 'string'], 'pay_password' => ['bail', 'required_if:pay_way,wallet'], 'products'=> ['array'], ], [ 'pay_password.required_if' => '支付密码 不能为空。', ], [ 'pay_way' => '支付方式', 'pay_password' => '支付密码', ]); $payWay = PayWay::tryFrom($input['pay_way']); if (! in_array($payWay, [PayWay::Wallet, PayWay::WxpayH5, PayWay::WxpayJsApi])) { throw new BizException('支付方式 非法'); } $user = $request->user(); $deliveryBill = $user->dealerDeliveryBills()->findOrFail($id); if ($payWay === PayWay::Wallet && !$user->wallet?->verifyPassword($input['pay_password'])) { throw new PayPasswordIncorrectException(); } try { DB::beginTransaction(); $data = $dealerDeliveryBillService->pay($deliveryBill, $payWay); DB::commit(); } catch (BizException $e) { DB::rollBack(); throw $e; } catch (Throwable $e) { DB::rollBack(); report($e); throw new BizException('支付失败,请重试'); } return response()->json($data); } /** * 取消提货单 * * @param int $id * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function cancel($id, Request $request) { $user = $request->user(); DB::transaction(function () use ($id, $user) { (new DealerDeliveryBillService())->cancel( $user->dealerDeliveryBills()->lockForUpdate()->findOrFail($id) ); }); return response()->noContent(); } }