OrderGoodsDeductionCollection.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2017/10/6
  6. * Time: 上午10:12
  7. */
  8. namespace app\frontend\modules\deduction;
  9. use app\common\models\VirtualCoin;
  10. use app\common\modules\orderGoods\models\PreOrderGoods;
  11. use app\frontend\modules\coin\InvalidVirtualCoin;
  12. use app\frontend\modules\deduction\models\Deduction;
  13. use app\frontend\modules\deduction\orderGoods\PreOrderGoodsDeduction;
  14. use Illuminate\Database\Eloquent\Collection;
  15. class OrderGoodsDeductionCollection extends Collection
  16. {
  17. public function loadOrderGoodsDeductions(PreOrderGoods $orderGoods, \Illuminate\Database\Eloquent\Collection $deductions)
  18. {
  19. $this->items = $deductions->map(function (Deduction $deduction) use ($orderGoods) {
  20. $preOrderGoodsDeduction = new PreOrderGoodsDeduction([
  21. 'name' => $deduction->getName(),
  22. 'code' => $deduction->getCode()
  23. ]);
  24. $preOrderGoodsDeduction->setOrderGoods($orderGoods);
  25. return $preOrderGoodsDeduction;
  26. })->all();
  27. return $this;
  28. }
  29. public function hasMinDeduction(){
  30. if($this->isEmpty()){
  31. return new InvalidVirtualCoin();
  32. }
  33. $result = $this->contains(function (PreOrderGoodsDeduction $orderGoodsDeduction) {
  34. /**
  35. * @var PreOrderGoodsDeduction $orderGoodsDeduction
  36. */
  37. return $orderGoodsDeduction->hasMinLimitBuyCoin();
  38. });
  39. return $result;
  40. }
  41. /**
  42. * @return VirtualCoin
  43. */
  44. public function getMinPoint()
  45. {
  46. if($this->isEmpty()){
  47. return new InvalidVirtualCoin();
  48. }
  49. trace_log()->deduction('订单抵扣', "订单商品集合开始计算所有可用的虚拟币");
  50. $result = $this->reduce(function ($result, PreOrderGoodsDeduction $orderGoodsDeduction) {
  51. /**
  52. * @var PreOrderGoodsDeduction $orderGoodsDeduction
  53. */
  54. if (!isset($result)) {
  55. return $orderGoodsDeduction->getMinLimitBuyCoin();
  56. }
  57. return $orderGoodsDeduction->getMinLimitBuyCoin()->plus($result);
  58. });
  59. trace_log()->deduction('订单抵扣', "所有订单商品最低抵扣{$result->getMoney()}元");
  60. return $result;
  61. }
  62. /**
  63. * @return VirtualCoin
  64. */
  65. public function getUsablePoint()
  66. {
  67. if($this->isEmpty()){
  68. return new InvalidVirtualCoin();
  69. }
  70. trace_log()->deduction('订单抵扣', "开始订单商品集合计算所有可用的虚拟币");
  71. $result = $this->reduce(function ($result, PreOrderGoodsDeduction $orderGoodsDeduction) {
  72. /**
  73. * @var PreOrderGoodsDeduction $orderGoodsDeduction
  74. */
  75. if (!isset($result)) {
  76. return $orderGoodsDeduction->getUsableCoin();
  77. }
  78. return $orderGoodsDeduction->getUsableCoin()->plus($result);
  79. });
  80. trace_log()->deduction('订单抵扣', "完成订单商品集合计算所有可用{$result->getMoney()}元");
  81. return $result;
  82. }
  83. /**
  84. * 订单商品抵扣集合中 已使用的抵扣
  85. * @return VirtualCoin
  86. */
  87. public function getUsedPoint()
  88. {
  89. if($this->isEmpty()){
  90. return new InvalidVirtualCoin();
  91. }
  92. trace_log()->deduction('订单抵扣', "开始订单商品抵扣集合计算所有已用的虚拟币");
  93. $result = $this->reduce(function ($result, $orderGoodsDeduction) {
  94. /**
  95. * @var PreOrderGoodsDeduction $orderGoodsDeduction
  96. */
  97. if (!$orderGoodsDeduction->used()) {
  98. // 没用过 0
  99. return $result;
  100. }
  101. return $result->plus($orderGoodsDeduction->getUsedCoin());
  102. }, new InvalidVirtualCoin());
  103. trace_log()->deduction('订单抵扣', "完成订单商品集合计算所有已用的虚拟币");
  104. return $result ?: new InvalidVirtualCoin();
  105. }
  106. }