Просмотр исходного кода

优化问题件同步退回件 退货状态

ajun 5 лет назад
Родитель
Сommit
5ec8638640
4 измененных файлов с 125 добавлено и 125 удалено
  1. 52 90
      app/OrderIssue.php
  2. 2 1
      database/factories/OrderFactory.php
  3. 52 34
      tests/old/OrderIssueTest.php
  4. 19 0
      yarn.lock

+ 52 - 90
app/OrderIssue.php

@@ -125,103 +125,65 @@ class OrderIssue extends Model
      */
     public function syncRejectingStatus()
     {
-        if(!$this->order_id)return;
-        $rejectedItems = [];
-        $orderItems = [];
-        $rejectedBills = $this->rejectedBills;
-        if(!$rejectedBills)return;
-        $rejectedBillItems = RejectedBillItem::query()->with('quality')
-            ->whereIn('id_rejected_bill',function($query)use($rejectedBills){
-                $query->from('rejected_bills')->select('id')->whereIn('logistic_number_return',$rejectedBills->map(function($rejectedBil){
-                    return $rejectedBil->logistic_number_return;
-                }));
-        })->get();
-
-        if($rejectedBillItems->count()===0){
-            $this->update(['rejecting_status' => '未退回']);
-            return;
-        }
+        $this->syncRejectedBillStatus($this);
+    }
 
