NewOrderCountingRecordServiceTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. namespace NewOrderCountingRecordService;
  3. use App\Order;
  4. use App\OrderCountingRecord;
  5. use App\Owner;
  6. use App\Services\NewOrderCountingRecordService;
  7. use App\User;
  8. use Carbon\Carbon;
  9. use Illuminate\Foundation\Testing\RefreshDatabase;
  10. use Illuminate\Support\Arr;
  11. use Tests\TestCase;
  12. class NewOrderCountingRecordServiceTest extends TestCase
  13. {
  14. use RefreshDatabase;
  15. protected $newOrderCountingRecordService;
  16. protected function setUp(): void
  17. {
  18. parent::setUp(); // TODO: Change the autogenerated stub
  19. cache()->flush();
  20. $this->newOrderCountingRecordService = new NewOrderCountingRecordService();
  21. $this->actingAs(factory(User::class)->create(['name' => 'yang']));
  22. }
  23. protected function tearDown(): void
  24. {
  25. cache()->flush();
  26. OrderCountingRecord::truncate();
  27. Order::truncate();
  28. Owner::truncate();
  29. parent::tearDown(); // TODO: Change the autogenerated stub
  30. }
  31. /**
  32. * @test
  33. */
  34. public function dateUtils_day()
  35. {
  36. factory(Owner::class)->times(2)->create();
  37. $start = Carbon::now()->subDays(2)->toDateString();
  38. $end = Carbon::now()->toDateString();
  39. $unit = '日';
  40. $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  41. $this->assertEquals([
  42. Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
  43. Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
  44. Carbon::now()->toDateString() => [0 => 1, 1 => 2],
  45. ], $dateArray);
  46. }
  47. /**
  48. * @test
  49. */
  50. public function orderCountingRecords_remember_day()
  51. {
  52. $start = Carbon::now()->subDays(2)->toDateString();
  53. $end = Carbon::now()->toDateString();
  54. $unit = '日';
  55. $key = 'orderCountingRecords_' . $start . '_' . $end . '_' . $unit . '_' . auth()->id();
  56. cache()->put($key, 'This is a test value');
  57. $result = $this->newOrderCountingRecordService->orderCountingRecords($start, $end, $unit);
  58. $this->assertEquals('This is a test value', $result);
  59. }
  60. /**
  61. * @test
  62. */
  63. public function dataFromCache_all_day()
  64. {
  65. $start = Carbon::now()->subDays(2)->toDateString();
  66. $end = Carbon::now()->toDateString();
  67. $unit = '日';
  68. factory(Owner::class)->times(2)->create();
  69. $queryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  70. foreach ($queryCondition as $dateStr => $ownerIds) {
  71. foreach ($ownerIds as $ownerId) {
  72. $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit . '_' . auth()->id();
  73. cache()->put($key, collect()->push(factory(Owner::class)->create()));
  74. }
  75. }
  76. $result = $this->newOrderCountingRecordService->dataFromCache($start, $end, $unit);
  77. $this->assertCount(6, $result['dataFromCache']);
  78. }
  79. /**
  80. * @test
  81. */
  82. public function dataFromCache_empty_day()
  83. {
  84. $start = Carbon::now()->subDays(2)->toDateString();
  85. $end = Carbon::now()->toDateString();
  86. $unit = '日';
  87. factory(Owner::class)->times(2)->create();
  88. $result = $this->newOrderCountingRecordService->dataFromCache($start, $end, $unit);
  89. $this->assertEquals([
  90. Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
  91. Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
  92. Carbon::now()->toDateString() => [0 => 1, 1 => 2],
  93. ], $result['unQueryCondition']);
  94. }
  95. /**
  96. * @test
  97. */
  98. public function dataFromMiddleTable_all_day()
  99. {
  100. $start = Carbon::now()->subDays(1)->toDateString();
  101. $end = Carbon::now()->toDateString();
  102. $unit = '日';
  103. $owner1 = factory(Owner::class)->create();
  104. $owner2 = factory(Owner::class)->create();
  105. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  106. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner2->id]);
  107. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner1->id]);
  108. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner2->id]);
  109. $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  110. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  111. $this->assertCount(8, $result['dataFromMiddleTable']);
  112. $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  113. $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  114. }
  115. /**
  116. * @test
  117. */
  118. public function dataFromMiddleTable_empty_day()
  119. {
  120. $start = Carbon::now()->subDays(1)->toDateString();
  121. $end = Carbon::now()->toDateString();
  122. $unit = '日';
  123. $owner1 = factory(Owner::class)->create();
  124. $owner2 = factory(Owner::class)->create();
  125. $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  126. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  127. $this->assertCount(0, $result['dataFromMiddleTable']);
  128. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  129. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  130. }
  131. /**
  132. * @test
  133. */
  134. public function dataFromMiddleTable_common_day()
  135. {
  136. $start = Carbon::now()->subDays(1)->toDateString();
  137. $end = Carbon::now()->toDateString();
  138. $unit = '日';
  139. $owner1 = factory(Owner::class)->create();
  140. $owner2 = factory(Owner::class)->create();
  141. $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  142. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  143. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  144. $this->assertCount(2, $result['dataFromMiddleTable']);
  145. $this->assertCount(1, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  146. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  147. }
  148. /**
  149. * @test
  150. */
  151. public function insertIntoCache_day()
  152. {
  153. $start = Carbon::now()->subDays(1)->toDateString();
  154. $end = Carbon::now()->toDateString();
  155. $unit = '日';
  156. $owner1 = factory(Owner::class)->create();
  157. $owner2 = factory(Owner::class)->create();
  158. $dateArray = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  159. $orderCountingRecord = factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  160. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  161. $this->newOrderCountingRecordService->insertIntoCache($result['dataFromMiddleTable'], $unit);
  162. $key = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
  163. $this->assertNotNull(cache()->get($key));
  164. $this->assertNotNull($orderCountingRecord->toArray());
  165. $this->assertEquals($orderCountingRecord->toArray(), cache()->get($key)->toArray());
  166. }
  167. /**
  168. * @test
  169. */
  170. public function dataFromOrder_day()
  171. {
  172. $start = Carbon::now()->subDays(1)->toDateString();
  173. $end = Carbon::now()->toDateString();
  174. $unit = '日';
  175. $owner1 = factory(Owner::class)->create();
  176. $owner2 = factory(Owner::class)->create();
  177. $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  178. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  179. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  180. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  181. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  182. $result = $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  183. $this->assertEquals(1, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner1->id)->first()->amount);
  184. $this->assertEquals(2, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner2->id)->first()->amount);
  185. $this->assertEquals(3, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner1->id)->first()->amount);
  186. $this->assertEquals(4, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner2->id)->first()->amount);
  187. }
  188. /**
  189. * @test
  190. */
  191. public function dataFromOrder_insertMiddleTable_day()
  192. {
  193. $start = Carbon::now()->subDays(1)->toDateString();
  194. $end = Carbon::now()->toDateString();
  195. $unit = '日';
  196. $owner1 = factory(Owner::class)->create();
  197. $owner2 = factory(Owner::class)->create();
  198. $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  199. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  200. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  201. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  202. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  203. $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  204. //当天的数据不入中间表
  205. $this->assertCount(0, OrderCountingRecord::query()->where('date_target', Carbon::now()->toDateString())->get());
  206. $this->assertCount(2, OrderCountingRecord::query()->where('date_target', Carbon::now()->subDays(1)->toDateString())->get());
  207. }
  208. /**
  209. * @test
  210. */
  211. public function dataFromOrder_insertCache_day()
  212. {
  213. $start = Carbon::now()->subDays(1)->toDateString();
  214. $end = Carbon::now()->toDateString();
  215. $unit = '日';
  216. $owner1 = factory(Owner::class)->create();
  217. $owner2 = factory(Owner::class)->create();
  218. $unQueryCondition = $this->newOrderCountingRecordService->dateUtils($start, $end, $unit);
  219. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  220. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  221. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  222. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  223. $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  224. $key1 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
  225. $key2 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner2->id . '_' . $unit;
  226. $key3 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner1->id . '_' . $unit;
  227. $key4 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner2->id . '_' . $unit;
  228. $this->assertCount(1, cache()->get($key1));
  229. $this->assertCount(1, cache()->get($key2));
  230. $this->assertCount(1, cache()->get($key3));
  231. $this->assertCount(1, cache()->get($key4));
  232. }
  233. /**
  234. * @test
  235. */
  236. public function orderCountingRecordsDay_day()
  237. {
  238. $start = Carbon::now()->subDays(1)->toDateString();
  239. $end = Carbon::now()->toDateString();
  240. $unit = '日';
  241. $owner1 = factory(Owner::class)->create();
  242. $owner2 = factory(Owner::class)->create();
  243. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  244. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  245. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  246. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  247. $result = $this->newOrderCountingRecordService->orderCountingRecordsDay($start, $end, $unit);
  248. $this->assertEquals(3, $result->where('date_target', Carbon::now()->toDateString())->reduce(function ($carry, $item) {
  249. return $carry + $item->amount;
  250. }));
  251. $this->assertEquals(7, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->reduce(function ($carry, $item) {
  252. return $carry + $item->amount;
  253. }));
  254. }
  255. }