From 0bb4f028cbfed587f697ab8f8f895f898a48a60e Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Sat, 18 Dec 2021 17:50:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8C=85=E8=A3=B9=E7=AD=BE?= =?UTF-8?q?=E6=94=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/OrderPackage.php | 1 - app/Services/Kuaidi100Service.php | 6 +- app/Services/OrderService.php | 125 +++++++++++++++++------------- 3 files changed, 76 insertions(+), 56 deletions(-) diff --git a/app/Models/OrderPackage.php b/app/Models/OrderPackage.php index 71421fee..3f732abe 100644 --- a/app/Models/OrderPackage.php +++ b/app/Models/OrderPackage.php @@ -64,7 +64,6 @@ class OrderPackage extends Model /** * 关联的订单商品 * - * @return void */ public function orderProducts() { diff --git a/app/Services/Kuaidi100Service.php b/app/Services/Kuaidi100Service.php index 6fd11f35..a1dd0716 100644 --- a/app/Services/Kuaidi100Service.php +++ b/app/Services/Kuaidi100Service.php @@ -1386,7 +1386,9 @@ class Kuaidi100Service $shippingCode = Arr::get($lastRsult, 'com', ''); 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); if (!is_null($status)) { @@ -1397,7 +1399,7 @@ class Kuaidi100Service //更新包裹状态 $orderService = new OrderService(); - $orderService->updatePackageStatus($packages, $status); + $orderService->updatePackageStatus($package, $status); } //记录物流信息 KuaidiLog::updateOrCreate([ diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index ee339cd2..fc046c06 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -623,78 +623,97 @@ class OrderService * @param integer $status * @return void */ - public function updatePackageStatus(?Collection $packages, int $status) + public function updatePackageStatus(OrderPackage $package, int $status) { - if ($packages instanceof OrderPackage) { - $packages[] = $packages; - $packages = collect($packages); + //如果包裹已签收则不再更新包裹状态 + if ($package->status == OrderPackage::STATUS_CHECK || $package->status == OrderPackage::STATUS_AUTOCHECK) { + return; } - //如果签收状态 if ($status == OrderPackage::STATUS_CHECK || $status == OrderPackage::STATUS_AUTOCHECK) { - $this->checkOrderPackage($packages, $status, now()); + $this->checkOrderPackage($package, $status); } else { - OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([ + $package->update([ '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自动签收(属于用户手动点,或者时间到了) * @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();//没指定签收时间,则默认当前时间 - if ($packages instanceof OrderPackage) { - $packages[] = $packages; - $packages = collect($packages); - } - //物流签收,更新包裹状态。自动签收不更新包裹状态 - if ($status == OrderPackage::STATUS_CHECK) { - OrderPackage::whereIn('id', $packages->pluck('id')->toArray())->update([ - 'status'=> $status, - 'checked_at' => $checkTime, + + //物流签收,更新包裹状态。 + // if ($status == OrderPackage::STATUS_CHECK) { //自动签收不更新包裹状态 + $package->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;//每个订单只更新执行一次 - } - } } /**