Browse Source

优化order查询索引

ANG YU 5 years ago
parent
commit
d32d75e9d0

+ 14 - 13
app/Services/OrderCountingRecordService.php

@@ -10,6 +10,7 @@ use App\OrderCountingRecord;
 use App\Warehouse;
 use Carbon\Carbon;
 use DateTime;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Cache;
@@ -30,7 +31,7 @@ class OrderCountingRecordService
     /**
      * @param $start
      * @param $end
-     * @param null $ownerIds    
+     * @param null $ownerIds ;
      * @param string $unit
      * @param $user
      * @return mixed
@@ -189,7 +190,7 @@ class OrderCountingRecordService
             $item->each(function ($item, $owner_id) use ($dateStr, $unit) {
                 $key = "order_counting_records_{$dateStr}_{$owner_id}_{$unit}";
                 $ttl = 3600 * 24;
-                if ($dateStr==Carbon::now()->toDateString()) {
+                if ($dateStr == Carbon::now()->toDateString()) {
                     $ttl = 1;
                 }
                 Cache::put($key, $item, $ttl);
@@ -203,7 +204,7 @@ class OrderCountingRecordService
         foreach ($targetOwnerIdsUnderDates as $dateStr => $ownerIds) {
             foreach ($ownerIds as $key => $ownerId) {
                 $key1 = 'owner_id=' . $ownerId . ' date_target' . $dateStr;
-                if (isset($map[$key1])&&$this->isNotCurrentDate($dateStr)) {
+                if (isset($map[$key1]) && $this->isNotCurrentDate($dateStr)) {
                     //中间表查找到数据,并且时间不是当前日期
                     unset($targetOwnerIdsUnderDates[$dateStr][$key]);
                 }
@@ -232,12 +233,11 @@ class OrderCountingRecordService
         $isHasCurrentDate = false;
         $currentDate = null;
         foreach ($targetOwnerIdsUnderDates as $dateStr => $ownerIds) {
-            if ($this->isNotCurrentDate($dateStr))
-            {
+            if ($this->isNotCurrentDate($dateStr)) {
                 foreach ($ownerIds as $ownerId) {
-                    if ($resultOrders->where('date_target', $dateStr)->where('owner_id', $ownerId)->count()==0) {
-                       $result->push([
-                            'owner_id' =>$ownerId,
+                    if ($resultOrders->where('date_target', $dateStr)->where('owner_id', $ownerId)->count() == 0) {
+                        $result->push([
+                            'owner_id' => $ownerId,
                             'shop_id' => null,
                             'warehouse_id' => null,
                             'logistic_id' => null,
@@ -267,7 +267,7 @@ class OrderCountingRecordService
         });
         if ($isHasCurrentDate) {
             //删除OrderCountingRecord表中与当前日期相关的数据,之后的批量插入重新插入这部分数据
-            OrderCountingRecord::query()->where('date_target', $currentDate)->where('counting_unit',$unit)->delete();
+            OrderCountingRecord::query()->where('date_target', $currentDate)->where('counting_unit', $unit)->delete();
         }
         OrderCountingRecord::query()->insert($result->toArray());
         return ['resultOrders' => $result];
@@ -329,14 +329,14 @@ class OrderCountingRecordService
 
     /**
      * @param $targetOwnerIdsUnderDates
-     * @return \Illuminate\Database\Eloquent\Builder[]|Collection
+     * @return Builder[]|Collection
      */
     private function getCreateByDatabaseUnitDay($targetOwnerIdsUnderDates)
     {
         $orderSqlBuilder = Order::query()->selectRaw("owner_id,warehouse_id,shop_id,logistic_id,count(1) as amounts ,DATE_FORMAT(created_at,'%Y-%m-%d') as date_target");
         foreach ($targetOwnerIdsUnderDates as $dateStr => $ownerIds) {
             $orderSqlBuilder->orWhere(function ($query) use ($ownerIds, $dateStr) {
-                $query->whereIn('owner_id', $ownerIds)->whereDate('created_at', $dateStr)->where('wms_status', '订单完成');
+                $query->whereIn('owner_id', $ownerIds)->where('created_at', '>', $dateStr)->where('created_at', '<', Carbon::parse($dateStr)->addDay()->toDateString())->where('wms_status', '订单完成');
             });
         }
         return $orderSqlBuilder->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id', 'date_target'])->get();
@@ -348,7 +348,7 @@ class OrderCountingRecordService
         foreach ($targetOwnerIdsUnderDates as $dateStr => $ownerIds) {
             $orderSqlBuilder->orWhere(function ($query) use ($ownerIds, $dateStr) {
                 $dateStr = (new DateTime())->setISODate(Str::of($dateStr)->explode('-')[0], Str::of($dateStr)->explode('-')[1])->format('yy-m-d');
-                $query->whereIn('owner_id', $ownerIds)->whereDate('created_at', '>=', $dateStr)->whereDate('created_at', '<', Carbon::parse($dateStr)->addWeek()->toDateString())->where('wms_status', '订单完成');;
+                $query->whereIn('owner_id', $ownerIds)->where('created_at', '>', $dateStr)->where('created_at', '<=', Carbon::parse($dateStr)->addWeek()->toDateString())->where('wms_status', '订单完成');
             });
         }
         return $orderSqlBuilder->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id', 'date_target'])->get();
@@ -361,7 +361,8 @@ class OrderCountingRecordService
             $orderSqlBuilder->orWhere(function ($query) use ($ownerIds, $dateStr) {
                 $year = Str::of($dateStr)->explode('-')[0];
                 $month = Str::of($dateStr)->explode('-')[1];
-                $query->whereIn('owner_id', $ownerIds)->whereMonth('created_at', $month)->whereYear('created_at', $year)->where('wms_status', '订单完成');;
+                $dateStr = $year . '-' . $month . '-01';
+                $query->whereIn('owner_id', $ownerIds)->where('created_at', '>', $dateStr)->where('created_at', '<', Carbon::parse($dateStr)->addMonth()->toDateString())->where('wms_status', '订单完成');
             });
         }
         return $orderSqlBuilder->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id', 'date_target'])->get();

