diff --git a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php index 79db4366..2cde7480 100644 --- a/app/Endpoint/Api/Http/Controllers/Order/OrderController.php +++ b/app/Endpoint/Api/Http/Controllers/Order/OrderController.php @@ -133,7 +133,21 @@ class OrderController extends Controller */ public function confirm($id, Request $request) { - // 确认收货 + $user = $request->user(); + + try { + return DB::transaction(function () use ($id, $user) { + $order = $user->orders()->lockForUpdate()->findOrFail($id); + + (new OrderService())->confirm($order); + }); + } catch (ModelNotFoundException | BizException $e) { + throw $e; + } catch (Throwable $e) { + report($e); + + throw new BizException('确认失败,请重试'); + } return response()->noContent(); } @@ -206,7 +220,7 @@ class OrderController extends Controller } catch (Throwable $e) { report($e); - throw new BizException('订单支付失败,请重试'); + throw new BizException('支付失败,请重试'); } } diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 35ae8cd4..272bc433 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -11,14 +11,11 @@ use App\Exceptions\ShippingNotSupportedException; use App\Helpers\Numeric; use App\Helpers\Order as OrderHelper; use App\Models\Order; -use App\Models\OrderPackage; use App\Models\OrderProduct; use App\Models\ProductSku; use App\Models\ShippingAddress; use App\Models\User; use App\Models\UserCoupon; -use Carbon\Carbon; -use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; class OrderService @@ -641,103 +638,33 @@ class OrderService // todo 处理预收益 } - /** - * 更新包裹状态 - * - * @param Collection|null $packages - * @param integer $status - * @return void - */ - public function updatePackageStatus(OrderPackage $package, int $status) - { - //如果包裹已签收则不再更新包裹状态 - if ($package->status == OrderPackage::STATUS_CHECK || $package->status == OrderPackage::STATUS_AUTOCHECK) { - return; - } - //如果签收状态 - if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) { - $this->checkOrderPackage($package, $status); - } else { - $package->update([ - 'status'=>$status, - ]); - } - } - /** * 订单确认收货 * + * @param \App\Models\Order $order * @return void */ - public function checkOrder(Order $order) + public function confirm(Order $order) { - //获取订单的未作废未签收包裹 + if (! $order->isShipped()) { + throw new BizException('订单包裹未发完'); + } + + $time = now(); + + $orderPackageService = new OrderPackageService(); + + // 获取订单的未作废未签收包裹 $packages = $order->packages()->unchecked()->where('is_failed', false)->get(); + foreach ($packages as $package) { - $this->checkPackage($package, OrderPackage::STATUS_AUTOCHECK); - } - if ($order->isShipped() - && OrderPackage::where('order_id', $order->id)->unchecked()->doesntExist() - ) { - //更新订单完成 - $order->update([ - 'status' => Order::STATUS_COMPLETED, - 'completed_at' => now(), - ]); - } - } - - /** - * 签收订单包裹:会更新订单状态 - * - * @param OrderPackage $package - * @param integer $status - * @param Carbon|null $time - * @return void - */ - public function checkOrderPackage(OrderPackage $package, int $status, ?Carbon $time = null) - { - $this->checkPackage($package, $status); - //如果订单是发货完成状态,且所有包裹都签收了 - if ($package->order->isShipped() - && OrderPackage::where('order_id', $package->order_id)->unchecked()->doesntExist() - ) { - //更新订单完成 - $package->order->update([ - 'status' => Order::STATUS_COMPLETED, - 'completed_at' => now(), - ]); - } - } - - /** - * 签收包裹 - * - * status 区分3签收(物流推送签收)和11自动签收(属于用户手动点,或者时间到了) - * @return void - */ - protected function checkPackage(OrderPackage $package, int $status, ?Carbon $time = null) - { - //如果不是签收状态,则直接退出 - if (!in_array($status, [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])) { - return; + $orderPackageService->checkPackage($package, true, $time); } - $checkTime = $time ?? now();//没指定签收时间,则默认当前时间 - - //物流签收,更新包裹状态。 - // if ($status == OrderPackage::STATUS_CHECK) { //自动签收不更新包裹状态 - $package->update([ - 'status'=> $status, - 'checked_at' => $checkTime, + // 将订单标记为已完成 + $order->update([ + 'status' => Order::STATUS_COMPLETED, + 'completed_at' => $time, ]); - // } - //如果这个包裹的订单状态是发货中,发货完成 - if ($package->order->isShipped() || $package->order->isShipping()) { - //处理这个包裹的商品的售后过期时间 - $package->orderProducts()->update([ - 'after_expire_at'=>$checkTime->addDays(config('settings.sale_after_expire_days', 7)), - ]); - } } }