更新包裹状态
parent
07fd87fcd1
commit
f0c2fde4ac
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
|
class OrderPackageAlreadyCheckedException extends BizException
|
||||||
|
{
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct('包裹已签收');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -37,6 +37,7 @@ class OrderPackage extends Model
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
'checked_at' => 'datetime',
|
||||||
'is_failed' => 'bool',
|
'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 $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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace App\Services;
|
namespace App\Services;
|
||||||
|
|
||||||
use App\Exceptions\BizException;
|
use App\Exceptions\BizException;
|
||||||
|
use App\Exceptions\OrderPackageAlreadyCheckedException;
|
||||||
use App\Models\KuaidiLog;
|
use App\Models\KuaidiLog;
|
||||||
use App\Models\OrderPackage;
|
use App\Models\OrderPackage;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
|
|
@ -1397,9 +1398,11 @@ class Kuaidi100Service
|
||||||
$status = OrderPackage::STATUS_OTHER;
|
$status = OrderPackage::STATUS_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//更新包裹状态
|
try {
|
||||||
$orderService = new OrderService();
|
//更新包裹状态
|
||||||
$orderService->updatePackageStatus($package, $status);
|
(new OrderPackageService())->updatePackageStatus($package, $status);
|
||||||
|
} catch (OrderPackageAlreadyCheckedException $e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//记录物流信息
|
//记录物流信息
|
||||||
KuaidiLog::updateOrCreate([
|
KuaidiLog::updateOrCreate([
|
||||||
|
|
|
||||||
|
|
@ -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)),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue