ANG YU %!s(int64=5) %!d(string=hai) anos
pai
achega
7d630a5679

+ 267 - 0
app/Services/NewOrderCountingRecordService.php

@@ -0,0 +1,267 @@
+<?php
+
+
+namespace App\Services;
+
+
+use App\Order;
+use App\OrderCountingRecord;
+use Carbon\Carbon;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Cache;
+
+class NewOrderCountingRecordService
+{
+    public function orderCountingRecords($start, $end, $unit)
+    {
+        $key = 'orderCountingRecords_' . $start . '_' . $end . '_' . $unit . '_' . auth()->id();
+        return \cache()->remember($key, 600, function () use ($start, $end, $unit) {
+            $result = collect();
+            switch ($unit) {
+                case '日':
+                    $result = $this->orderCountingRecordsDay($start, $end, $unit);
+                    break;
+                case '周':
+                    $result = $this->orderCountingRecordsWeek($start, $end, $unit);
+                    break;
+                case '月':
+                    $result = $this->orderCountingRecordsMonth($start, $end, $unit);
+                    break;
+                case '年':
+                    $result = $this->orderCountingRecordsYear($start, $end, $unit);
+                    break;
+                default:
+                    break;
+
+            }
+            return $result;
+        });
+    }
+
+
+    public function getCountingOwnerIds($ownerIds = null): array
+    {
+
+        $user = auth()->user();
+        /** @var UserService $userService */
+        $userService = app('UserService');
+        $permittingOwnerIds = $userService->getPermittingOwnerIds($user);
+        if (!$ownerIds) {
+            return $permittingOwnerIds;
+        }
+        return Cache::remember(
+            'PermittingOwnerIds' . '_' . auth()->user()->id . '_' . implode('_', $ownerIds),
+            600, function () use ($ownerIds, $permittingOwnerIds) {
+            /** @var User $user */
+            return array_intersect($ownerIds, $permittingOwnerIds);
+        });
+    }
+
+    public function dataByDayFromCache($start, $end, $unit)
+    {
+        //TODO
+        $result = [];
+        $unQueryCondition = [];
+        $dataByDayFromCache = collect();
+        $queryCondition = $this->dateUtils($start, $end, $unit);
+        foreach ($queryCondition as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $ownerId) {
+                $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit . '_' . auth()->id();
+                $items = cache()->get($key);
+                if (empty($items)) {
+                    if (empty($unQueryCondition[$dateStr])) $unQueryCondition[$dateStr] = [];
+                    $unQueryCondition[$dateStr][] = $ownerId;
+                } else {
+                    $dataByDayFromCache = $dataByDayFromCache->concat($items);
+                }
+            }
+        }
+        $result['dataByDayFromCache'] = $dataByDayFromCache;
+        $result['unQueryCondition'] = $unQueryCondition;
+        return $result;
+    }
+
+    public function dataByDayFromMiddleTable($unQueryCondition, $unit)
+    {
+        $result = [];
+        $orderSqlBuilder = OrderCountingRecord::query();
+        foreach ($unQueryCondition as $date => $owners) {
+            $orderSqlBuilder->orWhere(function ($query) use ($owners, $date, $unit) {
+                $query->whereIn('owner_id', $owners)->where('date_target', $date)->where('counting_unit', $unit);
+            });
+        }
+        $dataByDayFromMiddleTable = $orderSqlBuilder->get();
+        $this->insertIntoCache($dataByDayFromMiddleTable, $unit);
+
+        $unQueryCondition = $this->unQueryCondition($dataByDayFromMiddleTable, $unQueryCondition);
+        $result['unQueryCondition'] = $unQueryCondition;
+        $result['dataByDayFromMiddleTable'] = $dataByDayFromMiddleTable;
+        return $result;
+    }
+
+    public function orderCountingRecordsDay($start, $end, $unit)
+    {
+        $dataByDayFromCacheResult = $this->dataByDayFromCache($start, $end, $unit);
+        $dataByDayFromCache = $dataByDayFromCacheResult['dataByDayFromCache'];
+        $unQueryCondition = $dataByDayFromCacheResult['unQueryCondition'];
+        if (!empty($unQueryCondition)) {
+            $dataByDayFromMiddleTableResult = $this->dataByDayFromMiddleTable($unQueryCondition, $unit);
+            $dataByDayFromMiddleTable = $dataByDayFromMiddleTableResult['dataByDayFromMiddleTable'];
+            $unQueryCondition = $dataByDayFromMiddleTableResult['unQueryCondition'];
+            if (!empty($unQueryCondition)) {
+                $dataByDayFromOrder = $this->dataByDayFromOrder($unQueryCondition, $unit);
+            }
+        }
+        $dataByDayFromCache = $dataByDayFromCache ?? collect();
+        $dataByDayFromMiddleTable = $dataByDayFromMiddleTable ?? collect();
+        $dataByDayFromOrder = $dataByDayFromOrder ?? collect();
+        return $dataByDayFromCache->concat($dataByDayFromMiddleTable)->concat($dataByDayFromOrder);
+    }
+
+    public function dateUtils($start, $end, $unit)
+    {
+        $ownerIds = $this->getCountingOwnerIds();
+        $dataArray = [];
+        switch ($unit) {
+            case '日';
+                foreach (Carbon::parse($start)->daysUntil($end, 1)->toArray() as $item) {
+                    $dataArray[$item->toDateString()] = $ownerIds;
+                }
+                break;
+            case '周';
+                foreach (Carbon::parse($start)->weeksUntil($end, 1)->toArray() as $item) {
+                    $dataArray[$item->year . '-' . $item->week . ''] = $ownerIds;
+                }
+                break;
+            case '月';
+                foreach (Carbon::parse($start)->monthsUntil($end, 1)->toArray() as $item) {
+                    $dataArray[$item->year . '-' . $item->format('m') . ''] = $ownerIds;
+                }
+                break;
+            case '年';
+                foreach (Carbon::parse($start)->yearsUntil($end, 1)->toArray() as $item) {
+                    $dataArray[$item->year] = $ownerIds;
+                }
+                break;
+            default:
+                break;
+        }
+        return $dataArray;
+    }
+
+    public function dataByDayFromOrder($unQueryCondition, $unit)
+    {
+        $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 ($unQueryCondition as $dateStr => $ownerIds) {
+            $orderSqlBuilder->orWhere(function ($query) use ($ownerIds, $dateStr) {
+                $query->whereIn('owner_id', $ownerIds)->where('created_at', '>', $dateStr)->where('created_at', '<', Carbon::parse($dateStr)->addDay()->toDateString())->where('wms_status', '订单完成');
+            });
+        }
+        $dataByDayFromOrder = $orderSqlBuilder->groupBy(['owner_id', 'warehouse_id', 'shop_id', 'logistic_id', 'date_target'])->get();
+
+        $dataByDayFromMiddleTable = $this->ordersToOrderCountingRecords($dataByDayFromOrder);
+        $this->insertIntoMiddleTable($dataByDayFromMiddleTable, $unit);
+        $this->insertIntoCache($dataByDayFromMiddleTable, $unit);
+        return $dataByDayFromMiddleTable;
+    }
+
+    public function orderCountingRecordsWeek($start, $end, $unit)
+    {
+        //TODO
+        return collect();
+    }
+
+    public function orderCountingRecordsMonth($start, $end, $unit)
+    {
+        //TODO
+        return collect();
+    }
+
+    public function orderCountingRecordsYear($start, $end, $unit)
+    {
+        //TODO
+        return collect();
+    }
+
+    public function insertIntoMiddleTable($data, $unit)
+    {
+        $data->filter(function ($item) {
+            return $this->isNotCurrentDate($item->date_target);
+        })->chunk(1000)->each(function ($item) {
+            OrderCountingRecord::query()->insert($item->toArray());
+        });
+    }
+
+    public function insertIntoCache($collect, $unit)
+    {
+        $dateTime = Carbon::now()->toDateTimeString();
+        $map = [];
+        $collect->each(function ($order) use ($unit, &$map, $dateTime) {
+            $key = "order_counting_records_{$order->date_target}_{$order->owner_id}_{$unit}";
+            if (empty($map[$key])) $map[$key] = [];
+//            if(!empty($order['amounts'])){
+//                $order['amount'] = $order['amounts'];
+//                unset($order['amounts']);
+//            }
+            $map[$key][] = $order;
+        });
+
+        foreach ($map as $key => $orders) {
+            $ttl = 3600 * 24;
+            if (!$this->isNotCurrentDate($orders[0]['date_target'])) {
+                $ttl = 70;
+            }
+            Cache::put($key, collect($orders), $ttl);
+        }
+    }
+
+    public function isNotCurrentDate($dateStr): bool
+    {
+        return $dateStr != Carbon::now()->format('Y-m-d')
+            && $dateStr != Carbon::now()->year . '-' . Carbon::now()->week
+            && $dateStr != Carbon::now()->year . '-' . Carbon::now()->month;
+    }
+
+
+    public function unQueryCondition($dataByDayFromMiddleTable, $unQueryCondition)
+    {
+        $map = [];
+        $dataByDayFromMiddleTable->each(function ($item) use (&$map) {
+            $key = 'owner_id=' . $item->owner_id . ' date_target' . $item->date_target;
+            $map[$key] = true;
+        });
+        foreach ($unQueryCondition as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $key => $ownerId) {
+                $key1 = 'owner_id=' . $ownerId . ' date_target' . $dateStr;
+                if (isset($map[$key1])) {
+                    //中间表查找到数据
+                    unset($unQueryCondition[$dateStr][$key]);
+                }
+            }
+        }
+        return $unQueryCondition;
+    }
+
+
+    public function ordersToOrderCountingRecords($dataByDayFromOrder)
+    {
+        $dataByDayFromMiddleTable = collect();
+        //当日当周当月当年的数据不能插入到中间表
+        $dateTime = Carbon::now()->toDateTimeString();
+        foreach ($dataByDayFromOrder as $order) {
+            $dataByDayFromMiddleTable->push(new OrderCountingRecord([
+                'owner_id' => $order->owner_id,
+                'shop_id' => $order->shop_id,
+                'warehouse_id' => $order->warehouse_id,
+                'logistic_id' => $order->logistic_id,
+                'date_target' => $order->date_target,
+                'counting_unit' => $order->counting_unit,
+                'amount' => $order->amounts,
+                'created_at' => $dateTime,
+                'updated_at' => $dateTime,
+            ]));
+        }
+        return $dataByDayFromMiddleTable;
+    }
+
+}

