6
0
Fork 0

更新包裹状态

release
李静 2021-12-20 15:30:25 +08:00
parent 07fd87fcd1
commit f0c2fde4ac
4 changed files with 104 additions and 3 deletions

View File

@ -0,0 +1,11 @@
<?php
namespace App\Exceptions;
class OrderPackageAlreadyCheckedException extends BizException
{
public function __construct()
{
parent::__construct('包裹已签收');
}
}

View File

@ -37,6 +37,7 @@ class OrderPackage extends Model
];
protected $casts = [
'checked_at' => '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]);
}
}

View File

@ -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([

View File

@ -0,0 +1,76 @@
<?php
namespace App\Services;
use App\Exceptions\OrderPackageAlreadyCheckedException;
use App\Models\Order;
use App\Models\OrderPackage;
use Illuminate\Support\Carbon;
class OrderPackageService
{
/**
* 更新包裹状态
*
* @param \App\Models\OrderPackage $packages
* @param int $status
* @return void
*/
public function updatePackageStatus(OrderPackage $package, int $status): void
{
// 如果不是签收包裹,则直接更新包裹状态
if (! in_array($status, [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])) {
$package->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)),
]);
}
}