NewOrderCountingRecordServiceTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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 transfersToConditions()
  35. {
  36. factory(Owner::class)->times(2)->create();
  37. $start = Carbon::now()->subDays(2)->toDateString();
  38. $end = Carbon::now()->toDateString();
  39. $unit = '日';
  40. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  41. $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  42. $this->assertEquals([
  43. Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
  44. Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
  45. Carbon::now()->toDateString() => [0 => 1, 1 => 2],
  46. ], $dateArray);
  47. }
  48. /**
  49. * @test
  50. */
  51. public function dateUtils_week()
  52. {
  53. factory(Owner::class)->times(2)->create();
  54. $start = Carbon::now()->subWeeks(2)->toDateString();
  55. $end = Carbon::now()->toDateString();
  56. $unit = '周';
  57. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  58. $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  59. dd($dateArray);
  60. // $this->assertEquals([
  61. // Carbon::now()->subWeeks(2)->toDateString() => [0 => 1, 1 => 2],
  62. // Carbon::now()->subWeeks(1)->toDateString() => [0 => 1, 1 => 2],
  63. // Carbon::now()->toDateString() => [0 => 1, 1 => 2],
  64. // ], $dateArray);
  65. }
  66. /**
  67. * @test
  68. */
  69. public function orderCountingRecords_remember_day()
  70. {
  71. $start = Carbon::now()->subDays(2)->toDateString();
  72. $end = Carbon::now()->toDateString();
  73. $unit = '日';
  74. $key = 'orderCountingRecords_' . $start . '_' . $end . '_' . $unit . '_' . auth()->id();
  75. cache()->put($key, 'This is a test value');
  76. $result = $this->newOrderCountingRecordService->orderCountingRecords($start, $end, $unit);
  77. $this->assertEquals('This is a test value', $result);
  78. }
  79. /**
  80. * @test
  81. */
  82. public function dataFromCache_all_day()
  83. {
  84. $start = Carbon::now()->subDays(2)->toDateString();
  85. $end = Carbon::now()->toDateString();
  86. $unit = '日';
  87. factory(Owner::class)->times(2)->create();
  88. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  89. $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  90. foreach ($queryCondition as $dateStr => $ownerIds) {
  91. foreach ($ownerIds as $ownerId) {
  92. $key = 'order_counting_records_' . $dateStr . '_' . $ownerId . '_' . $unit . '_' . auth()->id();
  93. cache()->put($key, collect()->push(factory(Owner::class)->create()));
  94. }
  95. }
  96. $result = $this->newOrderCountingRecordService->getFromCache($queryCondition, $unit);
  97. $this->assertCount(6, $result['dataFromCache']);
  98. }
  99. /**
  100. * @test
  101. */
  102. public function dataFromCache_empty_day()
  103. {
  104. $start = Carbon::now()->subDays(2)->toDateString();
  105. $end = Carbon::now()->toDateString();
  106. $unit = '日';
  107. factory(Owner::class)->times(2)->create();
  108. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  109. $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  110. $result = $this->newOrderCountingRecordService->getFromCache($queryCondition, $unit);
  111. $this->assertEquals([
  112. Carbon::now()->subDays(2)->toDateString() => [0 => 1, 1 => 2],
  113. Carbon::now()->subDays(1)->toDateString() => [0 => 1, 1 => 2],
  114. Carbon::now()->toDateString() => [0 => 1, 1 => 2],
  115. ], $result['unQueryCondition']);
  116. }
  117. /**
  118. * @test
  119. */
  120. public function dataFromMiddleTable_all_day()
  121. {
  122. $start = Carbon::now()->subDays(1)->toDateString();
  123. $end = Carbon::now()->toDateString();
  124. $unit = '日';
  125. $owner1 = factory(Owner::class)->create();
  126. $owner2 = factory(Owner::class)->create();
  127. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  128. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner2->id]);
  129. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner1->id]);
  130. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->subDays(1)->toDateString(), 'owner_id' => $owner2->id]);
  131. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  132. $queryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  133. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($queryCondition, $unit);
  134. $this->assertCount(8, $result['dataFromMiddleTable']);
  135. $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  136. $this->assertCount(0, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  137. }
  138. /**
  139. * @test
  140. */
  141. public function dataFromMiddleTable_empty_day()
  142. {
  143. $start = Carbon::now()->subDays(1)->toDateString();
  144. $end = Carbon::now()->toDateString();
  145. $unit = '日';
  146. factory(Owner::class)->create();
  147. factory(Owner::class)->create();
  148. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  149. $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  150. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  151. $this->assertCount(0, $result['dataFromMiddleTable']);
  152. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  153. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  154. }
  155. /**
  156. * @test
  157. */
  158. public function dataFromMiddleTable_common_day()
  159. {
  160. $start = Carbon::now()->subDays(1)->toDateString();
  161. $end = Carbon::now()->toDateString();
  162. $unit = '日';
  163. $owner1 = factory(Owner::class)->create();
  164. $owner2 = factory(Owner::class)->create();
  165. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  166. $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  167. factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  168. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  169. $this->assertCount(2, $result['dataFromMiddleTable']);
  170. $this->assertCount(1, $result['unQueryCondition'][Carbon::now()->toDateString()]);
  171. $this->assertCount(2, $result['unQueryCondition'][Carbon::now()->subDays(1)->toDateString()]);
  172. }
  173. /**
  174. * @test
  175. */
  176. public function insertIntoCache_day()
  177. {
  178. $start = Carbon::now()->subDays(1)->toDateString();
  179. $end = Carbon::now()->toDateString();
  180. $unit = '日';
  181. $owner1 = factory(Owner::class)->create();
  182. $owner2 = factory(Owner::class)->create();
  183. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  184. $dateArray = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  185. $orderCountingRecord = factory(OrderCountingRecord::class)->times(2)->create(['date_target' => Carbon::now()->toDateString(), 'owner_id' => $owner1->id]);
  186. $result = $this->newOrderCountingRecordService->dataFromMiddleTable($dateArray, $unit);
  187. $this->newOrderCountingRecordService->insertIntoCache($result['dataFromMiddleTable'], $unit);
  188. $key = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
  189. $this->assertNotNull(cache()->get($key));
  190. $this->assertNotNull($orderCountingRecord->toArray());
  191. $this->assertEquals($orderCountingRecord->toArray(), cache()->get($key)->toArray());
  192. }
  193. /**
  194. * @test
  195. */
  196. public function dataFromOrder_day()
  197. {
  198. $start = Carbon::now()->subDays(1)->toDateString();
  199. $end = Carbon::now()->toDateString();
  200. $unit = '日';
  201. $owner1 = factory(Owner::class)->create();
  202. $owner2 = factory(Owner::class)->create();
  203. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  204. $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  205. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  206. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  207. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  208. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  209. $result = $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  210. $this->assertEquals(1, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner1->id)->first()->amount);
  211. $this->assertEquals(2, $result->where('date_target', Carbon::now()->toDateString())->where('owner_id', $owner2->id)->first()->amount);
  212. $this->assertEquals(3, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner1->id)->first()->amount);
  213. $this->assertEquals(4, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->where('owner_id', $owner2->id)->first()->amount);
  214. }
  215. /**
  216. * @test
  217. */
  218. public function dataFromOrder_insertMiddleTable_day()
  219. {
  220. $start = Carbon::now()->subDays(1)->toDateString();
  221. $end = Carbon::now()->toDateString();
  222. $unit = '日';
  223. $owner1 = factory(Owner::class)->create();
  224. $owner2 = factory(Owner::class)->create();
  225. $ownerIds = $this->newOrderCountingRecordService->getCountingOwnerIds();
  226. $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit, $ownerIds);
  227. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  228. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  229. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  230. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  231. $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  232. //当天的数据不入中间表
  233. $this->assertCount(0, OrderCountingRecord::query()->where('date_target', Carbon::now()->toDateString())->get());
  234. $this->assertCount(2, OrderCountingRecord::query()->where('date_target', Carbon::now()->subDays(1)->toDateString())->get());
  235. }
  236. /**
  237. * @test
  238. */
  239. public function dataFromOrder_insertCache_day()
  240. {
  241. $start = Carbon::now()->subDays(1)->toDateString();
  242. $end = Carbon::now()->toDateString();
  243. $unit = '日';
  244. $owner1 = factory(Owner::class)->create();
  245. $owner2 = factory(Owner::class)->create();
  246. $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit,$this->newOrderCountingRecordService->getCountingOwnerIds());
  247. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  248. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  249. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  250. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  251. $this->newOrderCountingRecordService->dataFromOrder($unQueryCondition, $unit);
  252. $key1 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner1->id . '_' . $unit;
  253. $key2 = 'order_counting_records_' . Carbon::now()->toDateString() . '_' . $owner2->id . '_' . $unit;
  254. $key3 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner1->id . '_' . $unit;
  255. $key4 = 'order_counting_records_' . Carbon::now()->subDays(1)->toDateString() . '_' . $owner2->id . '_' . $unit;
  256. $this->assertCount(1, cache()->get($key1));
  257. $this->assertCount(1, cache()->get($key2));
  258. $this->assertCount(1, cache()->get($key3));
  259. $this->assertCount(1, cache()->get($key4));
  260. }
  261. /**
  262. * @test
  263. */
  264. public function orderCountingRecordsDay_day()
  265. {
  266. $start = Carbon::now()->subDays(1)->toDateString();
  267. $end = Carbon::now()->toDateString();
  268. $unit = '日';
  269. $owner1 = factory(Owner::class)->create();
  270. $owner2 = factory(Owner::class)->create();
  271. factory(Order::class)->times(1)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner1->id]);
  272. factory(Order::class)->times(2)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now(), 'owner_id' => $owner2->id]);
  273. factory(Order::class)->times(3)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner1->id]);
  274. factory(Order::class)->times(4)->create(['wms_status' => '订单完成', 'created_at' => Carbon::now()->subDays(1), 'owner_id' => $owner2->id]);
  275. $unQueryCondition = $this->newOrderCountingRecordService->transfersToCondition($start, $end, $unit,$this->newOrderCountingRecordService->getCountingOwnerIds());
  276. $result = $this->newOrderCountingRecordService->getOrderCountingRecords($unQueryCondition, $unit);
  277. $this->assertEquals(3, $result->where('date_target', Carbon::now()->toDateString())->reduce(function ($carry, $item) {
  278. return $carry + $item->amount;
  279. }));
  280. $this->assertEquals(7, $result->where('date_target', Carbon::now()->subDays(1)->toDateString())->reduce(function ($carry, $item) {
  281. return $carry + $item->amount;
  282. }));
  283. }
  284. }