瀏覽代碼

订单生成即时账单

Zhouzhendong 5 年之前
父節點
當前提交
3f518cdf97

+ 12 - 3
app/Http/Controllers/TestController.php

@@ -10,6 +10,7 @@ use App\Console\Commands\SyncWMSOrderTask;
 use App\Events\CancelOrder;
 use App\Imports\OrderTrackingImport;
 use App\InventoryAccount;
+use App\Jobs\OrderCreateInstantBill;
 use App\LaborReport;
 use App\Feature;
 use App\Log;
@@ -98,9 +99,17 @@ class TestController extends Controller
         }
     }
     public function test4(){
-        $a = [];
-        if (!$a)dd(2);
-        dd(1);
+        $order = Order::query()->whereHas("packages",function ($query){
+            /** @var Builder $query */
+            $query->whereHas("commodities",function ($query){
+                /** @var Builder $query */
+                $query->whereHas("commodity",function ($query){
+                    /** @var Builder $query */
+                    $query->whereNotNull("name");
+                });
+            });
+        })->first();
+        OrderCreateInstantBill::dispatch($order);
     }
     public function t($a)
     {

+ 45 - 0
app/Jobs/OrderCreateInstantBill.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Order;
+use App\Services\LogService;
+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 OrderCreateInstantBill implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+
+    protected $order;
+    /**
+     * Create a new job instance.
+     *
+     * @param Order $order
+     * @return void
+     */
+    public function __construct(Order $order)
+    {
+        $this->order = $order;
+    }
+
+    /**
+     *
+     * @param OrderService $service
+     * @return void
+     */
+    public function handle(OrderService $service)
+    {
+        try{
+            $bool = $service->createInstantBill($this->order);
+            if (!$bool)LogService::log(__METHOD__,"EXCEPTION-订单生成即时账单",$this->order->toJson());
+        }catch (\Exception $e){
+            LogService::log(__METHOD__,"ERROR-订单生成即时账单",$this->order->toJson()." | ".$e->getMessage());
+        }
+    }
+}

+ 64 - 14
app/Services/OrderService.php

@@ -18,6 +18,7 @@ use App\Shop;
 use App\ValueStore;
 use App\Warehouse;
 use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\Cache;
@@ -1125,29 +1126,78 @@ class OrderService
     public function createInstantBill(Order $order):bool
     {
         //检查订单对象
-        if (!$order || $order->status != "订单完成")return false;
-        if (!$order->packages)$order->load("packages");
+        if (!$order || $order->wms_status != "订单完成")return false;
+        if (!$order->packages || !$order->packages[0]->commodities || !$order->packages[0]->commodities[0]->commodity)$order->load(["packages"=>function($query){
+            /** @var Builder $query */
+            $query->with(["commodities"=>function($query){
+                /** @var Builder $query */
+                $query->with("commodity");
+            }]);
+        }]);
 
         /** @var OwnerPriceExpressService $service */
         $service = app("OwnerPriceExpressService");
         $logistic_fee = 0;
-        foreach ($order->packages as $package){
-            $provinceName = $order->province;
-            $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
-                return app("ProvinceService")->first(["name"=>$provinceName]);
-            },86400);
-            if (!$province){$logistic_fee = null;break;}
+        $commodities = [];
+        $amount = 0;
+        $volume = 0;
+        $weight = 0;
+        $logistic_bill = "";
+        foreach ($order->packages as &$package){
+            $logistic_bill .= $package->logistic_number.",";
+            $volume += $package->bulk;
+            $weight += $package->weight;
+
+            // 四维转二维
+            foreach($package->commodities as &$commodity){
+                $commodity["commodity_name"] = $commodity->commodity ? $commodity->commodity->name : '';
+                $commodity["sku"] = $commodity->commodity ? $commodity->commodity->sku : '';
+                $amount += $commodity->amount;
+            }
+            $commodities = array_merge($commodities,$package->commodities->toArray());
+
+            if ($logistic_fee!==null){
+                $provinceName = $order->province;
+                $province = app(CacheService::class)->getOrExecute("province_".$provinceName,function ()use($provinceName){
+                    return app("ProvinceService")->first(["name"=>$provinceName]);
+                },60);
+                if (!$province)$logistic_fee = null;
 
-            $fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
-            if ($fee<0){$logistic_fee = null;break;}
+                $fee = $service->matching($package->weight, $order->owner_id, $order->logistic_id, $province->id);
+                if ($fee<0)$logistic_fee = null;
 
-            $logistic_fee += $fee;
+                $logistic_fee += $fee;
+            }
         }
