Quellcode durchsuchen

称重队列推送订单,补充即时账单计算

Zhouzhendong vor 5 Jahren
Ursprung
Commit
6a0a46e30d

+ 2 - 1
app/Http/Controllers/TestController.php

@@ -133,7 +133,8 @@ class TestController extends Controller
     }
 
     public function zzd(){
-
+        $owner = Owner::query()->first();
+        dd($owner->loadCount("ownerPriceExpresses"));
     }
 
     public function syncWeight()

+ 2 - 0
app/Http/Controllers/api/thirdPart/weight/PackageController.php

@@ -6,6 +6,7 @@ use App\Events\WeighedEvent;
 use App\Http\Controllers\Controller;
 use App\Http\Controllers\LogisticNumberFeatureController;
 use App\Jobs\FetchPackageFromOracle;
+use App\Jobs\WeightUpdateInstantBill;
 use App\MeasuringMachine;
 use App\Order;
 use App\OrderPackage;
@@ -298,6 +299,7 @@ class PackageController extends Controller
         if(!empty($package->order))
             Waybill::setWeightByOrderCode($package->order->code,$package->weight);
         event(new WeighedEvent($package));
+        dispatch(new WeightUpdateInstantBill($package));
         $response=["msg"=>"保存成功",
             "code"=>200,
             "data"=>true,

+ 45 - 0
app/Jobs/WeightUpdateInstantBill.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Jobs;
+
+use App\OrderPackage;
+use App\Services\OrderService;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class WeightUpdateInstantBill implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    /** @var \stdClass  */
+    protected $package;
+    /**
+     * Create a new job instance.
+     *
+     * @param OrderPackage $package
+     *
+     * @return void
+     */
+    public function __construct(OrderPackage $package)
+    {
+        $this->package = $package;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @param OrderService $service
+     *
+     * @return void
+     */
+    public function handle(OrderService $service)
+    {
+        if (!$this->package->weight)return;
+        $this->package->loadMissing("order");
+        if (!$this->package->order)return;
+        $service->reviseLogisticFee($this->package->order);
+    }
+}

+ 41 - 2
app/Services/OrderService.php

@@ -1055,8 +1055,7 @@ class OrderService
 
                 $fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
                 if ($fee<0)$logistic_fee = null;
-
-                $logistic_fee += $fee;
+                else $logistic_fee += $fee;
             }
         }
         if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
@@ -1104,4 +1103,44 @@ class OrderService
         return $count->c;
     }
 
+    /**
+     * 校正运输费
+     *
+     * @param Order $order
+     *
+     * @return bool
+     */
+    public function reviseLogisticFee(Order $order):bool
+    {
+        /** @var \stdClass $order */
+        if (!$order || $order->wms_status != '订单完成')return false; //订单不存在或状态不为完成
+        $feeBill = OwnerFeeDetail::query()->where("outer_table_name","orders")
+            ->where("outer_id",$order->id)->whereNull("logistic_fee")->first();
+        if (!$feeBill)return false; //是否已有即时账单,没有跳出
+        $order->loadMissing("packages","owner");//加载包裹
+        if (!$order->packages || !$order->owner)return false;
+        $order->owner->loadCount("ownerPriceExpresses");
+        if ($order->owner->owner_price_expresses_count < 1)return false; //不存在计费模型 跳出
+        foreach ($order->packages as $package)if (!$package->weight)return false; //包裹存在且全部存在数量
+
+        $logisticFee = 0;
+        foreach ($order->packages as $package){
+            if ($logisticFee!==null){
+                $provinceName = mb_substr($order->province,0,2);
+                $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
+                    return Province::query()->where("name","like",$provinceName."%")->first();
+                },86400);
+                if (!$province)$logisticFee = null;
+
+                $fee = app("OwnerPriceExpressService")->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
+                if ($fee<0)$logisticFee = null;
+                else $logisticFee += $fee;
+            }
+        }
+        if ($logisticFee===null || $logisticFee<0)
+            LogService::log(__METHOD__,"ERROR-校正即时账单计算物流费错误","订单ID:".$order->id."  费用结果:".$logisticFee);
+        else $feeBill->update(["logistic_fee"=>$logisticFee]);
+        return true;
+    }
+
 }