+ 24 - 0
database/factories/OrderCountingRecordFactory.php

@@ -0,0 +1,24 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\Logistic;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Shop;
+use App\Warehouse;
+use Carbon\Carbon;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(OrderCountingRecord::class, function (Faker $faker) {
+    return [
+        'owner_id' => $faker->numberBetween(0, 100),
+        'shop_id' => $faker->numberBetween(0, 100),
+        'warehouse_id' => $faker->numberBetween(0, 100),
+        'logistic_id' => $faker->numberBetween(0, 100),
+        'date_target' => Carbon::now()->toDateString(),
+        'counting_unit' => '日',
+        'amount' => $faker->numberBetween(0, 100),
+    ];
+});

+ 15 - 0
database/factories/WarehouseFactory.php

@@ -0,0 +1,15 @@
+<?php
+
+/** @var Factory $factory */
+
+use App\Warehouse;
+use Faker\Generator as Faker;
+use Illuminate\Database\Eloquent\Factory;
+
+$factory->define(Warehouse::class, function (Faker $faker) {
+    return [
+        //
+        'name' => $faker->name,
+        'code' => $faker->city,
+    ];
+});

+ 303 - 0
tests/Services/NewOrderCountingRecordService/NewOrderCountingRecordServiceTest.php

@@ -0,0 +1,303 @@
+<?php
+
+namespace NewOrderCountingRecordService;
+
+use App\Order;
+use App\OrderCountingRecord;
+use App\Owner;
+use App\Services\NewOrderCountingRecordService;
+use App\User;
+use Carbon\Carbon;
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Support\Arr;
+use Tests\TestCase;
+
+class NewOrderCountingRecordServiceTest extends TestCase
+{
+    use RefreshDatabase;
+
+    protected $newOrderCountingRecordService;
+
+    protected function setUp(): void
+    {
+        parent::setUp(); // TODO: Change the autogenerated stub
+        cache()->flush();
+        $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
+        $this->actingAs(factory(User::class)->create(['name' => 'yang']));
+
+    }
+
+    protected function tearDown(): void
+    {
+        cache()->flush();
+        OrderCountingRecord::truncate();
+        Order::truncate();
+        Owner::truncate();
+        parent::tearDown(); // TODO: Change the autogenerated stub
+    }
+
+    /**
+     * @test
+     */
+    public function dateUtils_day()
+    {
+        factory(Owner::class)->times(2)->create();
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        $this->assertEquals([
+            Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->toDateString() => [0 => 1, 1 => 2],
+        ], $dateArray);
+    }
+
+    /**
+     * @test
+     */
+    public function orderCountingRecords_remember()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $key = 'orderCountingRecords_' . $start . '_' . $end . '_' . $unit . '_' . auth()->id();
+
+        cache()->put($key, 'This is a test value');
+
+        $result = $this->newOrderCountingRecordService->orderCountingRecords($start, $end, $unit);
+        $this->assertEquals('This is a test value', $result);
+    }
+
+
+    /**
+     * @test
+     */
+    public function dataByDayFromCache_all()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        factory(Owner::class)->times(2)->create();
+        $queryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        foreach ($queryCondition as $dateStr => $ownerIds) {
+            foreach ($ownerIds as $ownerId) {
+                $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit . '_' . auth()->id();
+                cache()->put($key, collect()->push(factory(Owner::class)->create()));
+            }
+        }
+        $result = $this->newOrderCountingRecordService->dataByDayFromCache($start, $end, $unit);
+        $this->assertCount(6, $result['dataByDayFromCache']);
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromCache_empty()
+    {
+        $start = Carbon::now()->subDays(2)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        factory(Owner::class)->times(2)->create();
+        $result = $this->newOrderCountingRecordService->dataByDayFromCache($start, $end, $unit);
+        $this->assertEquals([
+            Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
+            Carbon::now()->toDateString() => [0 => 1, 1 => 2],
+        ], $result['unQueryCondition']);
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromMiddleTable_all()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner2->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner1->id]);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner2->id]);
+        $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        $result = $this->newOrderCountingRecordService->dataByDayFromMiddleTable($dateArray, $unit);
+
+        $this->assertCount(8, $result['dataByDayFromMiddleTable']);
+        $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromMiddleTable_empty()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        $result = $this->newOrderCountingRecordService->dataByDayFromMiddleTable($dateArray, $unit);
+
+        $this->assertCount(0, $result['dataByDayFromMiddleTable']);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromMiddleTable_common()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+
+        $result = $this->newOrderCountingRecordService->dataByDayFromMiddleTable($dateArray, $unit);
+
+        $this->assertCount(2, $result['dataByDayFromMiddleTable']);
+        $this->assertCount(1, $result['unQueryCondition'][Carbon::now()->toDateString()]);
+        $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
+    }
+
+    /**
+     * @test
+     */
+    public function insertIntoCache()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+        $orderCountingRecord = factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
+
+        $result = $this->newOrderCountingRecordService->dataByDayFromMiddleTable($dateArray, $unit);
+
+        $this->newOrderCountingRecordService->insertIntoCache($result['dataByDayFromMiddleTable'], $unit);
+        $key = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $this->assertNotNull(cache()->get($key));
+        $this->assertNotNull($orderCountingRecord->toArray());
+        $this->assertEquals($orderCountingRecord->toArray(), cache()->get($key)->toArray());
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromOrder()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $result = $this->newOrderCountingRecordService->dataByDayFromOrder($unQueryCondition, $unit);
+        $this->assertEquals(1, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner1->id)->first()->amount);
+        $this->assertEquals(2, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner2->id)->first()->amount);
+        $this->assertEquals(3, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner1->id)->first()->amount);
+        $this->assertEquals(4, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner2->id)->first()->amount);
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromOrder_insertMiddleTable()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $this->newOrderCountingRecordService->dataByDayFromOrder($unQueryCondition, $unit);
+        //当天的数据不入中间表
+        $this->assertCount(0, OrderCountingRecord::query()->where('date_target', Carbon::now()->toDateString())->get());
+        $this->assertCount(2, OrderCountingRecord::query()->where('date_target', Carbon::now()->subDays(1)->toDateString())->get());
+
+    }
+
+    /**
+     * @test
+     */
+    public function dataByDayFromOrder_insertCache()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+        $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $this->newOrderCountingRecordService->dataByDayFromOrder($unQueryCondition, $unit);
+        $key1 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $key2 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner2->id . '_' . $unit;
+        $key3 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner1->id . '_' . $unit;
+        $key4 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner2->id . '_' . $unit;
+        $this->assertCount(1, cache()->get($key1));
+        $this->assertCount(1, cache()->get($key2));
+        $this->assertCount(1, cache()->get($key3));
+        $this->assertCount(1, cache()->get($key4));
+    }
+
+    /**
+     * @test
+     */
+    public function orderCountingRecordsDay()
+    {
+        $start = Carbon::now()->subDays(1)->toDateString();
+        $end = Carbon::now()->toDateString();
+        $unit = '日';
+        $owner1 = factory(Owner::class)->create();
+        $owner2 = factory(Owner::class)->create();
+
+
+        factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
+
+        factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
+        factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
+
+        $result = $this->newOrderCountingRecordService->orderCountingRecordsDay($start, $end, $unit);
+        $this->assertEquals(3, $result->where('date_target', Carbon::now()->toDateString())->reduce(function ($carry, $item) {
+            return $carry + $item->amount;
+        }));
+        $this->assertEquals(7, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->reduce(function ($carry, $item) {
+            return $carry + $item->amount;
+        }));
+    }
+}