OrderDeductManager.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2019/1/9
  6. * Time: 10:50 AM
  7. */
  8. namespace app\frontend\modules\deduction;
  9. use app\common\exceptions\AppException;
  10. use app\common\modules\orderGoods\models\PreOrderGoods;
  11. use app\framework\Database\Eloquent\Collection;
  12. use app\frontend\models\order\PreOrderDeduction;
  13. use app\frontend\models\order\PreOrderDiscount;
  14. use app\frontend\modules\deduction\models\Deduction;
  15. use app\frontend\modules\order\models\PreOrder;
  16. class OrderDeductManager
  17. {
  18. /**
  19. * @var PreOrder
  20. */
  21. private $order;
  22. /**
  23. * @var OrderDeductionCollection
  24. */
  25. private $orderDeductionCollection;
  26. /**
  27. * @var OrderDeductionCollection
  28. */
  29. private $checkedOrderDeductionCollection;
  30. /**
  31. * @var OrderGoodsDeductionCollection
  32. */
  33. private $orderGoodsDeductionCollection;
  34. /**
  35. * @var \Illuminate\Database\Eloquent\Collection
  36. */
  37. private $deductions;
  38. public function __construct(PreOrder $order)
  39. {
  40. $this->order = $order;
  41. }
  42. /**
  43. * @return OrderDeductionCollection
  44. * @throws AppException
  45. */
  46. public function getOrderDeductions()
  47. {
  48. if (!isset($this->orderDeductionCollection)) {
  49. $this->orderDeductionCollection = $this->getAllOrderDeductions();
  50. $this->order->setRelation('orderDeductions',$this->orderDeductionCollection);
  51. // 按照选中状态排序
  52. $this->orderDeductionCollection->sortOrderDeductionCollection();
  53. // 验证
  54. $this->orderDeductionCollection->validate();
  55. }
  56. return $this->orderDeductionCollection;
  57. }
  58. /**
  59. * 获取并订单抵扣项并载入到订单模型中
  60. * @return OrderDeductionCollection
  61. */
  62. public function getAllOrderDeductions()
  63. {
  64. $orderDeductions = $this->getEnableDeductions()->map(function (Deduction $deduction) {
  65. $orderGoodsDeductionCollection = $this->getOrderGoodsDeductionCollection()->where('code', $deduction->getCode());
  66. /**
  67. * @var PreOrderDeduction $orderDeduction
  68. */
  69. $orderDeduction = new PreOrderDeduction();
  70. $orderDeduction->init($deduction, $this->order, $orderGoodsDeductionCollection);
  71. return $orderDeduction;
  72. });
  73. return new OrderDeductionCollection($orderDeductions->all());
  74. }
  75. /**
  76. * @param $deductions
  77. */
  78. public function setDeductions(\Illuminate\Database\Eloquent\Collection $deductions)
  79. {
  80. $this->deductions = $deductions;
  81. }
  82. /**
  83. * @param OrderGoodsDeductionCollection $orderGoodsDeductionCollection
  84. */
  85. public function setOrderGoodsDeductionCollection(OrderGoodsDeductionCollection $orderGoodsDeductionCollection)
  86. {
  87. $this->orderGoodsDeductionCollection = $orderGoodsDeductionCollection;
  88. }
  89. /**
  90. * @return OrderGoodsDeductionCollection
  91. */
  92. public function getOrderGoodsDeductionCollection()
  93. {
  94. if (!isset($this->orderGoodsDeductionCollection)) {
  95. $orderGoodsDeductions = $this->order->orderGoods->flatMap(function (PreOrderGoods $orderGoods) {
  96. return $orderGoods->getOrderGoodsDeductions();
  97. });
  98. $this->orderGoodsDeductionCollection = new OrderGoodsDeductionCollection($orderGoodsDeductions->all());
  99. }
  100. return $this->orderGoodsDeductionCollection;
  101. }
  102. /**
  103. * 开启的抵扣项
  104. * @return Collection
  105. */
  106. private function getEnableDeductions()
  107. {
  108. //由于获取开启抵扣都是相同的所以这里把这部分代码提取出来
  109. return \app\frontend\modules\deduction\EnableDeductionService::getInstance()->getEnableDeductions($this->order);
  110. // if (!isset($this->deductions)) {
  111. //
  112. // //blank not deduction
  113. // if ($this->order->isDeductionDisable()) {
  114. // trace_log()->deduction('订单关闭的抵扣类型','');
  115. // return collect();
  116. // }
  117. //
  118. // /**
  119. // * 商城开启的抵扣
  120. // * @var Collection $deductions
  121. // */
  122. // $deductions = Deduction::getEnable();
  123. //
  124. // trace_log()->deduction('开启的抵扣类型', $deductions->pluck('code')->toJson());
  125. // if ($deductions->isEmpty()) {
  126. // return collect();
  127. // }
  128. // // 过滤调无效的
  129. // $deductions = $deductions->filter(function (Deduction $deduction) {
  130. // /**
  131. // * @var Deduction $deduction
  132. // */
  133. // return $deduction->valid();
  134. // });
  135. // // 按照用户勾选顺序排序
  136. // $sort = array_flip($this->order->getParams('deduction_ids'));
  137. // $this->deductions = $deductions->sortBy(function ($deduction) use ($sort) {
  138. // return array_get($sort, $deduction->code, 999);
  139. // });
  140. // }
  141. // return $this->deductions;
  142. }
  143. /**
  144. * @return OrderDeductionCollection|static
  145. * @throws AppException
  146. */
  147. public function getCheckedOrderDeductions()
  148. {
  149. if (!isset($this->checkedOrderDeductionCollection)) {
  150. // 求和订单抵扣集合中所有已选中的可用金额
  151. $this->checkedOrderDeductionCollection = $this->getOrderDeductions()->filter(function (PreOrderDeduction $orderDeduction) {
  152. return $orderDeduction->isChecked();
  153. });
  154. // 过滤调不能抵扣的项
  155. $this->checkedOrderDeductionCollection->filterNotDeductible();
  156. $this->checkedOrderDeductionCollection->lock();
  157. if ($this->checkedOrderDeductionCollection->minAmount() > $this->order->getPriceBefore('orderDispatchPrice')) {
  158. throw new AppException("订单支付总金额{$this->order->getPriceBefore('orderDispatchPrice')}元,不满足最低抵扣总金额{$this->checkedOrderDeductionCollection->minAmount()}元");
  159. }
  160. }
  161. // 返回 订单抵扣金额
  162. return $this->checkedOrderDeductionCollection;
  163. }
  164. }