调整包裹签收逻辑
parent
43c933caea
commit
0bb4f028cb
|
|
@ -64,7 +64,6 @@ class OrderPackage extends Model
|
||||||
/**
|
/**
|
||||||
* 关联的订单商品
|
* 关联的订单商品
|
||||||
*
|
*
|
||||||
* @return void
|
|
||||||
*/
|
*/
|
||||||
public function orderProducts()
|
public function orderProducts()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1386,7 +1386,9 @@ class Kuaidi100Service
|
||||||
$shippingCode = Arr::get($lastRsult, 'com', '');
|
$shippingCode = Arr::get($lastRsult, 'com', '');
|
||||||
if ($shippingNumber) {
|
if ($shippingNumber) {
|
||||||
//找到有这个运单号的包裹
|
//找到有这个运单号的包裹
|
||||||
$packages = OrderPackage::where('shipping_number', $shippingNumber)->get();
|
$package = OrderPackage::where('shipping_number', $shippingNumber)
|
||||||
|
->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])
|
||||||
|
->orderBy('created_at', 'desc')->first();
|
||||||
$status = Arr::get($lastRsult, 'state', null);
|
$status = Arr::get($lastRsult, 'state', null);
|
||||||
|
|
||||||
if (!is_null($status)) {
|
if (!is_null($status)) {
|
||||||
|
|
@ -1397,7 +1399,7 @@ class Kuaidi100Service
|
||||||
|
|
||||||
//更新包裹状态
|
//更新包裹状态
|
||||||
$orderService = new OrderService();
|
$orderService = new OrderService();
|
||||||
$orderService->updatePackageStatus($packages, $status);
|
$orderService->updatePackageStatus($package, $status);
|
||||||
}
|
}
|
||||||
//记录物流信息
|
//记录物流信息
|
||||||
KuaidiLog::updateOrCreate([
|
KuaidiLog::updateOrCreate([
|
||||||
|
|
|
||||||
|
|
@ -623,78 +623,97 @@ class OrderService
|
||||||
* @param integer $status
|
* @param integer $status
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function updatePackageStatus(?Collection $packages, int $status)
|
public function updatePackageStatus(OrderPackage $package, int $status)
|
||||||
{
|
{
|
||||||
if ($packages instanceof OrderPackage) {
|
//如果包裹已签收则不再更新包裹状态
|
||||||
$packages[] = $packages;
|
if ($package->status == OrderPackage::STATUS_CHECK || $package->status == OrderPackage::STATUS_AUTOCHECK) {
|
||||||
$packages = collect($packages);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//如果签收状态
|
//如果签收状态
|
||||||
if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) {
|
if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) {
|
||||||
$this->checkOrderPackage($packages, $status, now());
|
$this->checkOrderPackage($package, $status);
|
||||||
} else {
|
} else {
|
||||||
OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([
|
$package->update([
|
||||||
'status'=>$status,
|
'status'=>$status,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 签收订单包裹
|
* 订单确认收货
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function checkOrder(Order $order)
|
||||||
|
{
|
||||||
|
//获取订单的未作废未签收包裹
|
||||||
|
$packages = $order->packages()->where('is_failed', false)->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])->get();
|
||||||
|
foreach ($packages as $package) {
|
||||||
|
$this->checkPackage($package, OrderPackage::STATUS_AUTOCHECK);
|
||||||
|
}
|
||||||
|
if ($order->isShipped()
|
||||||
|
&& OrderPackage::where('order_id', $order->id)->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])->doesntExist()
|
||||||
|
) {
|
||||||
|
//更新订单完成
|
||||||
|
$order->update([
|
||||||
|
'status' => Order::STATUS_COMPLETED,
|
||||||
|
'completed_at' => now(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签收订单包裹:会更新订单状态
|
||||||
|
*
|
||||||
|
* @param OrderPackage $package
|
||||||
|
* @param integer $status
|
||||||
|
* @param Carbon|null $time
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function checkOrderPackage(OrderPackage $package, int $status, ?Carbon $time = null)
|
||||||
|
{
|
||||||
|
$this->checkPackage($package, $status);
|
||||||
|
//如果订单是发货完成状态,且所有包裹都签收了
|
||||||
|
if ($package->order->isShipped()
|
||||||
|
&& OrderPackage::where('order_id', $package->order_id)->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])->doesntExist()
|
||||||
|
) {
|
||||||
|
//更新订单完成
|
||||||
|
$package->order->update([
|
||||||
|
'status' => Order::STATUS_COMPLETED,
|
||||||
|
'completed_at' => now(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签收包裹
|
||||||
*
|
*
|
||||||
* status 区分3签收(物流推送签收)和11自动签收(属于用户手动点,或者时间到了)
|
* status 区分3签收(物流推送签收)和11自动签收(属于用户手动点,或者时间到了)
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function checkOrderPackage(?Collection $packages, int $status, ?Carbon $time = null)
|
protected function checkPackage(OrderPackage $package, int $status, ?Carbon $time = null)
|
||||||
{
|
{
|
||||||
|
//如果不是签收状态,则直接退出
|
||||||
|
if (!in_array($status, [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$checkTime = $time ?? now();//没指定签收时间,则默认当前时间
|
$checkTime = $time ?? now();//没指定签收时间,则默认当前时间
|
||||||
if ($packages instanceof OrderPackage) {
|
|
||||||
$packages[] = $packages;
|
//物流签收,更新包裹状态。
|
||||||
$packages = collect($packages);
|
// if ($status == OrderPackage::STATUS_CHECK) { //自动签收不更新包裹状态
|
||||||
}
|
$package->update([
|
||||||
//物流签收,更新包裹状态。自动签收不更新包裹状态
|
'status'=> $status,
|
||||||
if ($status == OrderPackage::STATUS_CHECK) {
|
'checked_at' => $checkTime,
|
||||||
OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([
|
]);
|
||||||
'status'=> $status,
|
// }
|
||||||
'checked_at' => $checkTime,
|
//如果这个包裹的订单状态是发货中,发货完成
|
||||||
|
if ($package->order->isShipped() || $package->order->isShipping()) {
|
||||||
|
//处理这个包裹的商品的售后过期时间
|
||||||
|
$package->orderProducts()->update([
|
||||||
|
'after_expire_at'=>$checkTime->addDays(config('settings.sale_after_expire_days', 7)),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//按订单ID分组包裹
|
|
||||||
$packages = $packages->groupBy('order_id');
|
|
||||||
|
|
||||||
//获取所有订单
|
|
||||||
$orders = Order::whereIn('id', $packages->keys()->toArray())->get()->keyBy('id');
|
|
||||||
|
|
||||||
$checkedOrder = [];//已执行过订单状态更新的订单IDS
|
|
||||||
//遍历包裹-处理签收
|
|
||||||
foreach ($packages as $orderId => $orderPackages) {
|
|
||||||
$_order = $orders[$orderId];
|
|
||||||
//如果订单已完成,则不更新
|
|
||||||
if ($_order->isCompleted()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//处理包裹下订单商品售后过期时间
|
|
||||||
foreach ($orderPackages as $package) {
|
|
||||||
$package->orderProducts()->update([
|
|
||||||
'after_expire_at'=>$checkTime->addDays(7),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//处理订单已完成发货,且包裹已全部签收,则更新为完成状态、记录完成时间;
|
|
||||||
if (!in_array($_order->id, $checkedOrder)
|
|
||||||
&& $_order->isShipped()
|
|
||||||
&& $_order->packages()->where('is_failed', false)->whereNotIn('status', [OrderPackage::STATUS_CHECK, OrderPackage::STATUS_AUTOCHECK])->doesntExist()
|
|
||||||
) {
|
|
||||||
Order::where('id', $_order->id)->update([
|
|
||||||
'status' => Order::STATUS_COMPLETED,
|
|
||||||
'completed_at' => now(),
|
|
||||||
]);
|
|
||||||
$checkedOrder[] = $_order->id;//每个订单只更新执行一次
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue