OrderGoodsDeductManager.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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\modules\orderGoods\models\PreOrderGoods;
  10. use app\framework\Database\Eloquent\Collection;
  11. use app\frontend\modules\deduction\models\Deduction;
  12. use app\frontend\modules\deduction\orderGoods\PreOrderGoodsDeduction;
  13. class OrderGoodsDeductManager
  14. {
  15. /**
  16. * @var PreOrderGoods
  17. */
  18. private $orderGoods;
  19. /**
  20. * @var OrderGoodsDeductionCollection
  21. */
  22. private $orderGoodsDeductions;
  23. public function __construct(PreOrderGoods $orderGoods)
  24. {
  25. $this->orderGoods = $orderGoods;
  26. }
  27. /**
  28. * @return OrderGoodsDeductionCollection
  29. */
  30. public function getOrderGoodsDeductions()
  31. {
  32. if (!isset($this->orderGoodsDeductions)) {
  33. $this->orderGoodsDeductions = $this->_getOrderGoodsDeductions();
  34. }
  35. return $this->orderGoodsDeductions;
  36. }
  37. /**
  38. * 获取并订单抵扣项并载入到订单模型中
  39. * @return OrderGoodsDeductionCollection
  40. */
  41. private function _getOrderGoodsDeductions()
  42. {
  43. $orderDeductions = $this->getEnableDeductions()->map(function (Deduction $deduction) {
  44. $preOrderGoodsDeduction = new PreOrderGoodsDeduction([
  45. 'name' => $deduction->getName(),
  46. 'code' => $deduction->getCode()
  47. ]);
  48. $preOrderGoodsDeduction->setOrderGoods($this->orderGoods);
  49. return $preOrderGoodsDeduction;
  50. });
  51. return new OrderGoodsDeductionCollection($orderDeductions->all());
  52. }
  53. /**
  54. * 开启的抵扣项
  55. * @return Collection
  56. */
  57. private function getEnableDeductions()
  58. {
  59. //由于获取开启抵扣都是相同的所以这里把这部分代码提取出来
  60. return \app\frontend\modules\deduction\EnableDeductionService::getInstance()->getEnableDeductions($this->orderGoods->order);
  61. //blank not deduction
  62. if ($this->orderGoods->order->isDeductionDisable()) {
  63. trace_log()->deduction('订单商品关闭的抵扣类型','');
  64. return collect();
  65. }
  66. /**
  67. * 商城开启的抵扣
  68. * @var Collection $deductions
  69. */
  70. $deductions = Deduction::where('enable', 1)->get();
  71. trace_log()->deduction('订单商品开启的抵扣类型', $deductions->pluck('code')->toJson());
  72. if ($deductions->isEmpty()) {
  73. return collect();
  74. }
  75. // 过滤调无效的
  76. $deductions = $deductions->filter(function (Deduction $deduction) {
  77. /**
  78. * @var Deduction $deduction
  79. */
  80. return $deduction->valid();
  81. });
  82. // 按照用户勾选顺序排序
  83. $sort = array_flip($this->orderGoods->order->getParams('deduction_ids'));
  84. $deductions = $deductions->sortBy(function ($deduction) use ($sort) {
  85. return array_get($sort, $deduction->code, 999);
  86. });
  87. return $deductions;
  88. }
  89. }