diff --git a/beike/Models/OrderProduct.php b/beike/Models/OrderProduct.php index 56ed25d2..ac2af409 100644 --- a/beike/Models/OrderProduct.php +++ b/beike/Models/OrderProduct.php @@ -19,12 +19,17 @@ class OrderProduct extends Base 'product_id', 'order_number', 'product_sku', 'name', 'image', 'quantity', 'price', ]; + protected $appends = ['price_format']; + public function order(): BelongsTo { return $this->belongsTo(Order::class); } - protected $appends = ['price_format']; + public function productSku(): BelongsTo + { + return $this->belongsTo(ProductSku::class, 'product_sku', 'id'); + } public function getPriceFormatAttribute() { diff --git a/beike/Repositories/OrderProductRepo.php b/beike/Repositories/OrderProductRepo.php index ec3d921f..6aa8bc14 100644 --- a/beike/Repositories/OrderProductRepo.php +++ b/beike/Repositories/OrderProductRepo.php @@ -13,13 +13,13 @@ namespace Beike\Repositories; use Beike\Models\Order; use Beike\Models\OrderProduct; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; -use Illuminate\Database\Eloquent\Model; class OrderProductRepo { - public static function create(Order $order, $cartProducts) + public static function createOrderProducts(Order $order, $cartProducts) { $orderProducts = []; foreach ($cartProducts as $cartProduct) { diff --git a/beike/Repositories/OrderRepo.php b/beike/Repositories/OrderRepo.php index ba25485f..973e3f77 100644 --- a/beike/Repositories/OrderRepo.php +++ b/beike/Repositories/OrderRepo.php @@ -14,6 +14,7 @@ namespace Beike\Repositories; use Carbon\Carbon; use Beike\Models\Order; use Beike\Models\Address; +use Beike\Services\StateMachineService; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -199,7 +200,7 @@ class OrderRepo 'currency_value' => 1, 'ip' => request()->getClientIp(), 'user_agent' => request()->userAgent(), - 'status' => 'unpaid', + 'status' => StateMachineService::CREATED, 'shipping_method_code' => $shippingMethodCode, 'shipping_method_name' => trans($shippingMethodCode), 'shipping_customer_name' => $shippingAddress->name, @@ -223,9 +224,8 @@ class OrderRepo ]); $order->saveOrFail(); - OrderProductRepo::create($order, $carts['carts']); + OrderProductRepo::createOrderProducts($order, $carts['carts']); OrderTotalRepo::createTotals($order, $totals); - // OrderHistoryRepo::create($order); return $order; } diff --git a/beike/Services/StateMachineService.php b/beike/Services/StateMachineService.php index 5821ad90..c87474bf 100644 --- a/beike/Services/StateMachineService.php +++ b/beike/Services/StateMachineService.php @@ -47,7 +47,7 @@ class StateMachineService self::CANCELLED => ['updateStatus', 'addHistory'], ], self::PAID => [ - self::CANCELLED => ['updateStatus', 'addHistory', 'revertStock'], + self::CANCELLED => ['updateStatus', 'addHistory'], self::SHIPPED => ['updateStatus', 'addHistory'], self::COMPLETED => ['updateStatus', 'addHistory'] ], @@ -240,7 +240,17 @@ class StateMachineService */ private function subStock($oldCode, $newCode) { - + $this->order->loadMissing([ + 'orderProducts.productSku' + ]); + $orderProducts = $this->order->orderProducts; + foreach ($orderProducts as $orderProduct) { + $productSku = $orderProduct->productSku; + if (empty($productSku)) { + continue; + } + $productSku->decrement('quantity', $orderProduct->quantity); + } } diff --git a/beike/Shop/Services/CheckoutService.php b/beike/Shop/Services/CheckoutService.php index 3f14c9f6..e087e98c 100644 --- a/beike/Shop/Services/CheckoutService.php +++ b/beike/Shop/Services/CheckoutService.php @@ -20,6 +20,7 @@ use Illuminate\Support\Facades\DB; use Beike\Repositories\PluginRepo; use Beike\Repositories\AddressRepo; use Beike\Repositories\CountryRepo; +use Beike\Services\StateMachineService; use Beike\Shop\Http\Resources\Account\AddressResource; use Beike\Shop\Http\Resources\Checkout\PaymentMethodItem; use Beike\Shop\Http\Resources\Checkout\ShippingMethodItem; @@ -94,6 +95,7 @@ class CheckoutService try { DB::beginTransaction(); $order = OrderRepo::create($checkoutData); + StateMachineService::getInstance($order)->changeStatus(StateMachineService::UNPAID); CartRepo::clearSelectedCartProducts($customer); DB::commit(); } catch (\Exception $e) {