-        if($rejectedBillItems->where('quality.name','残次')->count()>0){
-            $this->update(['rejecting_status' => '差异退回']);
-            return;
-        }
-        $barcodeGoods = data_get($rejectedBillItems,'*.barcode_goods');
-        $commodityBarcodes = CommodityBarcode::query()->with('commodity')->whereIn('code',$barcodeGoods)->get();
-        $commodities = Commodity::query()->whereIn('sku',$barcodeGoods)->get();
-
-        foreach ($rejectedBillItems as $item) {
-            $barcode_goods = (string)$item->barcode_goods;
-            $commodity = $commodities->where('sku',$barcode_goods)->first();
-            if(!$commodity){
-                $commodityBarcode = $commodityBarcodes->where('code',$barcode_goods)->first();
-                $barcode_goods = $commodityBarcode->commodity->sku ?? $barcode_goods;
-            }
-            if (!isset($rejectedItems[$barcode_goods])){
-                $rejectedItems[$barcode_goods] = 0;
-            }
-            $rejectedItems[(string)$barcode_goods] += $item->amount;
+    public function syncRejectedBillStatus($orderIssue)
+    {
+        if (!$orderIssue->order_id) return;
+        $orderIssueMap = [];
+        $rejectedMap = [];
+        $owner_id = $orderIssue->order->owner_id;
+
+        // 获取对应订单的所有商品
+        $orderPackageQuery = OrderPackage::query()->selectRaw("id")->where('order_id', $orderIssue->order_id);
+        $orderPackageCommodities = OrderPackageCommodities::query()->with('commodity')->whereIn('order_package_id', $orderPackageQuery)->get();
+        foreach ($orderPackageCommodities as $orderPackageCommodity) {
+            $code = $orderPackageCommodity->commodity->sku;
+            if (empty($orderIssueMap[$code])) $orderIssueMap[$code] = $orderPackageCommodity->amount;
+            else $orderIssueMap[$code] += $orderPackageCommodity->amount;
         }
 
-        $items = OrderPackageCommodities::query()->with('commodity')
-            ->whereIn('order_package_id',function($query){
-                $query->from('order_packages')->selectRaw('id')->where('order_id',$this->order_id);
-            })->get();
-
-        if(count($items) == 0){
-            $this->update(['rejecting_status' => '无']);
-            return;
-        }
-        if (count($items) > 0) {
-            foreach ($items as $item) {
-                $sku = $item['commodity']['sku'];
-                if (! isset($orderItems[$sku]) ?? false){
-                    $orderItems[$sku] = 0;
+        // 获取对应退回单的所有商品
+        $orderIssueRejectedBillQuery = OrderIssueRejectedBill::query()->selectRaw("logistic_number_return")->where("order_issue_id", $orderIssue->id);
+        $RejectedBills = RejectedBill::query()->with('items.quality')->whereIn("logistic_number_return", $orderIssueRejectedBillQuery)->get();
+        /** @var RejectedBill $rejectedBill */
+        foreach ($RejectedBills as $rejectedBill) {
+            foreach ($rejectedBill->items as $item) {
+                $code = $item->barcode_goods;
+                $exists = Commodity::query()->where("sku", $code)->exists();
+                if (!$exists) {
+                    $commodityBarcode = CommodityBarcode::query()->with(['commodity' => function ($query) use ($owner_id) {
+                        $query->where('owner_id', $owner_id);
+                    }])->where('code', $code)->first();
+                    if($commodityBarcode && $commodityBarcode->commodity) $code = $commodityBarcode->commodity->sku;
                 }
-                $orderItems[$sku] += $item->amount;
+                $qualityName = $item->quality->name;
+                if (empty($rejectedMap[$code]) || empty($rejectedMap[$code][$qualityName])) $rejectedMap[$code][$qualityName] = $item->amount;
+                else $rejectedMap[$code][$qualityName] += $item->amount;
             }
-        } else {
-            $this->update(['rejecting_status' => '无']);
-            return;
-        }
-        $rejectedExcess = 0;    // 退回差异
-        $rejectedReview = 0;    // 退回复核  $rejectedItems == $orderItems
-        foreach ($rejectedItems as $key => $items) {
-            if ($orderItems[$key] ?? false) {
-                if ($rejectedItems[$key] == $orderItems[$key])
-                    $rejectedReview++;
-            } else
-                $rejectedExcess++;
-        }
-        if ($rejectedExcess > 0) {
-            $this->update(['rejecting_status' => '差异退回']);
-            return;
-        }
-        // 全部退回 部分退回 超量退回 差异退回 未退回 无
-        $isExcess = 0; // 超量 $orderItems < $rejectedItems
-        $isDiff = 0;   // 部分 $orderItems > $rejectedItems
-        $isAccord = 0; // 相同 $orderItems == $rejectedItems
-        $isLack = 0;   // 缺少 $orderItems != $rejectedItems
-        foreach ($orderItems as $key => $item) {
-            if ($rejectedItems[$key] ?? false) {
-                if ($orderItems[$key] < $rejectedItems[$key])
-                    $isExcess++;
-                else if ($orderItems[$key] > $rejectedItems[$key])
-                    $isDiff++;
-                else if ($orderItems[$key] == $rejectedItems[$key])
-                    $isAccord++;
-            } else
-                $isLack++;
         }
+        // 比较
+        $status = $this->getRejectingStatus($orderIssueMap, $rejectedMap);
+        $this->update(['rejecting_status' => $status]);
+    }
 
-        if($isAccord == $rejectedReview && $isLack == 0 && $isExcess == 0 && $isDiff==0 && $rejectedExcess == 0 )
-            $this->update(['rejecting_status' => '全部退回']);
-        else if($isExcess > 0 && $isAccord ==  $rejectedReview && $isDiff == 0 && $isLack == 0)
-            $this->update(['rejecting_status' => '超量退回']);
-        else if($isDiff >=0 && $isAccord == $rejectedReview && $isLack >=0 && $rejectedExcess ==0 && $isExcess==0)
-            $this->update(['rejecting_status' => '部分退回']);
-        else if($isLack >= 0 && $rejectedExcess>=0 && $isDiff>=0 && $isLack>=0 && $isExcess>=0 && $rejectedReview>=0)
-            $this->update(['rejecting_status' => '差异退回']);
+    private function getRejectingStatus($orderIssueMap, $rejectedMap): string
+    {
+        //未退回,差异退回,全部退回,超量退回,部分退回
+        if (count($rejectedMap) == 0) return "未退回";
+        $equal = 0;
+        $portion = 0;
+        foreach ($rejectedMap as $key => $map) {
+            if (isset($map['残次']) && $map['残次'] > 0) return "差异退回";
+            if (empty($orderIssueMap[$key])) return "差异退回";
+            if ($rejectedMap[$key]['正品'] < $orderIssueMap[$key]) $portion += 1;
+            if ($rejectedMap[$key]['正品'] > $orderIssueMap[$key]) return "超量退回";                    // 超量退回
+            if ($rejectedMap[$key]['正品'] == $orderIssueMap[$key]) $equal += 1;
+        }
+        if ($equal == count($orderIssueMap) && $equal == count($rejectedMap)  && $portion == 0) return "全部退回";        // 全部退回
+        if ($portion > 0) return "部分退回";                                                            // 部分退回
+        return "无";
     }
 
     public function delete()

+ 2 - 1
database/factories/OrderFactory.php

@@ -22,6 +22,7 @@ $factory->define(Order::class, function (Faker $faker) {
         'district'=>$faker->secondaryAddress,
         'address' => $faker->address,
         'wms_status' => $wms_status[rand(0,2)],
-        'wms_edittime' => $faker->dateTimeBetween( '-30 hour', 'now',  null)
+        'wms_edittime' => $faker->dateTimeBetween( '-30 hour', 'now',  null),
+        'owner_id' => $faker->numberBetween(0,10)
     ];
 });

+ 52 - 34
tests/old/OrderIssueTest.php

@@ -21,54 +21,72 @@ use Illuminate\Foundation\Testing\WithFaker;
 use Illuminate\Foundation\Testing\RefreshDatabase;
 use function Matrix\add;
 
-class OrderIssueTest extends TestCase{
+class OrderIssueTest extends TestCase
+{
 
-
-
-    public function testSyncRejectingStatusComparisonIsEqual()
+    public function getTestResult()
     {
         $orderIssue = factory(OrderIssue::class)->create(['rejecting_status' => '未退回']);
-        $orderPackage = factory(OrderPackage::class)->create(['order_id'=>$orderIssue->order->id]);
-        $commodities = factory(Commodity::class)->times(3)->create();
+        $orderPackage = factory(OrderPackage::class)->create(['order_id' => $orderIssue->order->id]);
+        $commodities = factory(Commodity::class)->times(3)->create(['owner_id' => $orderIssue->order->owner_id]);
         $orderPackageCommodities = collect();
         $commodities_barcodes = collect();
-        foreach ($commodities as $commodity){
-            $commodities_barcode = factory(CommodityBarcode::class)->create(['commodity_id'=>$commodity->id]);
+        foreach ($commodities as $commodity) {
+            $commodities_barcode = factory(CommodityBarcode::class)->create(['commodity_id' => $commodity->id]);
             $commodities_barcodes->push($commodities_barcode);
-            $orderPackageCommodity = factory(OrderPackageCommodities::class)->create(['order_package_id'=>$orderPackage->id,'amount'=>1,'commodity_id' =>$commodity->id]);
+            $orderPackageCommodity = factory(OrderPackageCommodities::class)->create(['order_package_id' => $orderPackage->id, 'amount' => 1, 'commodity_id' => $commodity->id]);
             $orderPackageCommodities->push($orderPackageCommodity);
         }
-        $rejectedBill =  factory(RejectedBill::class)->create(['logistic_number_return' => $orderIssue->logistic_number_return]);
-
+        $rejectedBill = factory(RejectedBill::class)->create(['logistic_number_return' => $orderIssue->logistic_number_return]);
         $rejectedBill_items = collect();
-        foreach ($commodities_barcodes as $commodities_barcode){
-            $item = factory(RejectedBillItem::class)->create(['id_rejected_bill'=>$rejectedBill->id,'barcode_goods' => $commodities_barcode->code,'amount'=>1]);
+        foreach ($commodities_barcodes as $commodities_barcode) {
+            $item = factory(RejectedBillItem::class)->create(['id_rejected_bill' => $rejectedBill->id, 'barcode_goods' => $commodities_barcode->code, 'amount' => 1]);
             $rejectedBill_items->push($item);
         }
-        $orderIssueRejectedBill = factory(OrderIssueRejectedBill::class)->create(['order_issue_id'=>$orderIssue->id,'logistic_number_return'=>$rejectedBill->logistic_number_return]);
-        $orderIssue->update(['logistic_number_return' =>$rejectedBill->logistic_number_return ]);
-        $orderIssue= OrderIssue::query()->find($orderIssue->id);
-        $orderIssue->syncRejectingStatus();
-
-        $this->assertEquals($orderIssue->rejecting_status,"完全退回");
-        $orderIssue->order->delete();
-        $orderIssue->forceDelete();
-        $orderPackage->forceDelete();
-        $orderPackageCommodities->map(function($item){
-            $item->delete();
-            return 1;
-        });
-        $rejectedBill->forceDelete();
-        $rejectedBill_items->map(function($item){
-            $item->delete();
-            return 1;
-        });
-        $orderIssueRejectedBill->delete();
+        $orderIssueRejectedBill = factory(OrderIssueRejectedBill::class)->create(['order_issue_id' => $orderIssue->id, 'logistic_number_return' => $rejectedBill->logistic_number_return]);
+        return [
+            'orderIssue' => $orderIssue,
+            'orderPackage' => $orderPackage,
+            'commodities' => $commodities,
+            'orderPackageCommodities' => $orderPackageCommodities,
+            'rejectedBill' => $rejectedBill,
+            'rejectedBill_items' => $rejectedBill_items,
+        ];
     }
 
-    public function testOrderIssue()
+    public function destroyResult(array $arr)
     {
-        $orderIssue = OrderIssue::query()->find(1);
+        if($arr['orderIssue']){
+            $arr['orderIssue']->order->delete();
+            $arr['orderIssue']->delete();
+        }
+        if($arr['orderPackage'])$arr['orderPackage']->delete();
+        if($arr['commodities']){
+            foreach ($arr['commodities'] as $commodity) {
+                CommodityBarcode::query()->where('commodity_id',$commodity->id)->delete();
+                $commodity->delete();
+            }
+        }
+        if($arr['rejectedBill'])$arr['rejectedBill']->delete();
+        if($arr['rejectedBill_items']){
+            foreach ($arr['rejectedBill_items'] as $rejectedBill_item) {
+                $rejectedBill_item->delete();
+            }
+        }
+        OrderIssueRejectedBill::query()->where('Order_Issue_Id',$arr['orderIssue']->id)->delete();
+    }
+
 
+    public function testSyncRejectingStatusComparisonIsEqual()
+    {
+        $arr = $this->getTestResult();
+        $orderIssue = $arr['orderIssue'];
+        $orderIssue->syncRejectingStatus();
+        $orderIssue->refresh();
+        $this->assertEquals($orderIssue->rejecting_status, "全部退回");
+        $this->destroyResult($arr);
     }
+
+
+
 }

+ 19 - 0
yarn.lock

@@ -1376,6 +1376,11 @@ base64-arraybuffer@0.1.5:
   resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
   integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
 
+base64-arraybuffer@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45"
+  integrity sha1-S5RPrAGRqlkHr+LYyZnMxXzoD0U=
+
 base64-js@^1.0.2:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
@@ -2275,6 +2280,13 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
+css-line-break@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/css-line-break/download/css-line-break-1.1.1.tgz#d5e9bdd297840099eb0503c7310fd34927a026ef"
+  integrity sha1-1em90peEAJnrBQPHMQ/TSSegJu8=
+  dependencies:
+    base64-arraybuffer "^0.2.0"
+
 css-loader@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
@@ -3686,6 +3698,13 @@ html-minifier@^3.5.8:
     relateurl "0.2.x"
     uglify-js "3.4.x"
 
+html2canvas@^1.0.0-rc.7:
+  version "1.0.0-rc.7"
+  resolved "https://registry.npm.taobao.org/html2canvas/download/html2canvas-1.0.0-rc.7.tgz#70c159ce0e63954a91169531894d08ad5627ac98"
+  integrity sha1-cMFZzg5jlUqRFpUxiU0IrVYnrJg=
+  dependencies:
+    css-line-break "1.1.1"
+
 http-deceiver@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"