diff --git a/app/Exceptions/OrderPackageAlreadyCheckedException.php b/app/Exceptions/OrderPackageAlreadyCheckedException.php new file mode 100644 index 00000000..0a45e5e0 --- /dev/null +++ b/app/Exceptions/OrderPackageAlreadyCheckedException.php @@ -0,0 +1,11 @@ + 'datetime', 'is_failed' => 'bool', ]; @@ -77,4 +78,14 @@ class OrderPackage extends Model { return $this->belongsToMany(OrderProduct::class, 'order_package_products', 'order_package_id', 'order_product_id'); } + + /** + * 确认此包裹是否已签收 + * + * @return bool + */ + public function isChecked() + { + return in_array($this->status, [static::STATUS_CHECK, static::STATUS_AUTOCHECK]); + } } diff --git a/app/Services/Kuaidi100Service.php b/app/Services/Kuaidi100Service.php index a1dd0716..0f26c833 100644 --- a/app/Services/Kuaidi100Service.php +++ b/app/Services/Kuaidi100Service.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Exceptions\BizException; +use App\Exceptions\OrderPackageAlreadyCheckedException; use App\Models\KuaidiLog; use App\Models\OrderPackage; use Illuminate\Support\Arr; @@ -1397,9 +1398,11 @@ class Kuaidi100Service $status = OrderPackage::STATUS_OTHER; } - //更新包裹状态 - $orderService = new OrderService(); - $orderService->updatePackageStatus($package, $status); + try { + //更新包裹状态 + (new OrderPackageService())->updatePackageStatus($package, $status); + } catch (OrderPackageAlreadyCheckedException $e) { + } } //记录物流信息 KuaidiLog::updateOrCreate([ diff --git a/app/Services/OrderPackageService.php b/app/Services/OrderPackageService.php new file mode 100644 index 00000000..d2991e64 --- /dev/null +++ b/app/Services/OrderPackageService.php @@ -0,0 +1,76 @@ +update([ + 'status'=>$status, + ]); + + return; + } + + // 签收包裹 + $this->checkPackage($package, $status === OrderPackage::STATUS_AUTOCHECK); + + // 如果订单包裹未发完 + if ($package->order->isShipped()) { + return; + } + + // 如果订单有未签收的未作废的包裹 + if (! $package->order->where('is_failed', false)->unchecked()->exists()) { + return; + } + + // 自动完成订单 + $package->order->update([ + 'status' => Order::STATUS_COMPLETED, + 'completed_at' => now(), + ]); + } + + /** + * 签收包裹 + * + * @param \App\Models\OrderPackage $package + * @param bool $auto + * @param \Illuminate\Support\Carbon|null $time + * @return void + * + * @throws \App\Exceptions\OrderPackageAlreadyCheckedException + */ + public function checkPackage(OrderPackage $package, bool $auto = false, ?Carbon $time = null) + { + if ($package->isChecked()) { + throw new OrderPackageAlreadyCheckedException('包裹已签收'); + } + + $package->update([ + 'status'=> $auto ? OrderPackage::STATUS_AUTOCHECK : OrderPackage::STATUS_CHECK, + 'checked_at' => $time ?: now(), + ]); + + // 更新商品的售后过期时间 + $package->orderProducts()->update([ + 'after_expire_at'=> $package->checked_at->addDays(config('settings.sale_after_expire_days', 7)), + ]); + } +}