diff --git a/app/Models/Order.php b/app/Models/Order.php index d5da4455..3d6100ee 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -213,6 +213,27 @@ class Order extends Model return $this->status === static::STATUS_CANCELLED; } + /** + * 将订单标记为已完成 + * + * @return void + */ + public function markAsCompleted() + { + // 加载订单商品 + $this->loadMissing('products'); + + foreach ($this->products->loadMissing(['spu', 'sku']) as $product) { + $product->spu?->increment('sales', $product->quantity); + $product->sku?->increment('sales', $product->quantity); + } + + $this->update([ + 'status' => static::STATUS_COMPLETED, + 'completed_at' => now(), + ]); + } + /** * 获取订单券优惠金额 * diff --git a/app/Models/OrderProduct.php b/app/Models/OrderProduct.php index f159e828..8328b693 100644 --- a/app/Models/OrderProduct.php +++ b/app/Models/OrderProduct.php @@ -58,6 +58,15 @@ class OrderProduct extends Model return $this->belongsToMany(OrderPackage::class, 'order_package_products', 'order_product_id', 'order_package_id'); } + /** + * 此订单商品所属的SPU + * + */ + public function spu() + { + return $this->belongsTo(ProductSpu::class, 'spu_id'); + } + /** * 此订单商品所属的SKU * diff --git a/app/Services/OrderPackageService.php b/app/Services/OrderPackageService.php index 22e8c051..c42e644e 100644 --- a/app/Services/OrderPackageService.php +++ b/app/Services/OrderPackageService.php @@ -3,7 +3,6 @@ namespace App\Services; use App\Exceptions\OrderPackageAlreadyCheckedException; -use App\Models\Order; use App\Models\OrderPackage; use Illuminate\Support\Carbon; @@ -40,11 +39,7 @@ class OrderPackageService return; } - // 自动完成订单 - $package->order->update([ - 'status' => Order::STATUS_COMPLETED, - 'completed_at' => now(), - ]); + $package->order->markAsCompleted(); } /** diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 61d278f3..ea619b13 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -633,22 +633,16 @@ class OrderService throw new BizException('订单包裹未发完'); } - $time = now(); - $orderPackageService = new OrderPackageService(); // 获取订单的未作废未签收包裹 $packages = $order->packages()->unchecked()->where('is_failed', false)->get(); foreach ($packages as $package) { - $orderPackageService->checkPackage($package, true, $time); + $orderPackageService->checkPackage($package, true); } - // 将订单标记为已完成 - $order->update([ - 'status' => Order::STATUS_COMPLETED, - 'completed_at' => $time, - ]); + $order->markAsCompleted(); } /**