From f0c2fde4ac563e9518fde4cf14c043fc6a3ec80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Mon, 20 Dec 2021 15:30:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8C=85=E8=A3=B9=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrderPackageAlreadyCheckedException.php | 11 +++ app/Models/OrderPackage.php | 11 +++ app/Services/Kuaidi100Service.php | 9 ++- app/Services/OrderPackageService.php | 76 +++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 app/Exceptions/OrderPackageAlreadyCheckedException.php create mode 100644 app/Services/OrderPackageService.php 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)), + ]); + } +}