+        if ($logistic_fee!==null && $logistic_fee<0)$logistic_fee = null;
+
+        $object = ["commodities"=>$commodities,"logistic_name"=>($order->logistic ? $order->logistic->name : ''),"shop_name"=>($order->shop ? $order->shop->name : '')];
+        $mapping = ["packages"=>"commodities","商品名称"=>"commodity_name","承运商"=>"logistic_name","店铺类型"=>"shop_name"];
 
-        $work_fee = 0;
         /** @var OwnerPriceOperationService $service */
         $service = app("OwnerPriceOperationService");
-        $service->matchRule($order,[]);
-
+        $work_fee = $service->matchRule($object,$mapping,$order->owner_id,"出库");
+        if ($work_fee < 0)$work_fee = null;
+
+       if (app("OwnerFeeDetailService")->create([
+            "owner_id"          => $order->owner_id,
+            "worked_at"         => $order->wms_edittime,
+            "type"              => "发货",
+            "shop_id"           => $order->shop_id,
+            "operation_bill"    => $order->client_code,
+            "consignee_name"    => $order->consignee_name,
+            "consignee_phone"   => $order->consignee_phone,
+            "commodity_amount"  => $amount,
+            "logistic_bill"     => rtrim($logistic_bill,","),
+            "volume"            => $volume,
+            "weight"            => $weight,
+            "logistic_id"       => $order->logistic_id,
+            "work_fee"          => $work_fee,
+            "logistic_fee"      => $logistic_fee,
+            "created_at"        => date('Y-m-d H:i:s'),
+            "outer_id"          => $order->id,
+            "outer_table_name"  => "orders",
+        ]))return true;
+       return false;
     }
 }

+ 5 - 0
app/Services/OwnerFeeDetailService.php

@@ -55,4 +55,9 @@ Class OwnerFeeDetailService
         return $query->sql();
     }
 
+    public function create(array $params)
+    {
+        return OwnerFeeDetail::query()->create($params);
+    }
+
 }

+ 29 - 10
app/Services/OwnerPriceOperationService.php

@@ -104,11 +104,10 @@ Class OwnerPriceOperationService
      * @param array $columnMapping       key-val
      * @param string $owner_id
      * @param string $type
-     * @param string $sku
      * @return double
      * 错误代码: -1:无匹配对象 -2:无计费模型 -3:未知单位 -4:sku为空 -5:货主未找到 -6:无箱规 -7:未匹配到计费模型
      */
-    public function matchRule($matchObject, $columnMapping, $owner_id, $sku = null, $type = '出库')
+    public function matchRule($matchObject, $columnMapping, $owner_id, $type = '出库')
     {
         $unitModels = Unit::query()->whereIn("name",["件","箱","单"])->get();
         $units = [];
@@ -144,7 +143,12 @@ Class OwnerPriceOperationService
                     if ($bool === true){
                         if (!isset($units[$rule->ownerInStorageRule->unit_id])) return -3;
                         if ($units[$rule->ownerInStorageRule->unit_id] == '箱'){ //为箱时同步商品寻找箱规
-                            $sum = $this->changeUnit($sum,$owner_id,$sku);
+                            $sumTemp = 0;
+                            $packageColumn = $columnMapping["packages"] ?? "packages";
+                            foreach ($matchObject[$packageColumn] as $commodity){
+                                $sumTemp += $this->changeUnit($sum,$owner_id,$commodity["sku"]);
+                            }
+                            $sum = $sumTemp;
                             if ($sum<0)return $sum;
                         }
                         if ($units[$rule->ownerInStorageRule->unit_id] == '单')$sum = 1; //为单时数量设为1;
@@ -153,7 +157,12 @@ Class OwnerPriceOperationService
                 }else{
                     if (!isset($units[$rule->ownerInStorageRule->unit_id])) return -3;
                     if ($units[$rule->ownerInStorageRule->unit_id] == '箱'){ //为箱时同步商品寻找箱规
-                        $sum = $this->changeUnit($sum,$owner_id,$sku);
+                        $sumTemp = 0;
+                        $packageColumn = $columnMapping["packages"] ?? "packages";
+                        foreach ($matchObject[$packageColumn] as $commodity){
+                            $sumTemp += $this->changeUnit($sum,$owner_id,$commodity["sku"]);
+                        }
+                        $sum = $sumTemp;
                         if ($sum<0)return $sum;
                     }
                     if ($units[$rule->ownerInStorageRule->unit_id] == '单')$sum = 1; //为单时数量设为1;
@@ -168,11 +177,11 @@ Class OwnerPriceOperationService
             if ($rule->strategy == '特征'){
                 $bool = app("FeatureService")->matchFeature($rule->feature,$columnMapping,$matchObject);//匹配特征
                 if ($bool === true){
-                    $money = $this->matchOutStorage($rule->ownerOutStorageRules,$columnMapping,$matchObject,$units,$owner_id,$sku);
+                    $money = $this->matchOutStorage($rule->ownerOutStorageRules,$columnMapping,$matchObject,$units,$owner_id);
                     if ($money>0)return $money;
                 };
             }else{
-                $money = $this->matchOutStorage($rule->ownerOutStorageRules,$columnMapping,$matchObject,$units,$owner_id,$sku);
+                $money = $this->matchOutStorage($rule->ownerOutStorageRules,$columnMapping,$matchObject,$units,$owner_id);
                 if ($money>0)return $money;
             };
         }
@@ -186,7 +195,7 @@ Class OwnerPriceOperationService
         return ceil($amount/$pack);
     }
 
