| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- <?php
- /**
- * Created by PhpStorm.
- * User: shenyang
- * Date: 2019/1/9
- * Time: 10:50 AM
- */
- namespace app\frontend\modules\deduction;
- use app\common\exceptions\AppException;
- use app\common\modules\orderGoods\models\PreOrderGoods;
- use app\framework\Database\Eloquent\Collection;
- use app\frontend\models\order\PreOrderDeduction;
- use app\frontend\models\order\PreOrderDiscount;
- use app\frontend\modules\deduction\models\Deduction;
- use app\frontend\modules\order\models\PreOrder;
- class OrderDeductManager
- {
- /**
- * @var PreOrder
- */
- private $order;
- /**
- * @var OrderDeductionCollection
- */
- private $orderDeductionCollection;
- /**
- * @var OrderDeductionCollection
- */
- private $checkedOrderDeductionCollection;
- /**
- * @var OrderGoodsDeductionCollection
- */
- private $orderGoodsDeductionCollection;
- /**
- * @var \Illuminate\Database\Eloquent\Collection
- */
- private $deductions;
- public function __construct(PreOrder $order)
- {
- $this->order = $order;
- }
- /**
- * @return OrderDeductionCollection
- * @throws AppException
- */
- public function getOrderDeductions()
- {
- if (!isset($this->orderDeductionCollection)) {
- $this->orderDeductionCollection = $this->getAllOrderDeductions();
- $this->order->setRelation('orderDeductions',$this->orderDeductionCollection);
- // 按照选中状态排序
- $this->orderDeductionCollection->sortOrderDeductionCollection();
- // 验证
- $this->orderDeductionCollection->validate();
- }
- return $this->orderDeductionCollection;
- }
- /**
- * 获取并订单抵扣项并载入到订单模型中
- * @return OrderDeductionCollection
- */
- public function getAllOrderDeductions()
- {
- $orderDeductions = $this->getEnableDeductions()->map(function (Deduction $deduction) {
- $orderGoodsDeductionCollection = $this->getOrderGoodsDeductionCollection()->where('code', $deduction->getCode());
- /**
- * @var PreOrderDeduction $orderDeduction
- */
- $orderDeduction = new PreOrderDeduction();
- $orderDeduction->init($deduction, $this->order, $orderGoodsDeductionCollection);
- return $orderDeduction;
- });
- return new OrderDeductionCollection($orderDeductions->all());
- }
- /**
- * @param $deductions
- */
- public function setDeductions(\Illuminate\Database\Eloquent\Collection $deductions)
- {
- $this->deductions = $deductions;
- }
- /**
- * @param OrderGoodsDeductionCollection $orderGoodsDeductionCollection
- */
- public function setOrderGoodsDeductionCollection(OrderGoodsDeductionCollection $orderGoodsDeductionCollection)
- {
- $this->orderGoodsDeductionCollection = $orderGoodsDeductionCollection;
- }
- /**
- * @return OrderGoodsDeductionCollection
- */
- public function getOrderGoodsDeductionCollection()
- {
- if (!isset($this->orderGoodsDeductionCollection)) {
- $orderGoodsDeductions = $this->order->orderGoods->flatMap(function (PreOrderGoods $orderGoods) {
- return $orderGoods->getOrderGoodsDeductions();
- });
- $this->orderGoodsDeductionCollection = new OrderGoodsDeductionCollection($orderGoodsDeductions->all());
- }
- return $this->orderGoodsDeductionCollection;
- }
- /**
- * 开启的抵扣项
- * @return Collection
- */
- private function getEnableDeductions()
- {
- //由于获取开启抵扣都是相同的所以这里把这部分代码提取出来
- return \app\frontend\modules\deduction\EnableDeductionService::getInstance()->getEnableDeductions($this->order);
- // if (!isset($this->deductions)) {
- //
- // //blank not deduction
- // if ($this->order->isDeductionDisable()) {
- // trace_log()->deduction('订单关闭的抵扣类型','');
- // return collect();
- // }
- //
- // /**
- // * 商城开启的抵扣
- // * @var Collection $deductions
- // */
- // $deductions = Deduction::getEnable();
- //
- // trace_log()->deduction('开启的抵扣类型', $deductions->pluck('code')->toJson());
- // if ($deductions->isEmpty()) {
- // return collect();
- // }
- // // 过滤调无效的
- // $deductions = $deductions->filter(function (Deduction $deduction) {
- // /**
- // * @var Deduction $deduction
- // */
- // return $deduction->valid();
- // });
- // // 按照用户勾选顺序排序
- // $sort = array_flip($this->order->getParams('deduction_ids'));
- // $this->deductions = $deductions->sortBy(function ($deduction) use ($sort) {
- // return array_get($sort, $deduction->code, 999);
- // });
- // }
- // return $this->deductions;
- }
- /**
- * @return OrderDeductionCollection|static
- * @throws AppException
- */
- public function getCheckedOrderDeductions()
- {
- if (!isset($this->checkedOrderDeductionCollection)) {
- // 求和订单抵扣集合中所有已选中的可用金额
- $this->checkedOrderDeductionCollection = $this->getOrderDeductions()->filter(function (PreOrderDeduction $orderDeduction) {
- return $orderDeduction->isChecked();
- });
- // 过滤调不能抵扣的项
- $this->checkedOrderDeductionCollection->filterNotDeductible();
- $this->checkedOrderDeductionCollection->lock();
- if ($this->checkedOrderDeductionCollection->minAmount() > $this->order->getPriceBefore('orderDispatchPrice')) {
- throw new AppException("订单支付总金额{$this->order->getPriceBefore('orderDispatchPrice')}元,不满足最低抵扣总金额{$this->checkedOrderDeductionCollection->minAmount()}元");
- }
- }
- // 返回 订单抵扣金额
- return $this->checkedOrderDeductionCollection;
- }
- }
|