+ 1 - 0
phpunitSh

@@ -0,0 +1 @@
+ bash vendor/bin/phpunit --testsuite $1

+ 86 - 12
tests/Services/OrderCountingRecordService/OrderCountingRecordServiceGetTest.php

@@ -29,8 +29,9 @@ class OrderCountingRecordServiceGetTest extends TestCase
     /**
      * @test
      */
-    public function current_date()
+    public function counting_unit_date()
     {
+        cache()->flush();
         $start = Carbon::now()->subDays(2)->format('Y-m-d');
         $end = (new Carbon())->toDateString();
 
@@ -40,24 +41,97 @@ class OrderCountingRecordServiceGetTest extends TestCase
         $orders = factory(Order::class)->times(20)->create([
             'created_at' => Carbon::now(),
             'owner_id' => $owner->id,
-            'wms_status'=>'订单完成']);
+            'wms_status' => '订单完成']);
         $orders = factory(Order::class)->times(10)->create([
             'created_at' => Carbon::now()->subDays(1),
             'owner_id' => $owner->id,
-            'wms_status'=>'订单完成']);
+            'wms_status' => '订单完成']);
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
-        $this->assertEquals([0,10,20], array_column($result, 'counter'));
+        $this->assertEquals([0, 10, 20], array_column($result, 'counter'));
         cache()->flush();
         $orders = factory(Order::class)->times(20)->create([
             'created_at' => Carbon::now(),
             'owner_id' => $owner->id,
-            'wms_status'=>'订单完成']);
+            'wms_status' => '订单完成']);
         $result = $this->orderCountingRecordService->orderCountingRecords($start, $end)->toArray();
-        $this->assertEquals([0,10,40], array_column($result, 'counter'));
+        $this->assertEquals([0, 10, 40], array_column($result, 'counter'));
+        cache()->flush();
+        Order::query()->delete();
+        Owner::query()->delete();
+        User::query()->delete();
+    }
+
+    /**
+     * @test
+     */
+    public function counting_unit_week()
+    {
+        cache()->flush();
+        $start = Carbon::now()->subWeek()->format('Y-m-d');
+        $end = (new Carbon())->toDateString();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owner = factory(Owner::class)->create();
+        $orders1 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+
+        $orders2 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now()->subWeek(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
+        $this->assertEquals([20, 20], array_column($result, 'counter'));
         cache()->flush();
+        $orders1 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
 
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '周')->toArray();
+        $this->assertEquals([20, 40], array_column($result, 'counter'));
+        Order::query()->delete();
+        Owner::query()->delete();
+        User::query()->delete();
     }
 
+    /**
+     * @test
+     */
+    public function counting_unit_month()
+    {
+        cache()->flush();
+        $start = Carbon::now()->subMonth()->format('Y-m-d');
+        $end = (new Carbon())->toDateString();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+        $owner = factory(Owner::class)->create();
+        $orders1 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+
+        $orders2 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now()->subMonth(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
+        $this->assertEquals([20, 20], array_column($result, 'counter'));
+        cache()->flush();
+        $orders1 = factory(Order::class)->times(20)->create([
+            'created_at' => Carbon::now(),
+            'owner_id' => $owner->id,
+            'wms_status' => '订单完成']);
+
+        $result = $this->orderCountingRecordService->orderCountingRecords($start, $end, null, '月')->toArray();
+        $this->assertEquals([20, 40], array_column($result, 'counter'));
+        Order::query()->delete();
+        Owner::query()->delete();
+        User::query()->delete();
+    }
+
+
     /**
      * @test
      */
@@ -72,14 +146,14 @@ class OrderCountingRecordServiceGetTest extends TestCase
      */
     public function isNotCurrentDate()
     {
-        $day_ture =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subDay()->format('Y-m-d'));
-        $day_false =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->format('Y-m-d'));
+        $day_ture = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subDay()->format('Y-m-d'));
+        $day_false = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->format('Y-m-d'));
 
-        $week_ture =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subWeek()->year . '-' . Carbon::now()->subWeek()->week);
-        $week_false =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->year . '-' . Carbon::now()->week);
+        $week_ture = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subWeek()->year . '-' . Carbon::now()->subWeek()->week);
+        $week_false = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->year . '-' . Carbon::now()->week);
 
-        $month_true =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subMonth()->year.'-'. Carbon::now()->subMonth()->month);
-        $month_false =$this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->year.'-'. Carbon::now()->month);
+        $month_true = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->subMonth()->year . '-' . Carbon::now()->subMonth()->month);
+        $month_false = $this->orderCountingRecordService->isNotCurrentDate(Carbon::now()->year . '-' . Carbon::now()->month);
 
         $this->assertTrue($day_ture);
         $this->assertFalse($day_false);