OwnerPriceOperationServiceTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace Tests\Services\OwnerPriceOperationService;
  3. use App\Commodity;
  4. use App\Owner;
  5. use App\OwnerInStorageRule;
  6. use App\OwnerOutStorageRule;
  7. use App\OwnerPriceOperation;
  8. use App\Services\FeatureService;
  9. use App\Services\OwnerPriceOperationService;
  10. use App\Unit;
  11. use Mockery\Mock;
  12. use Tests\TestCase;
  13. class OwnerPriceOperationServiceTest extends TestCase
  14. {
  15. /** @var OwnerPriceOperationService */
  16. public $service;
  17. public $data;
  18. protected function setUp(): void
  19. {
  20. parent::setUp();
  21. $this->service = app(OwnerPriceOperationService::class);
  22. $this->data["units"] = [];
  23. $pieces = Unit::query()->where("name","件")->first();
  24. $box = Unit::query()->where("name","箱")->first();
  25. $single = Unit::query()->where("name","单")->first();
  26. if (!$pieces){
  27. $pieces = factory(Unit::class)->create(["name"=>"件"]);
  28. $this->data["units"][] = $pieces->toArray();
  29. }
  30. if (!$box){
  31. $box = factory(Unit::class)->create(["name"=>"箱"]);
  32. $this->data["units"][] = $box->toArray();
  33. }
  34. if (!$single){
  35. $single = factory(Unit::class)->create(["name"=>"单"]);
  36. $this->data["units"][] = $single->toArray();
  37. }
  38. $model1 = factory(OwnerPriceOperation::class)->create([
  39. "operation_type"=>"入库", //操作类型
  40. "strategy" =>"默认", //策略
  41. ]);
  42. $model2 = factory(OwnerPriceOperation::class)->create([
  43. "operation_type"=>"入库", //操作类型
  44. "strategy" =>"特征", //策略
  45. ]);
  46. $model3 = factory(OwnerPriceOperation::class)->create([
  47. "operation_type"=>"出库", //操作类型
  48. "strategy" =>"默认", //策略
  49. ]);
  50. $model4 = factory(OwnerPriceOperation::class)->create([
  51. "operation_type"=>"出库", //操作类型
  52. "strategy" =>"特征", //策略
  53. ]);
  54. $this->data["models"] = [$model1->toArray(),$model2->toArray(),$model3->toArray(),$model4->toArray()];
  55. $in1 = factory(OwnerInStorageRule::class)->create([
  56. "owner_price_operation_id" => $model1->id, //作业计费ID
  57. "amount" => 5, //计量
  58. "unit_id" => $pieces->id,//单位ID
  59. "unit_price" => 2.22, //单价
  60. ]);
  61. $in2 = factory(OwnerInStorageRule::class)->create([
  62. "owner_price_operation_id" => $model2->id, //作业计费ID
  63. "amount" => 5, //计量
  64. "unit_id" => $box->id,//单位ID
  65. "unit_price" => 3.22, //单价
  66. ]);
  67. $out1 = factory(OwnerOutStorageRule::class)->create([
  68. "owner_price_operation_id" => $model3->id,
  69. "strategy" =>"起步",
  70. "amount" =>6,
  71. "unit_id" => $box->id,
  72. "unit_price" => 2.22,
  73. ]);
  74. $out4 = factory(OwnerOutStorageRule::class)->create([
  75. "owner_price_operation_id" => $model3->id,
  76. "strategy" => "默认",
  77. "unit_id" => $box->id,
  78. "unit_price" => 3.22,
  79. ]);
  80. $out5 = factory(OwnerOutStorageRule::class)->create([
  81. "owner_price_operation_id" => $model3->id,
  82. "strategy" =>"特征",
  83. "unit_id" => $box->id,
  84. "unit_price" => 4.22,
  85. ]);
  86. $out6 = factory(OwnerOutStorageRule::class)->create([
  87. "owner_price_operation_id" => $model4->id,
  88. "strategy" =>"起步",
  89. "amount" => 6,
  90. "unit_id" => $box->id,
  91. "unit_price" => 5.1,
  92. ]);
  93. $out7 = factory(OwnerOutStorageRule::class)->create([
  94. "owner_price_operation_id" => $model4->id,
  95. "strategy" => "默认",
  96. "unit_id" => $box->id,
  97. "unit_price" => 5.2,
  98. ]);
  99. $out8 = factory(OwnerOutStorageRule::class)->create([
  100. "owner_price_operation_id" => $model4->id,
  101. "strategy" =>"特征",
  102. "unit_id" => $box->id,
  103. "unit_price" => 5.3,
  104. ]);
  105. $this->data["in"] = [$in1->toArray(),$in2->toArray()];
  106. $this->data["out"] = [$out1->toArray(),$out4->toArray(),$out5->toArray(),$out6->toArray(),$out7->toArray(),$out8->toArray()];
  107. $owner = factory(Owner::class)->create([
  108. "user_owner_group_id" => 1,
  109. ]);
  110. $model1->ownerPriceOperationOwners()->sync([$owner->id]);
  111. $model2->ownerPriceOperationOwners()->sync([$owner->id]);
  112. $model3->ownerPriceOperationOwners()->sync([$owner->id]);
  113. $model4->ownerPriceOperationOwners()->sync([$owner->id]);
  114. $this->data["owners"] = [$owner->toArray()];
  115. $this->data["commodities"] = [];
  116. $commodity = factory(Commodity::class)->create([
  117. 'sku' => md5(date('Ymd').\Illuminate\Support\Str::random(3)),
  118. 'owner_id' => $owner->id,
  119. "pack_spec" => 3
  120. ]);
  121. $this->data["commodities"][] = $commodity->toArray();
  122. }
  123. /**
  124. * @group customer
  125. */
  126. public function testMatchRule()
  127. {
  128. $this->partialMock(FeatureService::class,function ($mock){
  129. /** @var Mock $mock */
  130. $mock->shouldReceive("matchFeature")->andReturn(true);
  131. });
  132. $result = $this->service->matchRule(["packages"=>[["commodity"=>"测试","amount"=>55]]],[],$this->data["owners"][0]["id"],$this->data["commodities"][0]["sku"],"入库");
  133. $this->assertEquals(12.88,$result);
  134. $result = $this->service->matchRule(["packages"=>[["commodity"=>"测试","amount"=>57]]],[],$this->data["owners"][0]["id"],$this->data["commodities"][0]["sku"],"出库");
  135. $this->assertEquals(99.5,$result);
  136. }
  137. /**
  138. * @group customer
  139. */
  140. public function testMatchRule1()
  141. {
  142. $result = $this->service->matchRule(["packages"=>[["commodity"=>"测试","amount"=>56]]],[],$this->data["owners"][0]["id"],$this->data["commodities"][0]["sku"],"入库");
  143. $this->assertEquals(26.64,$result);
  144. $result = $this->service->matchRule(["packages"=>[["commodity"=>"测试","amount"=>58]]],[],$this->data["owners"][0]["id"],$this->data["commodities"][0]["sku"],"出库");
  145. $this->assertEquals(58.4,$result);
  146. }
  147. public function tearDown(): void
  148. {
  149. Unit::destroy(array_column($this->data["units"],"id"));
  150. OwnerPriceOperation::destroy(array_column($this->data["models"],"id"));
  151. foreach ($this->data["models"] as $d){
  152. $model = new OwnerPriceOperation();
  153. $model->id = $d["id"];
  154. $model->ownerPriceOperationOwners()->sync([]);
  155. }
  156. OwnerInStorageRule::destroy(array_column($this->data["in"],"id"));
  157. OwnerOutStorageRule::destroy(array_column($this->data["out"],"id"));
  158. Owner::destroy(array_column($this->data["owners"],"id"));
  159. Commodity::destroy(array_column($this->data["commodities"],"id"));
  160. parent::tearDown();
  161. }
  162. }