OrderDiscount.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/15
  6. * Time: 下午4:29
  7. */
  8. namespace app\frontend\modules\order;
  9. use app\common\helpers\Serializer;
  10. use app\frontend\models\order\PreOrderDiscount;
  11. use app\frontend\modules\order\discount\BaseDiscount;
  12. use app\frontend\modules\order\discount\CouponDiscount;
  13. use app\frontend\modules\order\models\PreOrder;
  14. use app\frontend\modules\orderGoods\models\PreOrderGoods;
  15. use Illuminate\Support\Collection;
  16. class OrderDiscount
  17. {
  18. public $orderCoupons;
  19. public $orderDiscounts;
  20. /**
  21. * @var Collection
  22. */
  23. private $discounts;
  24. /**
  25. * @var PreOrder
  26. */
  27. protected $order;
  28. /**
  29. * 优惠券类
  30. * @var CouponDiscount
  31. */
  32. public function __construct(PreOrder $order)
  33. {
  34. $this->order = $order;
  35. // 订单优惠券使用记录集合
  36. $this->orderCoupons = $order->newCollection();
  37. $order->setRelation('orderCoupons', $this->orderCoupons);
  38. // 订单优惠使用记录集合
  39. $this->orderDiscounts = $order->newCollection();
  40. $order->setRelation('orderDiscounts', $this->orderDiscounts);
  41. }
  42. public function getDiscounts()
  43. {
  44. //blank not discount
  45. if ($this->order->isDiscountDisable()) {
  46. return collect();
  47. }
  48. if (!isset($this->discounts)) {
  49. $this->discounts = collect();
  50. foreach (\app\common\modules\shop\ShopConfig::current()->get('shop-foundation.order-discount') as $configItem) {
  51. $this->discounts->put($configItem['key'], call_user_func($configItem['class'], $this->order));
  52. }
  53. //todo 加载顺序问题,这里只是注入订单优惠项还没计算,所以没有等级优惠金额
  54. //$this->setOrderDiscounts();
  55. }
  56. return $this->discounts;
  57. }
  58. public function getAmount()
  59. {
  60. //todo 想放到 OrderGoodsPriceNode 节点里的但节点会重复调用,这里只有获取一次
  61. $this->addGoodsDiscounts();
  62. return $this->getDiscounts()->sum(function (BaseDiscount $discount) {
  63. // 每一种订单优惠
  64. return $discount->getAmount();
  65. });
  66. }
  67. private function addGoodsDiscounts()
  68. {
  69. // 将所有订单商品的优惠
  70. $orderGoodsDiscounts = $this->order->orderGoods->reduce(function (Collection $result, PreOrderGoods $aOrderGoods) {
  71. return $result->merge($aOrderGoods->getOrderGoodsDiscounts());
  72. }, collect());
  73. $preOrderDiscount = collect([]);
  74. // 按每个种类的优惠分组 求金额的和
  75. $orderGoodsDiscounts->each(function ($orderGoodsDiscount) use ($preOrderDiscount) {
  76. // 新类型添加
  77. if ($this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) {
  78. if ($preOrderDiscount->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) {
  79. $preDiscount = new PreOrderDiscount([
  80. 'discount_code' => $orderGoodsDiscount->discount_code,
  81. 'amount' => $orderGoodsDiscount->amount,
  82. 'name' => $orderGoodsDiscount->name,
  83. 'no_show' => isset($orderGoodsDiscount->no_show)?$orderGoodsDiscount->no_show:0,
  84. ]);
  85. $preOrderDiscount->push($preDiscount);
  86. return;
  87. }
  88. // 已存在的类型累加
  89. $preOrderDiscount->where('discount_code', $orderGoodsDiscount->discount_code)->first()->amount += $orderGoodsDiscount->amount;
  90. }
  91. });
  92. $preOrderDiscount->each(function (PreOrderDiscount $orderDiscount) {
  93. $orderDiscount->setOrder($this->order);
  94. });
  95. }
  96. private function setOrderDiscounts()
  97. {
  98. // 将所有订单商品的优惠
  99. $orderGoodsDiscounts = $this->order->orderGoods->reduce(function (Collection $result, PreOrderGoods $aOrderGoods) {
  100. return $result->merge($aOrderGoods->getOrderGoodsDiscounts());
  101. }, collect());
  102. // 按每个种类的优惠分组 求金额的和
  103. $orderGoodsDiscounts->each(function ($orderGoodsDiscount) {
  104. // 新类型添加
  105. if ($this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->isEmpty()) {
  106. $preOrderDiscount = new PreOrderDiscount([
  107. 'discount_code' => $orderGoodsDiscount->discount_code,
  108. 'amount' => $orderGoodsDiscount->amount,
  109. 'name' => $orderGoodsDiscount->name,
  110. ]);
  111. $preOrderDiscount->setOrder($this->order);
  112. return;
  113. }
  114. // 已存在的类型累加
  115. $this->order->orderDiscounts->where('discount_code', $orderGoodsDiscount->discount_code)->first()->amount += $orderGoodsDiscount->amount;
  116. });
  117. }
  118. /**
  119. * @param $code
  120. * @return BaseDiscount
  121. */
  122. public function getAmountByCode($code)
  123. {
  124. return $this->discounts[$code];
  125. }
  126. }