-    private function matchOutStorage($rules, $columnMapping, $matchObject, $units, $owner_id, $sku)
+    private function matchOutStorage($rules, $columnMapping, $matchObject, $units, $owner_id)
     {
         $amountColumn = $columnMapping["amount"] ?? "amount";
         $packageColumn = $columnMapping["packages"] ?? "packages";
@@ -200,7 +209,7 @@ Class OwnerPriceOperationService
                 case "特征":
                     foreach ($packages as &$package){
                         if ($package["price"] ?? false)continue;
-                        if (!app("FeatureService")->matchFeature($rule->feature,["商品名称"=>"commodity"],["commodity"=>$package[$commodityColumn] ?? ''])) continue;
+                        if (!app("FeatureService")->matchFeature($rule->feature,["商品名称"=>$commodityColumn],["commodity"=>$package[$commodityColumn] ?? ''])) continue;
 
                         if (!$unitName)$unitName = $units[$rule->unit_id];
                         else {
@@ -210,7 +219,12 @@ Class OwnerPriceOperationService
                         $package["price"] = $rule->unit_price;
                         if (!isset($units[$rule->unit_id]) || $units[$rule->unit_id] == '单')return -3;
                         if ($units[$rule->unit_id] == '箱'){ //为箱时同步商品寻找箱规
-                            $amount = $this->changeUnit($package[$amountColumn],$owner_id,$sku);
+                            $sumTemp = 0;
+                            $packageColumn = $columnMapping["packages"] ?? "packages";
+                            foreach ($matchObject[$packageColumn] as $commodity){
+                                $sumTemp += $this->changeUnit($package[$amountColumn],$owner_id,$commodity["sku"]);
+                            }
+                            $amount = $sumTemp;
                             if ($amount<0)return $amount;
                             $package[$amountColumn] = $amount;
                         }
@@ -228,7 +242,12 @@ Class OwnerPriceOperationService
                         $package["price"] = $rule->unit_price;
                         if (!isset($units[$rule->unit_id]) || $units[$rule->unit_id] == '单')return -3;
                         if ($units[$rule->unit_id] == '箱'){ //为箱时同步商品寻找箱规
-                            $amount = $this->changeUnit($package[$amountColumn],$owner_id,$sku);
+                            $sumTemp = 0;
+                            $packageColumn = $columnMapping["packages"] ?? "packages";
+                            foreach ($matchObject[$packageColumn] as $commodity){
+                                $sumTemp += $this->changeUnit($package[$amountColumn],$owner_id,$commodity["sku"]);
+                            }
+                            $amount = $sumTemp;
                             if ($amount<0)return $amount;
                             $package[$amountColumn] = $amount;
                         }

+ 1 - 0
app/Services/OwnerService.php

@@ -56,6 +56,7 @@ Class OwnerService
                     'name' => $basCustomer['descr_c'],
                     'created_at' => Carbon::now()->format('Y-m-d H:i:s'),
                 ]);
+                continue;
             }
             if ($owner['name']!=$basCustomer['descr_c']){
                 $owner->update([

+ 2 - 2
phpunit.xml

@@ -34,8 +34,8 @@
         <server name="APP_ENV" value="testing"/>
         <server name="BCRYPT_ROUNDS" value="4"/>
         <server name="CACHE_DRIVER" value="redis"/>
-        <server name="DB_CONNECTION" value="sqlite"/>
-        <server name="DB_DATABASE" value=":memory:"/>
+        <!--<server name="DB_CONNECTION" value="sqlite"/>
+        <server name="DB_DATABASE" value=":memory:"/>-->
         <server name="MAIL_DRIVER" value="array"/>
         <server name="QUEUE_CONNECTION" value="sync"/>
         <server name="SESSION_DRIVER" value="array"/>